UNPKG

@sixbell-telco/sdk

Version:

A collection of reusable components designed for use in Sixbell Telco Angular projects

1 lines 54.5 kB
{"version":3,"file":"sixbell-telco-sdk-components-audio-player.mjs","sources":["../../../projects/sdk/components/audio-player/services/audio.service.ts","../../../projects/sdk/components/audio-player/button-play/button-play.component.ts","../../../projects/sdk/components/audio-player/button-play/button-play.component.html","../../../projects/sdk/components/audio-player/audio-timeline/audio-timeline.component.ts","../../../projects/sdk/components/audio-player/audio-timeline/audio-timeline.component.html","../../../projects/sdk/components/audio-player/track-info/track-info.component.ts","../../../projects/sdk/components/audio-player/track-info/track-info.component.html","../../../projects/sdk/components/audio-player/volume-control/volume-control.component.ts","../../../projects/sdk/components/audio-player/volume-control/volume-control.component.html","../../../projects/sdk/components/audio-player/src/audio-player.component.ts","../../../projects/sdk/components/audio-player/src/audio-player.component.html","../../../projects/sdk/components/audio-player/sixbell-telco-sdk-components-audio-player.ts"],"sourcesContent":["// audio-player.service.ts\nimport { HttpClient } from '@angular/common/http';\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { Track } from '../src/audio-player.component';\n\n@Injectable({ providedIn: 'root' })\nexport class AudioPlayerService {\n\tprivate audio = new Audio();\n\tprivate http = inject(HttpClient);\n\tprivate objectUrls = new Map<string, string>();\n\n\t// State signals\n\tprivate _tracks = signal<Track[]>([]);\n\tprivate _currentTrackIndex = signal<number>(-1);\n\tprivate _isPlaying = signal(false);\n\tprivate _duration = signal(0);\n\tprivate _currentTime = signal(0);\n\tprivate _volume = signal(1);\n\tprivate _isMuted = signal(false);\n\tprivate _lastVolume = signal(1);\n\tprivate _isBuffering = signal(false);\n\tprivate _isInitializing = signal(false);\n\tprivate _autoPlayNext = signal(false);\n\tprivate _error = signal<ErrorEvent | null>(null);\n\n\t// Readonly signals\n\tpublic tracks = this._tracks.asReadonly();\n\tpublic currentTrackIndex = this._currentTrackIndex.asReadonly();\n\tpublic isPlaying = this._isPlaying.asReadonly();\n\tpublic duration = this._duration.asReadonly();\n\tpublic currentTime = this._currentTime.asReadonly();\n\tpublic volume = this._volume.asReadonly();\n\tpublic isMuted = this._isMuted.asReadonly();\n\tpublic isBuffering = this._isBuffering.asReadonly();\n\tpublic isInitializing = this._isInitializing.asReadonly();\n\tpublic currentTrack = computed(() => this.tracks()[this.currentTrackIndex()] || undefined);\n\tpublic autoPlayNext = this._autoPlayNext.asReadonly();\n\tpublic error = this._error.asReadonly();\n\n\tconstructor() {\n\t\tthis.setupAudioListeners();\n\t\tthis.restoreVolumeSettings();\n\t}\n\n\tprivate setupAudioListeners() {\n\t\tthis.audio.addEventListener('loadedmetadata', () => this.updateDuration());\n\t\tthis.audio.addEventListener('timeupdate', () => this.updateTime());\n\t\tthis.audio.addEventListener('playing', () => this.setPlaying(true));\n\t\tthis.audio.addEventListener('pause', () => this.setPlaying(false));\n\t\tthis.audio.addEventListener('ended', () => this.handleEnded());\n\t\tthis.audio.addEventListener('waiting', () => this._isBuffering.set(true));\n\t\tthis.audio.addEventListener('error', (e) => {\n\t\t\tthis._error.set(e);\n\t\t\tconsole.error('Audio error:', e);\n\t\t});\n\t}\n\n\tprivate async getAuthenticatedAudioUrl(track: Track): Promise<string> {\n\t\tif (!this.objectUrls.has(track.url)) {\n\t\t\tconst blob = await firstValueFrom(\n\t\t\t\tthis.http.get(track.url, {\n\t\t\t\t\tresponseType: 'blob',\n\t\t\t\t\theaders: { Accept: 'audio/mpeg' },\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.objectUrls.set(track.url, URL.createObjectURL(blob));\n\t\t}\n\t\treturn this.objectUrls.get(track.url)!;\n\t}\n\n\tpublic async playTrack(index: number) {\n\t\tif (index < 0 || index >= this.tracks().length) return;\n\n\t\tthis._isInitializing.set(true);\n\t\tthis._currentTrackIndex.set(index);\n\t\tconst track = this.tracks()[index];\n\n\t\t// Get authenticated URL\n\t\tconst authenticatedUrl = await this.getAuthenticatedAudioUrl(track);\n\n\t\t// Set audio source\n\t\tthis.audio.src = authenticatedUrl;\n\t\tthis.audio.load();\n\n\t\ttry {\n\t\t\t// Wait for audio to be ready\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tthis.audio.addEventListener('canplay', () => resolve(), { once: true });\n\t\t\t\tthis.audio.addEventListener('error', (e) => reject(e), { once: true });\n\t\t\t});\n\n\t\t\tawait this.audio.play();\n\t\t} catch (error) {\n\t\t\tconsole.error('Error playing track:', error);\n\t\t\tthis._error.set(error as ErrorEvent);\n\t\t\tthis._isPlaying.set(false);\n\t\t} finally {\n\t\t\tthis._isInitializing.set(false);\n\t\t}\n\t}\n\n\tpublic init() {\n\t\tthis.audio = new Audio();\n\t\tthis.setupAudioListeners();\n\t\tthis.restoreVolumeSettings();\n\t}\n\n\tpublic cleanup() {\n\t\tthis.audio.pause();\n\t\tthis.audio.src = '';\n\t\tthis.objectUrls.forEach((url) => URL.revokeObjectURL(url));\n\t\tthis.objectUrls.clear();\n\n\t\t// reset signals\n\t\tthis._tracks.set([]);\n\t\tthis._currentTrackIndex.set(-1);\n\t\tthis._isPlaying.set(false);\n\t\tthis._duration.set(0);\n\t\tthis._currentTime.set(0);\n\t\tthis._volume.set(1);\n\t\tthis._isMuted.set(false);\n\t\tthis._lastVolume.set(1);\n\t\tthis._isBuffering.set(false);\n\t\tthis._isInitializing.set(false);\n\t\tthis._autoPlayNext.set(false);\n\t\tthis._error.set(null);\n\t}\n\n\tpublic async togglePlay() {\n\t\tif (!this.checkIfTrackIsLoaded()) return;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-expressions\n\t\tthis.audio.paused ? await this.audio.play() : this.audio.pause();\n\t}\n\n\tpublic async previous() {\n\t\tthis.clearCurrentTime();\n\n\t\tconst totalTracks = this.tracks().length;\n\t\tif (totalTracks === 0) return;\n\n\t\tconst newIndex = (this.currentTrackIndex() - 1 + totalTracks) % totalTracks;\n\t\tawait this.playTrack(newIndex);\n\t}\n\n\tpublic async next() {\n\t\tthis.clearCurrentTime();\n\n\t\tconst totalTracks = this.tracks().length;\n\t\tif (totalTracks === 0) return;\n\n\t\tconst newIndex = (this.currentTrackIndex() + 1) % totalTracks;\n\t\tawait this.playTrack(newIndex);\n\t}\n\n\tpublic setTracks(tracks: Track[]) {\n\t\tthis._tracks.set(tracks);\n\t}\n\n\tpublic setCurrentTrackIndex(index: number) {\n\t\tthis._currentTrackIndex.set(index);\n\t}\n\n\tprivate setPlaying(playing: boolean) {\n\t\tthis._isPlaying.set(playing);\n\t\tthis._isBuffering.set(false);\n\t}\n\n\tpublic setAutoPlayNext(autoPlayNext: boolean) {\n\t\tthis._autoPlayNext.set(autoPlayNext);\n\t}\n\n\tpublic setVolume(volume: number) {\n\t\tthis._volume.set(volume);\n\t\tthis.audio.volume = volume;\n\t\tif (volume > 0) this._lastVolume.set(volume);\n\n\t\tlocalStorage.setItem('volume', JSON.stringify(this.volume()));\n\t}\n\n\tpublic setMuted(muted: boolean) {\n\t\tthis._isMuted.set(muted);\n\t\tif (muted) {\n\t\t\tthis._lastVolume.set(this.volume());\n\t\t\tthis.setVolume(0);\n\t\t} else {\n\t\t\tthis.setVolume(this._lastVolume());\n\t\t}\n\n\t\tlocalStorage.setItem('isMuted', JSON.stringify(this.isMuted()));\n\t}\n\n\tpublic seekTo(time: number) {\n\t\tthis.audio.currentTime = time;\n\t}\n\n\tpublic isPlayingATrack() {\n\t\treturn this.audio.src !== '' && !this.audio.paused;\n\t}\n\n\t// Private handlers\n\tprivate updateDuration() {\n\t\tthis._duration.set(this.audio.duration);\n\t\tthis._isInitializing.set(false);\n\t}\n\n\tprivate updateTime() {\n\t\tthis._currentTime.set(this.audio.currentTime);\n\t}\n\n\tprivate handleEnded() {\n\t\tthis._isPlaying.set(false);\n\t\tif (this._autoPlayNext()) this.next();\n\t}\n\n\tprivate clearCurrentTime() {\n\t\tthis.audio.currentTime = 0;\n\t\tthis._currentTime.set(0);\n\t}\n\n\tprivate restoreVolumeSettings() {\n\t\tconst volume = localStorage.getItem('volume');\n\t\tconst isMuted = localStorage.getItem('isMuted');\n\n\t\tif (volume) this.setVolume(JSON.parse(volume));\n\t\tif (isMuted) this.setMuted(JSON.parse(isMuted));\n\t}\n\n\tprivate checkIfTrackIsLoaded() {\n\t\treturn this.audio.src !== '';\n\t}\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\nimport { matPause, matPlayArrow } from '@ng-icons/material-icons/baseline';\nimport { ButtonComponent, ButtonSizeProps, ButtonVariantProps } from '@sixbell-telco/sdk/components/button';\nimport { IconComponent } from '@sixbell-telco/sdk/components/icon';\nimport { heroMusicalNoteMini } from '@sixbell-telco/sdk/components/icon/heroicons/mini';\nimport { cn } from '@sixbell-telco/sdk/utils/cn';\nimport { AudioPlayerService } from '../services/audio.service';\n\n@Component({\n\tselector: 'st-button-play',\n\timports: [IconComponent, CommonModule, ButtonComponent],\n\ttemplateUrl: './button-play.component.html',\n\tstyles: '',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonPlayComponent {\n\taudioService = inject(AudioPlayerService);\n\n\tvariant = input<ButtonVariantProps>();\n\tghost = input<boolean>(false);\n\toutline = input<boolean>(false);\n\tcircle = input<boolean>(false);\n\tsquare = input<boolean>(false);\n\tglass = input<boolean>(false);\n\tsize = input<ButtonSizeProps>();\n\tshadow = input<boolean>(false);\n\tasButton = input<boolean>(false);\n\n\tisHovered = signal<boolean>(false);\n\ttrackIndex = input.required<number>();\n\n\ttogglePlay = output();\n\n\ticonMusicNote = heroMusicalNoteMini;\n\ticonPlay = matPlayArrow;\n\ticonPause = matPause;\n\n\twaveBars = [\n\t\t{ delay: '0.4s', class: 'h-1/5 animate-wave w-[2px] rounded-full bg-current' },\n\t\t{ delay: '0.3s', class: 'h-3/5 animate-wave w-[2px] rounded-full bg-current' },\n\t\t{ delay: '0.2s', class: 'h-full animate-wave w-[2px] rounded-full bg-current' },\n\t\t{ delay: '0.3s', class: 'h-3/5 animate-wave w-[2px] rounded-full bg-current' },\n\t\t{ delay: '0.4s', class: 'h-1/5 animate-wave w-[2px] rounded-full bg-current' },\n\t];\n\n\tbuttonClass = computed(() => {\n\t\treturn cn(\n\t\t\t'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 opacity-0 transition-opacity duration-200 inline-flex items-center justify-center align-top',\n\t\t\t{\n\t\t\t\t'opacity-100': (this.audioService.isPlaying() && this.trackIndex() === this.audioService.currentTrackIndex()) || this.isHovered(),\n\t\t\t},\n\t\t);\n\t});\n\n\twaveBarsClass = computed(() => {\n\t\treturn cn('h-6 w-6 opacity-0 absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 transition-opacity duration-200', {\n\t\t\t'opacity-100': this.audioService.isPlaying() && this.trackIndex() === this.audioService.currentTrackIndex() && !this.isHovered(),\n\t\t});\n\t});\n\n\ticonClass = computed(() => {\n\t\treturn cn(\n\t\t\t'opacity-0 absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 transition-opacity duration-200 inline-flex items-center justify-center align-top text-lg',\n\t\t\t{\n\t\t\t\t'opacity-100': !this.audioService.isPlaying() || this.trackIndex() !== this.audioService.currentTrackIndex() || this.isHovered(),\n\t\t\t},\n\t\t);\n\t});\n\n\ticon = computed(() => {\n\t\treturn this.audioService.isPlaying() && this.trackIndex() === this.audioService.currentTrackIndex() ? this.iconPause : this.iconPlay;\n\t});\n\n\thandleHover(isHovered: boolean) {\n\t\tthis.isHovered.set(isHovered);\n\t}\n\n\tasync handleTogglePlay() {\n\t\tif (this.trackIndex() !== undefined && this.trackIndex() !== this.audioService.currentTrackIndex()) {\n\t\t\tawait this.audioService.playTrack(this.trackIndex()!);\n\t\t} else {\n\t\t\tawait this.audioService.togglePlay();\n\t\t}\n\t\tthis.togglePlay.emit();\n\t}\n}\n","@let waveBarsVar = waveBarsClass();\n@let iconClassVar = iconClass();\n@let iconVar = icon();\n\n@if (!asButton()) {\n\t<div\n\t\tclass=\"from-primary to-primary-gradient relative grid h-10 min-h-10 w-10 min-w-10 place-content-center rounded-sm bg-linear-to-br text-lg text-white\"\n\t\t(mouseenter)=\"handleHover(true)\"\n\t\t(mouseleave)=\"handleHover(false)\"\n\t>\n\t\t<st-icon [icon]=\"iconMusicNote\"></st-icon>\n\n\t\t<div [class]=\"buttonClass()\">\n\t\t\t<st-button [circle]=\"true\" size=\"sm\" [shadow]=\"true\" variant=\"secondary\" (click)=\"handleTogglePlay()\">\n\t\t\t\t<div class=\"relative h-full w-full\">\n\t\t\t\t\t<div [class]=\"waveBarsVar\">\n\t\t\t\t\t\t<div class=\"flex h-full w-full items-center justify-between\">\n\t\t\t\t\t\t\t@for (bar of waveBars; track $index) {\n\t\t\t\t\t\t\t\t<div [class]=\"bar.class\" [style.--i]=\"bar.delay\"></div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div [class]=\"iconClassVar\">\n\t\t\t\t\t\t<st-icon [icon]=\"iconVar\"></st-icon>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</st-button>\n\t\t</div>\n\t</div>\n} @else {\n\t<st-button\n\t\t[variant]=\"variant()\"\n\t\t[ghost]=\"ghost()\"\n\t\t[outline]=\"outline()\"\n\t\t[circle]=\"circle()\"\n\t\t[square]=\"square()\"\n\t\t[glass]=\"glass()\"\n\t\t[size]=\"size()\"\n\t\t[shadow]=\"shadow()\"\n\t\t(click)=\"handleTogglePlay()\"\n\t\t(mouseenter)=\"handleHover(true)\"\n\t\t(mouseleave)=\"handleHover(false)\"\n\t>\n\t\t<div class=\"relative h-full w-full\">\n\t\t\t<div [class]=\"waveBarsVar\">\n\t\t\t\t<div class=\"flex h-full w-full items-center justify-between\">\n\t\t\t\t\t@for (bar of waveBars; track $index) {\n\t\t\t\t\t\t<div [class]=\"bar.class\" [style.--i]=\"bar.delay\"></div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div [class]=\"iconClassVar\">\n\t\t\t\t<st-icon [icon]=\"iconVar\"></st-icon>\n\t\t\t</div>\n\t\t</div>\n\t</st-button>\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, ElementRef, HostListener, inject, signal, viewChild } from '@angular/core';\nimport { TypographyDirective } from '@sixbell-telco/sdk/directives/typography';\nimport { cn } from '@sixbell-telco/sdk/utils/cn';\nimport { TimePipe } from '@sixbell-telco/sdk/utils/pipes/time';\nimport { AudioPlayerService } from '../services/audio.service';\n\n@Component({\n\tselector: 'st-timeline',\n\timports: [CommonModule, TimePipe, TypographyDirective],\n\ttemplateUrl: './audio-timeline.component.html',\n\tstyles: '',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AudioTimelineComponent {\n\ttimeline = viewChild<ElementRef<HTMLAudioElement>>('timeline');\n\n\taudioService = inject(AudioPlayerService);\n\tisDragging = signal(false);\n\tisHovered = signal(false);\n\n\ttimelineClass = computed(() =>\n\t\tcn('relative h-1 w-full cursor-pointer rounded-full bg-neutral ', { 'h-[6px]': this.isHovered() || this.isDragging() }),\n\t);\n\n\ttimelineCircleClass = computed(() =>\n\t\tcn(\n\t\t\t'transition-opacity duration-200 absolute top-1/2 h-3 w-3 -translate-y-1/2 transform cursor-grab rounded-full bg-tertiary shadow-main',\n\t\t\tthis.isHovered() || this.isDragging() ? 'opacity-100' : 'opacity-0',\n\t\t),\n\t);\n\n\t// Handle timeline hover\n\thandleTimelineHover(isHovered: boolean) {\n\t\tthis.isHovered.set(isHovered);\n\t}\n\n\t// Start dragging\n\tstartDrag(event: MouseEvent | TouchEvent) {\n\t\tevent.preventDefault(); // Prevent default behavior\n\t\tevent.stopPropagation(); // Stop event propagation\n\t\tthis.isDragging.set(true);\n\t\tthis.updateProgress(event);\n\t}\n\n\t// Handle dragging\n\t@HostListener('document:mousemove', ['$event'])\n\t@HostListener('document:touchmove', ['$event'])\n\tonDrag(event: MouseEvent | TouchEvent) {\n\t\tif (this.isDragging()) {\n\t\t\tthis.updateProgress(event);\n\t\t}\n\t}\n\n\t// Stop dragging\n\t@HostListener('document:mouseup')\n\t@HostListener('document:touchend')\n\tstopDrag() {\n\t\tthis.isDragging.set(false);\n\t}\n\n\t// Update progress based on mouse/touch position\n\tupdateProgress(event: MouseEvent | TouchEvent) {\n\t\tconst timelineRect = this.timeline()?.nativeElement.getBoundingClientRect();\n\t\tif (!timelineRect) return;\n\n\t\tconst clientX = this.getClientX(event);\n\t\tconst newProgress = Math.max(0, Math.min(1, (clientX - timelineRect.left) / timelineRect.width));\n\n\t\tthis.audioService.seekTo(newProgress * this.audioService.duration());\n\t}\n\n\tprivate getClientX(event: MouseEvent | TouchEvent): number {\n\t\treturn event instanceof MouseEvent ? event.clientX : event.touches[0].clientX;\n\t}\n\n\tseek(event: MouseEvent) {\n\t\tif (!this.isDragging()) {\n\t\t\tthis.updateProgress(event);\n\t\t}\n\t}\n}\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n\n<!-- Progress Bar -->\n<div class=\"grid w-full grid-cols-[1fr_5fr_1fr] items-center gap-4\">\n\t<!-- Current Time Display -->\n\t<div class=\"text-tertiary inline-flex min-h-5 items-center justify-end align-top select-none\">\n\t\t@if (!audioService.isInitializing()) {\n\t\t\t@if (audioService.isBuffering()) {\n\t\t\t\t<span class=\"loading loading-ring loading-xs\"></span>\n\t\t\t} @else {\n\t\t\t\t<span typography tyVariant=\"body-xxs\">{{ audioService.currentTime() | time }}</span>\n\t\t\t}\n\t\t}\n\t</div>\n\n\t<div [class]=\"timelineClass()\" (click)=\"seek($event)\" #timeline (mouseenter)=\"handleTimelineHover(true)\" (mouseleave)=\"handleTimelineHover(false)\">\n\t\t<!-- Progress Bar Background -->\n\t\t<div class=\"bg-primary absolute h-full rounded-full\" [style.width]=\"(audioService.currentTime() / audioService.duration()) * 100 + '%'\"></div>\n\n\t\t<!-- Draggable Circle -->\n\t\t<div\n\t\t\t[style.left]=\"\n\t\t\t\t'calc(' +\n\t\t\t\t(audioService.currentTime() / audioService.duration()) * 100 +\n\t\t\t\t'% - ' +\n\t\t\t\t(audioService.currentTime() / audioService.duration() === 1 ? '6px' : '3px') +\n\t\t\t\t')'\n\t\t\t\"\n\t\t\t[class]=\"timelineCircleClass()\"\n\t\t\t#circle\n\t\t\t(mousedown)=\"startDrag($event)\"\n\t\t\t(touchstart)=\"startDrag($event)\"\n\t\t></div>\n\t</div>\n\n\t<!-- Total Time Display -->\n\t<div class=\"text-tertiary inline-flex min-h-5 items-center justify-start align-top select-none\">\n\t\t@if (audioService.isInitializing()) {\n\t\t\t<span class=\"loading loading-ring loading-xs\"></span>\n\t\t} @else {\n\t\t\t<span typography tyVariant=\"body-xxs\">{{ audioService.duration() | time }}</span>\n\t\t}\n\t</div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IconComponent } from '@sixbell-telco/sdk/components/icon';\nimport { heroMusicalNoteMini } from '@sixbell-telco/sdk/components/icon/heroicons/mini';\nimport { TypographyDirective } from '@sixbell-telco/sdk/directives/typography';\nimport { Track } from '../src/audio-player.component';\n\n@Component({\n selector: 'st-track-info',\n imports: [IconComponent, CommonModule, TypographyDirective, TranslatePipe],\n templateUrl: './track-info.component.html',\n styles: '',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TrackInfoComponent {\n\tcurrentTrack = input<Track | undefined>();\n\n\ticonMusicNote = heroMusicalNoteMini;\n}\n","<div class=\"relative flex max-w-80 items-center gap-4 overflow-x-hidden whitespace-nowrap\">\n\t<div class=\"flex items-center gap-3\">\n\t\t<!-- Album/Track Icon -->\n\t\t<div class=\"from-primary to-primary-gradient grid h-12 min-h-12 w-12 min-w-12 place-content-center rounded-sm bg-linear-to-br text-white\">\n\t\t\t<st-icon [icon]=\"iconMusicNote\" size=\"md\"></st-icon>\n\t\t</div>\n\n\t\t<!-- Track Info -->\n\t\t@let currentTrackVar = this.currentTrack();\n\t\t<div class=\"min-w-0 flex-1\">\n\t\t\t<p typography tyVariant=\"body\" tyFontWeight=\"medium\" tyColor=\"base\">\n\t\t\t\t{{ currentTrackVar?.title ?? 'sdk.audioPlayer.trackInfo.title' | translate }}\n\t\t\t</p>\n\t\t\t<p typography tyVariant=\"body-sm\" tyFontWeight=\"normal\" tyColor=\"base\">\n\t\t\t\t{{ currentTrackVar?.description ?? 'sdk.audioPlayer.trackInfo.description' | translate }}\n\t\t\t</p>\n\t\t</div>\n\t</div>\n\t<div class=\"from-base-200 pointer-events-none absolute inset-y-0 right-0 w-12 bg-linear-to-l to-transparent\"></div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, ElementRef, HostListener, inject, signal, viewChild } from '@angular/core';\nimport { matVolumeDownOutline, matVolumeMuteOutline, matVolumeUpOutline } from '@ng-icons/material-icons/outline';\nimport { ButtonComponent } from '@sixbell-telco/sdk/components/button';\nimport { IconComponent } from '@sixbell-telco/sdk/components/icon';\nimport { cn } from '@sixbell-telco/sdk/utils/cn';\nimport { AudioPlayerService } from '../services/audio.service';\n\n@Component({\n\tselector: 'st-volume-control',\n\timports: [IconComponent, CommonModule, ButtonComponent],\n\ttemplateUrl: './volume-control.component.html',\n\tstyles: '',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VolumeControlComponent {\n\tvolumeTimeline = viewChild<ElementRef<HTMLAudioElement>>('volumeTimeline');\n\taudioService = inject(AudioPlayerService);\n\n\tisVolumeDragging = signal(false);\n\tisVolumeHovered = signal(false);\n\n\ticonVolumeUp = matVolumeUpOutline;\n\ticonVolumeDown = matVolumeDownOutline;\n\ticonVolumeMute = matVolumeMuteOutline;\n\n\tvolumeTimelineClass = computed(() => {\n\t\treturn cn('relative h-1 w-20 cursor-pointer rounded-full bg-neutral', {\n\t\t\t'h-[6px]': this.isVolumeHovered() || this.isVolumeDragging(),\n\t\t});\n\t});\n\n\tvolumeTimelineCircleClass = computed(() => {\n\t\treturn cn(\n\t\t\t'absolute top-1/2 h-3 w-3 -translate-y-1/2 transform cursor-grab rounded-full bg-tertiary shadow-main transition-opacity duration-200',\n\t\t\tthis.isVolumeHovered() || this.isVolumeDragging() ? 'opacity-100' : 'opacity-0',\n\t\t);\n\t});\n\n\t// Handle volume hover\n\thandleVolumeHover(isHovered: boolean) {\n\t\tthis.isVolumeHovered.set(isHovered);\n\t}\n\n\t// Start volume drag\n\tstartVolumeDrag(event: MouseEvent | TouchEvent) {\n\t\tevent.preventDefault(); // Prevent default behavior\n\t\tevent.stopPropagation(); // Prevent event propagation\n\t\tthis.isVolumeDragging.set(true);\n\t\tthis.updateVolume(event);\n\t}\n\n\t// Handle volume drag\n\t@HostListener('document:mousemove', ['$event'])\n\t@HostListener('document:touchmove', ['$event'])\n\tonVolumeDrag(event: MouseEvent | TouchEvent) {\n\t\tif (this.isVolumeDragging()) {\n\t\t\tthis.updateVolume(event);\n\t\t}\n\t}\n\n\t// Stop volume drag\n\t@HostListener('document:mouseup')\n\t@HostListener('document:touchend')\n\tstopVolumeDrag() {\n\t\tthis.isVolumeDragging.set(false);\n\t}\n\n\tprivate getClientX(event: MouseEvent | TouchEvent): number {\n\t\treturn event instanceof MouseEvent ? event.clientX : event.touches[0].clientX;\n\t}\n\n\tupdateVolume(event: MouseEvent | TouchEvent) {\n\t\tconst volumeTimelineRect = this.volumeTimeline()?.nativeElement.getBoundingClientRect();\n\t\tif (!volumeTimelineRect) return;\n\n\t\tconst clientX = this.getClientX(event);\n\t\tconst newVolume = Math.max(0, Math.min(1, (clientX - volumeTimelineRect.left) / volumeTimelineRect.width));\n\n\t\tthis.audioService.setVolume(newVolume);\n\t}\n\n\t// Seek volume on click\n\tseekVolume(event: MouseEvent) {\n\t\tif (!this.isVolumeDragging()) {\n\t\t\tthis.updateVolume(event);\n\t\t}\n\t}\n\n\ttoggleMute() {\n\t\tthis.audioService.setMuted(!this.audioService.isMuted());\n\t}\n}\n","<!-- eslint-disable @angular-eslint/template/interactive-supports-focus -->\n<!-- eslint-disable @angular-eslint/template/click-events-have-key-events -->\n\n<!-- Volume Control -->\n<div class=\"flex items-center justify-end gap-2\">\n\t<!-- Mute/Unmute Button -->\n\t<st-button [ghost]=\"true\" size=\"sm\" [circle]=\"true\" (click)=\"toggleMute()\">\n\t\t@if (audioService.volume() === 0) {\n\t\t\t<st-icon [icon]=\"iconVolumeMute\" size=\"sm\"></st-icon>\n\t\t} @else if (audioService.volume() > 0.5) {\n\t\t\t<st-icon [icon]=\"iconVolumeUp\" size=\"sm\"></st-icon>\n\t\t} @else {\n\t\t\t<st-icon [icon]=\"iconVolumeDown\" size=\"sm\"></st-icon>\n\t\t}\n\t</st-button>\n\n\t<!-- Custom Volume Progress Bar -->\n\t<div\n\t\t[class]=\"volumeTimelineClass()\"\n\t\t(click)=\"seekVolume($event)\"\n\t\t#volumeTimeline\n\t\t(mouseenter)=\"handleVolumeHover(true)\"\n\t\t(mouseleave)=\"handleVolumeHover(false)\"\n\t>\n\t\t<!-- Volume Progress Bar Background -->\n\t\t<div class=\"bg-primary absolute h-full rounded-full\" [style.width]=\"audioService.volume() * 100 + '%'\"></div>\n\n\t\t<!-- Draggable Volume Circle -->\n\t\t<div\n\t\t\t[style.left]=\"'calc(' + audioService.volume() * 100 + '% - ' + (audioService.volume() === 1 ? '6px' : '3px') + ')'\"\n\t\t\t[class]=\"volumeTimelineCircleClass()\"\n\t\t\t#volumeCircle\n\t\t\t(mousedown)=\"startVolumeDrag($event)\"\n\t\t\t(touchstart)=\"startVolumeDrag($event)\"\n\t\t></div>\n\t</div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, model, OnDestroy, signal } from '@angular/core';\nimport { matPause, matPlayArrow, matSkipNext, matSkipPrevious } from '@ng-icons/material-icons/baseline';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ButtonComponent } from '@sixbell-telco/sdk/components/button';\nimport { IconComponent } from '@sixbell-telco/sdk/components/icon';\nimport { heroMusicalNoteMini } from '@sixbell-telco/sdk/components/icon/heroicons/mini';\nimport { TypographyDirective } from '@sixbell-telco/sdk/directives/typography';\nimport { cn } from '@sixbell-telco/sdk/utils/cn';\nimport { AudioTimelineComponent } from '../audio-timeline/audio-timeline.component';\nimport { ButtonPlayComponent } from '../button-play/button-play.component';\nimport { AudioPlayerService } from '../services/audio.service';\nimport { TrackInfoComponent } from '../track-info/track-info.component';\nimport { VolumeControlComponent } from '../volume-control/volume-control.component';\nexport interface Track {\n\ttitle: string;\n\tdescription: string;\n\turl: string;\n}\n\nexport type AudioPlayerVariantProps = 'default' | 'fixed';\n\n@Component({\n\tselector: 'st-audio-player',\n\timports: [\n\t\tCommonModule,\n\t\tButtonComponent,\n\t\tTypographyDirective,\n\t\tVolumeControlComponent,\n\t\tTrackInfoComponent,\n\t\tAudioTimelineComponent,\n\t\tButtonPlayComponent,\n\t\tTranslatePipe,\n\t\tIconComponent,\n\t],\n\ttemplateUrl: './audio-player.component.html',\n\tstyles: '',\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AudioPlayerComponent implements OnDestroy {\n\taudioPlayerService = inject(AudioPlayerService);\n\n\tvariant = input<AudioPlayerVariantProps>('default');\n\tshadow = input<boolean>(false);\n\topened = model<boolean>(false);\n\n\ttracks = input<Track[]>([]);\n\tshowTrackList = input(false);\n\tcurrentTrackIndex = model<number>(-1);\n\tcurrentTrack = computed<Track | undefined>(() => {\n\t\tconst tracks = this.tracks();\n\t\treturn this.currentTrackIndex() >= 0 && tracks ? tracks[this.currentTrackIndex()] : undefined;\n\t});\n\n\ticonSkipPrevious = matSkipPrevious;\n\ticonSkipNext = matSkipNext;\n\ticonPlay = matPlayArrow;\n\ticonPause = matPause;\n\ticonMusicNote = heroMusicalNoteMini;\n\n\toffScreen = signal<boolean>(false);\n\n\tplayerClass = computed(() =>\n\t\tcn(\n\t\t\t'grid w-full grid-cols-[minmax(0,1fr)_minmax(0,2fr)_minmax(0,1fr)] items-center gap-4 relative translate-y-0',\n\t\t\t{\n\t\t\t\t'shadow-main': this.shadow(),\n\t\t\t},\n\t\t\t{\n\t\t\t\t'fixed bottom-0 left-0 bg-base-200 p-4 z-50 border-t border-neutral transform transition-transform duration-300': this.variant() === 'fixed',\n\t\t\t},\n\t\t\t{\n\t\t\t\t'animate-fade-in-up animate-steps-modern animate-duration-300': this.opened() && this.variant() === 'fixed',\n\t\t\t},\n\t\t\t{\n\t\t\t\t'animate-fade-out-down animate-steps-modern animate-duration-300': !this.opened() && this.variant() === 'fixed',\n\t\t\t},\n\t\t\t{\n\t\t\t\t'invisible pointer-events-none -z-10 fixed bottom-5': this.offScreen() && this.variant() === 'fixed',\n\t\t\t},\n\t\t),\n\t);\n\n\tconstructor() {\n\t\t// Sync tracks with service\n\t\teffect(() => {\n\t\t\tthis.audioPlayerService.setTracks(this.tracks());\n\t\t});\n\n\t\t// One-way sync from service to component\n\t\teffect(() => {\n\t\t\tthis.currentTrackIndex.set(this.audioPlayerService.currentTrackIndex());\n\t\t});\n\t}\n\n\tentering = signal(false);\n\tleaving = signal(false);\n\n\thandleAnimationEnd(event: AnimationEvent) {\n\t\tif (this.variant() !== 'fixed') return;\n\n\t\tif (event.animationName === 'fade-out-down' && !this.opened()) {\n\t\t\tthis.offScreen.set(true);\n\t\t\tthis.leaving.set(false);\n\t\t}\n\n\t\tif (event.animationName === 'fade-in-up' && this.opened()) {\n\t\t\tthis.entering.set(false);\n\t\t}\n\t}\n\n\thandleAnimationStart(event: AnimationEvent) {\n\t\tif (this.variant() !== 'fixed') return;\n\n\t\tif (event.animationName === 'fade-in-up' && this.opened()) {\n\t\t\tthis.offScreen.set(false);\n\t\t\tthis.entering.set(true);\n\t\t}\n\n\t\tif (event.animationName === 'fade-out-down' && !this.opened()) {\n\t\t\tthis.leaving.set(true);\n\t\t}\n\t}\n\n\t// Simplify methods to call service\n\tasync playTrack(index: number) {\n\t\tawait this.audioPlayerService.playTrack(index);\n\t}\n\n\tasync togglePlay() {\n\t\tawait this.audioPlayerService.togglePlay();\n\t}\n\n\tasync previous() {\n\t\tawait this.audioPlayerService.previous();\n\t}\n\n\tasync next() {\n\t\tawait this.audioPlayerService.next();\n\t}\n\n\thandleOpen() {\n\t\tthis.opened.set(true);\n\t}\n\n\thandleClose() {\n\t\tthis.opened.set(false);\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.audioPlayerService.cleanup();\n\t}\n}\n","<div class=\"flex w-full flex-col gap-4\">\n\t<!-- Track List -->\n\t@if (showTrackList()) {\n\t\t<div class=\"rounded-box border-neutral shadow-main mb-4 border\">\n\t\t\t<div class=\"p-4\">\n\t\t\t\t<h4 typography tyVariant=\"h4\">{{ 'sdk.audioPlayer.trackListTitle' | translate }}</h4>\n\t\t\t\t<div class=\"max-h-[300px] space-y-2 overflow-y-auto\">\n\t\t\t\t\t@for (track of tracks(); track $index; let i = $index) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rounded-field hover:bg-base-300 flex cursor-pointer items-center gap-2 p-2\"\n\t\t\t\t\t\t\t[class.bg-base-300]=\"audioPlayerService.currentTrackIndex() === i\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<st-button-play [trackIndex]=\"i\" (click)=\"handleOpen()\"> </st-button-play>\n\t\t\t\t\t\t\t<div class=\"flex-1\">\n\t\t\t\t\t\t\t\t<div typography tyVariant=\"body\">{{ track.title }}</div>\n\t\t\t\t\t\t\t\t<div typography tyVariant=\"body-sm\">{{ track.description }}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t}\n\n\t<div [class]=\"playerClass()\" (animationend)=\"handleAnimationEnd($event)\" (animationstart)=\"handleAnimationStart($event)\">\n\t\t<!-- close button -->\n\t\t@if (variant() === 'fixed') {\n\t\t\t<div\n\t\t\t\tclass=\"group/close btn btn-ghost btn-square btn-primary btn-xs absolute top-1 right-1 grid place-content-center gap-0 hover:cursor-pointer\"\n\t\t\t\ttabindex=\"0\"\n\t\t\t\t(click)=\"handleClose()\"\n\t\t\t\t(keydown.enter)=\"handleClose()\"\n\t\t\t\taria-label=\"Close player\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"bg-primary group-hover/close:bg-primary-content group-active/close:bg-primary-content group-focus-within/close:bg-primary-content relative h-0.5 w-4 translate-y-0.5 rounded-full transition-transform duration-300 ease-in-out group-focus-within/close:rotate-45 group-hover/close:rotate-45 group-active/close:rotate-45\"\n\t\t\t\t></div>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"bg-primary group-hover/close:bg-primary-content group-active/close:bg-primary-content group-focus-within/close:bg-primary-content h-0.5 w-4 rounded-full transition-transform duration-300 ease-in-out group-focus-within/close:-rotate-45 group-hover/close:-rotate-45 group-active/close:-rotate-45\"\n\t\t\t\t></div>\n\t\t\t</div>\n\t\t}\n\n\t\t<!-- track info -->\n\t\t<div class=\"min-w-0\">\n\t\t\t<!-- Added min-w-0 to prevent overflow -->\n\t\t\t<st-track-info [currentTrack]=\"currentTrack()\"></st-track-info>\n\t\t</div>\n\n\t\t<div class=\"min-w-0\">\n\t\t\t<!-- Center section -->\n\t\t\t<!-- Your controls content -->\n\t\t\t<div class=\"grid items-center\">\n\t\t\t\t<!-- Controls -->\n\t\t\t\t<div class=\"flex items-center justify-center gap-2\">\n\t\t\t\t\t<st-button (click)=\"previous()\" [ghost]=\"true\" [circle]=\"true\" size=\"sm\">\n\t\t\t\t\t\t<st-icon [icon]=\"iconSkipPrevious\" size=\"sm\"></st-icon>\n\t\t\t\t\t</st-button>\n\n\t\t\t\t\t<st-button (click)=\"togglePlay()\" [circle]=\"true\" size=\"sm\" [shadow]=\"true\">\n\t\t\t\t\t\t<st-icon [icon]=\"audioPlayerService.isPlaying() ? iconPause : iconPlay\" size=\"sm\"></st-icon>\n\t\t\t\t\t</st-button>\n\n\t\t\t\t\t<st-button (click)=\"next()\" [ghost]=\"true\" [circle]=\"true\" size=\"sm\">\n\t\t\t\t\t\t<st-icon [icon]=\"iconSkipNext\" size=\"sm\"></st-icon>\n\t\t\t\t\t</st-button>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Progress Bar -->\n\t\t\t\t<st-timeline></st-timeline>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Volume Control -->\n\t\t<div class=\"min-w-0 justify-self-end\">\n\t\t\t<!-- Right-aligned -->\n\t\t\t<st-volume-control></st-volume-control>\n\t\t</div>\n\t</div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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