dsh-music-panel 0.3.3 → 0.3.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.
- package/CHANGELOG.md +15 -0
- package/client.js +83 -61
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.3.5
|
|
4
|
+
|
|
5
|
+
### 变更
|
|
6
|
+
|
|
7
|
+
- 播放队列、设置面板、排序菜单、播放页设置、迷你播放器、搜索历史等浮层背景统一为 DSH 设置面板的 `--dsw-alias-bg-layer-1`
|
|
8
|
+
- 移除播放队列头部的「清空队列」按钮(顶部「清空列表」按钮已在 0.3.3 移除)
|
|
9
|
+
|
|
10
|
+
## 0.3.4
|
|
11
|
+
|
|
12
|
+
### 变更
|
|
13
|
+
|
|
14
|
+
- 随机播放时,播放队列(播放列表)按实际播放顺序(乱序)展示,从上往下播放;切回顺序播放恢复原顺序
|
|
15
|
+
- 切换到随机播放时重新洗牌
|
|
16
|
+
- 双击歌曲 / 播放全部时,入队范围是当前歌单的完整曲目(忽略搜索过滤),从双击的歌曲开始
|
|
17
|
+
|
|
3
18
|
## 0.3.3
|
|
4
19
|
|
|
5
20
|
### 变更
|
package/client.js
CHANGED
|
@@ -1609,6 +1609,10 @@ window.__ModuleLoader__.load({
|
|
|
1609
1609
|
getTime: function () {
|
|
1610
1610
|
return { currentTime: state.currentTime, duration: state.duration, buffered: state.buffered }
|
|
1611
1611
|
},
|
|
1612
|
+
/** Queue indices in the current playback order (random mode). */
|
|
1613
|
+
getPlayOrder: function () {
|
|
1614
|
+
return randomOrder.slice()
|
|
1615
|
+
},
|
|
1612
1616
|
/** Restore the last queue/position once (called by the resident host). */
|
|
1613
1617
|
tryRestore: tryRestore,
|
|
1614
1618
|
/** Flush statistics + resume state when the page is hidden/closed. */
|
|
@@ -1823,8 +1827,14 @@ window.__ModuleLoader__.load({
|
|
|
1823
1827
|
emit()
|
|
1824
1828
|
},
|
|
1825
1829
|
setOrder: function (value) {
|
|
1826
|
-
|
|
1827
|
-
|
|
1830
|
+
var next = value === 'random' ? 'random' : 'list'
|
|
1831
|
+
if (next === 'random' && state.queue.length > 1) {
|
|
1832
|
+
// Fresh shuffle whenever random is selected, so the queue panel's
|
|
1833
|
+
// displayed order is the actual playback order.
|
|
1834
|
+
randomOrder = randomOrderOf(state.queue.length)
|
|
1835
|
+
}
|
|
1836
|
+
state = Object.assign({}, state, { order: next })
|
|
1837
|
+
savePrefs({ order: next })
|
|
1828
1838
|
emit()
|
|
1829
1839
|
},
|
|
1830
1840
|
clear: function () {
|
|
@@ -3068,6 +3078,18 @@ window.__ModuleLoader__.load({
|
|
|
3068
3078
|
var prefs = useRef(readPrefs()).current
|
|
3069
3079
|
var [snap, setSnap] = useState(player.getSnapshot())
|
|
3070
3080
|
var leaderNow = player.isLeader()
|
|
3081
|
+
var playOrder = player.getPlayOrder()
|
|
3082
|
+
// In random mode the queue panel lists songs in the order they will
|
|
3083
|
+
// actually play ("from top to bottom"), while edits still target the
|
|
3084
|
+
// original queue indices.
|
|
3085
|
+
var queueView =
|
|
3086
|
+
snap.order === 'random' && Array.isArray(playOrder) && playOrder.length === snap.queue.length
|
|
3087
|
+
? playOrder.map(function (originalIndex) {
|
|
3088
|
+
return { track: snap.queue[originalIndex], originalIndex: originalIndex }
|
|
3089
|
+
})
|
|
3090
|
+
: snap.queue.map(function (track, originalIndex) {
|
|
3091
|
+
return { track: track, originalIndex: originalIndex }
|
|
3092
|
+
})
|
|
3071
3093
|
var [config, setConfig] = useState(null)
|
|
3072
3094
|
var [tracks, setTracks] = useState([])
|
|
3073
3095
|
var [loading, setLoading] = useState(true)
|
|
@@ -3393,11 +3415,12 @@ window.__ModuleLoader__.load({
|
|
|
3393
3415
|
}
|
|
3394
3416
|
|
|
3395
3417
|
function activate(track) {
|
|
3396
|
-
var at =
|
|
3418
|
+
var at = sortedCollection.findIndex(function (item) {
|
|
3397
3419
|
return item.path === track.path
|
|
3398
3420
|
})
|
|
3399
3421
|
if (at < 0) return
|
|
3400
|
-
|
|
3422
|
+
// Queue the whole playlist (ignores the search filter), starting here.
|
|
3423
|
+
player.playList(sortedCollection, at)
|
|
3401
3424
|
}
|
|
3402
3425
|
|
|
3403
3426
|
function clearList() {
|
|
@@ -3521,6 +3544,39 @@ window.__ModuleLoader__.load({
|
|
|
3521
3544
|
[deleteConfirm],
|
|
3522
3545
|
)
|
|
3523
3546
|
|
|
3547
|
+
// Full collection in display order (search is a filter on top of it).
|
|
3548
|
+
// Double-clicking a song queues this whole playlist, not just the
|
|
3549
|
+
// filtered results, which is what desktop players do.
|
|
3550
|
+
var sortedCollection = useMemo(
|
|
3551
|
+
function () {
|
|
3552
|
+
// "Liked" is ordered by when it was liked (newest first) unless the
|
|
3553
|
+
// user picks another sort, matching NetEase/Spotify liked songs.
|
|
3554
|
+
if (view === 'favorites' && sortBy === 'title' && sortDir === 'asc') {
|
|
3555
|
+
return collectionTracks
|
|
3556
|
+
}
|
|
3557
|
+
var direction = sortDir === 'desc' ? -1 : 1
|
|
3558
|
+
var keyed = collectionTracks.map(function (track, position) {
|
|
3559
|
+
return { track: track, position: position }
|
|
3560
|
+
})
|
|
3561
|
+
keyed.sort(function (left, right) {
|
|
3562
|
+
var a = left.track
|
|
3563
|
+
var b = right.track
|
|
3564
|
+
var aValue = sortValueOf(a, sortBy)
|
|
3565
|
+
var bValue = sortValueOf(b, sortBy)
|
|
3566
|
+
var compared =
|
|
3567
|
+
typeof aValue === 'number' && typeof bValue === 'number'
|
|
3568
|
+
? aValue - bValue
|
|
3569
|
+
: String(aValue).localeCompare(String(bValue), LANG)
|
|
3570
|
+
if (compared === 0) compared = left.position - right.position
|
|
3571
|
+
return compared * direction
|
|
3572
|
+
})
|
|
3573
|
+
return keyed.map(function (entry) {
|
|
3574
|
+
return entry.track
|
|
3575
|
+
})
|
|
3576
|
+
},
|
|
3577
|
+
[collectionTracks, sortBy, sortDir, view],
|
|
3578
|
+
)
|
|
3579
|
+
|
|
3524
3580
|
var visible = useMemo(
|
|
3525
3581
|
function () {
|
|
3526
3582
|
var needles = query
|
|
@@ -3528,8 +3584,8 @@ window.__ModuleLoader__.load({
|
|
|
3528
3584
|
.toLowerCase()
|
|
3529
3585
|
.split(/\s+/)
|
|
3530
3586
|
.filter(Boolean)
|
|
3531
|
-
|
|
3532
|
-
|
|
3587
|
+
if (needles.length === 0) return sortedCollection
|
|
3588
|
+
return sortedCollection.filter(function (track) {
|
|
3533
3589
|
// Search across metadata, folder/path and pinyin (full + initials),
|
|
3534
3590
|
// the way desktop players let you type "zhoujielun" / "zjl".
|
|
3535
3591
|
var haystack = [
|
|
@@ -3550,32 +3606,8 @@ window.__ModuleLoader__.load({
|
|
|
3550
3606
|
return haystack.indexOf(needle) >= 0
|
|
3551
3607
|
})
|
|
3552
3608
|
})
|
|
3553
|
-
// "Liked" is ordered by when it was liked (newest first) unless the
|
|
3554
|
-
// user picks another sort, matching NetEase/Spotify liked songs.
|
|
3555
|
-
if (view === 'favorites' && sortBy === 'title' && sortDir === 'asc') {
|
|
3556
|
-
return list
|
|
3557
|
-
}
|
|
3558
|
-
var direction = sortDir === 'desc' ? -1 : 1
|
|
3559
|
-
var keyed = list.map(function (track, position) {
|
|
3560
|
-
return { track: track, position: position }
|
|
3561
|
-
})
|
|
3562
|
-
keyed.sort(function (left, right) {
|
|
3563
|
-
var a = left.track
|
|
3564
|
-
var b = right.track
|
|
3565
|
-
var aValue = sortValueOf(a, sortBy)
|
|
3566
|
-
var bValue = sortValueOf(b, sortBy)
|
|
3567
|
-
var compared =
|
|
3568
|
-
typeof aValue === 'number' && typeof bValue === 'number'
|
|
3569
|
-
? aValue - bValue
|
|
3570
|
-
: String(aValue).localeCompare(String(bValue), LANG)
|
|
3571
|
-
if (compared === 0) compared = left.position - right.position
|
|
3572
|
-
return compared * direction
|
|
3573
|
-
})
|
|
3574
|
-
return keyed.map(function (entry) {
|
|
3575
|
-
return entry.track
|
|
3576
|
-
})
|
|
3577
3609
|
},
|
|
3578
|
-
[
|
|
3610
|
+
[sortedCollection, query],
|
|
3579
3611
|
)
|
|
3580
3612
|
|
|
3581
3613
|
var selectedSet = useMemo(function () {
|
|
@@ -4512,7 +4544,7 @@ window.__ModuleLoader__.load({
|
|
|
4512
4544
|
type: 'button',
|
|
4513
4545
|
className: 'mu-chip',
|
|
4514
4546
|
onClick: function () {
|
|
4515
|
-
if (
|
|
4547
|
+
if (sortedCollection.length > 0) player.playList(sortedCollection, 0)
|
|
4516
4548
|
},
|
|
4517
4549
|
},
|
|
4518
4550
|
icon('play', 13),
|
|
@@ -4796,19 +4828,6 @@ window.__ModuleLoader__.load({
|
|
|
4796
4828
|
{ className: 'mu-pop-head' },
|
|
4797
4829
|
h('span', null, t('page.queue')),
|
|
4798
4830
|
h('span', { className: 'mu-queue-mode' }, loopLabel()),
|
|
4799
|
-
snap.queue.length > 0
|
|
4800
|
-
? h(
|
|
4801
|
-
'button',
|
|
4802
|
-
{
|
|
4803
|
-
type: 'button',
|
|
4804
|
-
className: 'mu-chip mu-chip-sm',
|
|
4805
|
-
onClick: function () {
|
|
4806
|
-
player.clearQueue()
|
|
4807
|
-
},
|
|
4808
|
-
},
|
|
4809
|
-
t('page.clearQueue'),
|
|
4810
|
-
)
|
|
4811
|
-
: null,
|
|
4812
4831
|
h(
|
|
4813
4832
|
'button',
|
|
4814
4833
|
{
|
|
@@ -4826,20 +4845,23 @@ window.__ModuleLoader__.load({
|
|
|
4826
4845
|
{ className: 'mu-pop-body' },
|
|
4827
4846
|
snap.queue.length === 0
|
|
4828
4847
|
? h('div', { className: 'mu-state-sub' }, t('page.queueEmpty'))
|
|
4829
|
-
:
|
|
4848
|
+
: queueView.map(function (entry, position) {
|
|
4849
|
+
var track = entry.track
|
|
4850
|
+
var originalIndex = entry.originalIndex
|
|
4851
|
+
var visibleCurrent = originalIndex === snap.index
|
|
4830
4852
|
return h(
|
|
4831
4853
|
'div',
|
|
4832
4854
|
{
|
|
4833
4855
|
key: position + ':' + track.path,
|
|
4834
|
-
className: 'mu-queue-row' + (
|
|
4856
|
+
className: 'mu-queue-row' + (visibleCurrent ? ' is-current' : ''),
|
|
4835
4857
|
onClick: function () {
|
|
4836
|
-
player.select(snap.queue,
|
|
4858
|
+
player.select(snap.queue, originalIndex)
|
|
4837
4859
|
},
|
|
4838
4860
|
},
|
|
4839
4861
|
h(
|
|
4840
4862
|
'span',
|
|
4841
4863
|
{ className: 'mu-queue-index' },
|
|
4842
|
-
|
|
4864
|
+
visibleCurrent && snap.playing ? '▶' : String(position + 1),
|
|
4843
4865
|
),
|
|
4844
4866
|
h('span', { className: 'mu-ellipsis' }, track.title),
|
|
4845
4867
|
h('span', { className: 'mu-queue-artist mu-ellipsis' }, track.artist || ''),
|
|
@@ -4852,10 +4874,10 @@ window.__ModuleLoader__.load({
|
|
|
4852
4874
|
type: 'button',
|
|
4853
4875
|
className: 'mu-queue-btn',
|
|
4854
4876
|
title: t('page.moveUp'),
|
|
4855
|
-
disabled:
|
|
4877
|
+
disabled: originalIndex === 0,
|
|
4856
4878
|
onClick: function (event) {
|
|
4857
4879
|
event.stopPropagation()
|
|
4858
|
-
player.moveQueue(
|
|
4880
|
+
player.moveQueue(originalIndex, originalIndex - 1)
|
|
4859
4881
|
},
|
|
4860
4882
|
},
|
|
4861
4883
|
'↑',
|
|
@@ -4866,10 +4888,10 @@ window.__ModuleLoader__.load({
|
|
|
4866
4888
|
type: 'button',
|
|
4867
4889
|
className: 'mu-queue-btn',
|
|
4868
4890
|
title: t('page.moveDown'),
|
|
4869
|
-
disabled:
|
|
4891
|
+
disabled: originalIndex === snap.queue.length - 1,
|
|
4870
4892
|
onClick: function (event) {
|
|
4871
4893
|
event.stopPropagation()
|
|
4872
|
-
player.moveQueue(
|
|
4894
|
+
player.moveQueue(originalIndex, originalIndex + 1)
|
|
4873
4895
|
},
|
|
4874
4896
|
},
|
|
4875
4897
|
'↓',
|
|
@@ -4882,7 +4904,7 @@ window.__ModuleLoader__.load({
|
|
|
4882
4904
|
title: t('page.removeTrack'),
|
|
4883
4905
|
onClick: function (event) {
|
|
4884
4906
|
event.stopPropagation()
|
|
4885
|
-
player.removeQueueAt(
|
|
4907
|
+
player.removeQueueAt(originalIndex)
|
|
4886
4908
|
},
|
|
4887
4909
|
},
|
|
4888
4910
|
'×',
|
|
@@ -5142,10 +5164,10 @@ window.__ModuleLoader__.load({
|
|
|
5142
5164
|
'.mu-vlist-row{position:absolute;left:0;right:0}',
|
|
5143
5165
|
'.mu-row{display:grid;grid-template-columns:calc(var(--mu-row-size,55px) + 4px) minmax(0,1.15fr) minmax(0,.85fr) 56px auto;align-items:center;gap:12px;padding:6px 10px;border-radius:var(--dsw-radius-md,8px);height:67px;box-sizing:border-box}',
|
|
5144
5166
|
'.mu-prefs{min-width:240px;padding:12px}',
|
|
5145
|
-
'.mu-prefs-panel{position:absolute;top:56px;right:24px;z-index:50;width:360px;max-width:calc(100% - 48px);max-height:70vh;overflow-y:auto;padding:14px;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));border-radius:var(--dsw-radius-xl,20px);background:var(--dsw-alias-bg-layer-
|
|
5167
|
+
'.mu-prefs-panel{position:absolute;top:56px;right:24px;z-index:50;width:360px;max-width:calc(100% - 48px);max-height:70vh;overflow-y:auto;padding:14px;border:1px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));border-radius:var(--dsw-radius-xl,20px);background:var(--dsw-alias-bg-layer-1,#1a1a1e);box-shadow:var(--dsw-elevation-panel,0 16px 40px rgba(0,0,0,.5))}',
|
|
5146
5168
|
'.mu-prefs-tabs{display:flex;gap:2px;padding:3px;margin-bottom:12px;border-radius:9px;background:var(--dsw-alias-bg-layer-3,rgba(255,255,255,.06))}',
|
|
5147
5169
|
'.mu-prefs-tab{flex:1;height:28px;border:0;border-radius:var(--dsw-radius-sm,8px);background:transparent;color:var(--dsw-alias-label-secondary,#a1a1aa);font-size:12px;cursor:pointer}',
|
|
5148
|
-
'.mu-prefs-tab.is-on{background:var(--dsw-alias-bg-
|
|
5170
|
+
'.mu-prefs-tab.is-on{background:var(--dsw-alias-bg-layer-2,#2a2a2e);color:var(--dsw-alias-label-primary,#f4f4f5);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.35)}',
|
|
5149
5171
|
'.mu-prefs-body{display:flex;flex-direction:column}',
|
|
5150
5172
|
'.mu-prefs-body .mu-set-item:last-child{border-bottom:0;padding-bottom:0}',
|
|
5151
5173
|
'.mu-prefs-hint{margin:0 0 8px;font-size:12px;color:var(--dsw-alias-label-tertiary,#8a8a93)}',
|
|
@@ -5214,7 +5236,7 @@ window.__ModuleLoader__.load({
|
|
|
5214
5236
|
'.mu-spinner{width:20px;height:20px;border-radius:50%;border:2px solid var(--dsw-alias-border-l2,rgba(255,255,255,.18));border-top-color:var(--dsw-alias-brand-primary,#f4f4f5);animation:mu-spin .8s linear infinite}',
|
|
5215
5237
|
'@keyframes mu-spin{to{transform:rotate(360deg)}}',
|
|
5216
5238
|
'.mu-warn{padding:4px 24px 8px;font-size:12px;color:var(--dsw-alias-state-warn-label,#e0a030)}',
|
|
5217
|
-
'.mu-menu{position:absolute;top:56px;right:24px;z-index:50;min-width:160px;max-height:70vh;overflow-y:auto;padding:4px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));border-radius:var(--dsw-radius-md,8px);background:var(--dsw-alias-bg-
|
|
5239
|
+
'.mu-menu{position:absolute;top:56px;right:24px;z-index:50;min-width:160px;max-height:70vh;overflow-y:auto;padding:4px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));border-radius:var(--dsw-radius-md,8px);background:var(--dsw-alias-bg-layer-1,#1a1a1e);box-shadow:var(--dsw-elevation-prominent,0 12px 32px rgba(0,0,0,.4))}',
|
|
5218
5240
|
'.mu-menu-item{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:4px 7px;border:0;border-radius:var(--dsw-radius-md,8px);background:transparent;color:var(--dsw-alias-label-primary,#e4e4e7);font-size:12px;text-align:left;cursor:pointer}',
|
|
5219
5241
|
'.mu-menu-item:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.07))}',
|
|
5220
5242
|
'.mu-menu-item.is-on{color:var(--dsw-alias-brand-primary,#f4f4f5)}',
|
|
@@ -5246,7 +5268,7 @@ window.__ModuleLoader__.load({
|
|
|
5246
5268
|
'.mu-play-btn:hover{background:var(--dsw-alias-button-primary-hover,#e4e4e7)}',
|
|
5247
5269
|
'.mu-bar-right{display:flex;align-items:center;gap:6px;justify-self:end}',
|
|
5248
5270
|
'.mu-quality{font-size:12px;color:var(--dsw-alias-label-tertiary,#a1a1aa);font-variant-numeric:tabular-nums;white-space:nowrap}',
|
|
5249
|
-
'.mu-pop{position:absolute;right:16px;bottom:84px;z-index:40;width:330px;max-height:58%;display:flex;flex-direction:column;border-radius:var(--dsw-radius-md,8px);background:var(--dsw-alias-bg-
|
|
5271
|
+
'.mu-pop{position:absolute;right:16px;bottom:84px;z-index:40;width:330px;max-height:58%;display:flex;flex-direction:column;border-radius:var(--dsw-radius-md,8px);background:var(--dsw-alias-bg-layer-1,#1a1a1e);border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));box-shadow:var(--dsw-elevation-prominent,0 16px 48px rgba(0,0,0,.5));overflow:hidden}',
|
|
5250
5272
|
'.mu-pop-head{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 6px;font-size:12px;font-weight:600}',
|
|
5251
5273
|
'.mu-pop-body{overflow-y:auto;padding:0 6px 8px}',
|
|
5252
5274
|
'.mu-queue-row{display:grid;grid-template-columns:26px minmax(0,1fr) minmax(0,70px) auto;align-items:center;gap:8px;padding:5px 8px;border-radius:var(--dsw-radius-sm,6px);font-size:12px;cursor:pointer}',
|
|
@@ -5258,7 +5280,7 @@ window.__ModuleLoader__.load({
|
|
|
5258
5280
|
'.mu-fav.is-on{color:var(--dsw-alias-brand-primary,#f4f4f5)}',
|
|
5259
5281
|
'.mu-fav.is-on svg{fill:currentColor}',
|
|
5260
5282
|
'.mu-chip-sm{height:24px;padding:0 8px;font-size:11px}',
|
|
5261
|
-
'.mu-search-history{position:absolute;top:34px;right:0;z-index:20;display:flex;flex-wrap:wrap;gap:4px;max-width:320px;padding:6px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));border-radius:8px;background:var(--dsw-alias-bg-
|
|
5283
|
+
'.mu-search-history{position:absolute;top:34px;right:0;z-index:20;display:flex;flex-wrap:wrap;gap:4px;max-width:320px;padding:6px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));border-radius:8px;background:var(--dsw-alias-bg-layer-1,#1a1a1e);box-shadow:var(--dsw-elevation-prominent,0 8px 24px rgba(0,0,0,.35))}',
|
|
5262
5284
|
'.mu-queue-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.06))}',
|
|
5263
5285
|
'.mu-queue-row.is-current{color:var(--dsw-alias-brand-primary,#f4f4f5);background:var(--dsw-alias-interactive-bg-active,rgba(255,255,255,.08))}',
|
|
5264
5286
|
'.mu-queue-index{font-size:12px;color:var(--dsw-alias-label-tertiary,#a1a1aa);font-variant-numeric:tabular-nums}',
|
|
@@ -5325,7 +5347,7 @@ window.__ModuleLoader__.load({
|
|
|
5325
5347
|
'.mu-set-note{font-size:12px;color:var(--dsw-alias-label-tertiary,#73737d);margin:6px 0 0}',
|
|
5326
5348
|
'.mu-scrim{position:absolute;inset:0 0 80px 0;z-index:35}',
|
|
5327
5349
|
'.mu-set{display:flex;flex-direction:column;gap:10px;max-width:640px;user-select:none}',
|
|
5328
|
-
'.mu-mini{position:fixed;right:20px;bottom:84px;z-index:60;display:flex;align-items:center;gap:10px;width:260px;padding:8px 10px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));border-radius:12px;background:var(--dsw-alias-bg-
|
|
5350
|
+
'.mu-mini{position:fixed;right:20px;bottom:84px;z-index:60;display:flex;align-items:center;gap:10px;width:260px;padding:8px 10px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.12));border-radius:12px;background:var(--dsw-alias-bg-layer-1,#1a1a1e);box-shadow:var(--dsw-elevation-prominent,0 12px 32px rgba(0,0,0,.45));cursor:grab;touch-action:none;user-select:none}',
|
|
5329
5351
|
'.mu-mini.is-corner{right:20px;bottom:84px}',
|
|
5330
5352
|
'.mu-mini-info{flex:1;min-width:0}',
|
|
5331
5353
|
'.mu-mini-title{font-size:12px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}',
|
|
@@ -5383,7 +5405,7 @@ window.__ModuleLoader__.load({
|
|
|
5383
5405
|
'.mu-np.is-blur .mu-np-line:not(.is-active){opacity:.42;filter:blur(1px)}',
|
|
5384
5406
|
'.mu-np-head-actions{margin-left:auto;display:flex;align-items:center;gap:6px}',
|
|
5385
5407
|
'.mu-trans-toggle{width:auto;padding:0 8px;font-size:12px;font-weight:600;line-height:1}',
|
|
5386
|
-
'.mu-np-settings{position:absolute;top:52px;right:20px;z-index:6;width:320px;max-width:calc(100% - 40px);padding:14px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));border-radius:10px;background:var(--dsw-alias-bg-
|
|
5408
|
+
'.mu-np-settings{position:absolute;top:52px;right:20px;z-index:6;width:320px;max-width:calc(100% - 40px);padding:14px;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));border-radius:10px;background:var(--dsw-alias-bg-layer-1,#1a1a1e);box-shadow:var(--dsw-elevation-prominent,0 12px 32px rgba(0,0,0,.45))}',
|
|
5387
5409
|
'.mu-np-offset-actions{display:flex;align-items:center;gap:6px;margin-top:6px;flex-wrap:wrap}',
|
|
5388
5410
|
'.mu-np-setting-hint{font-size:11px;color:var(--dsw-alias-label-tertiary,#8a8a93);margin-top:6px;line-height:1.5}',
|
|
5389
5411
|
'.mu-np-setting-error{font-size:11px;color:var(--dsw-alias-state-error,#e5484d);margin-top:4px;word-break:break-word}',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-music-panel",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Local music library for DeepSeek Harness: scan a folder, browse tracks with cover art and tags, and play through a sidebar-panel player with loop, shuffle and volume. · DSH 本地音乐插件:扫描音乐目录、读取封面与标签、侧栏入口 + 全屏播放器。",
|
|
6
6
|
"license": "MIT",
|