@vanduo-oss/vd3-cbun 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/LICENSE +22 -0
- package/README.md +160 -0
- package/SKILL.md +119 -0
- package/dist/charts/core.d.ts +273 -0
- package/dist/charts/index.cjs +1828 -0
- package/dist/charts/index.cjs.map +7 -0
- package/dist/charts/index.d.ts +65 -0
- package/dist/charts/index.js +1805 -0
- package/dist/charts/index.js.map +7 -0
- package/dist/charts/vd3-charts.css +51 -0
- package/dist/charts/vue.d.ts +86 -0
- package/dist/flowchart/core.d.ts +288 -0
- package/dist/flowchart/index.cjs +3447 -0
- package/dist/flowchart/index.cjs.map +7 -0
- package/dist/flowchart/index.d.ts +54 -0
- package/dist/flowchart/index.js +3424 -0
- package/dist/flowchart/index.js.map +7 -0
- package/dist/flowchart/vd3-flowchart.css +600 -0
- package/dist/flowchart/vue.d.ts +66 -0
- package/dist/hex-grid/core.d.ts +200 -0
- package/dist/hex-grid/hex-math.cjs +162 -0
- package/dist/hex-grid/hex-math.cjs.map +7 -0
- package/dist/hex-grid/hex-math.d.ts +119 -0
- package/dist/hex-grid/hex-math.js +141 -0
- package/dist/hex-grid/hex-math.js.map +7 -0
- package/dist/hex-grid/index.cjs +915 -0
- package/dist/hex-grid/index.cjs.map +7 -0
- package/dist/hex-grid/index.d.ts +15 -0
- package/dist/hex-grid/index.js +894 -0
- package/dist/hex-grid/index.js.map +7 -0
- package/dist/hex-grid/vue.d.ts +14 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +7 -0
- package/dist/meta.json +551 -0
- package/dist/music-player/core.d.ts +88 -0
- package/dist/music-player/index.cjs +1227 -0
- package/dist/music-player/index.cjs.map +7 -0
- package/dist/music-player/index.d.ts +12 -0
- package/dist/music-player/index.js +1204 -0
- package/dist/music-player/index.js.map +7 -0
- package/dist/music-player/vd3-music-player.css +829 -0
- package/dist/music-player/vue.d.ts +32 -0
- package/package.json +105 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/music-player/vue.js", "../../src/music-player/core.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Vue 3 bindings for @vanduo-oss/vd3-cbun/music-player \u2014 primary export.\n *\n * import { VdMusicPlayer } from '@vanduo-oss/vd3-cbun/music-player';\n * <VdMusicPlayer :tracks=\"tracks\" :options=\"{ showPlaylist: true }\" @trackchange=\"onTrack\" />\n *\n * The core (./core.js) stays framework-agnostic. SSR-safe: the player is\n * created on mount (client) into a plain container the server can pre-render.\n */\nimport { defineComponent, h, ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport { MusicPlayer } from './core.js';\n\nconst PLAYER_EVENTS = [\n 'play',\n 'pause',\n 'trackchange',\n 'volumechange',\n 'repeatchange',\n 'ended',\n 'detach',\n 'attach',\n 'minimize',\n 'expand',\n];\n\nexport const VdMusicPlayer = defineComponent({\n name: 'VdMusicPlayer',\n props: {\n /** Playlist \u2014 `[{ name, url }]`. */\n tracks: { type: Array, default: () => [] },\n /** Player options (volume, shuffle, repeat, glass, detachable, \u2026). */\n options: { type: Object, default: () => ({}) },\n },\n emits: [...PLAYER_EVENTS, 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n const bound = [];\n\n const create = () => {\n MusicPlayer.initPlayer(el.value, { tracks: props.tracks, ...props.options });\n PLAYER_EVENTS.forEach((name) => {\n const type = `musicplayer:${name}`;\n const handler = (e) => emit(name, e.detail);\n el.value.addEventListener(type, handler);\n bound.push([type, handler]);\n });\n emit('ready', el.value);\n };\n\n const teardown = () => {\n bound.forEach(([type, handler]) => {\n if (el.value) el.value.removeEventListener(type, handler);\n });\n bound.length = 0;\n if (el.value) MusicPlayer.destroy(el.value);\n };\n\n onMounted(() => {\n if (typeof window === 'undefined' || !el.value) return;\n create();\n });\n\n // Tracks/options changes recreate the player.\n watch(\n () => [props.tracks, props.options],\n () => {\n teardown();\n create();\n },\n { deep: true },\n );\n\n onBeforeUnmount(teardown);\n\n expose({ player: MusicPlayer, container: () => el.value });\n\n return () => h('div', { ref: el, class: 'vd-music-player' });\n },\n});\n", "/* global Audio, localStorage */\nexport const VD_MUSIC_PLAYER_VERSION = '1.0.0';\n\nconst CORNER_POSITIONS = ['bottom-left', 'bottom-right', 'top-left', 'top-right'];\n\nconst REPEAT_MODES = ['off', 'one', 'all'];\nconst REPEAT_CYCLE = { off: 'one', one: 'all', all: 'off' };\nconst REPEAT_LABELS = { off: 'Repeat', one: 'Repeat one', all: 'Repeat all' };\n\nfunction normalizeRepeat(value) {\n return REPEAT_MODES.includes(value) ? value : 'off';\n}\n\nfunction normalizeCornerPosition(position) {\n return CORNER_POSITIONS.includes(position) ? position : 'bottom-right';\n}\n\n/**\n * Vanduo Framework - Music Player Component\n * HTML5 Audio-based music player with transport controls, volume,\n * and optional shuffle, repeat modes, seek bar, and playlist features.\n *\n * Options (passed to MusicPlayer.initPlayer):\n * tracks {Array} - [{name, url}] \u2014 required\n * volume {number} - Initial volume 0\u20131 (default 0.5)\n * shuffle {boolean} - Shuffle on init (default false)\n * repeat {string} - 'off' | 'one' | 'all' (default 'off')\n * showProgress {boolean} - Show seek/progress bar (default false)\n * showPlaylist {boolean} - Show expandable playlist panel (default false)\n * autoAdvance {boolean} - Auto-play next track on end (default true)\n * glass {boolean} - Frosted-glass surface styling (default false)\n * detachable {boolean} - Show detach/attach; float above page when detached (default false)\n * floatingPosition {string|null} - After detach: corner preset (default 'bottom-right')\n * draggable {boolean} - When detached+detachable, drag by handle (default false)\n * minimizable {boolean} - Minimize/expand control (default false)\n * startMinimized {boolean} - On first detach, start minimized (default false)\n * persistPosition {boolean} - Save floating x/y in localStorage (default false)\n * persistKey {string} - Storage key for persist (default from element id)\n *\n * Custom events (all bubble, dispatched on container):\n * musicplayer:play \u2014 playback started\n * musicplayer:pause \u2014 playback paused\n * musicplayer:trackchange \u2014 detail: { index, name, url }\n * musicplayer:volumechange \u2014 detail: { volume }\n * musicplayer:repeatchange \u2014 detail: { repeat: 'off'|'one'|'all' }\n * musicplayer:ended \u2014 track ended with repeat off and no advance\n * musicplayer:detach \u2014 after floating player is created\n * musicplayer:attach \u2014 after returned to document flow\n * musicplayer:minimize \u2014 collapsed to minimal controls\n * musicplayer:expand \u2014 full controls visible again\n *\n * Programmatic API:\n * MusicPlayer.initPlayer(container, options?)\n * MusicPlayer.play(container)\n * MusicPlayer.pause(container)\n * MusicPlayer.toggle(container)\n * MusicPlayer.next(container)\n * MusicPlayer.previous(container)\n * MusicPlayer.setVolume(container, value)\n * MusicPlayer.setTrack(container, index)\n * MusicPlayer.shuffle(container)\n * MusicPlayer.detach(container, position?)\n * MusicPlayer.attach(container)\n * MusicPlayer.minimize(container)\n * MusicPlayer.expand(container)\n * MusicPlayer.toggleMinimize(container)\n * MusicPlayer.setPosition(container, corner|'bottom-left'|'bottom-right'|'top-left'|'top-right'|{x,y})\n * MusicPlayer.getState(container)\n * MusicPlayer.destroy(container)\n * MusicPlayer.destroyAll()\n */\n\n/* \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/**\n * Fisher-Yates shuffle (returns new array).\n * @param {Array} arr\n * @returns {Array}\n */\nfunction shuffleArray(arr) {\n const shuffled = arr.slice();\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const tmp = shuffled[i];\n shuffled[i] = shuffled[j];\n shuffled[j] = tmp;\n }\n return shuffled;\n}\n\n/**\n * Format seconds as m:ss.\n * @param {number} seconds\n * @returns {string}\n */\nfunction formatTime(seconds) {\n if (!isFinite(seconds) || seconds < 0) return '0:00';\n const m = Math.floor(seconds / 60);\n const s = Math.floor(seconds % 60);\n return m + ':' + (s < 10 ? '0' : '') + s;\n}\n\n/**\n * Set CSS background-size on a range input to visually fill the track.\n * @param {HTMLInputElement} input\n */\n/**\n * @param {string|undefined} id\n * @returns {string}\n */\nfunction persistStorageKey(id) {\n return 'vanduo:music-player:' + (id && id.trim() ? id.trim() : 'default') + ':pos';\n}\n\nfunction updateRangeFill(input) {\n const min = parseFloat(input.min) || 0;\n const max = parseFloat(input.max) || 1;\n const val = parseFloat(input.value) || 0;\n const pct = ((val - min) / (max - min)) * 100;\n input.style.setProperty('--vd-fill', pct + '%');\n // Fallback inline gradient for browsers without ::-moz-range-progress\n input.style.backgroundImage =\n 'linear-gradient(to right, var(--vd-music-player-track-fill, currentColor) 0%, ' +\n 'var(--vd-music-player-track-fill, currentColor) ' +\n pct +\n '%, ' +\n 'var(--vd-music-player-track-bg, #ccc) ' +\n pct +\n '%, ' +\n 'var(--vd-music-player-track-bg, #ccc) 100%)';\n}\n\n/* \u2500\u2500\u2500 Phosphor icon helper (matches framework icon style) \u2500 */\n\n/**\n * Return an <i class=\"ph ph-{name}\"> element (Phosphor icon).\n * @param {string} name\n * @returns {HTMLElement}\n */\nfunction icon(name) {\n const el = document.createElement('i');\n el.className = 'ph ph-' + name;\n el.setAttribute('aria-hidden', 'true');\n return el;\n}\n\n/* \u2500\u2500\u2500 Component \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\nconst MusicPlayer = {\n /** @type {Map<HTMLElement, Object>} */\n instances: new Map(),\n\n /**\n * Default options.\n */\n defaults: {\n tracks: [],\n volume: 0.5,\n shuffle: false,\n repeat: 'off',\n showProgress: false,\n showPlaylist: false,\n autoAdvance: true,\n glass: false,\n detachable: false,\n /** @type {null|string} */\n floatingPosition: null,\n draggable: false,\n minimizable: false,\n startMinimized: false,\n persistPosition: false,\n persistKey: '',\n },\n\n /**\n * Initialize a single player element.\n * @param {HTMLElement} container\n * @param {Object} [options]\n */\n initPlayer: function (container, options) {\n const opts = Object.assign({}, this.defaults, options || {});\n\n // Validate and normalise tracks\n const rawTracks = Array.isArray(opts.tracks) ? opts.tracks : [];\n const tracks = rawTracks.filter((t) => t && typeof t.url === 'string' && t.url.trim());\n\n // Build shuffled working copy without mutating opts\n const trackList = opts.shuffle ? shuffleArray(tracks) : tracks.slice();\n\n /* \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const state = {\n tracks: trackList,\n originalTracks: tracks.slice(),\n currentIndex: 0,\n isPlaying: false,\n volume: Math.max(0, Math.min(1, opts.volume)),\n shuffle: opts.shuffle,\n repeat: normalizeRepeat(opts.repeat),\n showProgress: opts.showProgress,\n showPlaylist: opts.showPlaylist,\n autoAdvance: opts.autoAdvance,\n audio: null,\n glass: Boolean(opts.glass),\n detachable: Boolean(opts.detachable),\n floatingPosition: opts.floatingPosition || 'bottom-right',\n draggable: Boolean(opts.draggable) && Boolean(opts.detachable),\n minimizable: Boolean(opts.minimizable),\n startMinimized: Boolean(opts.startMinimized),\n persistPosition: Boolean(opts.persistPosition),\n persistKey: typeof opts.persistKey === 'string' ? opts.persistKey : '',\n isDetached: false,\n isMinimized: false,\n _startMinimizeApplied: false,\n };\n\n /* \u2500\u2500 Audio element \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const audio = new Audio();\n audio.volume = state.volume;\n audio.preload = 'metadata';\n state.audio = audio;\n\n /* \u2500\u2500 Build DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n this._buildDOM(container, state);\n\n // Grab references after DOM build\n const refs = {\n btnPlay: container.querySelector('.vd-music-player-btn-play'),\n btnPrev: container.querySelector('.vd-music-player-btn-prev'),\n btnNext: container.querySelector('.vd-music-player-btn-next'),\n btnRepeat: container.querySelector('.vd-music-player-btn-repeat'),\n btnShuffle: container.querySelector('.vd-music-player-btn-shuffle'),\n btnPlaylist: container.querySelector('.vd-music-player-btn-playlist'),\n btnDetach: container.querySelector('.vd-music-player-btn-detach'),\n btnAttach: container.querySelector('.vd-music-player-btn-attach'),\n btnMinimize: container.querySelector('.vd-music-player-btn-minimize'),\n dragHandle: container.querySelector('.vd-music-player-drag-handle'),\n trackName: container.querySelector('.vd-music-player-track-name'),\n volumeSlider: container.querySelector('.vd-music-player-volume-slider'),\n volumeIcon: container.querySelector('.vd-music-player-volume-icon'),\n progressBar: container.querySelector('.vd-music-player-progress-bar'),\n timeElapsed: container.querySelector('.vd-music-player-time-elapsed'),\n timeDuration: container.querySelector('.vd-music-player-time-duration'),\n playlistPanel: container.querySelector('.vd-music-player-playlist'),\n };\n\n /* \u2500\u2500 Internal render helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const renderPlayIcon = () => {\n const btn = refs.btnPlay;\n if (!btn) return;\n btn.innerHTML = '';\n btn.appendChild(icon(state.isPlaying ? 'pause' : 'play'));\n btn.setAttribute('aria-label', state.isPlaying ? 'Pause' : 'Play');\n btn.classList.toggle('is-active', state.isPlaying);\n };\n\n const renderTrackName = () => {\n const el = refs.trackName;\n if (!el) return;\n const track = state.tracks[state.currentIndex];\n if (track) {\n el.textContent = track.name || 'Unknown Track';\n el.classList.remove('is-idle');\n } else {\n el.textContent = 'No tracks loaded';\n el.classList.add('is-idle');\n }\n };\n\n const renderVolumeIcon = () => {\n const el = refs.volumeIcon;\n if (!el) return;\n el.innerHTML = '';\n const v = state.volume;\n const name = v === 0 ? 'speaker-none' : v < 0.5 ? 'speaker-low' : 'speaker-high';\n el.appendChild(icon(name));\n };\n\n const renderShuffleBtn = () => {\n const btn = refs.btnShuffle;\n if (!btn) return;\n btn.classList.toggle('is-active', state.shuffle);\n btn.setAttribute('aria-pressed', state.shuffle ? 'true' : 'false');\n };\n\n const renderRepeatBtn = () => {\n const btn = refs.btnRepeat;\n if (!btn) return;\n btn.innerHTML = '';\n btn.appendChild(icon('repeat'));\n if (state.repeat === 'one') {\n const badge = document.createElement('span');\n badge.className = 'vd-music-player-repeat-badge';\n badge.setAttribute('aria-hidden', 'true');\n badge.textContent = '1';\n btn.appendChild(badge);\n }\n btn.classList.toggle('is-active', state.repeat !== 'off');\n btn.setAttribute('aria-pressed', state.repeat !== 'off' ? 'true' : 'false');\n const label = REPEAT_LABELS[state.repeat] || REPEAT_LABELS.off;\n btn.setAttribute('aria-label', label);\n btn.title = label;\n };\n\n const dispatchRepeatChange = () => {\n container.dispatchEvent(\n new CustomEvent('musicplayer:repeatchange', {\n bubbles: true,\n detail: { repeat: state.repeat },\n }),\n );\n };\n\n const cycleRepeat = () => {\n state.repeat = REPEAT_CYCLE[state.repeat] || 'off';\n renderRepeatBtn();\n dispatchRepeatChange();\n };\n\n const setRepeatMode = (mode) => {\n state.repeat = normalizeRepeat(mode);\n renderRepeatBtn();\n dispatchRepeatChange();\n };\n\n const renderPlaylistItems = () => {\n const panel = refs.playlistPanel;\n if (!panel) return;\n panel.innerHTML = '';\n state.tracks.forEach((track, i) => {\n const item = document.createElement('button');\n item.className =\n 'vd-music-player-playlist-item' + (i === state.currentIndex ? ' is-active' : '');\n item.type = 'button';\n item.setAttribute('data-index', String(i));\n item.setAttribute('aria-current', i === state.currentIndex ? 'true' : 'false');\n\n const num = document.createElement('span');\n num.className = 'vd-music-player-playlist-num';\n num.textContent = String(i + 1);\n\n const name = document.createElement('span');\n name.className = 'vd-music-player-playlist-name';\n name.textContent = track.name || 'Track ' + (i + 1);\n\n item.appendChild(num);\n item.appendChild(name);\n panel.appendChild(item);\n });\n };\n\n const renderProgress = () => {\n const bar = refs.progressBar;\n if (!bar || !audio.duration) return;\n const pct = (audio.currentTime / audio.duration) * 100;\n bar.value = String(pct);\n updateRangeFill(bar);\n if (refs.timeElapsed) refs.timeElapsed.textContent = formatTime(audio.currentTime);\n if (refs.timeDuration) refs.timeDuration.textContent = formatTime(audio.duration);\n };\n\n /* \u2500\u2500 Load track \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n const loadTrack = (index, autoPlay) => {\n const track = state.tracks[index];\n if (!track) return;\n state.currentIndex = index;\n audio.src = track.url;\n renderTrackName();\n renderPlaylistItems();\n\n // Reset progress\n if (refs.progressBar) {\n refs.progressBar.value = '0';\n updateRangeFill(refs.progressBar);\n }\n if (refs.timeElapsed) refs.timeElapsed.textContent = '0:00';\n if (refs.timeDuration) refs.timeDuration.textContent = '0:00';\n\n container.dispatchEvent(\n new CustomEvent('musicplayer:trackchange', {\n bubbles: true,\n detail: { index, name: track.name, url: track.url },\n }),\n );\n\n if (autoPlay) {\n audio.play().catch(() => {\n /* browser may block autoplay */\n });\n }\n };\n\n /* \u2500\u2500 Audio event listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n const cleanupFunctions = [];\n\n const onPlay = () => {\n state.isPlaying = true;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:play', { bubbles: true }));\n };\n\n const onPause = () => {\n state.isPlaying = false;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:pause', { bubbles: true }));\n };\n\n const onEnded = () => {\n if (state.repeat === 'one') {\n audio.currentTime = 0;\n audio.play().catch(() => {});\n return;\n }\n if (state.repeat === 'all') {\n if (state.tracks.length > 0) {\n const next = (state.currentIndex + 1) % state.tracks.length;\n loadTrack(next, true);\n }\n return;\n }\n if (state.autoAdvance && state.tracks.length > 1) {\n const next = (state.currentIndex + 1) % state.tracks.length;\n loadTrack(next, true);\n } else {\n state.isPlaying = false;\n renderPlayIcon();\n container.dispatchEvent(new CustomEvent('musicplayer:ended', { bubbles: true }));\n }\n };\n\n const onTimeUpdate = () => {\n if (state.showProgress) renderProgress();\n };\n\n const onLoadedMetadata = () => {\n if (refs.timeDuration) refs.timeDuration.textContent = formatTime(audio.duration);\n if (refs.progressBar) {\n refs.progressBar.max = '100';\n updateRangeFill(refs.progressBar);\n }\n };\n\n audio.addEventListener('play', onPlay);\n audio.addEventListener('pause', onPause);\n audio.addEventListener('ended', onEnded);\n audio.addEventListener('timeupdate', onTimeUpdate);\n audio.addEventListener('loadedmetadata', onLoadedMetadata);\n cleanupFunctions.push(() => {\n audio.removeEventListener('play', onPlay);\n audio.removeEventListener('pause', onPause);\n audio.removeEventListener('ended', onEnded);\n audio.removeEventListener('timeupdate', onTimeUpdate);\n audio.removeEventListener('loadedmetadata', onLoadedMetadata);\n audio.pause();\n audio.src = '';\n });\n\n /* \u2500\u2500 Control button listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n if (refs.btnPlay) {\n const handler = () => {\n if (!audio.src && state.tracks.length) loadTrack(state.currentIndex, false);\n if (state.isPlaying) {\n audio.pause();\n } else {\n audio.play().catch(() => {});\n }\n };\n refs.btnPlay.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPlay.removeEventListener('click', handler));\n\n // Keyboard: Space / Enter (already native for <button>; guard for edge cases)\n const keyHandler = (e) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n handler();\n }\n };\n refs.btnPlay.addEventListener('keydown', keyHandler);\n cleanupFunctions.push(() => refs.btnPlay.removeEventListener('keydown', keyHandler));\n }\n\n if (refs.btnPrev) {\n const handler = () => {\n if (!state.tracks.length) return;\n // If more than 3s into track, restart; otherwise go to previous\n if (audio.currentTime > 3) {\n audio.currentTime = 0;\n } else {\n const prev = state.currentIndex === 0 ? state.tracks.length - 1 : state.currentIndex - 1;\n loadTrack(prev, state.isPlaying);\n }\n };\n refs.btnPrev.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPrev.removeEventListener('click', handler));\n }\n\n if (refs.btnNext) {\n const handler = () => {\n if (!state.tracks.length) return;\n const next = (state.currentIndex + 1) % state.tracks.length;\n loadTrack(next, state.isPlaying);\n };\n refs.btnNext.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnNext.removeEventListener('click', handler));\n }\n\n if (refs.btnRepeat) {\n const handler = () => {\n cycleRepeat();\n };\n refs.btnRepeat.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnRepeat.removeEventListener('click', handler));\n }\n\n if (refs.btnShuffle) {\n const handler = () => {\n state.shuffle = !state.shuffle;\n if (state.shuffle) {\n const current = state.tracks[state.currentIndex];\n state.tracks = shuffleArray(state.tracks);\n // Keep current track at position 0 of the new order\n const newIdx = state.tracks.findIndex((t) => t === current);\n if (newIdx > 0) {\n state.tracks.splice(newIdx, 1);\n state.tracks.unshift(current);\n }\n state.currentIndex = 0;\n } else {\n // Restore original order, keep same track\n const current = state.tracks[state.currentIndex];\n state.tracks = state.originalTracks.slice();\n state.currentIndex = state.tracks.findIndex((t) => t === current);\n if (state.currentIndex < 0) state.currentIndex = 0;\n }\n renderShuffleBtn();\n renderPlaylistItems();\n };\n refs.btnShuffle.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnShuffle.removeEventListener('click', handler));\n }\n\n if (refs.btnPlaylist) {\n const handler = () => {\n const panel = refs.playlistPanel;\n if (!panel) return;\n const isOpen = panel.classList.toggle('is-open');\n refs.btnPlaylist.classList.toggle('is-active', isOpen);\n refs.btnPlaylist.setAttribute('aria-expanded', isOpen ? 'true' : 'false');\n };\n refs.btnPlaylist.addEventListener('click', handler);\n cleanupFunctions.push(() => refs.btnPlaylist.removeEventListener('click', handler));\n }\n\n if (refs.volumeSlider) {\n const handler = (e) => {\n const v = parseFloat(e.target.value);\n state.volume = v;\n audio.volume = v;\n renderVolumeIcon();\n updateRangeFill(refs.volumeSlider);\n container.dispatchEvent(\n new CustomEvent('musicplayer:volumechange', { bubbles: true, detail: { volume: v } }),\n );\n };\n refs.volumeSlider.addEventListener('input', handler);\n cleanupFunctions.push(() => refs.volumeSlider.removeEventListener('input', handler));\n // Initial fill\n updateRangeFill(refs.volumeSlider);\n }\n\n if (refs.progressBar) {\n const handler = (e) => {\n if (!audio.duration) return;\n const pct = parseFloat(e.target.value);\n audio.currentTime = (pct / 100) * audio.duration;\n updateRangeFill(refs.progressBar);\n };\n refs.progressBar.addEventListener('input', handler);\n cleanupFunctions.push(() => refs.progressBar.removeEventListener('input', handler));\n }\n\n // Playlist item click (event delegation)\n if (refs.playlistPanel) {\n const panelHandler = (e) => {\n const item = e.target.closest('.vd-music-player-playlist-item');\n if (!item) return;\n const idx = parseInt(item.getAttribute('data-index'), 10);\n if (!isNaN(idx)) loadTrack(idx, true);\n };\n refs.playlistPanel.addEventListener('click', panelHandler);\n cleanupFunctions.push(() => refs.playlistPanel.removeEventListener('click', panelHandler));\n }\n\n /* \u2500\u2500 Detach / attach / minimize chrome \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n if (refs.btnDetach) {\n const h = () => {\n this.detach(container);\n };\n refs.btnDetach.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnDetach.removeEventListener('click', h));\n }\n if (refs.btnAttach) {\n const h = () => {\n this.attach(container);\n };\n refs.btnAttach.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnAttach.removeEventListener('click', h));\n }\n if (refs.btnMinimize) {\n const h = () => {\n this.toggleMinimize(container);\n };\n refs.btnMinimize.addEventListener('click', h);\n cleanupFunctions.push(() => refs.btnMinimize.removeEventListener('click', h));\n }\n\n /* \u2500\u2500 Initial render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n renderPlayIcon();\n renderTrackName();\n renderVolumeIcon();\n renderRepeatBtn();\n if (opts.showPlaylist) renderPlaylistItems();\n\n /* \u2500\u2500 Persist instance \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n this.instances.set(container, {\n state,\n audio,\n refs,\n cleanup: cleanupFunctions,\n ui: { restore: null, unbindDrag: null },\n cycleRepeat,\n setRepeatMode,\n });\n container.setAttribute('data-music-player-initialized', 'true');\n },\n\n /* \u2500\u2500\u2500 DOM builder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Build the inner DOM structure inside container.\n * Pre-existing inner content is replaced only if it has no\n * recognised child elements (allows server-rendered markup).\n * @param {HTMLElement} container\n * @param {Object} state\n */\n _buildDOM: function (container, state) {\n // Skip if already has the expected structure\n if (container.querySelector('.vd-music-player-controls')) return;\n\n container.setAttribute('role', 'region');\n container.setAttribute('aria-label', 'Music Player');\n\n if (state.showProgress) container.classList.add('has-progress');\n if (state.showPlaylist) container.classList.add('has-playlist');\n if (state.glass) container.classList.add('vd-music-player-glass');\n if (state.draggable) container.classList.add('vd-music-player-draggable');\n\n // Detach / minimize / drag handle\n if (state.detachable || state.minimizable) {\n const tb = document.createElement('div');\n tb.className = 'vd-music-player-toolbar';\n tb.setAttribute('role', 'toolbar');\n tb.setAttribute('aria-label', 'Player window');\n if (state.draggable) {\n const h = document.createElement('button');\n h.type = 'button';\n h.className = 'vd-music-player-drag-handle';\n h.setAttribute('aria-label', 'Drag to move player');\n h.appendChild(icon('dots-six-vertical'));\n tb.appendChild(h);\n }\n const tSp = document.createElement('span');\n tSp.className = 'vd-music-player-toolbar-spacer';\n tSp.setAttribute('aria-hidden', 'true');\n tb.appendChild(tSp);\n if (state.minimizable) {\n const bMin = document.createElement('button');\n bMin.type = 'button';\n bMin.className = 'vd-music-player-btn vd-music-player-btn-minimize';\n bMin.setAttribute('aria-label', 'Minimize player');\n bMin.setAttribute('aria-expanded', 'true');\n bMin.appendChild(icon('minus'));\n tb.appendChild(bMin);\n }\n if (state.detachable) {\n const bOut = document.createElement('button');\n bOut.type = 'button';\n bOut.className = 'vd-music-player-btn vd-music-player-btn-detach';\n bOut.setAttribute('aria-label', 'Detach player');\n bOut.appendChild(icon('arrows-out'));\n tb.appendChild(bOut);\n const bIn = document.createElement('button');\n bIn.type = 'button';\n bIn.className = 'vd-music-player-btn vd-music-player-btn-attach';\n bIn.setAttribute('aria-label', 'Attach player');\n bIn.appendChild(icon('arrows-in'));\n tb.appendChild(bIn);\n }\n container.classList.add('vd-music-player-has-chrome');\n container.appendChild(tb);\n }\n\n // Track info row\n const info = document.createElement('div');\n info.className = 'vd-music-player-info';\n\n const iconWrap = document.createElement('span');\n iconWrap.className = 'vd-music-player-icon';\n iconWrap.setAttribute('aria-hidden', 'true');\n iconWrap.appendChild(icon('music-note'));\n\n const trackName = document.createElement('span');\n trackName.className = 'vd-music-player-track-name';\n trackName.setAttribute('aria-live', 'polite');\n trackName.setAttribute('aria-atomic', 'true');\n\n info.appendChild(iconWrap);\n info.appendChild(trackName);\n container.appendChild(info);\n\n // Controls row\n const controls = document.createElement('div');\n controls.className = 'vd-music-player-controls';\n controls.setAttribute('role', 'group');\n controls.setAttribute('aria-label', 'Playback controls');\n\n const btnPrev = document.createElement('button');\n btnPrev.type = 'button';\n btnPrev.className = 'vd-music-player-btn vd-music-player-btn-prev';\n btnPrev.setAttribute('aria-label', 'Previous track');\n btnPrev.appendChild(icon('skip-back'));\n\n const btnPlay = document.createElement('button');\n btnPlay.type = 'button';\n btnPlay.className = 'vd-music-player-btn vd-music-player-btn-play';\n btnPlay.setAttribute('aria-label', 'Play');\n btnPlay.appendChild(icon('play'));\n\n const btnNext = document.createElement('button');\n btnNext.type = 'button';\n btnNext.className = 'vd-music-player-btn vd-music-player-btn-next';\n btnNext.setAttribute('aria-label', 'Next track');\n btnNext.appendChild(icon('skip-forward'));\n\n controls.appendChild(btnPrev);\n controls.appendChild(btnPlay);\n controls.appendChild(btnNext);\n\n const btnRepeat = document.createElement('button');\n btnRepeat.type = 'button';\n btnRepeat.className = 'vd-music-player-btn vd-music-player-btn-repeat';\n btnRepeat.setAttribute('aria-label', REPEAT_LABELS[normalizeRepeat(state.repeat)]);\n btnRepeat.setAttribute('aria-pressed', state.repeat !== 'off' ? 'true' : 'false');\n btnRepeat.appendChild(icon('repeat'));\n controls.appendChild(btnRepeat);\n\n // Optional shuffle button\n if (state.showPlaylist || state.shuffle !== undefined) {\n // Always render shuffle so it can be shown when shuffle option is used\n const btnShuffle = document.createElement('button');\n btnShuffle.type = 'button';\n btnShuffle.className = 'vd-music-player-btn vd-music-player-btn-shuffle';\n btnShuffle.setAttribute('aria-label', 'Shuffle');\n btnShuffle.setAttribute('aria-pressed', state.shuffle ? 'true' : 'false');\n btnShuffle.appendChild(icon('shuffle'));\n controls.appendChild(btnShuffle);\n }\n\n // Spacer\n const spacer = document.createElement('span');\n spacer.className = 'vd-music-player-spacer';\n spacer.setAttribute('aria-hidden', 'true');\n controls.appendChild(spacer);\n\n // Volume\n const volumeWrap = document.createElement('div');\n volumeWrap.className = 'vd-music-player-volume';\n\n const volumeIcon = document.createElement('span');\n volumeIcon.className = 'vd-music-player-volume-icon';\n volumeIcon.setAttribute('aria-hidden', 'true');\n\n const volumeSlider = document.createElement('input');\n volumeSlider.type = 'range';\n volumeSlider.className = 'vd-music-player-volume-slider';\n volumeSlider.min = '0';\n volumeSlider.max = '1';\n volumeSlider.step = '0.01';\n volumeSlider.value = String(state.volume);\n volumeSlider.setAttribute('aria-label', 'Volume');\n\n volumeWrap.appendChild(volumeIcon);\n volumeWrap.appendChild(volumeSlider);\n controls.appendChild(volumeWrap);\n\n // Optional playlist toggle button\n if (state.showPlaylist) {\n const btnPlaylist = document.createElement('button');\n btnPlaylist.type = 'button';\n btnPlaylist.className = 'vd-music-player-btn vd-music-player-btn-playlist';\n btnPlaylist.setAttribute('aria-label', 'Show playlist');\n btnPlaylist.setAttribute('aria-expanded', 'false');\n btnPlaylist.appendChild(icon('playlist'));\n controls.appendChild(btnPlaylist);\n }\n\n container.appendChild(controls);\n\n // Optional progress bar\n if (state.showProgress) {\n const progressRow = document.createElement('div');\n progressRow.className = 'vd-music-player-progress';\n\n const timeElapsed = document.createElement('span');\n timeElapsed.className = 'vd-music-player-time vd-music-player-time-elapsed';\n timeElapsed.textContent = '0:00';\n timeElapsed.setAttribute('aria-hidden', 'true');\n\n const progressBar = document.createElement('input');\n progressBar.type = 'range';\n progressBar.className = 'vd-music-player-progress-bar';\n progressBar.min = '0';\n progressBar.max = '100';\n progressBar.step = '0.1';\n progressBar.value = '0';\n progressBar.setAttribute('aria-label', 'Seek');\n\n const timeDuration = document.createElement('span');\n timeDuration.className = 'vd-music-player-time vd-music-player-time-duration';\n timeDuration.textContent = '0:00';\n timeDuration.setAttribute('aria-hidden', 'true');\n\n progressRow.appendChild(timeElapsed);\n progressRow.appendChild(progressBar);\n progressRow.appendChild(timeDuration);\n container.appendChild(progressRow);\n }\n\n // Optional playlist panel (hidden until toggled)\n if (state.showPlaylist) {\n const playlist = document.createElement('div');\n playlist.className = 'vd-music-player-playlist';\n playlist.setAttribute('aria-label', 'Playlist');\n container.appendChild(playlist);\n }\n },\n\n /* \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * @param {HTMLElement} container\n */\n play: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n if (!inst.audio.src && inst.state.tracks.length) {\n inst.audio.src = inst.state.tracks[inst.state.currentIndex].url;\n }\n inst.audio.play().catch(() => {});\n },\n\n /**\n * @param {HTMLElement} container\n */\n pause: function (container) {\n const inst = this.instances.get(container);\n if (inst) inst.audio.pause();\n },\n\n /**\n * @param {HTMLElement} container\n */\n toggle: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n if (inst.state.isPlaying) {\n this.pause(container);\n } else {\n this.play(container);\n }\n },\n\n /**\n * @param {HTMLElement} container\n */\n next: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.tracks.length) return;\n const next = (inst.state.currentIndex + 1) % inst.state.tracks.length;\n this._loadTrack(inst, next, inst.state.isPlaying);\n },\n\n /**\n * @param {HTMLElement} container\n */\n previous: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.tracks.length) return;\n const len = inst.state.tracks.length;\n const prev = (inst.state.currentIndex - 1 + len) % len;\n this._loadTrack(inst, prev, inst.state.isPlaying);\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} value - 0 to 1\n */\n setVolume: function (container, value) {\n const inst = this.instances.get(container);\n if (!inst) return;\n const v = Math.max(0, Math.min(1, value));\n inst.state.volume = v;\n inst.audio.volume = v;\n if (inst.refs.volumeSlider) {\n inst.refs.volumeSlider.value = String(v);\n updateRangeFill(inst.refs.volumeSlider);\n }\n container.dispatchEvent(\n new CustomEvent('musicplayer:volumechange', { bubbles: true, detail: { volume: v } }),\n );\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} index - Track index\n */\n setTrack: function (container, index) {\n const inst = this.instances.get(container);\n if (!inst) return;\n this._loadTrack(inst, index, inst.state.isPlaying);\n },\n\n /**\n * Shuffle or un-shuffle the track list.\n * @param {HTMLElement} container\n */\n shuffle: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.refs.btnShuffle) return;\n inst.refs.btnShuffle.click();\n },\n\n /**\n * Cycle repeat mode: off \u2192 one \u2192 all \u2192 off.\n * @param {HTMLElement} container\n */\n repeat: function (container) {\n const inst = this.instances.get(container);\n if (!inst || typeof inst.cycleRepeat !== 'function') return;\n inst.cycleRepeat();\n },\n\n /**\n * Set repeat mode explicitly.\n * @param {HTMLElement} container\n * @param {'off'|'one'|'all'} mode\n */\n setRepeat: function (container, mode) {\n const inst = this.instances.get(container);\n if (!inst || typeof inst.setRepeatMode !== 'function') return;\n inst.setRepeatMode(mode);\n },\n\n /**\n * Float the player above the page. Requires { detachable: true } at init.\n * @param {HTMLElement} container\n * @param {string} [position] Corner preset or uses floatingPosition from init\n */\n detach: function (container, position) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.detachable || inst.state.isDetached) return;\n const s = inst.state;\n inst.ui = inst.ui || { restore: null, unbindDrag: null };\n s.isDetached = true;\n inst.ui.restore = {\n parent: container.parentNode,\n next: container.nextSibling,\n };\n document.body.appendChild(container);\n container.classList.add('vd-music-player-floating', 'vd-music-player-detached');\n const pos = position != null && position !== undefined ? position : s.floatingPosition;\n this._setCornerPosition(container, normalizeCornerPosition(pos));\n this._loadPersistedPosition(container, inst);\n if (s.startMinimized && !s._startMinimizeApplied) {\n s._startMinimizeApplied = true;\n this.minimize(container);\n }\n this._bindFloatingDrag(inst);\n container.dispatchEvent(new CustomEvent('musicplayer:detach', { bubbles: true }));\n },\n\n /**\n * Return a detached player to its original place in the document.\n * @param {HTMLElement} container\n */\n attach: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.isDetached) return;\n this._unbindFloatingDrag(inst);\n inst.state.isDetached = false;\n const r = inst.ui && inst.ui.restore;\n container.classList.remove(\n 'vd-music-player-floating',\n 'vd-music-player-detached',\n 'vd-music-player-floating-bottom-left',\n 'vd-music-player-floating-bottom-right',\n 'vd-music-player-floating-top-left',\n 'vd-music-player-floating-top-right',\n 'is-position-custom',\n );\n container.style.removeProperty('--vd-music-player-floating-top');\n container.style.removeProperty('--vd-music-player-floating-left');\n if (r && r.parent && r.parent.isConnected) {\n r.parent.insertBefore(container, r.next);\n }\n if (inst.ui) {\n inst.ui.restore = null;\n inst.ui.unbindDrag = null;\n }\n container.dispatchEvent(new CustomEvent('musicplayer:attach', { bubbles: true }));\n },\n\n /**\n * Collapse to essential controls. Requires { minimizable: true } at init.\n * @param {HTMLElement} container\n */\n minimize: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable || inst.state.isMinimized) return;\n const s = inst.state;\n s.isMinimized = true;\n container.classList.add('vd-music-player-minimized');\n this._setMinimizeButtonState(inst, true);\n if (\n inst.refs.playlistPanel &&\n inst.refs.playlistPanel.classList.contains('is-open') &&\n inst.refs.btnPlaylist\n ) {\n inst.refs.playlistPanel.classList.remove('is-open');\n inst.refs.btnPlaylist.classList.remove('is-active');\n inst.refs.btnPlaylist.setAttribute('aria-expanded', 'false');\n }\n container.dispatchEvent(new CustomEvent('musicplayer:minimize', { bubbles: true }));\n },\n\n /**\n * Restore from minimized state.\n * @param {HTMLElement} container\n */\n expand: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable || !inst.state.isMinimized) return;\n inst.state.isMinimized = false;\n container.classList.remove('vd-music-player-minimized');\n this._setMinimizeButtonState(inst, false);\n container.dispatchEvent(new CustomEvent('musicplayer:expand', { bubbles: true }));\n },\n\n /**\n * Toggle minimize / expand.\n * @param {HTMLElement} container\n */\n toggleMinimize: function (container) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.minimizable) return;\n if (inst.state.isMinimized) {\n this.expand(container);\n } else {\n this.minimize(container);\n }\n },\n\n /**\n * Set floating corner or pixel position (detached only).\n * @param {HTMLElement} container\n * @param {string|{x:number,y:number}} position Corner preset or { x, y } viewport pixels\n */\n setPosition: function (container, position) {\n const inst = this.instances.get(container);\n if (!inst || !inst.state.isDetached) return;\n if (typeof position === 'string') {\n this._setCornerPosition(container, normalizeCornerPosition(position));\n } else if (position && typeof position.x === 'number' && typeof position.y === 'number') {\n this._setCustomPositionFromRect(container, position.x, position.y);\n }\n if (inst.state.persistPosition) {\n const r = container.getBoundingClientRect();\n this._savePositionPixels(inst, r.left, r.top);\n }\n },\n\n /**\n * @param {Object} inst\n * @param {boolean} minimized\n */\n _setMinimizeButtonState: function (inst, minimized) {\n const b = inst.refs && inst.refs.btnMinimize;\n if (!b) return;\n b.innerHTML = '';\n b.appendChild(icon(minimized ? 'plus' : 'minus'));\n b.setAttribute('aria-label', minimized ? 'Expand player' : 'Minimize player');\n b.setAttribute('aria-expanded', minimized ? 'false' : 'true');\n },\n\n /**\n * @param {HTMLElement} container\n * @param {string} which Corner preset from CORNER_POSITIONS\n */\n _setCornerPosition: function (container, which) {\n const corner = normalizeCornerPosition(which);\n container.classList.remove(\n 'is-position-custom',\n 'vd-music-player-floating-bottom-left',\n 'vd-music-player-floating-bottom-right',\n 'vd-music-player-floating-top-left',\n 'vd-music-player-floating-top-right',\n );\n container.style.removeProperty('--vd-music-player-floating-top');\n container.style.removeProperty('--vd-music-player-floating-left');\n container.classList.add('vd-music-player-floating-' + corner);\n },\n\n /**\n * @param {HTMLElement} container\n * @param {number} left\n * @param {number} top\n */\n _setCustomPositionFromRect: function (container, left, top) {\n container.classList.remove(\n 'vd-music-player-floating-bottom-left',\n 'vd-music-player-floating-bottom-right',\n 'vd-music-player-floating-top-left',\n 'vd-music-player-floating-top-right',\n );\n container.classList.add('is-position-custom');\n container.style.setProperty('--vd-music-player-floating-left', left + 'px');\n container.style.setProperty('--vd-music-player-floating-top', top + 'px');\n },\n\n /**\n * @param {HTMLElement} container\n * @param {Object} inst\n */\n _loadPersistedPosition: function (container, inst) {\n if (!inst.state.persistPosition) return;\n const key = this._persistKeyForInstance(inst, container);\n let raw = null;\n try {\n raw = localStorage.getItem(key);\n } catch {\n /* ignore unavailable storage */\n }\n if (!raw) return;\n try {\n const o = JSON.parse(raw);\n if (o && typeof o.x === 'number' && typeof o.y === 'number') {\n this._setCustomPositionFromRect(container, o.x, o.y);\n }\n } catch {\n /* ignore */\n }\n },\n\n /**\n * @param {Object} inst\n * @param {number} x\n * @param {number} y\n */\n _savePositionPixels: function (inst, x, y) {\n if (!inst.state.persistPosition) return;\n const container = this._containerOf(inst);\n if (!container) return;\n const key = this._persistKeyForInstance(inst, container);\n const val = JSON.stringify({ x, y });\n try {\n localStorage.setItem(key, val);\n } catch {\n /* ignore */\n }\n },\n\n /**\n * @param {Object} inst\n * @param {HTMLElement} container\n * @returns {string}\n */\n _persistKeyForInstance: function (inst, container) {\n const pk = inst.state.persistKey;\n if (pk && String(pk).trim()) return persistStorageKey(String(pk).trim());\n return persistStorageKey(container.id || '');\n },\n\n /**\n * @param {Object} inst\n */\n _unbindFloatingDrag: function (inst) {\n if (inst.ui && typeof inst.ui.unbindDrag === 'function') {\n inst.ui.unbindDrag();\n inst.ui.unbindDrag = null;\n }\n },\n\n /**\n * Free-form pointer drag on the handle. Vanduo's `draggable` component uses HTML5\n * drag/drop for list reordering; floating players use pointer events on the handle instead.\n * @param {Object} inst\n */\n _bindFloatingDrag: function (inst) {\n this._unbindFloatingDrag(inst);\n const h = inst.refs && inst.refs.dragHandle;\n if (!h || !inst.state || !inst.state.draggable) return;\n const self = this;\n const container = this._containerOf(inst);\n if (!container) return;\n let startX = 0;\n let startY = 0;\n let origL = 0;\n let origT = 0;\n let activeDrag = false;\n const onDown = function (e) {\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n e.preventDefault();\n activeDrag = true;\n const r = container.getBoundingClientRect();\n origL = r.left;\n origT = r.top;\n startX = e.clientX;\n startY = e.clientY;\n self._setCustomPositionFromRect(container, origL, origT);\n try {\n h.setPointerCapture(e.pointerId);\n } catch {\n /* empty */\n }\n };\n const onMove = function (e) {\n if (!activeDrag) return;\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n let nl = origL + dx;\n let nt = origT + dy;\n const r = container.getBoundingClientRect();\n const w = r.width;\n const ph = r.height;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const pad = 8;\n nl = Math.max(pad, Math.min(nl, vw - w - pad));\n nt = Math.max(pad, Math.min(nt, vh - ph - pad));\n self._setCustomPositionFromRect(container, nl, nt);\n };\n const onUp = function (e) {\n if (!activeDrag) return;\n activeDrag = false;\n if (typeof h.hasPointerCapture === 'function' && h.hasPointerCapture(e.pointerId)) {\n try {\n h.releasePointerCapture(e.pointerId);\n } catch {\n /* empty */\n }\n }\n if (inst.state.persistPosition) {\n const r = container.getBoundingClientRect();\n self._savePositionPixels(inst, r.left, r.top);\n }\n };\n h.addEventListener('pointerdown', onDown);\n h.addEventListener('pointermove', onMove);\n h.addEventListener('pointerup', onUp);\n h.addEventListener('pointercancel', onUp);\n inst.ui = inst.ui || { restore: null, unbindDrag: null };\n inst.ui.unbindDrag = function () {\n h.removeEventListener('pointerdown', onDown);\n h.removeEventListener('pointermove', onMove);\n h.removeEventListener('pointerup', onUp);\n h.removeEventListener('pointercancel', onUp);\n };\n },\n\n /**\n * Return a shallow copy of the current player state.\n * @param {HTMLElement} container\n * @returns {Object|null}\n */\n getState: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return null;\n const s = inst.state;\n return {\n isPlaying: s.isPlaying,\n currentIndex: s.currentIndex,\n currentTrack: s.tracks[s.currentIndex] || null,\n volume: s.volume,\n shuffle: s.shuffle,\n repeat: s.repeat,\n tracks: s.tracks.slice(),\n isDetached: Boolean(s.isDetached),\n isMinimized: Boolean(s.isMinimized),\n };\n },\n\n /**\n * Stop playback, clean up listeners, remove instance.\n * @param {HTMLElement} container\n */\n destroy: function (container) {\n const inst = this.instances.get(container);\n if (!inst) return;\n this._unbindFloatingDrag(inst);\n if (inst.state && inst.state.isDetached) {\n try {\n this.attach(container);\n } catch {\n /* empty */\n }\n }\n inst.cleanup.forEach((fn) => fn());\n this.instances.delete(container);\n container.removeAttribute('data-music-player-initialized');\n },\n\n /**\n * Destroy all instances.\n */\n destroyAll: function () {\n this.instances.forEach((_, container) => this.destroy(container));\n },\n\n /* \u2500\u2500\u2500 Internal helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n /**\n * Load track by index on an already-initialised instance object.\n * @param {Object} inst\n * @param {number} index\n * @param {boolean} autoPlay\n */\n _loadTrack: function (inst, index, autoPlay) {\n const track = inst.state.tracks[index];\n if (!track) return;\n const container = this._containerOf(inst);\n\n inst.state.currentIndex = index;\n inst.audio.src = track.url;\n\n if (inst.refs.trackName) {\n inst.refs.trackName.textContent = track.name || 'Unknown Track';\n inst.refs.trackName.classList.remove('is-idle');\n }\n\n // Update playlist highlights\n if (inst.refs.playlistPanel) {\n inst.refs.playlistPanel\n .querySelectorAll('.vd-music-player-playlist-item')\n .forEach((item, i) => {\n const active = i === index;\n item.classList.toggle('is-active', active);\n item.setAttribute('aria-current', active ? 'true' : 'false');\n });\n }\n\n // Reset progress\n if (inst.refs.progressBar) {\n inst.refs.progressBar.value = '0';\n updateRangeFill(inst.refs.progressBar);\n }\n if (inst.refs.timeElapsed) inst.refs.timeElapsed.textContent = '0:00';\n if (inst.refs.timeDuration) inst.refs.timeDuration.textContent = '0:00';\n\n if (container) {\n container.dispatchEvent(\n new CustomEvent('musicplayer:trackchange', {\n bubbles: true,\n detail: { index, name: track.name, url: track.url },\n }),\n );\n }\n\n if (autoPlay) inst.audio.play().catch(() => {});\n },\n\n /**\n * Reverse-lookup the container element for a given instance object.\n * @param {Object} inst\n * @returns {HTMLElement|null}\n */\n _containerOf: function (inst) {\n for (const [container, i] of this.instances) {\n if (i === inst) return container;\n }\n return null;\n },\n};\n\nMusicPlayer.version = VD_MUSIC_PLAYER_VERSION;\n\nexport { MusicPlayer };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["h"]
|
|
7
|
+
}
|