@livepeer-frameworks/player-wc 0.1.4 → 0.1.5

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.
@@ -861,6 +861,7 @@ exports.FwDevModePanel.styles = [
861
861
  :host {
862
862
  display: block;
863
863
  height: 100%;
864
+ min-height: 0;
864
865
  }
865
866
  `,
866
867
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"fw-dev-mode-panel.js","sources":["../../../../src/components/fw-dev-mode-panel.ts"],"sourcesContent":["/**\n * <fw-dev-mode-panel> — Developer mode side panel.\n * Feature parity with React/Svelte advanced panel.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport { closeIcon } from \"../icons/index.js\";\nimport {\n QualityMonitor,\n globalPlayerManager,\n type MistStreamInfo,\n type PlaybackMode,\n type PlayerCombination,\n type StreamInfo,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\nconst SOURCE_TYPE_LABELS: Record<string, string> = {\n \"html5/application/vnd.apple.mpegurl\": \"HLS\",\n \"dash/video/mp4\": \"DASH\",\n \"html5/video/mp4\": \"MP4\",\n \"html5/video/webm\": \"WebM\",\n whep: \"WHEP\",\n \"mist/html\": \"Mist\",\n \"mist/legacy\": \"Auto\",\n \"ws/video/mp4\": \"MEWS\",\n};\n\n@customElement(\"fw-dev-mode-panel\")\nexport class FwDevModePanel extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n\n @state() private _activeTab: \"config\" | \"stats\" = \"config\";\n @state() private _hoveredComboIndex: number | null = null;\n @state() private _tooltipAbove = false;\n @state() private _showDisabledPlayers = false;\n\n @state() private _playbackScore = 1;\n @state() private _qualityScore = 100;\n @state() private _stallCount = 0;\n @state() private _frameDropRate = 0;\n\n @state()\n private _videoStats: {\n resolution: string;\n buffered: string;\n playbackRate: string;\n currentTime: string;\n duration: string;\n readyState: number;\n networkState: number;\n } | null = null;\n\n @state() private _playerStats: unknown = null;\n\n private _qualityMonitor: QualityMonitor | null = null;\n private _qualityMonitorVideo: HTMLVideoElement | null = null;\n private _videoStatsInterval: ReturnType<typeof setInterval> | null = null;\n private _playerStatsInterval: ReturnType<typeof setInterval> | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: block;\n height: 100%;\n }\n `,\n ];\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._stopQualityMonitor();\n this._stopStatsPolling();\n }\n\n protected updated(_changed: PropertyValues<this>): void {\n this._syncQualityMonitor();\n this._syncStatsPolling();\n }\n\n private _getMistStreamInfo(): MistStreamInfo | undefined {\n return this.pc.s.streamState?.streamInfo as MistStreamInfo | undefined;\n }\n\n private _getAllCombinations(): PlayerCombination[] {\n const streamInfo = this.pc.s.streamInfo as StreamInfo | null;\n if (!streamInfo) {\n return [];\n }\n\n try {\n return globalPlayerManager.getAllCombinations(streamInfo, this.playbackMode);\n } catch {\n return [];\n }\n }\n\n private _getCompatibleCombinations(): PlayerCombination[] {\n return this._getAllCombinations().filter((combo) => combo.compatible);\n }\n\n private _getActiveComboIndex(combinations: PlayerCombination[]): number {\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n if (!currentPlayer || !currentSource || combinations.length === 0) {\n return -1;\n }\n\n return combinations.findIndex(\n (combo) => combo.player === currentPlayer.shortname && combo.sourceType === currentSource.type\n );\n }\n\n private _syncQualityMonitor(): void {\n const video = this.pc.s.videoElement;\n\n if (!video) {\n this._stopQualityMonitor();\n return;\n }\n\n if (!this._qualityMonitor) {\n this._qualityMonitor = new QualityMonitor({\n sampleInterval: 500,\n onSample: (quality) => {\n this._qualityScore = quality.score;\n this._stallCount = quality.stallCount;\n this._frameDropRate = quality.frameDropRate;\n this._playbackScore = this._qualityMonitor?.getPlaybackScore() ?? 1;\n this.requestUpdate();\n },\n });\n }\n\n if (this._qualityMonitorVideo !== video) {\n this._qualityMonitor.stop();\n this._qualityMonitor.start(video);\n this._qualityMonitorVideo = video;\n }\n }\n\n private _stopQualityMonitor(): void {\n this._qualityMonitor?.stop();\n this._qualityMonitorVideo = null;\n }\n\n private _syncStatsPolling(): void {\n if (this._activeTab !== \"stats\") {\n this._stopStatsPolling();\n return;\n }\n\n if (!this._videoStatsInterval) {\n this._updateVideoStats();\n this._videoStatsInterval = setInterval(() => {\n this._updateVideoStats();\n }, 500);\n }\n\n if (!this._playerStatsInterval) {\n void this._pollPlayerStats();\n this._playerStatsInterval = setInterval(() => {\n void this._pollPlayerStats();\n }, 500);\n }\n }\n\n private _stopStatsPolling(): void {\n if (this._videoStatsInterval) {\n clearInterval(this._videoStatsInterval);\n this._videoStatsInterval = null;\n }\n\n if (this._playerStatsInterval) {\n clearInterval(this._playerStatsInterval);\n this._playerStatsInterval = null;\n }\n }\n\n private _updateVideoStats(): void {\n const video = this.pc.s.videoElement;\n if (!video) {\n this._videoStats = null;\n return;\n }\n\n this._videoStats = {\n resolution: `${video.videoWidth}x${video.videoHeight}`,\n buffered:\n video.buffered.length > 0\n ? (video.buffered.end(video.buffered.length - 1) - video.currentTime).toFixed(1)\n : \"0\",\n playbackRate: video.playbackRate.toFixed(2),\n currentTime: video.currentTime.toFixed(1),\n duration: Number.isFinite(video.duration) ? video.duration.toFixed(1) : \"live\",\n readyState: video.readyState,\n networkState: video.networkState,\n };\n }\n\n private async _pollPlayerStats(): Promise<void> {\n try {\n const stats = await this.pc.getStats();\n if (stats) {\n this._playerStats = stats;\n }\n } catch {\n // No-op for optional stats backends.\n }\n }\n\n private _handleComboMouseEnter(index: number, event: MouseEvent): void {\n this._hoveredComboIndex = index;\n\n const container = this.renderRoot.querySelector(\".fw-dev-body\") as HTMLElement | null;\n if (!container) {\n return;\n }\n\n const row = event.currentTarget as HTMLElement;\n const containerRect = container.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n const relativePosition = (rowRect.top - containerRect.top) / containerRect.height;\n\n this._tooltipAbove = relativePosition > 0.6;\n }\n\n private _handleModeChange(mode: \"auto\" | \"low-latency\" | \"quality\"): void {\n this.playbackMode = mode;\n void this.pc.setDevModeOptions({ playbackMode: mode });\n this.dispatchEvent(\n new CustomEvent(\"fw-playback-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handleReload(): void {\n this.pc.clearError();\n void this.pc.reload();\n }\n\n private _handleNextCombo(): void {\n const compatible = this._getCompatibleCombinations();\n if (compatible.length === 0) {\n return;\n }\n\n const activeCompatibleIndex = this._getActiveComboIndex(compatible);\n const startIndex = activeCompatibleIndex >= 0 ? activeCompatibleIndex : -1;\n const nextIndex = (startIndex + 1) % compatible.length;\n const next = compatible[nextIndex];\n\n void this.pc.setDevModeOptions({\n forcePlayer: next.player,\n forceType: next.sourceType,\n forceSource: next.sourceIndex,\n });\n }\n\n private _handleSelectCombo(index: number): void {\n const allCombinations = this._getAllCombinations();\n const combo = allCombinations[index];\n if (!combo) {\n return;\n }\n\n void this.pc.setDevModeOptions({\n forcePlayer: combo.player,\n forceType: combo.sourceType,\n forceSource: combo.sourceIndex,\n });\n }\n\n private _renderStatsTab(): unknown {\n const primaryEndpoint = (this.pc.s.endpoints?.primary ?? null) as {\n protocol?: string;\n nodeId?: string;\n } | null;\n\n const stats = this._videoStats;\n const playerStats = this._playerStats as any;\n const mistStreamInfo = this._getMistStreamInfo();\n const trackEntries = Object.entries(mistStreamInfo?.meta?.tracks ?? {});\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Rate</div>\n <div class=\"fw-dev-rate\">\n <div\n class=${classMap({\n \"fw-dev-rate-value\": true,\n \"fw-dev-stat-value--good\":\n this._playbackScore >= 0.95 && this._playbackScore <= 1.05,\n \"fw-dev-stat-value--accent\": this._playbackScore > 1.05,\n \"fw-dev-stat-value--warn\":\n this._playbackScore >= 0.75 && this._playbackScore < 0.95,\n \"fw-dev-stat-value--bad\": this._playbackScore < 0.75,\n })}\n >\n ${this._playbackScore.toFixed(2)}x\n </div>\n <div class=\"fw-dev-rate-status\">\n ${this._playbackScore >= 0.95 && this._playbackScore <= 1.05\n ? \"realtime\"\n : this._playbackScore > 1.05\n ? \"catching up\"\n : this._playbackScore >= 0.75\n ? \"slightly slow\"\n : \"stalling\"}\n </div>\n </div>\n <div class=\"fw-dev-rate-stats\">\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._qualityScore >= 75,\n \"fw-dev-stat-value--bad\": this._qualityScore < 75,\n })}\n >\n Quality: ${this._qualityScore}/100\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._stallCount === 0,\n \"fw-dev-stat-value--warn\": this._stallCount > 0,\n })}\n >\n Stalls: ${this._stallCount}\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._frameDropRate < 1,\n \"fw-dev-stat-value--bad\": this._frameDropRate >= 1,\n })}\n >\n Drops: ${this._frameDropRate.toFixed(1)}%\n </span>\n </div>\n </div>\n\n ${stats\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Resolution</span>\n <span class=\"fw-dev-stat-value\">${stats.resolution}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Buffer</span>\n <span class=\"fw-dev-stat-value\">${stats.buffered}s</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Playback Rate</span>\n <span class=\"fw-dev-stat-value\">${stats.playbackRate}x</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Time</span>\n <span class=\"fw-dev-stat-value\">${stats.currentTime} / ${stats.duration}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Ready State</span>\n <span class=\"fw-dev-stat-value\">${stats.readyState}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Network State</span>\n <span class=\"fw-dev-stat-value\">${stats.networkState}</span>\n </div>\n ${primaryEndpoint?.protocol\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Protocol</span>\n <span class=\"fw-dev-stat-value\">${primaryEndpoint.protocol}</span>\n </div>\n `\n : nothing}\n ${primaryEndpoint?.nodeId\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Node ID</span>\n <span\n class=\"fw-dev-stat-value\"\n style=\"max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\"\n >${primaryEndpoint.nodeId}</span\n >\n </div>\n `\n : nothing}\n `\n : html`<div class=\"fw-dev-list-empty\">No video element available</div>`}\n ${playerStats\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\"\n >${playerStats.type === \"hls\"\n ? \"HLS.js Stats\"\n : playerStats.type === \"webrtc\"\n ? \"WebRTC Stats\"\n : \"Player Stats\"}</span\n >\n </div>\n\n ${playerStats.type === \"hls\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.currentBitrate === \"number\" &&\n playerStats.currentBitrate > 0\n ? `${Math.round(playerStats.currentBitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bandwidth Est.</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.bandwidthEstimate === \"number\" &&\n playerStats.bandwidthEstimate > 0\n ? `${Math.round(playerStats.bandwidthEstimate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Level</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.currentLevel === \"number\" &&\n playerStats.currentLevel >= 0\n ? playerStats.currentLevel\n : \"Auto\"}\n / ${Array.isArray(playerStats.levels) ? playerStats.levels.length : 0}</span\n >\n </div>\n ${typeof playerStats.latency === \"number\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Latency</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\": playerStats.latency > 5000,\n })}\n >${Math.round(playerStats.latency)} ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n ${playerStats.type === \"webrtc\"\n ? html`\n ${playerStats.video\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Video Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.video.bitrate === \"number\" &&\n playerStats.video.bitrate > 0\n ? `${Math.round(playerStats.video.bitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">FPS</span>\n <span class=\"fw-dev-stat-value\"\n >${Math.round(\n (playerStats.video.framesPerSecond as number) || 0\n )}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Frames</span>\n <span class=\"fw-dev-stat-value\"\n >${playerStats.video.framesDecoded as number} decoded,\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.frameDropRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.frameDropRate as number) || 0) <= 1,\n })}\n >${playerStats.video.framesDropped as number} dropped</span\n ></span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Packet Loss</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.packetLossRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.packetLossRate as number) || 0) <= 1,\n })}\n >${(\n ((playerStats.video.packetLossRate as number) || 0) as number\n ).toFixed(2)}%</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.video.jitter as number) || 0) > 30,\n })}\n >${(((playerStats.video.jitter as number) || 0) as number).toFixed(1)}\n ms</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter Buffer</span>\n <span class=\"fw-dev-stat-value\"\n >${(\n ((playerStats.video.jitterBufferDelay as number) || 0) as number\n ).toFixed(1)}\n ms</span\n >\n </div>\n `\n : nothing}\n ${playerStats.network\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">RTT</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.network.rtt as number) || 0) > 200,\n })}\n >${Math.round(((playerStats.network.rtt as number) || 0) as number)}\n ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n `\n : nothing}\n ${trackEntries.length > 0\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\">Tracks (${trackEntries.length})</span>\n </div>\n ${trackEntries.map(([id, track]) => {\n const typedTrack = track as {\n type: string;\n codec: string;\n width?: number;\n height?: number;\n bps?: number;\n fpks?: number;\n channels?: number;\n rate?: number;\n lang?: string;\n };\n\n return html`\n <div class=\"fw-dev-track\">\n <div class=\"fw-dev-track-header\">\n <span\n class=${classMap({\n \"fw-dev-track-badge\": true,\n \"fw-dev-track-badge--video\": typedTrack.type === \"video\",\n \"fw-dev-track-badge--audio\": typedTrack.type === \"audio\",\n \"fw-dev-track-badge--other\":\n typedTrack.type !== \"video\" && typedTrack.type !== \"audio\",\n })}\n >${typedTrack.type}</span\n >\n <span class=\"fw-dev-track-codec\">${typedTrack.codec}</span>\n <span class=\"fw-dev-track-id\">#${id}</span>\n </div>\n <div class=\"fw-dev-track-meta\">\n ${typedTrack.type === \"video\" && typedTrack.width && typedTrack.height\n ? html`<span>${typedTrack.width}x${typedTrack.height}</span>`\n : nothing}\n ${typedTrack.bps\n ? html`<span>${Math.round(typedTrack.bps / 1000)} kbps</span>`\n : nothing}\n ${typedTrack.fpks\n ? html`<span>${Math.round(typedTrack.fpks / 1000)} fps</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.channels\n ? html`<span>${typedTrack.channels}ch</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.rate\n ? html`<span>${typedTrack.rate} Hz</span>`\n : nothing}\n ${typedTrack.lang ? html`<span>${typedTrack.lang}</span>` : nothing}\n </div>\n </div>\n `;\n })}\n `\n : nothing}\n ${mistStreamInfo && trackEntries.length === 0\n ? html`\n <div class=\"fw-dev-no-tracks\">\n <span class=\"fw-dev-no-tracks-text\"\n >No track data available\n ${mistStreamInfo.type\n ? html`<span class=\"fw-dev-no-tracks-type\">(${mistStreamInfo.type})</span>`\n : nothing}</span\n >\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n private _renderConfigTab(): unknown {\n const allCombinations = this._getAllCombinations();\n const compatibleCombinations = allCombinations.filter((combo) => combo.compatible);\n const activeComboIndex = this._getActiveComboIndex(allCombinations);\n\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Active</div>\n <div class=\"fw-dev-value\">\n ${currentPlayer?.name || \"None\"}\n <span class=\"fw-dev-value-arrow\">${\"\\u2192\"}</span>\n ${SOURCE_TYPE_LABELS[currentSource?.type || \"\"] || currentSource?.type || \"-\"}\n </div>\n ${(this.pc.s.endpoints?.primary as { nodeId?: string } | undefined)?.nodeId\n ? html`\n <div class=\"fw-dev-value-muted\">\n Node: ${(this.pc.s.endpoints?.primary as { nodeId?: string }).nodeId}\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Mode</div>\n <div class=\"fw-dev-mode-group\">\n ${([\"auto\", \"low-latency\", \"quality\"] as const).map(\n (mode) => html`\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-mode-btn\": true,\n \"fw-dev-mode-btn--active\": this.playbackMode === mode,\n })}\n @click=${() => this._handleModeChange(mode)}\n >\n ${mode === \"low-latency\"\n ? \"Low Lat\"\n : `${mode.charAt(0).toUpperCase()}${mode.slice(1)}`}\n </button>\n `\n )}\n </div>\n <div class=\"fw-dev-mode-desc\">\n ${this.playbackMode === \"auto\"\n ? \"Balanced: MP4/WS \\u2192 WHEP \\u2192 HLS\"\n : this.playbackMode === \"low-latency\"\n ? \"WHEP/WebRTC first (<1s delay)\"\n : \"MP4/WS first, HLS fallback\"}\n </div>\n </div>\n\n <div class=\"fw-dev-actions\">\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleReload}>\n Reload\n </button>\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleNextCombo}>\n Next Option\n </button>\n </div>\n\n <div class=\"fw-dev-section\" style=\"padding:0;border-bottom:0;\">\n <div class=\"fw-dev-list-header\">\n <span class=\"fw-dev-list-title\">Player Options (${compatibleCombinations.length})</span>\n ${allCombinations.length > compatibleCombinations.length\n ? html`\n <button\n type=\"button\"\n class=\"fw-dev-list-toggle\"\n @click=${() => {\n this._showDisabledPlayers = !this._showDisabledPlayers;\n }}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=${classMap({\n \"fw-dev-chevron\": true,\n \"fw-dev-chevron--open\": this._showDisabledPlayers,\n })}\n >\n <path d=\"M6 9l6 6 6-6\"></path>\n </svg>\n ${this._showDisabledPlayers ? \"Hide\" : \"Show\"} disabled\n (${allCombinations.length - compatibleCombinations.length})\n </button>\n `\n : nothing}\n </div>\n\n ${allCombinations.length === 0\n ? html`<div class=\"fw-dev-list-empty\">No stream info available</div>`\n : html`\n ${allCombinations.map((combo, index) => {\n const isCodecIncompatible = combo.codecIncompatible === true;\n if (!combo.compatible && !isCodecIncompatible && !this._showDisabledPlayers) {\n return nothing;\n }\n\n const isActive = activeComboIndex === index;\n const typeLabel =\n SOURCE_TYPE_LABELS[combo.sourceType] || combo.sourceType.split(\"/\").pop();\n\n const scoreClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-score--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-score--low\"\n : combo.score >= 2\n ? \"fw-dev-combo-score--high\"\n : combo.score >= 1.5\n ? \"fw-dev-combo-score--mid\"\n : \"fw-dev-combo-score--low\";\n\n const rankClass = isActive\n ? \"fw-dev-combo-rank--active\"\n : !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-rank--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-rank--warn\"\n : \"\";\n\n const typeClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-type--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-type--warn\"\n : \"\";\n\n return html`\n <div\n class=\"fw-dev-combo\"\n @mouseenter=${(event: MouseEvent) =>\n this._handleComboMouseEnter(index, event)}\n @mouseleave=${() => {\n this._hoveredComboIndex = null;\n }}\n >\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-combo-btn\": true,\n \"fw-dev-combo-btn--active\": isActive,\n \"fw-dev-combo-btn--disabled\": !combo.compatible && !isCodecIncompatible,\n \"fw-dev-combo-btn--codec-warn\": isCodecIncompatible,\n })}\n @click=${() => this._handleSelectCombo(index)}\n >\n <span\n class=${classMap({\n \"fw-dev-combo-rank\": true,\n [rankClass]: rankClass.length > 0,\n })}\n >${combo.compatible\n ? index + 1\n : isCodecIncompatible\n ? \"\\u26A0\"\n : \"\\u2014\"}</span\n >\n\n <span class=\"fw-dev-combo-name\"\n >${combo.playerName} <span class=\"fw-dev-combo-arrow\">${\"\\u2192\"}</span>\n <span\n class=${classMap({\n \"fw-dev-combo-type\": true,\n [typeClass]: typeClass.length > 0,\n })}\n >${typeLabel}</span\n ></span\n >\n\n <span class=${classMap({ \"fw-dev-combo-score\": true, [scoreClass]: true })}\n >${combo.score.toFixed(2)}</span\n >\n </button>\n\n ${this._hoveredComboIndex === index\n ? html`\n <div\n class=${classMap({\n \"fw-dev-tooltip\": true,\n \"fw-dev-tooltip--above\": this._tooltipAbove,\n \"fw-dev-tooltip--below\": !this._tooltipAbove,\n })}\n >\n <div class=\"fw-dev-tooltip-header\">\n <div class=\"fw-dev-tooltip-title\">${combo.playerName}</div>\n <div class=\"fw-dev-tooltip-subtitle\">${combo.sourceType}</div>\n ${combo.scoreBreakdown?.trackTypes &&\n combo.scoreBreakdown.trackTypes.length > 0\n ? html`\n <div class=\"fw-dev-tooltip-tracks\">\n Tracks:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackTypes.join(\", \")}</span\n >\n </div>\n `\n : nothing}\n </div>\n\n ${combo.compatible && combo.scoreBreakdown\n ? html`\n <div class=\"fw-dev-tooltip-score\">\n Score: ${combo.score.toFixed(2)}\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Tracks [${combo.scoreBreakdown.trackTypes.join(\", \")}]:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.tracks}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Priority:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.priorityScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.priority}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Source:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.sourceScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.source}</span\n >\n </div>\n\n ${typeof combo.scoreBreakdown.reliabilityScore === \"number\"\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Reliability:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.reliabilityScore.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.reliability ??\n 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.modeBonus === \"number\" &&\n combo.scoreBreakdown.modeBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Mode (${this.playbackMode}):\n <span class=\"fw-dev-tooltip-bonus\"\n >+${combo.scoreBreakdown.modeBonus.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.mode ?? 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.routingBonus === \"number\" &&\n combo.scoreBreakdown.routingBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Routing:\n <span\n class=${classMap({\n \"fw-dev-tooltip-bonus\":\n combo.scoreBreakdown.routingBonus > 0,\n \"fw-dev-tooltip-penalty\":\n combo.scoreBreakdown.routingBonus < 0,\n })}\n >${combo.scoreBreakdown.routingBonus > 0\n ? \"+\"\n : \"\"}${combo.scoreBreakdown.routingBonus.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.routing ?? 0}</span\n >\n </div>\n `\n : nothing}\n `\n : html`\n <div class=\"fw-dev-tooltip-error\">\n ${combo.incompatibleReason || \"Incompatible\"}\n </div>\n `}\n </div>\n `\n : nothing}\n </div>\n `;\n })}\n `}\n </div>\n </div>\n `;\n }\n\n protected render() {\n return html`\n <div class=\"fw-dev-panel\">\n <div class=\"fw-dev-header\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"config\",\n })}\n @click=${() => {\n this._activeTab = \"config\";\n }}\n >\n Config\n </button>\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"stats\",\n })}\n @click=${() => {\n this._activeTab = \"stats\";\n }}\n >\n Stats\n </button>\n <div class=\"fw-dev-spacer\"></div>\n <button\n type=\"button\"\n class=\"fw-dev-close\"\n aria-label=\"Close dev mode panel\"\n @click=${() =>\n this.dispatchEvent(new CustomEvent(\"fw-close\", { bubbles: true, composed: true }))}\n >\n ${closeIcon()}\n </button>\n </div>\n\n ${this._activeTab === \"config\" ? this._renderConfigTab() : this._renderStatsTab()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-dev-mode-panel\": FwDevModePanel;\n }\n}\n"],"names":["FwDevModePanel","LitElement","globalPlayerManager","QualityMonitor","html","classMap","nothing","closeIcon","sharedStyles","utilityStyles","css","__decorate","property","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"fw-dev-mode-panel.js","sources":["../../../../src/components/fw-dev-mode-panel.ts"],"sourcesContent":["/**\n * <fw-dev-mode-panel> — Developer mode side panel.\n * Feature parity with React/Svelte advanced panel.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport { closeIcon } from \"../icons/index.js\";\nimport {\n QualityMonitor,\n globalPlayerManager,\n type MistStreamInfo,\n type PlaybackMode,\n type PlayerCombination,\n type StreamInfo,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\nconst SOURCE_TYPE_LABELS: Record<string, string> = {\n \"html5/application/vnd.apple.mpegurl\": \"HLS\",\n \"dash/video/mp4\": \"DASH\",\n \"html5/video/mp4\": \"MP4\",\n \"html5/video/webm\": \"WebM\",\n whep: \"WHEP\",\n \"mist/html\": \"Mist\",\n \"mist/legacy\": \"Auto\",\n \"ws/video/mp4\": \"MEWS\",\n};\n\n@customElement(\"fw-dev-mode-panel\")\nexport class FwDevModePanel extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n\n @state() private _activeTab: \"config\" | \"stats\" = \"config\";\n @state() private _hoveredComboIndex: number | null = null;\n @state() private _tooltipAbove = false;\n @state() private _showDisabledPlayers = false;\n\n @state() private _playbackScore = 1;\n @state() private _qualityScore = 100;\n @state() private _stallCount = 0;\n @state() private _frameDropRate = 0;\n\n @state()\n private _videoStats: {\n resolution: string;\n buffered: string;\n playbackRate: string;\n currentTime: string;\n duration: string;\n readyState: number;\n networkState: number;\n } | null = null;\n\n @state() private _playerStats: unknown = null;\n\n private _qualityMonitor: QualityMonitor | null = null;\n private _qualityMonitorVideo: HTMLVideoElement | null = null;\n private _videoStatsInterval: ReturnType<typeof setInterval> | null = null;\n private _playerStatsInterval: ReturnType<typeof setInterval> | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: block;\n height: 100%;\n min-height: 0;\n }\n `,\n ];\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._stopQualityMonitor();\n this._stopStatsPolling();\n }\n\n protected updated(_changed: PropertyValues<this>): void {\n this._syncQualityMonitor();\n this._syncStatsPolling();\n }\n\n private _getMistStreamInfo(): MistStreamInfo | undefined {\n return this.pc.s.streamState?.streamInfo as MistStreamInfo | undefined;\n }\n\n private _getAllCombinations(): PlayerCombination[] {\n const streamInfo = this.pc.s.streamInfo as StreamInfo | null;\n if (!streamInfo) {\n return [];\n }\n\n try {\n return globalPlayerManager.getAllCombinations(streamInfo, this.playbackMode);\n } catch {\n return [];\n }\n }\n\n private _getCompatibleCombinations(): PlayerCombination[] {\n return this._getAllCombinations().filter((combo) => combo.compatible);\n }\n\n private _getActiveComboIndex(combinations: PlayerCombination[]): number {\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n if (!currentPlayer || !currentSource || combinations.length === 0) {\n return -1;\n }\n\n return combinations.findIndex(\n (combo) => combo.player === currentPlayer.shortname && combo.sourceType === currentSource.type\n );\n }\n\n private _syncQualityMonitor(): void {\n const video = this.pc.s.videoElement;\n\n if (!video) {\n this._stopQualityMonitor();\n return;\n }\n\n if (!this._qualityMonitor) {\n this._qualityMonitor = new QualityMonitor({\n sampleInterval: 500,\n onSample: (quality) => {\n this._qualityScore = quality.score;\n this._stallCount = quality.stallCount;\n this._frameDropRate = quality.frameDropRate;\n this._playbackScore = this._qualityMonitor?.getPlaybackScore() ?? 1;\n this.requestUpdate();\n },\n });\n }\n\n if (this._qualityMonitorVideo !== video) {\n this._qualityMonitor.stop();\n this._qualityMonitor.start(video);\n this._qualityMonitorVideo = video;\n }\n }\n\n private _stopQualityMonitor(): void {\n this._qualityMonitor?.stop();\n this._qualityMonitorVideo = null;\n }\n\n private _syncStatsPolling(): void {\n if (this._activeTab !== \"stats\") {\n this._stopStatsPolling();\n return;\n }\n\n if (!this._videoStatsInterval) {\n this._updateVideoStats();\n this._videoStatsInterval = setInterval(() => {\n this._updateVideoStats();\n }, 500);\n }\n\n if (!this._playerStatsInterval) {\n void this._pollPlayerStats();\n this._playerStatsInterval = setInterval(() => {\n void this._pollPlayerStats();\n }, 500);\n }\n }\n\n private _stopStatsPolling(): void {\n if (this._videoStatsInterval) {\n clearInterval(this._videoStatsInterval);\n this._videoStatsInterval = null;\n }\n\n if (this._playerStatsInterval) {\n clearInterval(this._playerStatsInterval);\n this._playerStatsInterval = null;\n }\n }\n\n private _updateVideoStats(): void {\n const video = this.pc.s.videoElement;\n if (!video) {\n this._videoStats = null;\n return;\n }\n\n this._videoStats = {\n resolution: `${video.videoWidth}x${video.videoHeight}`,\n buffered:\n video.buffered.length > 0\n ? (video.buffered.end(video.buffered.length - 1) - video.currentTime).toFixed(1)\n : \"0\",\n playbackRate: video.playbackRate.toFixed(2),\n currentTime: video.currentTime.toFixed(1),\n duration: Number.isFinite(video.duration) ? video.duration.toFixed(1) : \"live\",\n readyState: video.readyState,\n networkState: video.networkState,\n };\n }\n\n private async _pollPlayerStats(): Promise<void> {\n try {\n const stats = await this.pc.getStats();\n if (stats) {\n this._playerStats = stats;\n }\n } catch {\n // No-op for optional stats backends.\n }\n }\n\n private _handleComboMouseEnter(index: number, event: MouseEvent): void {\n this._hoveredComboIndex = index;\n\n const container = this.renderRoot.querySelector(\".fw-dev-body\") as HTMLElement | null;\n if (!container) {\n return;\n }\n\n const row = event.currentTarget as HTMLElement;\n const containerRect = container.getBoundingClientRect();\n const rowRect = row.getBoundingClientRect();\n const relativePosition = (rowRect.top - containerRect.top) / containerRect.height;\n\n this._tooltipAbove = relativePosition > 0.6;\n }\n\n private _handleModeChange(mode: \"auto\" | \"low-latency\" | \"quality\"): void {\n this.playbackMode = mode;\n void this.pc.setDevModeOptions({ playbackMode: mode });\n this.dispatchEvent(\n new CustomEvent(\"fw-playback-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handleReload(): void {\n this.pc.clearError();\n void this.pc.reload();\n }\n\n private _handleNextCombo(): void {\n const compatible = this._getCompatibleCombinations();\n if (compatible.length === 0) {\n return;\n }\n\n const activeCompatibleIndex = this._getActiveComboIndex(compatible);\n const startIndex = activeCompatibleIndex >= 0 ? activeCompatibleIndex : -1;\n const nextIndex = (startIndex + 1) % compatible.length;\n const next = compatible[nextIndex];\n\n void this.pc.setDevModeOptions({\n forcePlayer: next.player,\n forceType: next.sourceType,\n forceSource: next.sourceIndex,\n });\n }\n\n private _handleSelectCombo(index: number): void {\n const allCombinations = this._getAllCombinations();\n const combo = allCombinations[index];\n if (!combo) {\n return;\n }\n\n void this.pc.setDevModeOptions({\n forcePlayer: combo.player,\n forceType: combo.sourceType,\n forceSource: combo.sourceIndex,\n });\n }\n\n private _renderStatsTab(): unknown {\n const primaryEndpoint = (this.pc.s.endpoints?.primary ?? null) as {\n protocol?: string;\n nodeId?: string;\n } | null;\n\n const stats = this._videoStats;\n const playerStats = this._playerStats as any;\n const mistStreamInfo = this._getMistStreamInfo();\n const trackEntries = Object.entries(mistStreamInfo?.meta?.tracks ?? {});\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Rate</div>\n <div class=\"fw-dev-rate\">\n <div\n class=${classMap({\n \"fw-dev-rate-value\": true,\n \"fw-dev-stat-value--good\":\n this._playbackScore >= 0.95 && this._playbackScore <= 1.05,\n \"fw-dev-stat-value--accent\": this._playbackScore > 1.05,\n \"fw-dev-stat-value--warn\":\n this._playbackScore >= 0.75 && this._playbackScore < 0.95,\n \"fw-dev-stat-value--bad\": this._playbackScore < 0.75,\n })}\n >\n ${this._playbackScore.toFixed(2)}x\n </div>\n <div class=\"fw-dev-rate-status\">\n ${this._playbackScore >= 0.95 && this._playbackScore <= 1.05\n ? \"realtime\"\n : this._playbackScore > 1.05\n ? \"catching up\"\n : this._playbackScore >= 0.75\n ? \"slightly slow\"\n : \"stalling\"}\n </div>\n </div>\n <div class=\"fw-dev-rate-stats\">\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._qualityScore >= 75,\n \"fw-dev-stat-value--bad\": this._qualityScore < 75,\n })}\n >\n Quality: ${this._qualityScore}/100\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._stallCount === 0,\n \"fw-dev-stat-value--warn\": this._stallCount > 0,\n })}\n >\n Stalls: ${this._stallCount}\n </span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--good\": this._frameDropRate < 1,\n \"fw-dev-stat-value--bad\": this._frameDropRate >= 1,\n })}\n >\n Drops: ${this._frameDropRate.toFixed(1)}%\n </span>\n </div>\n </div>\n\n ${stats\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Resolution</span>\n <span class=\"fw-dev-stat-value\">${stats.resolution}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Buffer</span>\n <span class=\"fw-dev-stat-value\">${stats.buffered}s</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Playback Rate</span>\n <span class=\"fw-dev-stat-value\">${stats.playbackRate}x</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Time</span>\n <span class=\"fw-dev-stat-value\">${stats.currentTime} / ${stats.duration}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Ready State</span>\n <span class=\"fw-dev-stat-value\">${stats.readyState}</span>\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Network State</span>\n <span class=\"fw-dev-stat-value\">${stats.networkState}</span>\n </div>\n ${primaryEndpoint?.protocol\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Protocol</span>\n <span class=\"fw-dev-stat-value\">${primaryEndpoint.protocol}</span>\n </div>\n `\n : nothing}\n ${primaryEndpoint?.nodeId\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Node ID</span>\n <span\n class=\"fw-dev-stat-value\"\n style=\"max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\"\n >${primaryEndpoint.nodeId}</span\n >\n </div>\n `\n : nothing}\n `\n : html`<div class=\"fw-dev-list-empty\">No video element available</div>`}\n ${playerStats\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\"\n >${playerStats.type === \"hls\"\n ? \"HLS.js Stats\"\n : playerStats.type === \"webrtc\"\n ? \"WebRTC Stats\"\n : \"Player Stats\"}</span\n >\n </div>\n\n ${playerStats.type === \"hls\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.currentBitrate === \"number\" &&\n playerStats.currentBitrate > 0\n ? `${Math.round(playerStats.currentBitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Bandwidth Est.</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.bandwidthEstimate === \"number\" &&\n playerStats.bandwidthEstimate > 0\n ? `${Math.round(playerStats.bandwidthEstimate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Level</span>\n <span class=\"fw-dev-stat-value\"\n >${typeof playerStats.currentLevel === \"number\" &&\n playerStats.currentLevel >= 0\n ? playerStats.currentLevel\n : \"Auto\"}\n / ${Array.isArray(playerStats.levels) ? playerStats.levels.length : 0}</span\n >\n </div>\n ${typeof playerStats.latency === \"number\"\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Latency</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\": playerStats.latency > 5000,\n })}\n >${Math.round(playerStats.latency)} ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n ${playerStats.type === \"webrtc\"\n ? html`\n ${playerStats.video\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Video Bitrate</span>\n <span class=\"fw-dev-stat-value--accent\"\n >${typeof playerStats.video.bitrate === \"number\" &&\n playerStats.video.bitrate > 0\n ? `${Math.round(playerStats.video.bitrate / 1000)} kbps`\n : \"N/A\"}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">FPS</span>\n <span class=\"fw-dev-stat-value\"\n >${Math.round(\n (playerStats.video.framesPerSecond as number) || 0\n )}</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Frames</span>\n <span class=\"fw-dev-stat-value\"\n >${playerStats.video.framesDecoded as number} decoded,\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.frameDropRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.frameDropRate as number) || 0) <= 1,\n })}\n >${playerStats.video.framesDropped as number} dropped</span\n ></span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Packet Loss</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value--bad\":\n ((playerStats.video.packetLossRate as number) || 0) > 1,\n \"fw-dev-stat-value--good\":\n ((playerStats.video.packetLossRate as number) || 0) <= 1,\n })}\n >${(\n ((playerStats.video.packetLossRate as number) || 0) as number\n ).toFixed(2)}%</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.video.jitter as number) || 0) > 30,\n })}\n >${(((playerStats.video.jitter as number) || 0) as number).toFixed(1)}\n ms</span\n >\n </div>\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">Jitter Buffer</span>\n <span class=\"fw-dev-stat-value\"\n >${(\n ((playerStats.video.jitterBufferDelay as number) || 0) as number\n ).toFixed(1)}\n ms</span\n >\n </div>\n `\n : nothing}\n ${playerStats.network\n ? html`\n <div class=\"fw-dev-stat\">\n <span class=\"fw-dev-stat-label\">RTT</span>\n <span\n class=${classMap({\n \"fw-dev-stat-value\": true,\n \"fw-dev-stat-value--warn\":\n ((playerStats.network.rtt as number) || 0) > 200,\n })}\n >${Math.round(((playerStats.network.rtt as number) || 0) as number)}\n ms</span\n >\n </div>\n `\n : nothing}\n `\n : nothing}\n `\n : nothing}\n ${trackEntries.length > 0\n ? html`\n <div class=\"fw-dev-list-header fw-dev-section-header\">\n <span class=\"fw-dev-list-title\">Tracks (${trackEntries.length})</span>\n </div>\n ${trackEntries.map(([id, track]) => {\n const typedTrack = track as {\n type: string;\n codec: string;\n width?: number;\n height?: number;\n bps?: number;\n fpks?: number;\n channels?: number;\n rate?: number;\n lang?: string;\n };\n\n return html`\n <div class=\"fw-dev-track\">\n <div class=\"fw-dev-track-header\">\n <span\n class=${classMap({\n \"fw-dev-track-badge\": true,\n \"fw-dev-track-badge--video\": typedTrack.type === \"video\",\n \"fw-dev-track-badge--audio\": typedTrack.type === \"audio\",\n \"fw-dev-track-badge--other\":\n typedTrack.type !== \"video\" && typedTrack.type !== \"audio\",\n })}\n >${typedTrack.type}</span\n >\n <span class=\"fw-dev-track-codec\">${typedTrack.codec}</span>\n <span class=\"fw-dev-track-id\">#${id}</span>\n </div>\n <div class=\"fw-dev-track-meta\">\n ${typedTrack.type === \"video\" && typedTrack.width && typedTrack.height\n ? html`<span>${typedTrack.width}x${typedTrack.height}</span>`\n : nothing}\n ${typedTrack.bps\n ? html`<span>${Math.round(typedTrack.bps / 1000)} kbps</span>`\n : nothing}\n ${typedTrack.fpks\n ? html`<span>${Math.round(typedTrack.fpks / 1000)} fps</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.channels\n ? html`<span>${typedTrack.channels}ch</span>`\n : nothing}\n ${typedTrack.type === \"audio\" && typedTrack.rate\n ? html`<span>${typedTrack.rate} Hz</span>`\n : nothing}\n ${typedTrack.lang ? html`<span>${typedTrack.lang}</span>` : nothing}\n </div>\n </div>\n `;\n })}\n `\n : nothing}\n ${mistStreamInfo && trackEntries.length === 0\n ? html`\n <div class=\"fw-dev-no-tracks\">\n <span class=\"fw-dev-no-tracks-text\"\n >No track data available\n ${mistStreamInfo.type\n ? html`<span class=\"fw-dev-no-tracks-type\">(${mistStreamInfo.type})</span>`\n : nothing}</span\n >\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n private _renderConfigTab(): unknown {\n const allCombinations = this._getAllCombinations();\n const compatibleCombinations = allCombinations.filter((combo) => combo.compatible);\n const activeComboIndex = this._getActiveComboIndex(allCombinations);\n\n const currentPlayer = this.pc.s.currentPlayerInfo;\n const currentSource = this.pc.s.currentSourceInfo;\n\n return html`\n <div class=\"fw-dev-body\">\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Active</div>\n <div class=\"fw-dev-value\">\n ${currentPlayer?.name || \"None\"}\n <span class=\"fw-dev-value-arrow\">${\"\\u2192\"}</span>\n ${SOURCE_TYPE_LABELS[currentSource?.type || \"\"] || currentSource?.type || \"-\"}\n </div>\n ${(this.pc.s.endpoints?.primary as { nodeId?: string } | undefined)?.nodeId\n ? html`\n <div class=\"fw-dev-value-muted\">\n Node: ${(this.pc.s.endpoints?.primary as { nodeId?: string }).nodeId}\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-dev-section\">\n <div class=\"fw-dev-label\">Playback Mode</div>\n <div class=\"fw-dev-mode-group\">\n ${([\"auto\", \"low-latency\", \"quality\"] as const).map(\n (mode) => html`\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-mode-btn\": true,\n \"fw-dev-mode-btn--active\": this.playbackMode === mode,\n })}\n @click=${() => this._handleModeChange(mode)}\n >\n ${mode === \"low-latency\"\n ? \"Low Lat\"\n : `${mode.charAt(0).toUpperCase()}${mode.slice(1)}`}\n </button>\n `\n )}\n </div>\n <div class=\"fw-dev-mode-desc\">\n ${this.playbackMode === \"auto\"\n ? \"Balanced: MP4/WS \\u2192 WHEP \\u2192 HLS\"\n : this.playbackMode === \"low-latency\"\n ? \"WHEP/WebRTC first (<1s delay)\"\n : \"MP4/WS first, HLS fallback\"}\n </div>\n </div>\n\n <div class=\"fw-dev-actions\">\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleReload}>\n Reload\n </button>\n <button type=\"button\" class=\"fw-dev-action-btn\" @click=${this._handleNextCombo}>\n Next Option\n </button>\n </div>\n\n <div class=\"fw-dev-section\" style=\"padding:0;border-bottom:0;\">\n <div class=\"fw-dev-list-header\">\n <span class=\"fw-dev-list-title\">Player Options (${compatibleCombinations.length})</span>\n ${allCombinations.length > compatibleCombinations.length\n ? html`\n <button\n type=\"button\"\n class=\"fw-dev-list-toggle\"\n @click=${() => {\n this._showDisabledPlayers = !this._showDisabledPlayers;\n }}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=${classMap({\n \"fw-dev-chevron\": true,\n \"fw-dev-chevron--open\": this._showDisabledPlayers,\n })}\n >\n <path d=\"M6 9l6 6 6-6\"></path>\n </svg>\n ${this._showDisabledPlayers ? \"Hide\" : \"Show\"} disabled\n (${allCombinations.length - compatibleCombinations.length})\n </button>\n `\n : nothing}\n </div>\n\n ${allCombinations.length === 0\n ? html`<div class=\"fw-dev-list-empty\">No stream info available</div>`\n : html`\n ${allCombinations.map((combo, index) => {\n const isCodecIncompatible = combo.codecIncompatible === true;\n if (!combo.compatible && !isCodecIncompatible && !this._showDisabledPlayers) {\n return nothing;\n }\n\n const isActive = activeComboIndex === index;\n const typeLabel =\n SOURCE_TYPE_LABELS[combo.sourceType] || combo.sourceType.split(\"/\").pop();\n\n const scoreClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-score--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-score--low\"\n : combo.score >= 2\n ? \"fw-dev-combo-score--high\"\n : combo.score >= 1.5\n ? \"fw-dev-combo-score--mid\"\n : \"fw-dev-combo-score--low\";\n\n const rankClass = isActive\n ? \"fw-dev-combo-rank--active\"\n : !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-rank--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-rank--warn\"\n : \"\";\n\n const typeClass =\n !combo.compatible && !isCodecIncompatible\n ? \"fw-dev-combo-type--disabled\"\n : isCodecIncompatible\n ? \"fw-dev-combo-type--warn\"\n : \"\";\n\n return html`\n <div\n class=\"fw-dev-combo\"\n @mouseenter=${(event: MouseEvent) =>\n this._handleComboMouseEnter(index, event)}\n @mouseleave=${() => {\n this._hoveredComboIndex = null;\n }}\n >\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-combo-btn\": true,\n \"fw-dev-combo-btn--active\": isActive,\n \"fw-dev-combo-btn--disabled\": !combo.compatible && !isCodecIncompatible,\n \"fw-dev-combo-btn--codec-warn\": isCodecIncompatible,\n })}\n @click=${() => this._handleSelectCombo(index)}\n >\n <span\n class=${classMap({\n \"fw-dev-combo-rank\": true,\n [rankClass]: rankClass.length > 0,\n })}\n >${combo.compatible\n ? index + 1\n : isCodecIncompatible\n ? \"\\u26A0\"\n : \"\\u2014\"}</span\n >\n\n <span class=\"fw-dev-combo-name\"\n >${combo.playerName} <span class=\"fw-dev-combo-arrow\">${\"\\u2192\"}</span>\n <span\n class=${classMap({\n \"fw-dev-combo-type\": true,\n [typeClass]: typeClass.length > 0,\n })}\n >${typeLabel}</span\n ></span\n >\n\n <span class=${classMap({ \"fw-dev-combo-score\": true, [scoreClass]: true })}\n >${combo.score.toFixed(2)}</span\n >\n </button>\n\n ${this._hoveredComboIndex === index\n ? html`\n <div\n class=${classMap({\n \"fw-dev-tooltip\": true,\n \"fw-dev-tooltip--above\": this._tooltipAbove,\n \"fw-dev-tooltip--below\": !this._tooltipAbove,\n })}\n >\n <div class=\"fw-dev-tooltip-header\">\n <div class=\"fw-dev-tooltip-title\">${combo.playerName}</div>\n <div class=\"fw-dev-tooltip-subtitle\">${combo.sourceType}</div>\n ${combo.scoreBreakdown?.trackTypes &&\n combo.scoreBreakdown.trackTypes.length > 0\n ? html`\n <div class=\"fw-dev-tooltip-tracks\">\n Tracks:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackTypes.join(\", \")}</span\n >\n </div>\n `\n : nothing}\n </div>\n\n ${combo.compatible && combo.scoreBreakdown\n ? html`\n <div class=\"fw-dev-tooltip-score\">\n Score: ${combo.score.toFixed(2)}\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Tracks [${combo.scoreBreakdown.trackTypes.join(\", \")}]:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.trackScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.tracks}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Priority:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.priorityScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.priority}</span\n >\n </div>\n <div class=\"fw-dev-tooltip-row\">\n Source:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.sourceScore.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.source}</span\n >\n </div>\n\n ${typeof combo.scoreBreakdown.reliabilityScore === \"number\"\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Reliability:\n <span class=\"fw-dev-tooltip-value\"\n >${combo.scoreBreakdown.reliabilityScore.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.reliability ??\n 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.modeBonus === \"number\" &&\n combo.scoreBreakdown.modeBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Mode (${this.playbackMode}):\n <span class=\"fw-dev-tooltip-bonus\"\n >+${combo.scoreBreakdown.modeBonus.toFixed(2)}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.mode ?? 0}</span\n >\n </div>\n `\n : nothing}\n ${typeof combo.scoreBreakdown.routingBonus === \"number\" &&\n combo.scoreBreakdown.routingBonus !== 0\n ? html`\n <div class=\"fw-dev-tooltip-row\">\n Routing:\n <span\n class=${classMap({\n \"fw-dev-tooltip-bonus\":\n combo.scoreBreakdown.routingBonus > 0,\n \"fw-dev-tooltip-penalty\":\n combo.scoreBreakdown.routingBonus < 0,\n })}\n >${combo.scoreBreakdown.routingBonus > 0\n ? \"+\"\n : \"\"}${combo.scoreBreakdown.routingBonus.toFixed(\n 2\n )}</span\n >\n <span class=\"fw-dev-tooltip-weight\"\n >x${combo.scoreBreakdown.weights.routing ?? 0}</span\n >\n </div>\n `\n : nothing}\n `\n : html`\n <div class=\"fw-dev-tooltip-error\">\n ${combo.incompatibleReason || \"Incompatible\"}\n </div>\n `}\n </div>\n `\n : nothing}\n </div>\n `;\n })}\n `}\n </div>\n </div>\n `;\n }\n\n protected render() {\n return html`\n <div class=\"fw-dev-panel\">\n <div class=\"fw-dev-header\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"config\",\n })}\n @click=${() => {\n this._activeTab = \"config\";\n }}\n >\n Config\n </button>\n <button\n type=\"button\"\n class=${classMap({\n \"fw-dev-tab\": true,\n \"fw-dev-tab--active\": this._activeTab === \"stats\",\n })}\n @click=${() => {\n this._activeTab = \"stats\";\n }}\n >\n Stats\n </button>\n <div class=\"fw-dev-spacer\"></div>\n <button\n type=\"button\"\n class=\"fw-dev-close\"\n aria-label=\"Close dev mode panel\"\n @click=${() =>\n this.dispatchEvent(new CustomEvent(\"fw-close\", { bubbles: true, composed: true }))}\n >\n ${closeIcon()}\n </button>\n </div>\n\n ${this._activeTab === \"config\" ? this._renderConfigTab() : this._renderStatsTab()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-dev-mode-panel\": FwDevModePanel;\n }\n}\n"],"names":["FwDevModePanel","LitElement","globalPlayerManager","QualityMonitor","html","classMap","nothing","closeIcon","sharedStyles","utilityStyles","css","__decorate","property","state","customElement"],"mappings":"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"}
@@ -15,7 +15,6 @@ exports.FwPlayerControls = class FwPlayerControls extends lit.LitElement {
15
15
  this.playbackMode = "auto";
16
16
  this.isContentLive = false;
17
17
  this.devMode = false;
18
- this.isDevPanelOpen = false;
19
18
  this.showStatsButton = false;
20
19
  this.isStatsOpen = false;
21
20
  this._settingsOpen = false;
@@ -343,30 +342,6 @@ exports.FwPlayerControls = class FwPlayerControls extends lit.LitElement {
343
342
  </div>
344
343
  `
345
344
  : lit.nothing}
346
- ${this.devMode
347
- ? lit.html `
348
- <div class="fw-control-group">
349
- <button
350
- type="button"
351
- class=${classMap_js.classMap({
352
- "fw-btn-flush": true,
353
- "fw-btn-flush--active": this.isDevPanelOpen,
354
- })}
355
- aria-label=${this.isDevPanelOpen
356
- ? "Hide advanced settings sidebar"
357
- : "Show advanced settings sidebar"}
358
- title=${this.isDevPanelOpen ? "Hide advanced sidebar" : "Advanced sidebar"}
359
- @click=${() => this.dispatchEvent(new CustomEvent("fw-dev-panel-toggle", {
360
- bubbles: true,
361
- composed: true,
362
- }))}
363
- >
364
- <span class="fw-dev-toggle-label">ADV</span>
365
- </button>
366
- </div>
367
- `
368
- : lit.nothing}
369
-
370
345
  <div class="fw-control-group fw-settings-anchor">
371
346
  <button
372
347
  type="button"
@@ -431,12 +406,6 @@ exports.FwPlayerControls.styles = [
431
406
  .fw-settings-anchor {
432
407
  position: relative;
433
408
  }
434
-
435
- .fw-dev-toggle-label {
436
- font-size: 10px;
437
- font-weight: 700;
438
- letter-spacing: 0.08em;
439
- }
440
409
  `,
441
410
  ];
442
411
  tslib_es6.__decorate([
@@ -451,9 +420,6 @@ tslib_es6.__decorate([
451
420
  tslib_es6.__decorate([
452
421
  decorators_js.property({ type: Boolean, attribute: "dev-mode" })
453
422
  ], exports.FwPlayerControls.prototype, "devMode", void 0);
454
- tslib_es6.__decorate([
455
- decorators_js.property({ type: Boolean, attribute: "is-dev-panel-open" })
456
- ], exports.FwPlayerControls.prototype, "isDevPanelOpen", void 0);
457
423
  tslib_es6.__decorate([
458
424
  decorators_js.property({ type: Boolean, attribute: "show-stats-button" })
459
425
  ], exports.FwPlayerControls.prototype, "showStatsButton", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"fw-player-controls.js","sources":["../../../../src/components/fw-player-controls.ts"],"sourcesContent":["/**\n * <fw-player-controls> — Player controls with seek, volume, live state, and settings.\n * Parity port of React/Svelte control behavior.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport {\n playIcon,\n pauseIcon,\n fullscreenIcon,\n fullscreenExitIcon,\n settingsIcon,\n seekToLiveIcon,\n skipBackIcon,\n skipForwardIcon,\n statsIcon,\n} from \"../icons/index.js\";\nimport {\n calculateIsNearLive,\n calculateLiveThresholds,\n calculateSeekableRange,\n canSeekStream,\n formatTimeDisplay,\n isLiveContent,\n isMediaStreamSource,\n type MistStreamInfo,\n type PlaybackMode,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\ninterface SeekingContext {\n mistStreamInfo?: MistStreamInfo;\n isLive: boolean;\n sourceType?: string;\n seekableStart: number;\n liveEdge: number;\n hasDvrWindow: boolean;\n canSeek: boolean;\n commitOnRelease: boolean;\n liveThresholds: ReturnType<typeof calculateLiveThresholds>;\n}\n\n@customElement(\"fw-player-controls\")\nexport class FwPlayerControls extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n @property({ type: Boolean, attribute: \"is-content-live\" }) isContentLive = false;\n @property({ type: Boolean, attribute: \"dev-mode\" }) devMode = false;\n @property({ type: Boolean, attribute: \"is-dev-panel-open\" }) isDevPanelOpen = false;\n @property({ type: Boolean, attribute: \"show-stats-button\" }) showStatsButton = false;\n @property({ type: Boolean, attribute: \"is-stats-open\" }) isStatsOpen = false;\n\n @state() private _settingsOpen = false;\n @state() private _isNearLiveState = true;\n @state() private _buffered: TimeRanges | null = null;\n\n private _boundVideo: HTMLVideoElement | null = null;\n private _onBufferedUpdate: (() => void) | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: contents;\n }\n\n .fw-settings-anchor {\n position: relative;\n }\n\n .fw-dev-toggle-label {\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.08em;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._unbindVideoEvents();\n this._detachWindowClickListener();\n }\n\n protected updated(changed: PropertyValues<this>): void {\n this._bindVideoEvents();\n this._reconcileNearLiveState();\n\n if (changed.has(\"_settingsOpen\" as keyof FwPlayerControls)) {\n if (this._settingsOpen) {\n this._attachWindowClickListener();\n } else {\n this._detachWindowClickListener();\n }\n }\n }\n\n private _bindVideoEvents(): void {\n const video = this.pc?.s.videoElement ?? null;\n if (video === this._boundVideo) {\n return;\n }\n\n this._unbindVideoEvents();\n this._boundVideo = video;\n\n if (!video) {\n this._buffered = null;\n return;\n }\n\n const updateBuffered = () => {\n this._buffered = this.pc.getBufferedRanges() ?? video.buffered;\n };\n\n updateBuffered();\n video.addEventListener(\"progress\", updateBuffered);\n video.addEventListener(\"loadeddata\", updateBuffered);\n this._onBufferedUpdate = updateBuffered;\n }\n\n private _unbindVideoEvents(): void {\n if (!this._boundVideo) {\n return;\n }\n\n const updateBuffered = this._onBufferedUpdate;\n if (updateBuffered) {\n this._boundVideo.removeEventListener(\"progress\", updateBuffered);\n this._boundVideo.removeEventListener(\"loadeddata\", updateBuffered);\n }\n\n this._boundVideo = null;\n this._onBufferedUpdate = null;\n }\n\n private _attachWindowClickListener(): void {\n window.setTimeout(() => {\n if (!this._settingsOpen) {\n return;\n }\n window.addEventListener(\"click\", this._onWindowClick);\n }, 0);\n }\n\n private _detachWindowClickListener(): void {\n window.removeEventListener(\"click\", this._onWindowClick);\n }\n\n private _onWindowClick = (event: MouseEvent): void => {\n const path = event.composedPath();\n const insideControls = path.some((entry) => {\n if (!(entry instanceof HTMLElement)) {\n return false;\n }\n return (\n entry.classList.contains(\"fw-settings-anchor\") ||\n entry.classList.contains(\"fw-settings-menu\")\n );\n });\n\n if (!insideControls) {\n this._settingsOpen = false;\n }\n };\n\n private _deriveBufferWindowMs(\n tracks?: Record<string, { firstms?: number; lastms?: number }>\n ): number | undefined {\n if (!tracks) {\n return undefined;\n }\n\n const trackValues = Object.values(tracks);\n if (trackValues.length === 0) {\n return undefined;\n }\n\n const firstmsValues = trackValues\n .map((track) => track.firstms)\n .filter((value): value is number => typeof value === \"number\");\n const lastmsValues = trackValues\n .map((track) => track.lastms)\n .filter((value): value is number => typeof value === \"number\");\n\n if (firstmsValues.length === 0 || lastmsValues.length === 0) {\n return undefined;\n }\n\n const firstms = Math.max(...firstmsValues);\n const lastms = Math.min(...lastmsValues);\n const window = lastms - firstms;\n\n if (!Number.isFinite(window) || window <= 0) {\n return undefined;\n }\n\n return window;\n }\n\n private _getSeekingContext(): SeekingContext {\n const state = this.pc.s;\n const controller = this.pc.getController();\n const sourceType = state.currentSourceInfo?.type;\n const mistStreamInfo = state.streamState?.streamInfo as MistStreamInfo | undefined;\n\n const isLive = isLiveContent(this.isContentLive, mistStreamInfo, state.duration);\n const bufferWindowMs =\n mistStreamInfo?.meta?.buffer_window ??\n this._deriveBufferWindowMs(\n mistStreamInfo?.meta?.tracks as\n | Record<string, { firstms?: number; lastms?: number }>\n | undefined\n );\n\n const isWebRTC = isMediaStreamSource(state.videoElement);\n\n const allowMediaStreamDvr =\n isMediaStreamSource(state.videoElement) &&\n bufferWindowMs !== undefined &&\n bufferWindowMs > 0 &&\n sourceType !== \"whep\" &&\n sourceType !== \"webrtc\";\n\n const calculatedRange = calculateSeekableRange({\n isLive,\n video: state.videoElement,\n mistStreamInfo,\n currentTime: state.currentTime,\n duration: state.duration,\n allowMediaStreamDvr,\n });\n\n const controllerSeekableStart = this.pc.getSeekableStart();\n const controllerLiveEdge = this.pc.getLiveEdge();\n\n const useControllerRange =\n Number.isFinite(controllerSeekableStart) &&\n Number.isFinite(controllerLiveEdge) &&\n controllerLiveEdge >= controllerSeekableStart &&\n (controllerLiveEdge > 0 || controllerSeekableStart > 0);\n\n const seekableStart = useControllerRange\n ? controllerSeekableStart\n : calculatedRange.seekableStart;\n const liveEdge = useControllerRange ? controllerLiveEdge : calculatedRange.liveEdge;\n\n const hasDvrWindow =\n isLive &&\n Number.isFinite(liveEdge) &&\n Number.isFinite(seekableStart) &&\n liveEdge > seekableStart;\n\n const baseCanSeek =\n controller?.canSeekStream?.() ??\n canSeekStream({\n video: state.videoElement,\n isLive,\n duration: state.duration,\n bufferWindowMs,\n });\n\n const liveThresholds = calculateLiveThresholds(sourceType, isWebRTC, bufferWindowMs);\n\n return {\n mistStreamInfo,\n isLive,\n sourceType,\n seekableStart,\n liveEdge,\n hasDvrWindow,\n canSeek: baseCanSeek && (!isLive || hasDvrWindow),\n commitOnRelease: isLive,\n liveThresholds,\n };\n }\n\n private _reconcileNearLiveState(): void {\n const context = this._getSeekingContext();\n\n if (!context.isLive) {\n if (!this._isNearLiveState) {\n this._isNearLiveState = true;\n }\n return;\n }\n\n const next = calculateIsNearLive(\n this.pc.s.currentTime,\n context.liveEdge,\n context.liveThresholds,\n this._isNearLiveState\n );\n\n if (next !== this._isNearLiveState) {\n this._isNearLiveState = next;\n }\n }\n\n private _handleModeChange(\n event: CustomEvent<{ mode: \"auto\" | \"low-latency\" | \"quality\" }>\n ): void {\n const { mode } = event.detail;\n this.dispatchEvent(\n new CustomEvent(\"fw-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected render() {\n const state = this.pc.s;\n const disabled = !state.videoElement;\n const context = this._getSeekingContext();\n const shouldShowControls =\n state.shouldShowControls ||\n state.isPaused ||\n !state.hasPlaybackStarted ||\n state.shouldShowIdleScreen ||\n !!state.error ||\n this._settingsOpen;\n\n const timeDisplay = formatTimeDisplay({\n isLive: context.isLive,\n currentTime: state.currentTime,\n duration: state.duration,\n liveEdge: context.liveEdge,\n seekableStart: context.seekableStart,\n unixoffset: context.mistStreamInfo?.unixoffset,\n });\n\n const liveButtonDisabled = !context.hasDvrWindow || this._isNearLiveState;\n\n return html`\n <div\n class=${classMap({\n \"fw-player-surface\": true,\n \"fw-controls-wrapper\": true,\n \"fw-controls-wrapper--visible\": shouldShowControls,\n \"fw-controls-wrapper--hidden\": !shouldShowControls,\n })}\n >\n <div class=\"fw-control-bar\" @click=${(event: Event) => event.stopPropagation()}>\n ${context.canSeek\n ? html`\n <div class=\"fw-seek-wrapper\">\n <fw-seek-bar\n .currentTime=${state.currentTime}\n .duration=${state.duration}\n .buffered=${this._buffered}\n .disabled=${disabled}\n .isLive=${context.isLive}\n .seekableStart=${context.seekableStart}\n .liveEdge=${context.liveEdge}\n .commitOnRelease=${context.commitOnRelease}\n @fw-seek=${(event: CustomEvent<{ time: number }>) =>\n this.pc.seek(event.detail.time)}\n ></fw-seek-bar>\n </div>\n `\n : nothing}\n\n <div class=\"fw-controls-row\">\n <div class=\"fw-controls-left\">\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isPlaying ? \"Pause\" : \"Play\"}\n @click=${() => this.pc.togglePlay()}\n >\n ${state.isPlaying ? pauseIcon(18) : playIcon(18)}\n </button>\n\n ${context.canSeek\n ? html`\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=\"Skip back 10 seconds\"\n @click=${() => this.pc.seekBy(-10)}\n >\n ${skipBackIcon(16)}\n </button>\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=\"Skip forward 10 seconds\"\n @click=${() => this.pc.seekBy(10)}\n >\n ${skipForwardIcon(16)}\n </button>\n `\n : nothing}\n </div>\n\n <div class=\"fw-control-group\">\n <fw-volume-control .pc=${this.pc}></fw-volume-control>\n </div>\n\n <div class=\"fw-control-group\">\n <span class=\"fw-time-display\">${timeDisplay}</span>\n </div>\n\n ${context.isLive\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n @click=${() => this.pc.jumpToLive()}\n ?disabled=${liveButtonDisabled}\n class=${classMap({\n \"fw-live-badge\": true,\n \"fw-live-badge--active\": liveButtonDisabled,\n \"fw-live-badge--behind\": !liveButtonDisabled,\n })}\n title=${!context.hasDvrWindow\n ? \"Live only\"\n : this._isNearLiveState\n ? \"At live edge\"\n : \"Jump to live\"}\n >\n LIVE\n ${!this._isNearLiveState && context.hasDvrWindow\n ? seekToLiveIcon(10)\n : nothing}\n </button>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-controls-right\">\n ${this.showStatsButton\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n \"fw-btn-flush--active\": this.isStatsOpen,\n })}\n aria-label=\"Toggle stats\"\n title=\"Stats\"\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent(\"fw-stats-toggle\", {\n bubbles: true,\n composed: true,\n })\n )}\n >\n ${statsIcon(16)}\n </button>\n </div>\n `\n : nothing}\n ${this.devMode\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n \"fw-btn-flush--active\": this.isDevPanelOpen,\n })}\n aria-label=${this.isDevPanelOpen\n ? \"Hide advanced settings sidebar\"\n : \"Show advanced settings sidebar\"}\n title=${this.isDevPanelOpen ? \"Hide advanced sidebar\" : \"Advanced sidebar\"}\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent(\"fw-dev-panel-toggle\", {\n bubbles: true,\n composed: true,\n })\n )}\n >\n <span class=\"fw-dev-toggle-label\">ADV</span>\n </button>\n </div>\n `\n : nothing}\n\n <div class=\"fw-control-group fw-settings-anchor\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n group: true,\n \"fw-btn-flush--active\": this._settingsOpen,\n })}\n aria-label=\"Settings\"\n title=\"Settings\"\n ?disabled=${disabled}\n @click=${() => {\n if (disabled) {\n return;\n }\n this._settingsOpen = !this._settingsOpen;\n }}\n >\n <span class=\"transition-transform group-hover:rotate-90\"\n >${settingsIcon(16)}</span\n >\n </button>\n\n <fw-settings-menu\n .pc=${this.pc}\n .open=${this._settingsOpen}\n .playbackMode=${this.playbackMode}\n .isContentLive=${this.isContentLive}\n @fw-close=${() => {\n this._settingsOpen = false;\n }}\n @fw-mode-change=${this._handleModeChange}\n ></fw-settings-menu>\n </div>\n\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n @click=${() => this.pc.toggleFullscreen()}\n >\n ${state.isFullscreen ? fullscreenExitIcon(16) : fullscreenIcon(16)}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-player-controls\": FwPlayerControls;\n }\n}\n"],"names":["FwPlayerControls","LitElement","isLiveContent","isMediaStreamSource","calculateSeekableRange","canSeekStream","calculateLiveThresholds","calculateIsNearLive","formatTimeDisplay","html","classMap","nothing","pauseIcon","playIcon","skipBackIcon","skipForwardIcon","seekToLiveIcon","statsIcon","settingsIcon","fullscreenExitIcon","fullscreenIcon","sharedStyles","utilityStyles","css","__decorate","property","state","customElement"],"mappings":"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"}
1
+ {"version":3,"file":"fw-player-controls.js","sources":["../../../../src/components/fw-player-controls.ts"],"sourcesContent":["/**\n * <fw-player-controls> — Player controls with seek, volume, live state, and settings.\n * Parity port of React/Svelte control behavior.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport {\n playIcon,\n pauseIcon,\n fullscreenIcon,\n fullscreenExitIcon,\n settingsIcon,\n seekToLiveIcon,\n skipBackIcon,\n skipForwardIcon,\n statsIcon,\n} from \"../icons/index.js\";\nimport {\n calculateIsNearLive,\n calculateLiveThresholds,\n calculateSeekableRange,\n canSeekStream,\n formatTimeDisplay,\n isLiveContent,\n isMediaStreamSource,\n type MistStreamInfo,\n type PlaybackMode,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\ninterface SeekingContext {\n mistStreamInfo?: MistStreamInfo;\n isLive: boolean;\n sourceType?: string;\n seekableStart: number;\n liveEdge: number;\n hasDvrWindow: boolean;\n canSeek: boolean;\n commitOnRelease: boolean;\n liveThresholds: ReturnType<typeof calculateLiveThresholds>;\n}\n\n@customElement(\"fw-player-controls\")\nexport class FwPlayerControls extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n @property({ type: Boolean, attribute: \"is-content-live\" }) isContentLive = false;\n @property({ type: Boolean, attribute: \"dev-mode\" }) devMode = false;\n @property({ type: Boolean, attribute: \"show-stats-button\" }) showStatsButton = false;\n @property({ type: Boolean, attribute: \"is-stats-open\" }) isStatsOpen = false;\n\n @state() private _settingsOpen = false;\n @state() private _isNearLiveState = true;\n @state() private _buffered: TimeRanges | null = null;\n\n private _boundVideo: HTMLVideoElement | null = null;\n private _onBufferedUpdate: (() => void) | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: contents;\n }\n\n .fw-settings-anchor {\n position: relative;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._unbindVideoEvents();\n this._detachWindowClickListener();\n }\n\n protected updated(changed: PropertyValues<this>): void {\n this._bindVideoEvents();\n this._reconcileNearLiveState();\n\n if (changed.has(\"_settingsOpen\" as keyof FwPlayerControls)) {\n if (this._settingsOpen) {\n this._attachWindowClickListener();\n } else {\n this._detachWindowClickListener();\n }\n }\n }\n\n private _bindVideoEvents(): void {\n const video = this.pc?.s.videoElement ?? null;\n if (video === this._boundVideo) {\n return;\n }\n\n this._unbindVideoEvents();\n this._boundVideo = video;\n\n if (!video) {\n this._buffered = null;\n return;\n }\n\n const updateBuffered = () => {\n this._buffered = this.pc.getBufferedRanges() ?? video.buffered;\n };\n\n updateBuffered();\n video.addEventListener(\"progress\", updateBuffered);\n video.addEventListener(\"loadeddata\", updateBuffered);\n this._onBufferedUpdate = updateBuffered;\n }\n\n private _unbindVideoEvents(): void {\n if (!this._boundVideo) {\n return;\n }\n\n const updateBuffered = this._onBufferedUpdate;\n if (updateBuffered) {\n this._boundVideo.removeEventListener(\"progress\", updateBuffered);\n this._boundVideo.removeEventListener(\"loadeddata\", updateBuffered);\n }\n\n this._boundVideo = null;\n this._onBufferedUpdate = null;\n }\n\n private _attachWindowClickListener(): void {\n window.setTimeout(() => {\n if (!this._settingsOpen) {\n return;\n }\n window.addEventListener(\"click\", this._onWindowClick);\n }, 0);\n }\n\n private _detachWindowClickListener(): void {\n window.removeEventListener(\"click\", this._onWindowClick);\n }\n\n private _onWindowClick = (event: MouseEvent): void => {\n const path = event.composedPath();\n const insideControls = path.some((entry) => {\n if (!(entry instanceof HTMLElement)) {\n return false;\n }\n return (\n entry.classList.contains(\"fw-settings-anchor\") ||\n entry.classList.contains(\"fw-settings-menu\")\n );\n });\n\n if (!insideControls) {\n this._settingsOpen = false;\n }\n };\n\n private _deriveBufferWindowMs(\n tracks?: Record<string, { firstms?: number; lastms?: number }>\n ): number | undefined {\n if (!tracks) {\n return undefined;\n }\n\n const trackValues = Object.values(tracks);\n if (trackValues.length === 0) {\n return undefined;\n }\n\n const firstmsValues = trackValues\n .map((track) => track.firstms)\n .filter((value): value is number => typeof value === \"number\");\n const lastmsValues = trackValues\n .map((track) => track.lastms)\n .filter((value): value is number => typeof value === \"number\");\n\n if (firstmsValues.length === 0 || lastmsValues.length === 0) {\n return undefined;\n }\n\n const firstms = Math.max(...firstmsValues);\n const lastms = Math.min(...lastmsValues);\n const window = lastms - firstms;\n\n if (!Number.isFinite(window) || window <= 0) {\n return undefined;\n }\n\n return window;\n }\n\n private _getSeekingContext(): SeekingContext {\n const state = this.pc.s;\n const controller = this.pc.getController();\n const sourceType = state.currentSourceInfo?.type;\n const mistStreamInfo = state.streamState?.streamInfo as MistStreamInfo | undefined;\n\n const isLive = isLiveContent(this.isContentLive, mistStreamInfo, state.duration);\n const bufferWindowMs =\n mistStreamInfo?.meta?.buffer_window ??\n this._deriveBufferWindowMs(\n mistStreamInfo?.meta?.tracks as\n | Record<string, { firstms?: number; lastms?: number }>\n | undefined\n );\n\n const isWebRTC = isMediaStreamSource(state.videoElement);\n\n const allowMediaStreamDvr =\n isMediaStreamSource(state.videoElement) &&\n bufferWindowMs !== undefined &&\n bufferWindowMs > 0 &&\n sourceType !== \"whep\" &&\n sourceType !== \"webrtc\";\n\n const calculatedRange = calculateSeekableRange({\n isLive,\n video: state.videoElement,\n mistStreamInfo,\n currentTime: state.currentTime,\n duration: state.duration,\n allowMediaStreamDvr,\n });\n\n const controllerSeekableStart = this.pc.getSeekableStart();\n const controllerLiveEdge = this.pc.getLiveEdge();\n\n const useControllerRange =\n Number.isFinite(controllerSeekableStart) &&\n Number.isFinite(controllerLiveEdge) &&\n controllerLiveEdge >= controllerSeekableStart &&\n (controllerLiveEdge > 0 || controllerSeekableStart > 0);\n\n const seekableStart = useControllerRange\n ? controllerSeekableStart\n : calculatedRange.seekableStart;\n const liveEdge = useControllerRange ? controllerLiveEdge : calculatedRange.liveEdge;\n\n const hasDvrWindow =\n isLive &&\n Number.isFinite(liveEdge) &&\n Number.isFinite(seekableStart) &&\n liveEdge > seekableStart;\n\n const baseCanSeek =\n controller?.canSeekStream?.() ??\n canSeekStream({\n video: state.videoElement,\n isLive,\n duration: state.duration,\n bufferWindowMs,\n });\n\n const liveThresholds = calculateLiveThresholds(sourceType, isWebRTC, bufferWindowMs);\n\n return {\n mistStreamInfo,\n isLive,\n sourceType,\n seekableStart,\n liveEdge,\n hasDvrWindow,\n canSeek: baseCanSeek && (!isLive || hasDvrWindow),\n commitOnRelease: isLive,\n liveThresholds,\n };\n }\n\n private _reconcileNearLiveState(): void {\n const context = this._getSeekingContext();\n\n if (!context.isLive) {\n if (!this._isNearLiveState) {\n this._isNearLiveState = true;\n }\n return;\n }\n\n const next = calculateIsNearLive(\n this.pc.s.currentTime,\n context.liveEdge,\n context.liveThresholds,\n this._isNearLiveState\n );\n\n if (next !== this._isNearLiveState) {\n this._isNearLiveState = next;\n }\n }\n\n private _handleModeChange(\n event: CustomEvent<{ mode: \"auto\" | \"low-latency\" | \"quality\" }>\n ): void {\n const { mode } = event.detail;\n this.dispatchEvent(\n new CustomEvent(\"fw-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected render() {\n const state = this.pc.s;\n const disabled = !state.videoElement;\n const context = this._getSeekingContext();\n const shouldShowControls =\n state.shouldShowControls ||\n state.isPaused ||\n !state.hasPlaybackStarted ||\n state.shouldShowIdleScreen ||\n !!state.error ||\n this._settingsOpen;\n\n const timeDisplay = formatTimeDisplay({\n isLive: context.isLive,\n currentTime: state.currentTime,\n duration: state.duration,\n liveEdge: context.liveEdge,\n seekableStart: context.seekableStart,\n unixoffset: context.mistStreamInfo?.unixoffset,\n });\n\n const liveButtonDisabled = !context.hasDvrWindow || this._isNearLiveState;\n\n return html`\n <div\n class=${classMap({\n \"fw-player-surface\": true,\n \"fw-controls-wrapper\": true,\n \"fw-controls-wrapper--visible\": shouldShowControls,\n \"fw-controls-wrapper--hidden\": !shouldShowControls,\n })}\n >\n <div class=\"fw-control-bar\" @click=${(event: Event) => event.stopPropagation()}>\n ${context.canSeek\n ? html`\n <div class=\"fw-seek-wrapper\">\n <fw-seek-bar\n .currentTime=${state.currentTime}\n .duration=${state.duration}\n .buffered=${this._buffered}\n .disabled=${disabled}\n .isLive=${context.isLive}\n .seekableStart=${context.seekableStart}\n .liveEdge=${context.liveEdge}\n .commitOnRelease=${context.commitOnRelease}\n @fw-seek=${(event: CustomEvent<{ time: number }>) =>\n this.pc.seek(event.detail.time)}\n ></fw-seek-bar>\n </div>\n `\n : nothing}\n\n <div class=\"fw-controls-row\">\n <div class=\"fw-controls-left\">\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isPlaying ? \"Pause\" : \"Play\"}\n @click=${() => this.pc.togglePlay()}\n >\n ${state.isPlaying ? pauseIcon(18) : playIcon(18)}\n </button>\n\n ${context.canSeek\n ? html`\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=\"Skip back 10 seconds\"\n @click=${() => this.pc.seekBy(-10)}\n >\n ${skipBackIcon(16)}\n </button>\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=\"Skip forward 10 seconds\"\n @click=${() => this.pc.seekBy(10)}\n >\n ${skipForwardIcon(16)}\n </button>\n `\n : nothing}\n </div>\n\n <div class=\"fw-control-group\">\n <fw-volume-control .pc=${this.pc}></fw-volume-control>\n </div>\n\n <div class=\"fw-control-group\">\n <span class=\"fw-time-display\">${timeDisplay}</span>\n </div>\n\n ${context.isLive\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n @click=${() => this.pc.jumpToLive()}\n ?disabled=${liveButtonDisabled}\n class=${classMap({\n \"fw-live-badge\": true,\n \"fw-live-badge--active\": liveButtonDisabled,\n \"fw-live-badge--behind\": !liveButtonDisabled,\n })}\n title=${!context.hasDvrWindow\n ? \"Live only\"\n : this._isNearLiveState\n ? \"At live edge\"\n : \"Jump to live\"}\n >\n LIVE\n ${!this._isNearLiveState && context.hasDvrWindow\n ? seekToLiveIcon(10)\n : nothing}\n </button>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-controls-right\">\n ${this.showStatsButton\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n \"fw-btn-flush--active\": this.isStatsOpen,\n })}\n aria-label=\"Toggle stats\"\n title=\"Stats\"\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent(\"fw-stats-toggle\", {\n bubbles: true,\n composed: true,\n })\n )}\n >\n ${statsIcon(16)}\n </button>\n </div>\n `\n : nothing}\n <div class=\"fw-control-group fw-settings-anchor\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n group: true,\n \"fw-btn-flush--active\": this._settingsOpen,\n })}\n aria-label=\"Settings\"\n title=\"Settings\"\n ?disabled=${disabled}\n @click=${() => {\n if (disabled) {\n return;\n }\n this._settingsOpen = !this._settingsOpen;\n }}\n >\n <span class=\"transition-transform group-hover:rotate-90\"\n >${settingsIcon(16)}</span\n >\n </button>\n\n <fw-settings-menu\n .pc=${this.pc}\n .open=${this._settingsOpen}\n .playbackMode=${this.playbackMode}\n .isContentLive=${this.isContentLive}\n @fw-close=${() => {\n this._settingsOpen = false;\n }}\n @fw-mode-change=${this._handleModeChange}\n ></fw-settings-menu>\n </div>\n\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n @click=${() => this.pc.toggleFullscreen()}\n >\n ${state.isFullscreen ? fullscreenExitIcon(16) : fullscreenIcon(16)}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-player-controls\": FwPlayerControls;\n }\n}\n"],"names":["FwPlayerControls","LitElement","isLiveContent","isMediaStreamSource","calculateSeekableRange","canSeekStream","calculateLiveThresholds","calculateIsNearLive","formatTimeDisplay","html","classMap","nothing","pauseIcon","playIcon","skipBackIcon","skipForwardIcon","seekToLiveIcon","statsIcon","settingsIcon","fullscreenExitIcon","fullscreenIcon","sharedStyles","utilityStyles","css","__decorate","property","state","customElement"],"mappings":"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"}
@@ -668,13 +668,9 @@ exports.FwPlayer = class FwPlayer extends lit.LitElement {
668
668
  .playbackMode=${this.playbackMode}
669
669
  .isContentLive=${s.isEffectivelyLive}
670
670
  .devMode=${this.devMode}
671
- .isDevPanelOpen=${this._isDevPanelOpen}
672
671
  .isStatsOpen=${this._isStatsOpen}
673
672
  @fw-stats-toggle=${() => {
674
673
  this._isStatsOpen = !this._isStatsOpen;
675
- }}
676
- @fw-dev-panel-toggle=${() => {
677
- this._isDevPanelOpen = !this._isDevPanelOpen;
678
674
  }}
679
675
  @fw-mode-change=${(event) => {
680
676
  this.playbackMode = event.detail.mode;
@@ -920,6 +916,7 @@ exports.FwPlayer.styles = [
920
916
  .player-area--dev {
921
917
  flex: 1;
922
918
  min-width: 0;
919
+ min-height: 0;
923
920
  }
924
921
  `,
925
922
  ];