@hopeplayer/core 1.0.12 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/HopePlayerElement.d.ts +5 -0
- package/dist/HopePlayerElement.d.ts.map +1 -1
- package/dist/chunks/ScratchSound-0XKHUcJK.js +174 -0
- package/dist/chunks/ScratchSound-0XKHUcJK.js.map +1 -0
- package/dist/chunks/{index-Br_RybXV.js → index-BCMVXNL0.js} +71 -61
- package/dist/chunks/index-BCMVXNL0.js.map +1 -0
- package/dist/chunks/{index-DBwvWiuK.js → index-BTBAxNjr.js} +2 -2
- package/dist/chunks/{index-DBwvWiuK.js.map → index-BTBAxNjr.js.map} +1 -1
- package/dist/chunks/index-BeJNpAyx.js +326 -0
- package/dist/chunks/index-BeJNpAyx.js.map +1 -0
- package/dist/chunks/{index-nvfNBIM_.js → index-C2c71cGP.js} +2 -2
- package/dist/chunks/{index-nvfNBIM_.js.map → index-C2c71cGP.js.map} +1 -1
- package/dist/chunks/{index-adiWYyto.js → index-DcVUXkXo.js} +2 -2
- package/dist/chunks/{index-adiWYyto.js.map → index-DcVUXkXo.js.map} +1 -1
- package/dist/chunks/{index-C3s21eZa.js → index-DtqNHU7Y.js} +2 -2
- package/dist/chunks/{index-C3s21eZa.js.map → index-DtqNHU7Y.js.map} +1 -1
- package/dist/chunks/{index-_-pYIxvh.js → index-Dy0Th0is.js} +2 -2
- package/dist/chunks/{index-_-pYIxvh.js.map → index-Dy0Th0is.js.map} +1 -1
- package/dist/chunks/{index-D2aXO0eh.js → index-Dz0E1YPE.js} +610 -486
- package/dist/chunks/index-Dz0E1YPE.js.map +1 -0
- package/dist/controls/ControlBar.d.ts +17 -0
- package/dist/controls/ControlBar.d.ts.map +1 -1
- package/dist/controls/SeekBar.d.ts +8 -0
- package/dist/controls/SeekBar.d.ts.map +1 -1
- package/dist/controls/SettingsMenu.d.ts +4 -0
- package/dist/controls/SettingsMenu.d.ts.map +1 -1
- package/dist/hls/SourceManager.d.ts +2 -0
- package/dist/hls/SourceManager.d.ts.map +1 -1
- package/dist/hope-player.js +1 -1
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/types.d.ts +2 -0
- package/dist/i18n/types.d.ts.map +1 -1
- package/dist/plugins/ads/AdsController.d.ts +2 -0
- package/dist/plugins/ads/AdsController.d.ts.map +1 -1
- package/dist/plugins/audio/AudioStage.d.ts +89 -0
- package/dist/plugins/audio/AudioStage.d.ts.map +1 -0
- package/dist/plugins/audio/ScratchSound.d.ts +48 -0
- package/dist/plugins/audio/ScratchSound.d.ts.map +1 -0
- package/dist/plugins/audio/index.d.ts +7 -0
- package/dist/plugins/audio/index.d.ts.map +1 -0
- package/dist/plugins/audio/vinylSvg.d.ts +12 -0
- package/dist/plugins/audio/vinylSvg.d.ts.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/index-Br_RybXV.js.map +0 -1
- package/dist/chunks/index-D2aXO0eh.js.map +0 -1
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
var y = Object.defineProperty;
|
|
2
|
+
var S = (n, t, e) => t in n ? y(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
|
|
3
|
+
var i = (n, t, e) => S(n, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
+
const g = "http://www.w3.org/2000/svg";
|
|
5
|
+
let b = 0;
|
|
6
|
+
function E() {
|
|
7
|
+
let n = "";
|
|
8
|
+
for (let t = 40; t <= 95; t += 1.25) {
|
|
9
|
+
const s = Math.abs(t - 58) < 0.7 || Math.abs(t - 74) < 0.7 ? 0 : 0.035 + t * 7 % 5 * 8e-3;
|
|
10
|
+
n += `<circle cx="100" cy="100" r="${t}" fill="none" stroke="rgba(255,255,255,${s.toFixed(3)})" stroke-width="0.45"/>`;
|
|
11
|
+
}
|
|
12
|
+
return n;
|
|
13
|
+
}
|
|
14
|
+
function x() {
|
|
15
|
+
const n = `hp-vinyl-${++b}`, t = document.createElement("div");
|
|
16
|
+
t.innerHTML = `
|
|
17
|
+
<svg xmlns="${g}" viewBox="0 0 200 200" aria-hidden="true" focusable="false">
|
|
18
|
+
<defs>
|
|
19
|
+
<radialGradient id="${n}-disc" cx="50%" cy="50%" r="50%">
|
|
20
|
+
<stop offset="0" stop-color="#1c1c1f"/>
|
|
21
|
+
<stop offset="0.45" stop-color="#101012"/>
|
|
22
|
+
<stop offset="0.97" stop-color="#151518"/>
|
|
23
|
+
<stop offset="1" stop-color="#2a2a2e"/>
|
|
24
|
+
</radialGradient>
|
|
25
|
+
<clipPath id="${n}-label"><circle cx="100" cy="100" r="34"/></clipPath>
|
|
26
|
+
</defs>
|
|
27
|
+
<circle cx="100" cy="100" r="99.5" fill="url(#${n}-disc)"/>
|
|
28
|
+
${E()}
|
|
29
|
+
<circle cx="100" cy="100" r="96.5" fill="none" stroke="rgba(255,255,255,0.10)" stroke-width="0.6"/>
|
|
30
|
+
<circle cx="100" cy="100" r="38" fill="none" stroke="#050506" stroke-width="3"/>
|
|
31
|
+
<g class="hp-vinyl-label">
|
|
32
|
+
<circle cx="100" cy="100" r="34" fill="var(--hp-color-accent, #e5484d)"/>
|
|
33
|
+
<image class="hp-vinyl-cover" x="66" y="66" width="68" height="68" preserveAspectRatio="xMidYMid slice" clip-path="url(#${n}-label)"/>
|
|
34
|
+
<circle cx="100" cy="100" r="34" fill="none" stroke="rgba(0,0,0,0.35)" stroke-width="1"/>
|
|
35
|
+
<text class="hp-vinyl-text" x="100" y="80" text-anchor="middle" font-size="6.5" font-weight="700" fill="rgba(0,0,0,0.72)" font-family="system-ui, sans-serif"></text>
|
|
36
|
+
<circle cx="100" cy="122" r="2.2" fill="rgba(255,255,255,0.85)"/>
|
|
37
|
+
</g>
|
|
38
|
+
<circle cx="100" cy="100" r="3.6" fill="#0b0b0c"/>
|
|
39
|
+
<circle cx="100" cy="100" r="3.6" fill="none" stroke="rgba(255,255,255,0.35)" stroke-width="0.6"/>
|
|
40
|
+
</svg>`;
|
|
41
|
+
const e = t.firstElementChild, s = e.querySelector(".hp-vinyl-cover"), r = e.querySelector(".hp-vinyl-text");
|
|
42
|
+
return {
|
|
43
|
+
el: e,
|
|
44
|
+
setLabel(a, o) {
|
|
45
|
+
a ? (s.setAttribute("href", a), s.style.display = "") : (s.removeAttribute("href"), s.style.display = "none"), r.textContent = a ? "" : o.slice(0, 22);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function k() {
|
|
50
|
+
const n = document.createElement("div");
|
|
51
|
+
return n.innerHTML = `
|
|
52
|
+
<svg xmlns="${g}" viewBox="0 0 100 200" aria-hidden="true" focusable="false">
|
|
53
|
+
<circle cx="70" cy="22" r="15" fill="#2b2b30" stroke="rgba(255,255,255,0.18)" stroke-width="1"/>
|
|
54
|
+
<circle cx="70" cy="22" r="7" fill="#9a9aa2"/>
|
|
55
|
+
<path d="M70 22 L66 120 L40 162" fill="none" stroke="#c9c9cf" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
|
|
56
|
+
<rect x="26" y="156" width="20" height="28" rx="3" transform="rotate(32 36 170)" fill="#3a3a40" stroke="rgba(255,255,255,0.25)" stroke-width="1"/>
|
|
57
|
+
</svg>`, n.firstElementChild;
|
|
58
|
+
}
|
|
59
|
+
const c = 0.78, f = 100 / 3, w = 230, p = 4, A = 250, m = 10;
|
|
60
|
+
function v(n) {
|
|
61
|
+
if (n === !1) return null;
|
|
62
|
+
const t = n === !0 || n === void 0 ? {} : n, e = typeof t.size == "number" && Number.isFinite(t.size) ? Math.min(1, Math.max(0.3, t.size)) : c, s = typeof t.rpm == "number" && t.rpm > 0 ? t.rpm : f;
|
|
63
|
+
return {
|
|
64
|
+
position: t.position === "center" || t.position === "left" ? t.position : "right",
|
|
65
|
+
size: e,
|
|
66
|
+
rpm: s,
|
|
67
|
+
scratch: t.scratch !== !1,
|
|
68
|
+
scratchSound: t.scratchSound === !0,
|
|
69
|
+
tonearm: t.tonearm !== !1
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function P(n) {
|
|
73
|
+
return ((n + 180) % 360 + 360) % 360 - 180;
|
|
74
|
+
}
|
|
75
|
+
const h = class h {
|
|
76
|
+
constructor(t) {
|
|
77
|
+
i(this, "el");
|
|
78
|
+
i(this, "backdropImg");
|
|
79
|
+
i(this, "sleeve");
|
|
80
|
+
i(this, "sleeveImg");
|
|
81
|
+
i(this, "vinylEl");
|
|
82
|
+
i(this, "discEl");
|
|
83
|
+
i(this, "armHolder");
|
|
84
|
+
i(this, "titleEl");
|
|
85
|
+
i(this, "artistEl");
|
|
86
|
+
i(this, "areaEl");
|
|
87
|
+
i(this, "resizeObserver");
|
|
88
|
+
i(this, "disc");
|
|
89
|
+
i(this, "options", {});
|
|
90
|
+
i(this, "vinyl", null);
|
|
91
|
+
i(this, "frame", 0);
|
|
92
|
+
i(this, "lastAriaSecond", -1);
|
|
93
|
+
i(this, "lastPositionState", 0);
|
|
94
|
+
// Scratch durumu
|
|
95
|
+
i(this, "dragging", !1);
|
|
96
|
+
i(this, "dragPointer", -1);
|
|
97
|
+
i(this, "center", { x: 0, y: 0 });
|
|
98
|
+
i(this, "lastPointerAngle", 0);
|
|
99
|
+
i(this, "accum", 0);
|
|
100
|
+
i(this, "dragStartTime", 0);
|
|
101
|
+
i(this, "dragStartAngle", 0);
|
|
102
|
+
i(this, "moved", !1);
|
|
103
|
+
i(this, "wasPlaying", !1);
|
|
104
|
+
i(this, "downAt", 0);
|
|
105
|
+
i(this, "seekFrame", 0);
|
|
106
|
+
i(this, "pendingSeek", null);
|
|
107
|
+
/** vinyl.scratchSound — ayrı parça olarak yalnızca açıksa yüklenir. */
|
|
108
|
+
i(this, "sound", null);
|
|
109
|
+
i(this, "soundImport", null);
|
|
110
|
+
i(this, "prepareTimer", null);
|
|
111
|
+
i(this, "render", () => {
|
|
112
|
+
!this.vinyl || this.dragging || (this.discEl.style.transform = `rotate(${this.angleForTime(this.ctx.videoEl.currentTime || 0)}deg)`);
|
|
113
|
+
});
|
|
114
|
+
i(this, "loop", () => {
|
|
115
|
+
this.render(), this.frame = requestAnimationFrame(this.loop);
|
|
116
|
+
});
|
|
117
|
+
i(this, "onPlay", () => {
|
|
118
|
+
this.el.setAttribute("data-playing", ""), this.schedulePrepareSound(), cancelAnimationFrame(this.frame), this.vinyl && (this.frame = requestAnimationFrame(this.loop)), this.options.mediaSession !== !1 && "mediaSession" in navigator && (this.applyMediaSession(), navigator.mediaSession.playbackState = "playing");
|
|
119
|
+
});
|
|
120
|
+
i(this, "onPause", () => {
|
|
121
|
+
this.dragging || this.el.removeAttribute("data-playing"), cancelAnimationFrame(this.frame), this.render(), this.ownsMediaSession() && (navigator.mediaSession.playbackState = "paused");
|
|
122
|
+
});
|
|
123
|
+
i(this, "onTimeUpdate", () => {
|
|
124
|
+
const t = this.ctx.videoEl;
|
|
125
|
+
t.paused && this.render();
|
|
126
|
+
const e = Math.floor(t.currentTime || 0);
|
|
127
|
+
e !== this.lastAriaSecond && (this.lastAriaSecond = e, this.vinylEl.setAttribute("aria-valuenow", String(e))), performance.now() - this.lastPositionState > 1e3 && this.updatePositionState();
|
|
128
|
+
});
|
|
129
|
+
i(this, "onDurationChange", () => {
|
|
130
|
+
const t = this.ctx.videoEl.duration, e = Number.isFinite(t) && t > 0;
|
|
131
|
+
e ? this.vinylEl.setAttribute("aria-valuemax", String(Math.floor(t))) : this.vinylEl.removeAttribute("aria-valuemax"), this.vinylEl.toggleAttribute("data-live", !e && t === 1 / 0), this.updatePositionState();
|
|
132
|
+
});
|
|
133
|
+
i(this, "onPointerDown", (t) => {
|
|
134
|
+
var s;
|
|
135
|
+
if (!this.vinyl || this.dragging || t.pointerType === "mouse" && t.button !== 0) return;
|
|
136
|
+
t.stopPropagation(), t.preventDefault();
|
|
137
|
+
const e = this.vinylEl.getBoundingClientRect();
|
|
138
|
+
this.center = { x: e.left + e.width / 2, y: e.top + e.height / 2 }, this.dragging = !0, this.dragPointer = t.pointerId, this.lastPointerAngle = this.pointerAngle(t), this.accum = 0, this.moved = !1, this.dragStartTime = this.ctx.videoEl.currentTime || 0, this.dragStartAngle = this.angleForTime(this.dragStartTime), this.wasPlaying = !this.ctx.videoEl.paused, this.downAt = performance.now(), this.wasPlaying && this.canScratch() && this.ctx.videoEl.pause(), this.vinyl.scratchSound && this.canScratch() && ((s = this.sound) != null && s.ready ? this.sound.start(this.dragStartTime) : this.loadSound().then((r) => r == null ? void 0 : r.prepare()));
|
|
139
|
+
try {
|
|
140
|
+
this.vinylEl.setPointerCapture(t.pointerId);
|
|
141
|
+
} catch {
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
i(this, "onPointerMove", (t) => {
|
|
145
|
+
var d;
|
|
146
|
+
if (!this.dragging || t.pointerId !== this.dragPointer) return;
|
|
147
|
+
t.stopPropagation();
|
|
148
|
+
const e = this.pointerAngle(t), s = P(e - this.lastPointerAngle);
|
|
149
|
+
if (this.lastPointerAngle = e, !this.canScratch()) {
|
|
150
|
+
this.accum += s, Math.abs(this.accum) > p && (this.moved = !0);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const r = this.secondsPerTurn, a = this.ctx.videoEl.duration, o = -this.dragStartTime / r * 360, l = (a - this.dragStartTime) / r * 360;
|
|
154
|
+
this.accum = Math.min(l, Math.max(o, this.accum + s)), !this.moved && Math.abs(this.accum) > p && (this.moved = !0, this.el.setAttribute("data-scratching", "")), this.moved && (this.discEl.style.transform = `rotate(${this.dragStartAngle + this.accum}deg)`, this.pendingSeek = this.dragStartTime + this.accum / 360 * r, (d = this.sound) == null || d.setTarget(this.pendingSeek), this.seekFrame || (this.seekFrame = requestAnimationFrame(this.flushSeek)));
|
|
155
|
+
});
|
|
156
|
+
i(this, "flushSeek", () => {
|
|
157
|
+
this.seekFrame = 0, this.pendingSeek !== null && (this.ctx.videoEl.currentTime = this.pendingSeek, this.pendingSeek = null);
|
|
158
|
+
});
|
|
159
|
+
i(this, "onPointerUp", (t) => {
|
|
160
|
+
var e;
|
|
161
|
+
if (!(!this.dragging || t.pointerId !== this.dragPointer)) {
|
|
162
|
+
if (t.stopPropagation(), this.dragging = !1, this.dragPointer = -1, this.el.removeAttribute("data-scratching"), (e = this.sound) == null || e.stop(), this.seekFrame && (cancelAnimationFrame(this.seekFrame), this.flushSeek()), !this.moved && this.canScratch() && this.wasPlaying) {
|
|
163
|
+
performance.now() - this.downAt >= A || t.type !== "pointerup" ? this.ctx.play() : (this.el.removeAttribute("data-playing"), this.render());
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (!this.moved) {
|
|
167
|
+
t.type === "pointerup" && this.ctx.togglePlay();
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
this.wasPlaying ? this.ctx.play() : this.render();
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
i(this, "updatePositionState", () => {
|
|
174
|
+
if (!this.ownsMediaSession()) return;
|
|
175
|
+
this.lastPositionState = performance.now();
|
|
176
|
+
const t = this.ctx.videoEl, e = t.duration;
|
|
177
|
+
if (!(!Number.isFinite(e) || e <= 0))
|
|
178
|
+
try {
|
|
179
|
+
navigator.mediaSession.setPositionState({
|
|
180
|
+
duration: e,
|
|
181
|
+
playbackRate: t.playbackRate || 1,
|
|
182
|
+
position: Math.min(e, Math.max(0, t.currentTime || 0))
|
|
183
|
+
});
|
|
184
|
+
} catch {
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
var r, a;
|
|
188
|
+
this.ctx = t;
|
|
189
|
+
const e = document.createElement("div");
|
|
190
|
+
e.className = "hp-audio", e.setAttribute("part", "audio-stage"), e.innerHTML = `
|
|
191
|
+
<div class="hp-audio-backdrop"><img alt="" decoding="async"></div>
|
|
192
|
+
<div class="hp-audio-meta"><div class="hp-audio-title" part="audio-title"></div><div class="hp-audio-artist" part="audio-artist"></div></div>
|
|
193
|
+
<div class="hp-audio-area">
|
|
194
|
+
<div class="hp-audio-deck">
|
|
195
|
+
<div class="hp-audio-sleeve" part="audio-cover"><img alt="" decoding="async"></div>
|
|
196
|
+
<div class="hp-vinyl" part="vinyl" role="slider" tabindex="-1" aria-valuemin="0">
|
|
197
|
+
<div class="hp-vinyl-disc"></div>
|
|
198
|
+
<div class="hp-vinyl-sheen"></div>
|
|
199
|
+
<div class="hp-tonearm-holder"><div class="hp-tonearm"></div></div>
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
</div>`, this.el = e, this.backdropImg = e.querySelector(".hp-audio-backdrop img"), this.sleeve = e.querySelector(".hp-audio-sleeve"), this.sleeveImg = this.sleeve.querySelector("img"), this.vinylEl = e.querySelector(".hp-vinyl"), this.discEl = e.querySelector(".hp-vinyl-disc"), this.armHolder = e.querySelector(".hp-tonearm-holder"), this.titleEl = e.querySelector(".hp-audio-title"), this.artistEl = e.querySelector(".hp-audio-artist"), this.disc = x(), this.discEl.appendChild(this.disc.el), e.querySelector(".hp-tonearm").appendChild(k());
|
|
203
|
+
for (const o of [this.backdropImg, this.sleeveImg])
|
|
204
|
+
o.addEventListener("error", () => o.removeAttribute("src"));
|
|
205
|
+
const s = t.videoEl;
|
|
206
|
+
s.addEventListener("play", this.onPlay), s.addEventListener("pause", this.onPause), s.addEventListener("ended", this.onPause), s.addEventListener("seeked", this.render), s.addEventListener("timeupdate", this.onTimeUpdate), s.addEventListener("durationchange", this.onDurationChange), s.addEventListener("ratechange", this.updatePositionState), s.addEventListener("emptied", this.render), this.vinylEl.addEventListener("pointerdown", this.onPointerDown), this.vinylEl.addEventListener("pointermove", this.onPointerMove), this.vinylEl.addEventListener("pointerup", this.onPointerUp), this.vinylEl.addEventListener("pointercancel", this.onPointerUp), this.vinylEl.addEventListener("lostpointercapture", this.onPointerUp);
|
|
207
|
+
for (const o of ["click", "mousedown", "mouseup", "touchstart", "touchend", "dblclick"])
|
|
208
|
+
this.vinylEl.addEventListener(o, (l) => l.stopPropagation());
|
|
209
|
+
t.layerEl.insertBefore(e, t.videoEl.nextSibling), this.areaEl = e.querySelector(".hp-audio-area"), this.resizeObserver = typeof ResizeObserver < "u" ? new ResizeObserver(() => this.layout()) : null, (r = this.resizeObserver) == null || r.observe(e), (a = this.resizeObserver) == null || a.observe(this.areaEl), this.refreshLabels();
|
|
210
|
+
}
|
|
211
|
+
update(t) {
|
|
212
|
+
this.options = t;
|
|
213
|
+
const e = t.layout === "compact";
|
|
214
|
+
this.el.setAttribute("data-layout", e ? "compact" : "full"), this.ctx.setBarMeta(
|
|
215
|
+
e ? { title: t.title ?? "", subtitle: [t.artist, t.album].filter(Boolean).join(" · ") } : null
|
|
216
|
+
), this.vinyl = e ? null : v(t.vinyl);
|
|
217
|
+
const s = t.cover || this.ctx.poster() || "";
|
|
218
|
+
for (const a of [this.backdropImg, this.sleeveImg])
|
|
219
|
+
s ? a.src = s : a.removeAttribute("src");
|
|
220
|
+
this.el.toggleAttribute("data-cover", !!s), this.titleEl.textContent = t.title ?? "", this.artistEl.textContent = [t.artist, t.album].filter(Boolean).join(" · "), this.el.toggleAttribute("data-meta", !!(t.title || t.artist || t.album));
|
|
221
|
+
const r = this.vinyl;
|
|
222
|
+
this.el.setAttribute("data-position", r ? r.position : "none"), this.el.style.setProperty("--hp-vinyl-size", String((r == null ? void 0 : r.size) ?? c)), this.vinylEl.hidden = !r, this.sleeve.hidden = !!r && r.position === "center", this.disc.setLabel(s || null, t.title || "HopeCore"), this.armHolder.hidden = !(r != null && r.tonearm), this.vinylEl.toggleAttribute("data-scratch", !!(r != null && r.scratch)), this.vinylEl.tabIndex = r ? 0 : -1, r != null && r.scratchSound ? this.ctx.videoEl.paused || this.schedulePrepareSound() : this.disableSound(), this.applyMediaSession(), this.onDurationChange(), this.layout(), this.render(), this.ctx.videoEl.paused || this.onPlay();
|
|
223
|
+
}
|
|
224
|
+
/** Kapak / plak yüksekliği: alan yüksekliğinin `size` katı, genişliğe sığacak kadar (kılıf + yarım plak ≈ 1,46 H). */
|
|
225
|
+
layout() {
|
|
226
|
+
var o, l;
|
|
227
|
+
if (!this.el.isConnected) return;
|
|
228
|
+
const t = this.areaEl.clientWidth, e = this.areaEl.clientHeight, s = ((o = this.vinyl) == null ? void 0 : o.size) ?? ((l = v(this.options.vinyl)) == null ? void 0 : l.size) ?? c, r = !!this.vinyl && this.vinyl.position !== "center", a = Math.max(0, Math.min(s * e, (r ? 0.62 : 0.9) * t));
|
|
229
|
+
this.el.style.setProperty("--hp-deck-h", `${Math.round(a * 10) / 10}px`), a > 0 && !this.el.hasAttribute("data-laid-out") && requestAnimationFrame(() => requestAnimationFrame(() => this.el.setAttribute("data-laid-out", ""))), this.el.toggleAttribute("data-short", this.el.clientHeight > 0 && this.el.clientHeight < w);
|
|
230
|
+
}
|
|
231
|
+
// ── Scratch sesi ────────────────────────────────────────────────────
|
|
232
|
+
loadSound() {
|
|
233
|
+
return this.sound ? Promise.resolve(this.sound) : (this.soundImport ?? (this.soundImport = import("./ScratchSound-0XKHUcJK.js").then(({ ScratchSound: t }) => {
|
|
234
|
+
var e;
|
|
235
|
+
return !((e = this.vinyl) != null && e.scratchSound) || !t.isSupported() ? (this.el.setAttribute("data-scratch-sound", "unsupported"), null) : (this.sound ?? (this.sound = new t(this.ctx.videoEl)), this.sound.onStateChange = (s) => this.el.setAttribute("data-scratch-sound", s), this.sound);
|
|
236
|
+
}).catch(() => null).finally(() => {
|
|
237
|
+
this.soundImport = null;
|
|
238
|
+
})), this.soundImport);
|
|
239
|
+
}
|
|
240
|
+
/** Çalma başlayınca, boşta: sesi önceden çöz ki ilk scratch gecikmesin. */
|
|
241
|
+
schedulePrepareSound() {
|
|
242
|
+
var t, e;
|
|
243
|
+
!((t = this.vinyl) != null && t.scratchSound) || this.prepareTimer || (e = this.sound) != null && e.ready || (this.prepareTimer = setTimeout(() => {
|
|
244
|
+
this.prepareTimer = null;
|
|
245
|
+
const s = () => void this.loadSound().then((r) => r == null ? void 0 : r.prepare());
|
|
246
|
+
"requestIdleCallback" in window ? window.requestIdleCallback(s, { timeout: 2e3 }) : s();
|
|
247
|
+
}, 300));
|
|
248
|
+
}
|
|
249
|
+
disableSound() {
|
|
250
|
+
var t;
|
|
251
|
+
this.prepareTimer && clearTimeout(this.prepareTimer), this.prepareTimer = null, (t = this.sound) == null || t.destroy(), this.sound = null, this.el.removeAttribute("data-scratch-sound");
|
|
252
|
+
}
|
|
253
|
+
refreshLabels() {
|
|
254
|
+
this.vinylEl.setAttribute("aria-label", this.ctx.i18n.audioVinyl);
|
|
255
|
+
}
|
|
256
|
+
// ── Dönüş ────────────────────────────────────────────────────────────
|
|
257
|
+
get secondsPerTurn() {
|
|
258
|
+
var t;
|
|
259
|
+
return 60 / (((t = this.vinyl) == null ? void 0 : t.rpm) ?? f);
|
|
260
|
+
}
|
|
261
|
+
angleForTime(t) {
|
|
262
|
+
return t / this.secondsPerTurn * 360 % 360;
|
|
263
|
+
}
|
|
264
|
+
// ── Scratch ──────────────────────────────────────────────────────────
|
|
265
|
+
canScratch() {
|
|
266
|
+
var e;
|
|
267
|
+
const t = this.ctx.videoEl.duration;
|
|
268
|
+
return !!((e = this.vinyl) != null && e.scratch) && Number.isFinite(t) && t > 0;
|
|
269
|
+
}
|
|
270
|
+
pointerAngle(t) {
|
|
271
|
+
return Math.atan2(t.clientY - this.center.y, t.clientX - this.center.x) * 180 / Math.PI;
|
|
272
|
+
}
|
|
273
|
+
// ── Media Session ───────────────────────────────────────────────────
|
|
274
|
+
ownsMediaSession() {
|
|
275
|
+
return this.options.mediaSession !== !1 && "mediaSession" in navigator && h.sessionOwner === this;
|
|
276
|
+
}
|
|
277
|
+
applyMediaSession() {
|
|
278
|
+
if (this.options.mediaSession === !1 || !("mediaSession" in navigator) || typeof MediaMetadata > "u") return;
|
|
279
|
+
const t = h.sessionOwner;
|
|
280
|
+
if (t && t !== this && !t.ctx.videoEl.paused && this.ctx.videoEl.paused) return;
|
|
281
|
+
h.sessionOwner = this;
|
|
282
|
+
const e = this.options, s = e.cover || this.ctx.poster(), r = navigator.mediaSession;
|
|
283
|
+
r.metadata = new MediaMetadata({
|
|
284
|
+
title: e.title ?? "",
|
|
285
|
+
artist: e.artist ?? "",
|
|
286
|
+
album: e.album ?? "",
|
|
287
|
+
artwork: s ? [{ src: new URL(s, document.baseURI).href }] : []
|
|
288
|
+
});
|
|
289
|
+
const a = this.ctx.videoEl, o = (l, d) => {
|
|
290
|
+
try {
|
|
291
|
+
r.setActionHandler(l, d);
|
|
292
|
+
} catch {
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
o("play", () => this.ctx.play()), o("pause", () => a.pause()), o("seekbackward", (l) => a.currentTime = Math.max(0, a.currentTime - (l.seekOffset ?? m))), o("seekforward", (l) => a.currentTime = Math.min(a.duration || 1 / 0, a.currentTime + (l.seekOffset ?? m))), o("seekto", (l) => {
|
|
296
|
+
typeof l.seekTime == "number" && (a.currentTime = l.seekTime);
|
|
297
|
+
}), this.updatePositionState();
|
|
298
|
+
}
|
|
299
|
+
releaseMediaSession() {
|
|
300
|
+
if (h.sessionOwner !== this || (h.sessionOwner = null, !("mediaSession" in navigator))) return;
|
|
301
|
+
const t = navigator.mediaSession;
|
|
302
|
+
t.metadata = null;
|
|
303
|
+
for (const e of ["play", "pause", "seekbackward", "seekforward", "seekto"])
|
|
304
|
+
try {
|
|
305
|
+
t.setActionHandler(e, null);
|
|
306
|
+
} catch {
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
destroy() {
|
|
310
|
+
var e;
|
|
311
|
+
cancelAnimationFrame(this.frame), cancelAnimationFrame(this.seekFrame);
|
|
312
|
+
const t = this.ctx.videoEl;
|
|
313
|
+
t.removeEventListener("play", this.onPlay), t.removeEventListener("pause", this.onPause), t.removeEventListener("ended", this.onPause), t.removeEventListener("seeked", this.render), t.removeEventListener("timeupdate", this.onTimeUpdate), t.removeEventListener("durationchange", this.onDurationChange), t.removeEventListener("ratechange", this.updatePositionState), t.removeEventListener("emptied", this.render), this.releaseMediaSession(), this.disableSound(), (e = this.resizeObserver) == null || e.disconnect(), this.ctx.setBarMeta(null), this.el.remove();
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
i(h, "sessionOwner", null);
|
|
317
|
+
let u = h;
|
|
318
|
+
function M(n, t) {
|
|
319
|
+
const e = new u(n);
|
|
320
|
+
return e.update(t), e;
|
|
321
|
+
}
|
|
322
|
+
export {
|
|
323
|
+
u as AudioStage,
|
|
324
|
+
M as installAudioStage
|
|
325
|
+
};
|
|
326
|
+
//# sourceMappingURL=index-BeJNpAyx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BeJNpAyx.js","sources":["../../src/plugins/audio/vinylSvg.ts","../../src/plugins/audio/AudioStage.ts","../../src/plugins/audio/index.ts"],"sourcesContent":["/**\n * Plak ve pikap kolu — elle çizilmiş SVG (dış görsel yok). Disk döner; ışık yansıması ayrı bir katmanda sabit kalır,\n * böylece dönüş gerçek bir plaktaki gibi okunur. Oluklar tam simetrik olduğundan etikette dönüşü gösteren bir işaret var.\n */\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nlet uid = 0;\n\nfunction grooves(): string {\n let out = '';\n // Kayıt alanı r=40..95; iki şarkı arası boşluk gibi birkaç koyu halka.\n for (let r = 40; r <= 95; r += 1.25) {\n const gap = Math.abs(r - 58) < 0.7 || Math.abs(r - 74) < 0.7;\n const alpha = gap ? 0 : 0.035 + ((r * 7) % 5) * 0.008;\n out += `<circle cx=\"100\" cy=\"100\" r=\"${r}\" fill=\"none\" stroke=\"rgba(255,255,255,${alpha.toFixed(3)})\" stroke-width=\"0.45\"/>`;\n }\n return out;\n}\n\n/** Dönen disk: oluklar, etiket (kapak ya da düz renk), merkez deliği. */\nexport function createDisc(): { el: SVGSVGElement; setLabel(cover: string | null, text: string): void } {\n const id = `hp-vinyl-${++uid}`;\n const wrap = document.createElement('div');\n wrap.innerHTML = `\n<svg xmlns=\"${SVG_NS}\" viewBox=\"0 0 200 200\" aria-hidden=\"true\" focusable=\"false\">\n <defs>\n <radialGradient id=\"${id}-disc\" cx=\"50%\" cy=\"50%\" r=\"50%\">\n <stop offset=\"0\" stop-color=\"#1c1c1f\"/>\n <stop offset=\"0.45\" stop-color=\"#101012\"/>\n <stop offset=\"0.97\" stop-color=\"#151518\"/>\n <stop offset=\"1\" stop-color=\"#2a2a2e\"/>\n </radialGradient>\n <clipPath id=\"${id}-label\"><circle cx=\"100\" cy=\"100\" r=\"34\"/></clipPath>\n </defs>\n <circle cx=\"100\" cy=\"100\" r=\"99.5\" fill=\"url(#${id}-disc)\"/>\n ${grooves()}\n <circle cx=\"100\" cy=\"100\" r=\"96.5\" fill=\"none\" stroke=\"rgba(255,255,255,0.10)\" stroke-width=\"0.6\"/>\n <circle cx=\"100\" cy=\"100\" r=\"38\" fill=\"none\" stroke=\"#050506\" stroke-width=\"3\"/>\n <g class=\"hp-vinyl-label\">\n <circle cx=\"100\" cy=\"100\" r=\"34\" fill=\"var(--hp-color-accent, #e5484d)\"/>\n <image class=\"hp-vinyl-cover\" x=\"66\" y=\"66\" width=\"68\" height=\"68\" preserveAspectRatio=\"xMidYMid slice\" clip-path=\"url(#${id}-label)\"/>\n <circle cx=\"100\" cy=\"100\" r=\"34\" fill=\"none\" stroke=\"rgba(0,0,0,0.35)\" stroke-width=\"1\"/>\n <text class=\"hp-vinyl-text\" x=\"100\" y=\"80\" text-anchor=\"middle\" font-size=\"6.5\" font-weight=\"700\" fill=\"rgba(0,0,0,0.72)\" font-family=\"system-ui, sans-serif\"></text>\n <circle cx=\"100\" cy=\"122\" r=\"2.2\" fill=\"rgba(255,255,255,0.85)\"/>\n </g>\n <circle cx=\"100\" cy=\"100\" r=\"3.6\" fill=\"#0b0b0c\"/>\n <circle cx=\"100\" cy=\"100\" r=\"3.6\" fill=\"none\" stroke=\"rgba(255,255,255,0.35)\" stroke-width=\"0.6\"/>\n</svg>`;\n const svg = wrap.firstElementChild as SVGSVGElement;\n const image = svg.querySelector('.hp-vinyl-cover') as SVGImageElement;\n const text = svg.querySelector('.hp-vinyl-text') as SVGTextElement;\n return {\n el: svg,\n setLabel(cover, label) {\n if (cover) {\n image.setAttribute('href', cover);\n image.style.display = '';\n } else {\n image.removeAttribute('href');\n image.style.display = 'none';\n }\n // Kapak varsa yazı kapağın üstüne binmesin.\n text.textContent = cover ? '' : label.slice(0, 22);\n },\n };\n}\n\n/** Pikap kolu: sağ üstteki mile bağlı; çalarken plağın üzerine iner. */\nexport function createTonearm(): SVGSVGElement {\n const wrap = document.createElement('div');\n wrap.innerHTML = `\n<svg xmlns=\"${SVG_NS}\" viewBox=\"0 0 100 200\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"70\" cy=\"22\" r=\"15\" fill=\"#2b2b30\" stroke=\"rgba(255,255,255,0.18)\" stroke-width=\"1\"/>\n <circle cx=\"70\" cy=\"22\" r=\"7\" fill=\"#9a9aa2\"/>\n <path d=\"M70 22 L66 120 L40 162\" fill=\"none\" stroke=\"#c9c9cf\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <rect x=\"26\" y=\"156\" width=\"20\" height=\"28\" rx=\"3\" transform=\"rotate(32 36 170)\" fill=\"#3a3a40\" stroke=\"rgba(255,255,255,0.25)\" stroke-width=\"1\"/>\n</svg>`;\n return wrap.firstElementChild as SVGSVGElement;\n}\n","import type { AudioOptions, VinylOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { createDisc, createTonearm } from './vinylSvg';\nimport type { ScratchSound } from './ScratchSound';\n\nexport interface AudioStageContext {\n videoEl: HTMLVideoElement;\n /** Sahnenin ekleneceği katman (video ile reklam katmanı arasında). */\n layerEl: HTMLElement;\n /** Kapak verilmezse kullanılan görsel (options.poster). */\n poster(): string | undefined;\n /** Player'ın oynat / duraklat yolu (preroll kapısına uyar). */\n togglePlay(): void;\n play(): void;\n i18n: HopeLocaleStrings;\n /** İnce çubuk (layout: 'compact'): başlık / sanatçıyı kontrol çubuğuna yazar; `null` kaldırır. */\n setBarMeta(meta: { title: string; subtitle: string } | null): void;\n}\n\nconst DEFAULT_SIZE = 0.78;\nconst DEFAULT_RPM = 100 / 3;\n/** Kontrol çubuğunun üstündeki alan bundan kısaysa başlık gizlenir, plağa yer kalır (ör. mobilde 16:9). */\nconst SHORT_STAGE_PX = 230;\n\n/** Bu kadar dereceden az çevirme \"dokunuş\" sayılır: oynat / duraklat. */\nconst TAP_DEGREES = 4;\n/** Bundan kısa, çevirmesiz basış \"dokunuş\"tur (oynat / duraklat); daha uzunu \"tutuş\" (bırakınca çalmaya devam). */\nconst TAP_MS = 250;\nconst MEDIA_SESSION_SEEK_SECONDS = 10;\n\ntype ResolvedVinyl = Required<VinylOptions>;\n\nfunction resolveVinyl(v: AudioOptions['vinyl']): ResolvedVinyl | null {\n if (v === false) return null;\n const o = v === true || v === undefined ? {} : v;\n const size = typeof o.size === 'number' && Number.isFinite(o.size) ? Math.min(1, Math.max(0.3, o.size)) : DEFAULT_SIZE;\n const rpm = typeof o.rpm === 'number' && o.rpm > 0 ? o.rpm : DEFAULT_RPM;\n return {\n position: o.position === 'center' || o.position === 'left' ? o.position : 'right',\n size,\n rpm,\n scratch: o.scratch !== false,\n scratchSound: o.scratchSound === true,\n tonearm: o.tonearm !== false,\n };\n}\n\n/** -180..180 aralığına indirger (açı farkı). */\nfunction wrapDegrees(d: number): number {\n return ((((d + 180) % 360) + 360) % 360) - 180;\n}\n\n/**\n * Ses modunun sahnesi: bulanık kapak zemini, kapak (plak kılıfı), dönen plak, pikap kolu, başlık / sanatçı.\n * Plağın açısı doğrudan çalma zamanından hesaplanır (açı = zaman / tur süresi × 360): sarınca, atlayınca, scratch\n * yapınca plak her zaman sesle aynı yerde durur.\n */\nexport class AudioStage {\n readonly el: HTMLDivElement;\n private readonly backdropImg: HTMLImageElement;\n private readonly sleeve: HTMLDivElement;\n private readonly sleeveImg: HTMLImageElement;\n private readonly vinylEl: HTMLDivElement;\n private readonly discEl: HTMLDivElement;\n private readonly armHolder: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly artistEl: HTMLDivElement;\n private readonly areaEl: HTMLDivElement;\n private readonly resizeObserver: ResizeObserver | null;\n private readonly disc: ReturnType<typeof createDisc>;\n\n private options: AudioOptions = {};\n private vinyl: ResolvedVinyl | null = null;\n private frame = 0;\n private lastAriaSecond = -1;\n private lastPositionState = 0;\n\n // Scratch durumu\n private dragging = false;\n private dragPointer = -1;\n private center = { x: 0, y: 0 };\n private lastPointerAngle = 0;\n private accum = 0;\n private dragStartTime = 0;\n private dragStartAngle = 0;\n private moved = false;\n private wasPlaying = false;\n private downAt = 0;\n private seekFrame = 0;\n private pendingSeek: number | null = null;\n /** vinyl.scratchSound — ayrı parça olarak yalnızca açıksa yüklenir. */\n private sound: ScratchSound | null = null;\n private soundImport: Promise<ScratchSound | null> | null = null;\n private prepareTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly ctx: AudioStageContext) {\n const el = document.createElement('div');\n el.className = 'hp-audio';\n el.setAttribute('part', 'audio-stage');\n el.innerHTML = `\n <div class=\"hp-audio-backdrop\"><img alt=\"\" decoding=\"async\"></div>\n <div class=\"hp-audio-meta\"><div class=\"hp-audio-title\" part=\"audio-title\"></div><div class=\"hp-audio-artist\" part=\"audio-artist\"></div></div>\n <div class=\"hp-audio-area\">\n <div class=\"hp-audio-deck\">\n <div class=\"hp-audio-sleeve\" part=\"audio-cover\"><img alt=\"\" decoding=\"async\"></div>\n <div class=\"hp-vinyl\" part=\"vinyl\" role=\"slider\" tabindex=\"-1\" aria-valuemin=\"0\">\n <div class=\"hp-vinyl-disc\"></div>\n <div class=\"hp-vinyl-sheen\"></div>\n <div class=\"hp-tonearm-holder\"><div class=\"hp-tonearm\"></div></div>\n </div>\n </div>\n </div>`;\n this.el = el;\n this.backdropImg = el.querySelector('.hp-audio-backdrop img')!;\n this.sleeve = el.querySelector('.hp-audio-sleeve')!;\n this.sleeveImg = this.sleeve.querySelector('img')!;\n this.vinylEl = el.querySelector('.hp-vinyl')!;\n this.discEl = el.querySelector('.hp-vinyl-disc')!;\n this.armHolder = el.querySelector('.hp-tonearm-holder')!;\n this.titleEl = el.querySelector('.hp-audio-title')!;\n this.artistEl = el.querySelector('.hp-audio-artist')!;\n this.disc = createDisc();\n this.discEl.appendChild(this.disc.el);\n el.querySelector('.hp-tonearm')!.appendChild(createTonearm());\n // Kırık kapak bağlantısı: görseli gizle, zemin temaya düşsün.\n for (const img of [this.backdropImg, this.sleeveImg]) {\n img.addEventListener('error', () => img.removeAttribute('src'));\n }\n\n const v = ctx.videoEl;\n v.addEventListener('play', this.onPlay);\n v.addEventListener('pause', this.onPause);\n v.addEventListener('ended', this.onPause);\n v.addEventListener('seeked', this.render);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('durationchange', this.onDurationChange);\n v.addEventListener('ratechange', this.updatePositionState);\n v.addEventListener('emptied', this.render);\n\n this.vinylEl.addEventListener('pointerdown', this.onPointerDown);\n this.vinylEl.addEventListener('pointermove', this.onPointerMove);\n this.vinylEl.addEventListener('pointerup', this.onPointerUp);\n this.vinylEl.addEventListener('pointercancel', this.onPointerUp);\n this.vinylEl.addEventListener('lostpointercapture', this.onPointerUp);\n // Plağa tık / dokunuş videonun \"boş alana tık\" işleyicilerine düşmesin (oynat/duraklat'ı kendimiz yapıyoruz).\n for (const type of ['click', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'dblclick'] as const) {\n this.vinylEl.addEventListener(type, (e) => e.stopPropagation());\n }\n\n // Videonun hemen üstü: yükleme halkası ve reklam katmanı sahnenin üstünde kalır.\n ctx.layerEl.insertBefore(el, ctx.videoEl.nextSibling);\n this.areaEl = el.querySelector('.hp-audio-area')!;\n // Plak / kapak boyutu JS ile (px): CSS konteyner sorgu birimleri (cqh/cqw) iOS 16 öncesi Safari'de yok, orada\n // boyut kuralı düşüp kapak dev boyutta sola taşıyordu.\n this.resizeObserver = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(() => this.layout()) : null;\n this.resizeObserver?.observe(el);\n this.resizeObserver?.observe(this.areaEl);\n this.refreshLabels();\n }\n\n update(options: AudioOptions): void {\n this.options = options;\n const compact = options.layout === 'compact';\n this.el.setAttribute('data-layout', compact ? 'compact' : 'full');\n // İnce çubukta kapak / plak yok — başlık ve sanatçı kontrol çubuğunda.\n this.ctx.setBarMeta(\n compact ? { title: options.title ?? '', subtitle: [options.artist, options.album].filter(Boolean).join(' · ') } : null\n );\n this.vinyl = compact ? null : resolveVinyl(options.vinyl);\n const cover = options.cover || this.ctx.poster() || '';\n for (const img of [this.backdropImg, this.sleeveImg]) {\n if (cover) img.src = cover;\n else img.removeAttribute('src');\n }\n this.el.toggleAttribute('data-cover', !!cover);\n this.titleEl.textContent = options.title ?? '';\n this.artistEl.textContent = [options.artist, options.album].filter(Boolean).join(' · ');\n this.el.toggleAttribute('data-meta', !!(options.title || options.artist || options.album));\n\n const vinyl = this.vinyl;\n this.el.setAttribute('data-position', vinyl ? vinyl.position : 'none');\n this.el.style.setProperty('--hp-vinyl-size', String(vinyl?.size ?? DEFAULT_SIZE));\n this.vinylEl.hidden = !vinyl;\n // 'center': kılıf yok. Plak kapalıysa yalnızca kapak. Etikette her zaman kapak (yoksa düz renk + başlık).\n this.sleeve.hidden = !!vinyl && vinyl.position === 'center';\n this.disc.setLabel(cover || null, options.title || 'HopeCore');\n this.armHolder.hidden = !vinyl?.tonearm;\n this.vinylEl.toggleAttribute('data-scratch', !!vinyl?.scratch);\n this.vinylEl.tabIndex = vinyl ? 0 : -1;\n\n if (!vinyl?.scratchSound) this.disableSound();\n else if (!this.ctx.videoEl.paused) this.schedulePrepareSound();\n\n this.applyMediaSession();\n this.onDurationChange();\n this.layout();\n this.render();\n if (!this.ctx.videoEl.paused) this.onPlay();\n }\n\n /** Kapak / plak yüksekliği: alan yüksekliğinin `size` katı, genişliğe sığacak kadar (kılıf + yarım plak ≈ 1,46 H). */\n private layout(): void {\n if (!this.el.isConnected) return;\n const w = this.areaEl.clientWidth;\n const h = this.areaEl.clientHeight;\n const size = this.vinyl?.size ?? resolveVinyl(this.options.vinyl)?.size ?? DEFAULT_SIZE;\n const withSleeveAndVinyl = !!this.vinyl && this.vinyl.position !== 'center';\n const deck = Math.max(0, Math.min(size * h, (withSleeveAndVinyl ? 0.62 : 0.9) * w));\n this.el.style.setProperty('--hp-deck-h', `${Math.round(deck * 10) / 10}px`);\n // İlk yerleşim animasyonsuz: plak 0'dan yerine kayarak gelmesin (kayma yalnızca çal / duraklat geçişinde).\n if (deck > 0 && !this.el.hasAttribute('data-laid-out')) {\n requestAnimationFrame(() => requestAnimationFrame(() => this.el.setAttribute('data-laid-out', '')));\n }\n this.el.toggleAttribute('data-short', this.el.clientHeight > 0 && this.el.clientHeight < SHORT_STAGE_PX);\n }\n\n // ── Scratch sesi ────────────────────────────────────────────────────\n\n private loadSound(): Promise<ScratchSound | null> {\n if (this.sound) return Promise.resolve(this.sound);\n this.soundImport ??= import('./ScratchSound')\n .then(({ ScratchSound }) => {\n if (!this.vinyl?.scratchSound || !ScratchSound.isSupported()) {\n this.el.setAttribute('data-scratch-sound', 'unsupported');\n return null;\n }\n this.sound ??= new ScratchSound(this.ctx.videoEl);\n this.sound.onStateChange = (state) => this.el.setAttribute('data-scratch-sound', state);\n return this.sound;\n })\n .catch(() => null)\n .finally(() => {\n this.soundImport = null;\n });\n return this.soundImport;\n }\n\n /** Çalma başlayınca, boşta: sesi önceden çöz ki ilk scratch gecikmesin. */\n private schedulePrepareSound(): void {\n if (!this.vinyl?.scratchSound || this.prepareTimer || this.sound?.ready) return;\n this.prepareTimer = setTimeout(() => {\n this.prepareTimer = null;\n const run = () => void this.loadSound().then((s) => s?.prepare());\n if ('requestIdleCallback' in window) window.requestIdleCallback(run, { timeout: 2000 });\n else run();\n }, 300);\n }\n\n private disableSound(): void {\n if (this.prepareTimer) clearTimeout(this.prepareTimer);\n this.prepareTimer = null;\n this.sound?.destroy();\n this.sound = null;\n this.el.removeAttribute('data-scratch-sound');\n }\n\n refreshLabels(): void {\n this.vinylEl.setAttribute('aria-label', this.ctx.i18n.audioVinyl);\n }\n\n // ── Dönüş ────────────────────────────────────────────────────────────\n\n private get secondsPerTurn(): number {\n return 60 / (this.vinyl?.rpm ?? DEFAULT_RPM);\n }\n\n private angleForTime(t: number): number {\n return ((t / this.secondsPerTurn) * 360) % 360;\n }\n\n private readonly render = (): void => {\n if (!this.vinyl || this.dragging) return;\n this.discEl.style.transform = `rotate(${this.angleForTime(this.ctx.videoEl.currentTime || 0)}deg)`;\n };\n\n private readonly loop = (): void => {\n this.render();\n this.frame = requestAnimationFrame(this.loop);\n };\n\n private readonly onPlay = (): void => {\n this.el.setAttribute('data-playing', '');\n this.schedulePrepareSound();\n cancelAnimationFrame(this.frame);\n if (this.vinyl) this.frame = requestAnimationFrame(this.loop);\n if (this.options.mediaSession !== false && 'mediaSession' in navigator) {\n // Sayfada birden fazla player varsa son çalan sistemin medya kontrollerini alır.\n this.applyMediaSession();\n navigator.mediaSession.playbackState = 'playing';\n }\n };\n\n private readonly onPause = (): void => {\n // Scratch sırasında plak elde tutuluyor — pikap kolu kalkmasın.\n if (!this.dragging) this.el.removeAttribute('data-playing');\n cancelAnimationFrame(this.frame);\n this.render();\n if (this.ownsMediaSession()) navigator.mediaSession.playbackState = 'paused';\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.videoEl;\n if (v.paused) this.render();\n const second = Math.floor(v.currentTime || 0);\n if (second !== this.lastAriaSecond) {\n this.lastAriaSecond = second;\n this.vinylEl.setAttribute('aria-valuenow', String(second));\n }\n const now = performance.now();\n if (now - this.lastPositionState > 1000) this.updatePositionState();\n };\n\n private readonly onDurationChange = (): void => {\n const d = this.ctx.videoEl.duration;\n const finite = Number.isFinite(d) && d > 0;\n if (finite) this.vinylEl.setAttribute('aria-valuemax', String(Math.floor(d)));\n else this.vinylEl.removeAttribute('aria-valuemax');\n // Canlı yayında (süre sonsuz) sarma yok — plak yalnızca döner.\n this.vinylEl.toggleAttribute('data-live', !finite && d === Infinity);\n this.updatePositionState();\n };\n\n // ── Scratch ──────────────────────────────────────────────────────────\n\n private canScratch(): boolean {\n const d = this.ctx.videoEl.duration;\n return !!this.vinyl?.scratch && Number.isFinite(d) && d > 0;\n }\n\n private pointerAngle(e: PointerEvent): number {\n return (Math.atan2(e.clientY - this.center.y, e.clientX - this.center.x) * 180) / Math.PI;\n }\n\n private readonly onPointerDown = (e: PointerEvent): void => {\n if (!this.vinyl || this.dragging) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n const rect = this.vinylEl.getBoundingClientRect();\n this.center = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n this.dragging = true;\n this.dragPointer = e.pointerId;\n this.lastPointerAngle = this.pointerAngle(e);\n this.accum = 0;\n this.moved = false;\n this.dragStartTime = this.ctx.videoEl.currentTime || 0;\n this.dragStartAngle = this.angleForTime(this.dragStartTime);\n this.wasPlaying = !this.ctx.videoEl.paused;\n this.downAt = performance.now();\n // Gerçek plak gibi: elle tutulan plak anında susar (çevirmeye başlamayı beklemeden).\n if (this.wasPlaying && this.canScratch()) this.ctx.videoEl.pause();\n if (this.vinyl.scratchSound && this.canScratch()) {\n // AudioContext yalnızca kullanıcı etkileşimi içinde başlatılabilir — pointerdown'da.\n if (this.sound?.ready) this.sound.start(this.dragStartTime);\n else void this.loadSound().then((s) => s?.prepare());\n }\n try {\n this.vinylEl.setPointerCapture(e.pointerId);\n } catch {\n /* eski tarayıcı */\n }\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n if (!this.dragging || e.pointerId !== this.dragPointer) return;\n e.stopPropagation();\n const angle = this.pointerAngle(e);\n const delta = wrapDegrees(angle - this.lastPointerAngle);\n this.lastPointerAngle = angle;\n if (!this.canScratch()) {\n this.accum += delta;\n if (Math.abs(this.accum) > TAP_DEGREES) this.moved = true;\n return;\n }\n // Başa / sona dayanınca plak daha fazla dönmez.\n const spt = this.secondsPerTurn;\n const duration = this.ctx.videoEl.duration;\n const minAccum = (-this.dragStartTime / spt) * 360;\n const maxAccum = ((duration - this.dragStartTime) / spt) * 360;\n this.accum = Math.min(maxAccum, Math.max(minAccum, this.accum + delta));\n if (!this.moved && Math.abs(this.accum) > TAP_DEGREES) {\n this.moved = true;\n this.el.setAttribute('data-scratching', '');\n }\n if (!this.moved) return;\n this.discEl.style.transform = `rotate(${this.dragStartAngle + this.accum}deg)`;\n this.pendingSeek = this.dragStartTime + (this.accum / 360) * spt;\n this.sound?.setTarget(this.pendingSeek);\n if (!this.seekFrame) this.seekFrame = requestAnimationFrame(this.flushSeek);\n };\n\n private readonly flushSeek = (): void => {\n this.seekFrame = 0;\n if (this.pendingSeek === null) return;\n this.ctx.videoEl.currentTime = this.pendingSeek;\n this.pendingSeek = null;\n };\n\n private readonly onPointerUp = (e: PointerEvent): void => {\n if (!this.dragging || e.pointerId !== this.dragPointer) return;\n e.stopPropagation();\n this.dragging = false;\n this.dragPointer = -1;\n this.el.removeAttribute('data-scratching');\n this.sound?.stop();\n if (this.seekFrame) {\n cancelAnimationFrame(this.seekFrame);\n this.flushSeek();\n }\n if (!this.moved && this.canScratch() && this.wasPlaying) {\n // Çalarken basıldı (ve basınca sustu): kısa dokunuş = duraklat (öyle kalır); tutup bırakmak = devam.\n const held = performance.now() - this.downAt >= TAP_MS;\n // Basış iptal olduysa (ör. dokunmatikte sayfa kaydırması) kullanıcı duraklatmak istememiştir — devam.\n if (held || e.type !== 'pointerup') this.ctx.play();\n else {\n this.el.removeAttribute('data-playing'); // basılıyken inik tutulan pikap kolu kalksın\n this.render();\n }\n return;\n }\n if (!this.moved) {\n if (e.type === 'pointerup') this.ctx.togglePlay();\n return;\n }\n if (this.wasPlaying) this.ctx.play();\n else this.render();\n };\n\n // ── Media Session ───────────────────────────────────────────────────\n\n private ownsMediaSession(): boolean {\n return this.options.mediaSession !== false && 'mediaSession' in navigator && AudioStage.sessionOwner === this;\n }\n\n private static sessionOwner: AudioStage | null = null;\n\n private applyMediaSession(): void {\n if (this.options.mediaSession === false || !('mediaSession' in navigator) || typeof MediaMetadata === 'undefined') return;\n // Başka bir player çalıyorsa onun bilgilerini ezme — bu player çalmaya başlayınca alır.\n const owner = AudioStage.sessionOwner;\n if (owner && owner !== this && !owner.ctx.videoEl.paused && this.ctx.videoEl.paused) return;\n AudioStage.sessionOwner = this;\n const o = this.options;\n const cover = o.cover || this.ctx.poster();\n const ms = navigator.mediaSession;\n ms.metadata = new MediaMetadata({\n title: o.title ?? '',\n artist: o.artist ?? '',\n album: o.album ?? '',\n artwork: cover ? [{ src: new URL(cover, document.baseURI).href }] : [],\n });\n const v = this.ctx.videoEl;\n const set = (action: MediaSessionAction, handler: MediaSessionActionHandler | null): void => {\n try {\n ms.setActionHandler(action, handler);\n } catch {\n /* tarayıcı bu eylemi desteklemiyor */\n }\n };\n set('play', () => this.ctx.play());\n set('pause', () => v.pause());\n set('seekbackward', (d) => (v.currentTime = Math.max(0, v.currentTime - (d.seekOffset ?? MEDIA_SESSION_SEEK_SECONDS))));\n set('seekforward', (d) => (v.currentTime = Math.min(v.duration || Infinity, v.currentTime + (d.seekOffset ?? MEDIA_SESSION_SEEK_SECONDS))));\n set('seekto', (d) => {\n if (typeof d.seekTime === 'number') v.currentTime = d.seekTime;\n });\n this.updatePositionState();\n }\n\n private readonly updatePositionState = (): void => {\n if (!this.ownsMediaSession()) return;\n this.lastPositionState = performance.now();\n const v = this.ctx.videoEl;\n const duration = v.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n try {\n navigator.mediaSession.setPositionState({\n duration,\n playbackRate: v.playbackRate || 1,\n position: Math.min(duration, Math.max(0, v.currentTime || 0)),\n });\n } catch {\n /* geçersiz durum (ör. kaynak değişirken) */\n }\n };\n\n private releaseMediaSession(): void {\n if (AudioStage.sessionOwner !== this) return;\n AudioStage.sessionOwner = null;\n if (!('mediaSession' in navigator)) return;\n const ms = navigator.mediaSession;\n ms.metadata = null;\n for (const action of ['play', 'pause', 'seekbackward', 'seekforward', 'seekto'] as MediaSessionAction[]) {\n try {\n ms.setActionHandler(action, null);\n } catch {\n /* desteklenmiyor */\n }\n }\n }\n\n destroy(): void {\n cancelAnimationFrame(this.frame);\n cancelAnimationFrame(this.seekFrame);\n const v = this.ctx.videoEl;\n v.removeEventListener('play', this.onPlay);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onPause);\n v.removeEventListener('seeked', this.render);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('durationchange', this.onDurationChange);\n v.removeEventListener('ratechange', this.updatePositionState);\n v.removeEventListener('emptied', this.render);\n this.releaseMediaSession();\n this.disableSound();\n this.resizeObserver?.disconnect();\n this.ctx.setBarMeta(null);\n this.el.remove();\n }\n}\n","import { AudioStage, type AudioStageContext } from './AudioStage';\nimport type { AudioOptions } from '../../types';\n\n/** Ses modu sahnesini kurar (kapak, plak, scratch, sistem medya kontrolleri). */\nexport function installAudioStage(ctx: AudioStageContext, options: AudioOptions): AudioStage {\n const stage = new AudioStage(ctx);\n stage.update(options);\n return stage;\n}\n\nexport { AudioStage };\nexport type { AudioStageContext };\n"],"names":["SVG_NS","uid","grooves","out","r","alpha","createDisc","id","wrap","svg","image","text","cover","label","createTonearm","DEFAULT_SIZE","DEFAULT_RPM","SHORT_STAGE_PX","TAP_DEGREES","TAP_MS","MEDIA_SESSION_SEEK_SECONDS","resolveVinyl","v","o","size","rpm","wrapDegrees","d","_AudioStage","ctx","__publicField","second","finite","e","_a","rect","s","angle","delta","spt","duration","minAccum","maxAccum","_b","el","img","type","options","compact","vinyl","w","h","withSleeveAndVinyl","deck","ScratchSound","state","run","owner","ms","set","action","handler","AudioStage","installAudioStage","stage"],"mappings":";;;AAKA,MAAMA,IAAS;AACf,IAAIC,IAAM;AAEV,SAASC,IAAkB;AACvB,MAAIC,IAAM;AAEV,WAASC,IAAI,IAAIA,KAAK,IAAIA,KAAK,MAAM;AAEjC,UAAMC,IADM,KAAK,IAAID,IAAI,EAAE,IAAI,OAAO,KAAK,IAAIA,IAAI,EAAE,IAAI,MACrC,IAAI,QAAUA,IAAI,IAAK,IAAK;AAChD,IAAAD,KAAO,gCAAgCC,CAAC,0CAA0CC,EAAM,QAAQ,CAAC,CAAC;AAAA,EACtG;AACA,SAAOF;AACX;AAGO,SAASG,IAAwF;AACpG,QAAMC,IAAK,YAAY,EAAEN,CAAG,IACtBO,IAAO,SAAS,cAAc,KAAK;AACzC,EAAAA,EAAK,YAAY;AAAA,cACPR,CAAM;AAAA;AAAA,0BAEMO,CAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMRA,CAAE;AAAA;AAAA,kDAE4BA,CAAE;AAAA,IAChDL,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA,8HAKiHK,CAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ5H,QAAME,IAAMD,EAAK,mBACXE,IAAQD,EAAI,cAAc,iBAAiB,GAC3CE,IAAOF,EAAI,cAAc,gBAAgB;AAC/C,SAAO;AAAA,IACH,IAAIA;AAAA,IACJ,SAASG,GAAOC,GAAO;AACnB,MAAID,KACAF,EAAM,aAAa,QAAQE,CAAK,GAChCF,EAAM,MAAM,UAAU,OAEtBA,EAAM,gBAAgB,MAAM,GAC5BA,EAAM,MAAM,UAAU,SAG1BC,EAAK,cAAcC,IAAQ,KAAKC,EAAM,MAAM,GAAG,EAAE;AAAA,IACrD;AAAA,EAAA;AAER;AAGO,SAASC,IAA+B;AAC3C,QAAMN,IAAO,SAAS,cAAc,KAAK;AACzC,SAAAA,EAAK,YAAY;AAAA,cACPR,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,SAMTQ,EAAK;AAChB;AC3DA,MAAMO,IAAe,MACfC,IAAc,MAAM,GAEpBC,IAAiB,KAGjBC,IAAc,GAEdC,IAAS,KACTC,IAA6B;AAInC,SAASC,EAAaC,GAAgD;AAClE,MAAIA,MAAM,GAAO,QAAO;AACxB,QAAMC,IAAID,MAAM,MAAQA,MAAM,SAAY,CAAA,IAAKA,GACzCE,IAAO,OAAOD,EAAE,QAAS,YAAY,OAAO,SAASA,EAAE,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKA,EAAE,IAAI,CAAC,IAAIR,GACpGU,IAAM,OAAOF,EAAE,OAAQ,YAAYA,EAAE,MAAM,IAAIA,EAAE,MAAMP;AAC7D,SAAO;AAAA,IACH,UAAUO,EAAE,aAAa,YAAYA,EAAE,aAAa,SAASA,EAAE,WAAW;AAAA,IAC1E,MAAAC;AAAA,IACA,KAAAC;AAAA,IACA,SAASF,EAAE,YAAY;AAAA,IACvB,cAAcA,EAAE,iBAAiB;AAAA,IACjC,SAASA,EAAE,YAAY;AAAA,EAAA;AAE/B;AAGA,SAASG,EAAYC,GAAmB;AACpC,WAAWA,IAAI,OAAO,MAAO,OAAO,MAAO;AAC/C;AAOO,MAAMC,IAAN,MAAMA,EAAW;AAAA,EAsCpB,YAA6BC,GAAwB;AArC5C,IAAAC,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAET,IAAAA,EAAA,iBAAwB,CAAA;AACxB,IAAAA,EAAA,eAA8B;AAC9B,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,2BAAoB;AAGpB;AAAA,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,gBAAS,EAAE,GAAG,GAAG,GAAG,EAAA;AACpB,IAAAA,EAAA,0BAAmB;AACnB,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,qBAA6B;AAE7B;AAAA,IAAAA,EAAA,eAA6B;AAC7B,IAAAA,EAAA,qBAAmD;AACnD,IAAAA,EAAA,sBAAqD;AAiL5C,IAAAA,EAAA,gBAAS,MAAY;AAClC,MAAI,CAAC,KAAK,SAAS,KAAK,aACxB,KAAK,OAAO,MAAM,YAAY,UAAU,KAAK,aAAa,KAAK,IAAI,QAAQ,eAAe,CAAC,CAAC;AAAA,IAChG;AAEiB,IAAAA,EAAA,cAAO,MAAY;AAChC,WAAK,OAAA,GACL,KAAK,QAAQ,sBAAsB,KAAK,IAAI;AAAA,IAChD;AAEiB,IAAAA,EAAA,gBAAS,MAAY;AAClC,WAAK,GAAG,aAAa,gBAAgB,EAAE,GACvC,KAAK,qBAAA,GACL,qBAAqB,KAAK,KAAK,GAC3B,KAAK,UAAO,KAAK,QAAQ,sBAAsB,KAAK,IAAI,IACxD,KAAK,QAAQ,iBAAiB,MAAS,kBAAkB,cAEzD,KAAK,kBAAA,GACL,UAAU,aAAa,gBAAgB;AAAA,IAE/C;AAEiB,IAAAA,EAAA,iBAAU,MAAY;AAEnC,MAAK,KAAK,YAAU,KAAK,GAAG,gBAAgB,cAAc,GAC1D,qBAAqB,KAAK,KAAK,GAC/B,KAAK,OAAA,GACD,KAAK,iBAAA,MAAoB,UAAU,aAAa,gBAAgB;AAAA,IACxE;AAEiB,IAAAA,EAAA,sBAAe,MAAY;AACxC,YAAMR,IAAI,KAAK,IAAI;AACnB,MAAIA,EAAE,UAAQ,KAAK,OAAA;AACnB,YAAMS,IAAS,KAAK,MAAMT,EAAE,eAAe,CAAC;AAC5C,MAAIS,MAAW,KAAK,mBAChB,KAAK,iBAAiBA,GACtB,KAAK,QAAQ,aAAa,iBAAiB,OAAOA,CAAM,CAAC,IAEjD,YAAY,IAAA,IACd,KAAK,oBAAoB,YAAW,oBAAA;AAAA,IAClD;AAEiB,IAAAD,EAAA,0BAAmB,MAAY;AAC5C,YAAMH,IAAI,KAAK,IAAI,QAAQ,UACrBK,IAAS,OAAO,SAASL,CAAC,KAAKA,IAAI;AACzC,MAAIK,IAAQ,KAAK,QAAQ,aAAa,iBAAiB,OAAO,KAAK,MAAML,CAAC,CAAC,CAAC,IACvE,KAAK,QAAQ,gBAAgB,eAAe,GAEjD,KAAK,QAAQ,gBAAgB,aAAa,CAACK,KAAUL,MAAM,KAAQ,GACnE,KAAK,oBAAA;AAAA,IACT;AAaiB,IAAAG,EAAA,uBAAgB,CAACG,MAA0B;ADxUhE,UAAAC;AC0UQ,UADI,CAAC,KAAK,SAAS,KAAK,YACpBD,EAAE,gBAAgB,WAAWA,EAAE,WAAW,EAAG;AACjD,MAAAA,EAAE,gBAAA,GACFA,EAAE,eAAA;AACF,YAAME,IAAO,KAAK,QAAQ,sBAAA;AAC1B,WAAK,SAAS,EAAE,GAAGA,EAAK,OAAOA,EAAK,QAAQ,GAAG,GAAGA,EAAK,MAAMA,EAAK,SAAS,EAAA,GAC3E,KAAK,WAAW,IAChB,KAAK,cAAcF,EAAE,WACrB,KAAK,mBAAmB,KAAK,aAAaA,CAAC,GAC3C,KAAK,QAAQ,GACb,KAAK,QAAQ,IACb,KAAK,gBAAgB,KAAK,IAAI,QAAQ,eAAe,GACrD,KAAK,iBAAiB,KAAK,aAAa,KAAK,aAAa,GAC1D,KAAK,aAAa,CAAC,KAAK,IAAI,QAAQ,QACpC,KAAK,SAAS,YAAY,IAAA,GAEtB,KAAK,cAAc,KAAK,WAAA,KAAc,KAAK,IAAI,QAAQ,MAAA,GACvD,KAAK,MAAM,gBAAgB,KAAK,kBAE5BC,IAAA,KAAK,UAAL,QAAAA,EAAY,aAAY,MAAM,MAAM,KAAK,aAAa,IAChD,KAAK,YAAY,KAAK,CAACE,MAAMA,KAAA,gBAAAA,EAAG,SAAS;AAEvD,UAAI;AACA,aAAK,QAAQ,kBAAkBH,EAAE,SAAS;AAAA,MAC9C,QAAQ;AAAA,MAER;AAAA,IACJ;AAEiB,IAAAH,EAAA,uBAAgB,CAACG,MAA0B;ADtWhE,UAAAC;ACuWQ,UAAI,CAAC,KAAK,YAAYD,EAAE,cAAc,KAAK,YAAa;AACxD,MAAAA,EAAE,gBAAA;AACF,YAAMI,IAAQ,KAAK,aAAaJ,CAAC,GAC3BK,IAAQZ,EAAYW,IAAQ,KAAK,gBAAgB;AAEvD,UADA,KAAK,mBAAmBA,GACpB,CAAC,KAAK,cAAc;AACpB,aAAK,SAASC,GACV,KAAK,IAAI,KAAK,KAAK,IAAIpB,WAAkB,QAAQ;AACrD;AAAA,MACJ;AAEA,YAAMqB,IAAM,KAAK,gBACXC,IAAW,KAAK,IAAI,QAAQ,UAC5BC,IAAY,CAAC,KAAK,gBAAgBF,IAAO,KACzCG,KAAaF,IAAW,KAAK,iBAAiBD,IAAO;AAM3D,MALA,KAAK,QAAQ,KAAK,IAAIG,GAAU,KAAK,IAAID,GAAU,KAAK,QAAQH,CAAK,CAAC,GAClE,CAAC,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,IAAIpB,MACtC,KAAK,QAAQ,IACb,KAAK,GAAG,aAAa,mBAAmB,EAAE,IAEzC,KAAK,UACV,KAAK,OAAO,MAAM,YAAY,UAAU,KAAK,iBAAiB,KAAK,KAAK,QACxE,KAAK,cAAc,KAAK,gBAAiB,KAAK,QAAQ,MAAOqB,IAC7DL,IAAA,KAAK,UAAL,QAAAA,EAAY,UAAU,KAAK,cACtB,KAAK,mBAAgB,YAAY,sBAAsB,KAAK,SAAS;AAAA,IAC9E;AAEiB,IAAAJ,EAAA,mBAAY,MAAY;AAErC,MADA,KAAK,YAAY,GACb,KAAK,gBAAgB,SACzB,KAAK,IAAI,QAAQ,cAAc,KAAK,aACpC,KAAK,cAAc;AAAA,IACvB;AAEiB,IAAAA,EAAA,qBAAc,CAACG,MAA0B;ADzY9D,UAAAC;AC0YQ,UAAI,GAAC,KAAK,YAAYD,EAAE,cAAc,KAAK,cAU3C;AAAA,YATAA,EAAE,gBAAA,GACF,KAAK,WAAW,IAChB,KAAK,cAAc,IACnB,KAAK,GAAG,gBAAgB,iBAAiB,IACzCC,IAAA,KAAK,UAAL,QAAAA,EAAY,QACR,KAAK,cACL,qBAAqB,KAAK,SAAS,GACnC,KAAK,UAAA,IAEL,CAAC,KAAK,SAAS,KAAK,WAAA,KAAgB,KAAK,YAAY;AAIrD,UAFa,YAAY,IAAA,IAAQ,KAAK,UAAUf,KAEpCc,EAAE,SAAS,cAAa,KAAK,IAAI,KAAA,KAEzC,KAAK,GAAG,gBAAgB,cAAc,GACtC,KAAK,OAAA;AAET;AAAA,QACJ;AACA,YAAI,CAAC,KAAK,OAAO;AACb,UAAIA,EAAE,SAAS,eAAa,KAAK,IAAI,WAAA;AACrC;AAAA,QACJ;AACA,QAAI,KAAK,aAAY,KAAK,IAAI,KAAA,SACpB,OAAA;AAAA;AAAA,IACd;AA2CiB,IAAAH,EAAA,6BAAsB,MAAY;AAC/C,UAAI,CAAC,KAAK,mBAAoB;AAC9B,WAAK,oBAAoB,YAAY,IAAA;AACrC,YAAMR,IAAI,KAAK,IAAI,SACbkB,IAAWlB,EAAE;AACnB,UAAI,GAAC,OAAO,SAASkB,CAAQ,KAAKA,KAAY;AAC9C,YAAI;AACA,oBAAU,aAAa,iBAAiB;AAAA,YACpC,UAAAA;AAAA,YACA,cAAclB,EAAE,gBAAgB;AAAA,YAChC,UAAU,KAAK,IAAIkB,GAAU,KAAK,IAAI,GAAGlB,EAAE,eAAe,CAAC,CAAC;AAAA,UAAA,CAC/D;AAAA,QACL,QAAQ;AAAA,QAER;AAAA,IACJ;AD/dJ,QAAAY,GAAAS;AC0FiC,SAAA,MAAAd;AACzB,UAAMe,IAAK,SAAS,cAAc,KAAK;AACvC,IAAAA,EAAG,YAAY,YACfA,EAAG,aAAa,QAAQ,aAAa,GACrCA,EAAG,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAaf,KAAK,KAAKA,GACV,KAAK,cAAcA,EAAG,cAAc,wBAAwB,GAC5D,KAAK,SAASA,EAAG,cAAc,kBAAkB,GACjD,KAAK,YAAY,KAAK,OAAO,cAAc,KAAK,GAChD,KAAK,UAAUA,EAAG,cAAc,WAAW,GAC3C,KAAK,SAASA,EAAG,cAAc,gBAAgB,GAC/C,KAAK,YAAYA,EAAG,cAAc,oBAAoB,GACtD,KAAK,UAAUA,EAAG,cAAc,iBAAiB,GACjD,KAAK,WAAWA,EAAG,cAAc,kBAAkB,GACnD,KAAK,OAAOtC,EAAA,GACZ,KAAK,OAAO,YAAY,KAAK,KAAK,EAAE,GACpCsC,EAAG,cAAc,aAAa,EAAG,YAAY9B,GAAe;AAE5D,eAAW+B,KAAO,CAAC,KAAK,aAAa,KAAK,SAAS;AAC/C,MAAAA,EAAI,iBAAiB,SAAS,MAAMA,EAAI,gBAAgB,KAAK,CAAC;AAGlE,UAAMvB,IAAIO,EAAI;AACd,IAAAP,EAAE,iBAAiB,QAAQ,KAAK,MAAM,GACtCA,EAAE,iBAAiB,SAAS,KAAK,OAAO,GACxCA,EAAE,iBAAiB,SAAS,KAAK,OAAO,GACxCA,EAAE,iBAAiB,UAAU,KAAK,MAAM,GACxCA,EAAE,iBAAiB,cAAc,KAAK,YAAY,GAClDA,EAAE,iBAAiB,kBAAkB,KAAK,gBAAgB,GAC1DA,EAAE,iBAAiB,cAAc,KAAK,mBAAmB,GACzDA,EAAE,iBAAiB,WAAW,KAAK,MAAM,GAEzC,KAAK,QAAQ,iBAAiB,eAAe,KAAK,aAAa,GAC/D,KAAK,QAAQ,iBAAiB,eAAe,KAAK,aAAa,GAC/D,KAAK,QAAQ,iBAAiB,aAAa,KAAK,WAAW,GAC3D,KAAK,QAAQ,iBAAiB,iBAAiB,KAAK,WAAW,GAC/D,KAAK,QAAQ,iBAAiB,sBAAsB,KAAK,WAAW;AAEpE,eAAWwB,KAAQ,CAAC,SAAS,aAAa,WAAW,cAAc,YAAY,UAAU;AACrF,WAAK,QAAQ,iBAAiBA,GAAM,CAACb,MAAMA,EAAE,iBAAiB;AAIlE,IAAAJ,EAAI,QAAQ,aAAae,GAAIf,EAAI,QAAQ,WAAW,GACpD,KAAK,SAASe,EAAG,cAAc,gBAAgB,GAG/C,KAAK,iBAAiB,OAAO,iBAAmB,MAAc,IAAI,eAAe,MAAM,KAAK,OAAA,CAAQ,IAAI,OACxGV,IAAA,KAAK,mBAAL,QAAAA,EAAqB,QAAQU,KAC7BD,IAAA,KAAK,mBAAL,QAAAA,EAAqB,QAAQ,KAAK,SAClC,KAAK,cAAA;AAAA,EACT;AAAA,EAEA,OAAOI,GAA6B;AAChC,SAAK,UAAUA;AACf,UAAMC,IAAUD,EAAQ,WAAW;AACnC,SAAK,GAAG,aAAa,eAAeC,IAAU,YAAY,MAAM,GAEhE,KAAK,IAAI;AAAA,MACLA,IAAU,EAAE,OAAOD,EAAQ,SAAS,IAAI,UAAU,CAACA,EAAQ,QAAQA,EAAQ,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK,MAAM;AAAA,IAAA,GAEtH,KAAK,QAAQC,IAAU,OAAO3B,EAAa0B,EAAQ,KAAK;AACxD,UAAMnC,IAAQmC,EAAQ,SAAS,KAAK,IAAI,YAAY;AACpD,eAAWF,KAAO,CAAC,KAAK,aAAa,KAAK,SAAS;AAC/C,MAAIjC,MAAW,MAAMA,IAChBiC,EAAI,gBAAgB,KAAK;AAElC,SAAK,GAAG,gBAAgB,cAAc,CAAC,CAACjC,CAAK,GAC7C,KAAK,QAAQ,cAAcmC,EAAQ,SAAS,IAC5C,KAAK,SAAS,cAAc,CAACA,EAAQ,QAAQA,EAAQ,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK,GACtF,KAAK,GAAG,gBAAgB,aAAa,CAAC,EAAEA,EAAQ,SAASA,EAAQ,UAAUA,EAAQ,MAAM;AAEzF,UAAME,IAAQ,KAAK;AACnB,SAAK,GAAG,aAAa,iBAAiBA,IAAQA,EAAM,WAAW,MAAM,GACrE,KAAK,GAAG,MAAM,YAAY,mBAAmB,QAAOA,KAAA,gBAAAA,EAAO,SAAQlC,CAAY,CAAC,GAChF,KAAK,QAAQ,SAAS,CAACkC,GAEvB,KAAK,OAAO,SAAS,CAAC,CAACA,KAASA,EAAM,aAAa,UACnD,KAAK,KAAK,SAASrC,KAAS,MAAMmC,EAAQ,SAAS,UAAU,GAC7D,KAAK,UAAU,SAAS,EAACE,KAAA,QAAAA,EAAO,UAChC,KAAK,QAAQ,gBAAgB,gBAAgB,CAAC,EAACA,KAAA,QAAAA,EAAO,QAAO,GAC7D,KAAK,QAAQ,WAAWA,IAAQ,IAAI,IAE/BA,KAAA,QAAAA,EAAO,eACF,KAAK,IAAI,QAAQ,eAAa,qBAAA,IADd,KAAK,aAAA,GAG/B,KAAK,kBAAA,GACL,KAAK,iBAAA,GACL,KAAK,OAAA,GACL,KAAK,OAAA,GACA,KAAK,IAAI,QAAQ,eAAa,OAAA;AAAA,EACvC;AAAA;AAAA,EAGQ,SAAe;ADpM3B,QAAAf,GAAAS;ACqMQ,QAAI,CAAC,KAAK,GAAG,YAAa;AAC1B,UAAMO,IAAI,KAAK,OAAO,aAChBC,IAAI,KAAK,OAAO,cAChB3B,MAAOU,IAAA,KAAK,UAAL,gBAAAA,EAAY,WAAQS,IAAAtB,EAAa,KAAK,QAAQ,KAAK,MAA/B,gBAAAsB,EAAkC,SAAQ5B,GACrEqC,IAAqB,CAAC,CAAC,KAAK,SAAS,KAAK,MAAM,aAAa,UAC7DC,IAAO,KAAK,IAAI,GAAG,KAAK,IAAI7B,IAAO2B,IAAIC,IAAqB,OAAO,OAAOF,CAAC,CAAC;AAClF,SAAK,GAAG,MAAM,YAAY,eAAe,GAAG,KAAK,MAAMG,IAAO,EAAE,IAAI,EAAE,IAAI,GAEtEA,IAAO,KAAK,CAAC,KAAK,GAAG,aAAa,eAAe,KACjD,sBAAsB,MAAM,sBAAsB,MAAM,KAAK,GAAG,aAAa,iBAAiB,EAAE,CAAC,CAAC,GAEtG,KAAK,GAAG,gBAAgB,cAAc,KAAK,GAAG,eAAe,KAAK,KAAK,GAAG,eAAepC,CAAc;AAAA,EAC3G;AAAA;AAAA,EAIQ,YAA0C;AAC9C,WAAI,KAAK,QAAc,QAAQ,QAAQ,KAAK,KAAK,KACjD,KAAK,gBAAL,KAAK,cAAgB,OAAO,4BAAgB,EACvC,KAAK,CAAC,EAAE,cAAAqC,QAAmB;ADxNxC,UAAApB;ACyNgB,aAAI,GAACA,IAAA,KAAK,UAAL,QAAAA,EAAY,iBAAgB,CAACoB,EAAa,iBAC3C,KAAK,GAAG,aAAa,sBAAsB,aAAa,GACjD,SAEX,KAAK,UAAL,KAAK,QAAU,IAAIA,EAAa,KAAK,IAAI,OAAO,IAChD,KAAK,MAAM,gBAAgB,CAACC,MAAU,KAAK,GAAG,aAAa,sBAAsBA,CAAK,GAC/E,KAAK;AAAA,IAChB,CAAC,EACA,MAAM,MAAM,IAAI,EAChB,QAAQ,MAAM;AACX,WAAK,cAAc;AAAA,IACvB,CAAC,IACE,KAAK;AAAA,EAChB;AAAA;AAAA,EAGQ,uBAA6B;ADzOzC,QAAArB,GAAAS;AC0OQ,IAAI,GAACT,IAAA,KAAK,UAAL,QAAAA,EAAY,iBAAgB,KAAK,iBAAgBS,IAAA,KAAK,UAAL,QAAAA,EAAY,UAClE,KAAK,eAAe,WAAW,MAAM;AACjC,WAAK,eAAe;AACpB,YAAMa,IAAM,MAAM,KAAK,KAAK,UAAA,EAAY,KAAK,CAACpB,MAAMA,KAAA,gBAAAA,EAAG,SAAS;AAChE,MAAI,yBAAyB,SAAQ,OAAO,oBAAoBoB,GAAK,EAAE,SAAS,KAAM,IACjFA,EAAA;AAAA,IACT,GAAG,GAAG;AAAA,EACV;AAAA,EAEQ,eAAqB;ADnPjC,QAAAtB;ACoPQ,IAAI,KAAK,gBAAc,aAAa,KAAK,YAAY,GACrD,KAAK,eAAe,OACpBA,IAAA,KAAK,UAAL,QAAAA,EAAY,WACZ,KAAK,QAAQ,MACb,KAAK,GAAG,gBAAgB,oBAAoB;AAAA,EAChD;AAAA,EAEA,gBAAsB;AAClB,SAAK,QAAQ,aAAa,cAAc,KAAK,IAAI,KAAK,UAAU;AAAA,EACpE;AAAA;AAAA,EAIA,IAAY,iBAAyB;ADjQzC,QAAAA;ACkQQ,WAAO,QAAMA,IAAA,KAAK,UAAL,gBAAAA,EAAY,QAAOlB;AAAA,EACpC;AAAA,EAEQ,aAAa,GAAmB;AACpC,WAAS,IAAI,KAAK,iBAAkB,MAAO;AAAA,EAC/C;AAAA;AAAA,EAwDQ,aAAsB;AD/TlC,QAAAkB;ACgUQ,UAAMP,IAAI,KAAK,IAAI,QAAQ;AAC3B,WAAO,CAAC,GAACO,IAAA,KAAK,UAAL,QAAAA,EAAY,YAAW,OAAO,SAASP,CAAC,KAAKA,IAAI;AAAA,EAC9D;AAAA,EAEQ,aAAaM,GAAyB;AAC1C,WAAQ,KAAK,MAAMA,EAAE,UAAU,KAAK,OAAO,GAAGA,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,MAAO,KAAK;AAAA,EAC3F;AAAA;AAAA,EAmGQ,mBAA4B;AAChC,WAAO,KAAK,QAAQ,iBAAiB,MAAS,kBAAkB,aAAaL,EAAW,iBAAiB;AAAA,EAC7G;AAAA,EAIQ,oBAA0B;AAC9B,QAAI,KAAK,QAAQ,iBAAiB,MAAS,EAAE,kBAAkB,cAAc,OAAO,gBAAkB,IAAa;AAEnH,UAAM6B,IAAQ7B,EAAW;AACzB,QAAI6B,KAASA,MAAU,QAAQ,CAACA,EAAM,IAAI,QAAQ,UAAU,KAAK,IAAI,QAAQ,OAAQ;AACrF,IAAA7B,EAAW,eAAe;AAC1B,UAAML,IAAI,KAAK,SACTX,IAAQW,EAAE,SAAS,KAAK,IAAI,OAAA,GAC5BmC,IAAK,UAAU;AACrB,IAAAA,EAAG,WAAW,IAAI,cAAc;AAAA,MAC5B,OAAOnC,EAAE,SAAS;AAAA,MAClB,QAAQA,EAAE,UAAU;AAAA,MACpB,OAAOA,EAAE,SAAS;AAAA,MAClB,SAASX,IAAQ,CAAC,EAAE,KAAK,IAAI,IAAIA,GAAO,SAAS,OAAO,EAAE,KAAA,CAAM,IAAI,CAAA;AAAA,IAAC,CACxE;AACD,UAAMU,IAAI,KAAK,IAAI,SACbqC,IAAM,CAACC,GAA4BC,MAAoD;AACzF,UAAI;AACA,QAAAH,EAAG,iBAAiBE,GAAQC,CAAO;AAAA,MACvC,QAAQ;AAAA,MAER;AAAA,IACJ;AACA,IAAAF,EAAI,QAAQ,MAAM,KAAK,IAAI,MAAM,GACjCA,EAAI,SAAS,MAAMrC,EAAE,MAAA,CAAO,GAC5BqC,EAAI,gBAAgB,CAAChC,MAAOL,EAAE,cAAc,KAAK,IAAI,GAAGA,EAAE,eAAeK,EAAE,cAAcP,EAA2B,CAAE,GACtHuC,EAAI,eAAe,CAAChC,MAAOL,EAAE,cAAc,KAAK,IAAIA,EAAE,YAAY,OAAUA,EAAE,eAAeK,EAAE,cAAcP,EAA2B,CAAE,GAC1IuC,EAAI,UAAU,CAAChC,MAAM;AACjB,MAAI,OAAOA,EAAE,YAAa,aAAUL,EAAE,cAAcK,EAAE;AAAA,IAC1D,CAAC,GACD,KAAK,oBAAA;AAAA,EACT;AAAA,EAmBQ,sBAA4B;AAGhC,QAFIC,EAAW,iBAAiB,SAChCA,EAAW,eAAe,MACtB,EAAE,kBAAkB,YAAY;AACpC,UAAM8B,IAAK,UAAU;AACrB,IAAAA,EAAG,WAAW;AACd,eAAWE,KAAU,CAAC,QAAQ,SAAS,gBAAgB,eAAe,QAAQ;AAC1E,UAAI;AACA,QAAAF,EAAG,iBAAiBE,GAAQ,IAAI;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,EAER;AAAA,EAEA,UAAgB;ADhfpB,QAAA1B;ACifQ,yBAAqB,KAAK,KAAK,GAC/B,qBAAqB,KAAK,SAAS;AACnC,UAAMZ,IAAI,KAAK,IAAI;AACnB,IAAAA,EAAE,oBAAoB,QAAQ,KAAK,MAAM,GACzCA,EAAE,oBAAoB,SAAS,KAAK,OAAO,GAC3CA,EAAE,oBAAoB,SAAS,KAAK,OAAO,GAC3CA,EAAE,oBAAoB,UAAU,KAAK,MAAM,GAC3CA,EAAE,oBAAoB,cAAc,KAAK,YAAY,GACrDA,EAAE,oBAAoB,kBAAkB,KAAK,gBAAgB,GAC7DA,EAAE,oBAAoB,cAAc,KAAK,mBAAmB,GAC5DA,EAAE,oBAAoB,WAAW,KAAK,MAAM,GAC5C,KAAK,oBAAA,GACL,KAAK,aAAA,IACLY,IAAA,KAAK,mBAAL,QAAAA,EAAqB,cACrB,KAAK,IAAI,WAAW,IAAI,GACxB,KAAK,GAAG,OAAA;AAAA,EACZ;AACJ;AArFIJ,EAzXSF,GAyXM,gBAAkC;AAzX9C,IAAMkC,IAANlC;ACrDA,SAASmC,EAAkBlC,GAAwBkB,GAAmC;AACzF,QAAMiB,IAAQ,IAAIF,EAAWjC,CAAG;AAChC,SAAAmC,EAAM,OAAOjB,CAAO,GACbiB;AACX;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var m = Object.defineProperty;
|
|
2
2
|
var v = (r, t, e) => t in r ? m(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;
|
|
3
3
|
var n = (r, t, e) => v(r, typeof t != "symbol" ? t + "" : t, e);
|
|
4
|
-
import { f as E } from "./index-
|
|
4
|
+
import { f as E } from "./index-Dz0E1YPE.js";
|
|
5
5
|
class u {
|
|
6
6
|
constructor(t, e) {
|
|
7
7
|
n(this, "chapters", []);
|
|
@@ -60,4 +60,4 @@ export {
|
|
|
60
60
|
u as Segments,
|
|
61
61
|
g as installSegments
|
|
62
62
|
};
|
|
63
|
-
//# sourceMappingURL=index-
|
|
63
|
+
//# sourceMappingURL=index-C2c71cGP.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-nvfNBIM_.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-C2c71cGP.js","sources":["../../src/plugins/segments/Segments.ts","../../src/plugins/segments/index.ts"],"sourcesContent":["import type { SegmentItem } from '../../types';\nimport type { SeekBarChapterRange } from '../../controls/SeekBar';\nimport { formatTime } from '../../utils/format-time';\n\nexport interface SegmentsPlayerContext {\n videoEl: HTMLVideoElement;\n /** Chapter modunu destekleyen seek bar — parçalara bölme/zaman eşlemesi onda. */\n seekBar: {\n readonly el: HTMLElement;\n setChapters(ranges: SeekBarChapterRange[]): HTMLElement[];\n suppressHoverTime(key: string, suppressed: boolean): void;\n clearChapters(): void;\n ratioAtClientX(clientX: number): number;\n };\n}\n\ninterface Chapter {\n start: number;\n end: number;\n text?: string;\n color?: string;\n}\n\n/**\n * YouTube tarzı bölümler: seek bar parçalara bölünür (SeekBar.setChapters), hover'da bölüm adı + zaman.\n * Zaman çizgisi her zaman tam kaplanır (boşluklar adsız bölüm, son bölüm sona uzar).\n */\nexport class Segments {\n private chapters: Chapter[] = [];\n private chapterEls: HTMLElement[] = [];\n private hoverIndex = -1;\n private readonly tooltipEl: HTMLDivElement;\n private readonly titleEl: HTMLDivElement;\n private readonly timeEl: HTMLDivElement;\n\n constructor(\n private readonly ctx: SegmentsPlayerContext,\n private readonly segments: SegmentItem[]\n ) {\n this.tooltipEl = document.createElement('div');\n this.tooltipEl.className = 'hp-chapter-tooltip';\n this.tooltipEl.setAttribute('part', 'segment-tooltip');\n this.titleEl = document.createElement('div');\n this.titleEl.className = 'hp-chapter-tooltip-title';\n this.timeEl = document.createElement('div');\n this.timeEl.className = 'hp-chapter-tooltip-time';\n this.tooltipEl.append(this.titleEl, this.timeEl);\n ctx.seekBar.el.appendChild(this.tooltipEl);\n // Popup zamanı zaten gösteriyor — seek bar'ın varsayılan hover zamanı ikinci kez yazmasın.\n ctx.seekBar.suppressHoverTime('segments', true);\n\n ctx.seekBar.el.addEventListener('pointermove', this.onPointerMove);\n ctx.seekBar.el.addEventListener('pointerleave', this.onPointerLeave);\n ctx.videoEl.addEventListener('loadedmetadata', this.onLoadedMetadata);\n if (ctx.videoEl.readyState >= 1) this.onLoadedMetadata();\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('loadedmetadata', this.onLoadedMetadata);\n this.ctx.seekBar.el.removeEventListener('pointermove', this.onPointerMove);\n this.ctx.seekBar.el.removeEventListener('pointerleave', this.onPointerLeave);\n this.ctx.seekBar.clearChapters();\n this.ctx.seekBar.suppressHoverTime('segments', false);\n this.tooltipEl.remove();\n this.chapterEls = [];\n this.chapters = [];\n }\n\n private readonly onLoadedMetadata = (): void => {\n const duration = this.ctx.videoEl.duration;\n if (!Number.isFinite(duration) || duration <= 0) return;\n\n this.chapters = buildChapters(this.segments, duration);\n this.chapterEls = this.ctx.seekBar.setChapters(\n this.chapters.map((c) => ({ start: c.start / duration, end: c.end / duration, color: c.color }))\n );\n };\n\n private readonly onPointerMove = (e: PointerEvent): void => {\n const duration = this.ctx.videoEl.duration;\n if (!this.chapters.length || !Number.isFinite(duration) || duration <= 0) return;\n\n const time = this.ctx.seekBar.ratioAtClientX(e.clientX) * duration;\n let index = this.chapters.findIndex((c) => time < c.end);\n if (index === -1) index = this.chapters.length - 1;\n this.setHover(index);\n\n const chapter = this.chapters[index]!;\n this.titleEl.textContent = chapter.text ?? '';\n this.titleEl.style.display = chapter.text ? '' : 'none';\n this.timeEl.textContent = formatTime(time);\n\n // sprite-thumbnails önizlemesi de seek bar'ın hemen üstünde açılıyor —\n // görünürse popup onun ÜSTÜNE çıkıyor (üst üste binmesin).\n const sprite = this.ctx.seekBar.el.querySelector<HTMLElement>('[part=\"sprite-tooltip\"]');\n const spriteH = sprite && sprite.hasAttribute('data-visible') && sprite.offsetHeight > 0 ? sprite.offsetHeight + 8 : 0;\n this.tooltipEl.style.bottom = spriteH ? `calc(100% + 6px + ${spriteH}px)` : '';\n // Sprite önizlemesi zamanı zaten kendi altında gösteriyor — aynı zaman iki kez yazılmasın.\n this.timeEl.style.display = spriteH ? 'none' : '';\n\n // Popup imleci ortalar ama seek bar kenarlarından taşmaz.\n const barRect = this.ctx.seekBar.el.getBoundingClientRect();\n this.tooltipEl.setAttribute('data-visible', '');\n const tipWidth = this.tooltipEl.offsetWidth;\n const x = Math.min(Math.max(e.clientX - barRect.left - tipWidth / 2, 0), Math.max(barRect.width - tipWidth, 0));\n this.tooltipEl.style.transform = `translateX(${x}px)`;\n };\n\n private readonly onPointerLeave = (): void => {\n this.setHover(-1);\n this.tooltipEl.removeAttribute('data-visible');\n };\n\n private setHover(index: number): void {\n if (index === this.hoverIndex) return;\n this.chapterEls[this.hoverIndex]?.removeAttribute('data-hover');\n this.hoverIndex = index;\n this.chapterEls[index]?.setAttribute('data-hover', '');\n }\n}\n\n/** Segmentleri sıralar, boşlukları adsız bölümle doldurur, son bölümü video sonuna uzatır — sonuç 0→duration'ı kesintisiz kaplar. */\nfunction buildChapters(segments: SegmentItem[], duration: number): Chapter[] {\n const sorted = segments\n .filter((s) => Number.isFinite(s.start) && s.start < duration)\n .slice()\n .sort((a, b) => a.start - b.start);\n\n const chapters: Chapter[] = [];\n let cursor = 0;\n for (const seg of sorted) {\n const start = Math.max(seg.start, cursor);\n const end = Math.min(Number.isFinite(seg.end) ? seg.end : duration, duration);\n if (end <= start) continue;\n if (start > cursor) chapters.push({ start: cursor, end: start });\n chapters.push({ start, end, text: seg.text, color: seg.color });\n cursor = end;\n }\n if (!chapters.length) return [];\n if (cursor < duration) chapters[chapters.length - 1]!.end = duration;\n return chapters;\n}\n","import { Segments, type SegmentsPlayerContext } from './Segments';\nimport type { SegmentItem } from '../../types';\n\nexport function installSegments(ctx: SegmentsPlayerContext, items: SegmentItem[]): Segments {\n return new Segments(ctx, items);\n}\n\nexport { Segments };\nexport type { SegmentsPlayerContext };\n"],"names":["Segments","ctx","segments","__publicField","duration","buildChapters","c","e","time","index","chapter","formatTime","sprite","spriteH","barRect","tipWidth","x","_a","_b","sorted","a","b","chapters","cursor","seg","start","end","installSegments","items"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var u = Object.defineProperty;
|
|
2
2
|
var m = (p, e, t) => e in p ? u(p, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : p[e] = t;
|
|
3
3
|
var o = (p, e, t) => m(p, typeof e != "symbol" ? e + "" : e, t);
|
|
4
|
-
import { c as b } from "./index-
|
|
4
|
+
import { c as b } from "./index-Dz0E1YPE.js";
|
|
5
5
|
const f = {
|
|
6
6
|
enabled: !1,
|
|
7
7
|
mode: "rich",
|
|
@@ -202,4 +202,4 @@ export {
|
|
|
202
202
|
v as MarkProgress,
|
|
203
203
|
y as installMarkers
|
|
204
204
|
};
|
|
205
|
-
//# sourceMappingURL=index-
|
|
205
|
+
//# sourceMappingURL=index-DcVUXkXo.js.map
|