dsh-music-panel 0.3.9 → 0.3.11

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/client.js +96 -8
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.11
4
+
5
+ ### 变更
6
+
7
+ - 播放列表面板支持拖动移动位置:拖动顶部正在播放条/标题区即可,位置记在偏好里,下次打开恢复
8
+ - 播放列表面板内禁用文本框选(`user-select: none`)
9
+
10
+ ## 0.3.10
11
+
12
+ ### 变更
13
+
14
+ - 正在播放行改用 DSH 品牌蓝 `--dsw-static-deepseek-450`:歌曲名蓝色加粗、播放均衡器蓝色
15
+ - 高亮改为淡蓝底 + 左侧圆角蓝条 + 10px 圆角,替换原来的灰白块 + 生硬内阴影
16
+
3
17
  ## 0.3.9
4
18
 
5
19
  ### 修复
package/client.js CHANGED
@@ -33,6 +33,7 @@ window.__ModuleLoader__.load({
33
33
  /** Defaults for every appearance / lyric preference. */
34
34
  var PREF_DEFAULTS = {
35
35
  miniPlayer: true,
36
+ queuePos: null,
36
37
  composerQueueButton: true,
37
38
  circularCover: true,
38
39
  vinylRing: false,
@@ -2124,6 +2125,12 @@ window.__ModuleLoader__.load({
2124
2125
  function QueueOverlay() {
2125
2126
  var [open, setOpen] = useState(queueOverlaySnapshot())
2126
2127
  var [snap, setSnap] = useState(player.getSnapshot())
2128
+ var [pos, setPos] = useState(function () {
2129
+ var saved = readPrefs().queuePos
2130
+ if (saved === null || typeof saved !== 'object') return null
2131
+ if (!isFinite(saved.x) || !isFinite(saved.y)) return null
2132
+ return { x: Number(saved.x), y: Number(saved.y) }
2133
+ })
2127
2134
  // Drag state lives entirely in refs/DOM classes so React never
2128
2135
  // re-renders the dragged row mid-drag (Chromium cancels that).
2129
2136
  var dragFromRef = useRef(null)
@@ -2245,6 +2252,73 @@ window.__ModuleLoader__.load({
2245
2252
  document.addEventListener('pointercancel', onUp)
2246
2253
  }
2247
2254
 
2255
+ // Drag the whole panel by its header strip (buttons and queue rows keep
2256
+ // their own gestures). Position is remembered in prefs.
2257
+ function startPanelDrag(event) {
2258
+ if (event.button !== undefined && event.button !== 0) return
2259
+ var target = event.target
2260
+ if (target === null || target === undefined || typeof target.closest !== 'function') return
2261
+ if (target.closest('button, .mu-queue-row, .mu-queue-grip') !== null) return
2262
+ if (target.closest('.mu-qoverlay-now, .mu-qoverlay-head') === null) return
2263
+ var el = ref.current
2264
+ if (el === null) return
2265
+ var rect = el.getBoundingClientRect()
2266
+ var start = {
2267
+ x: event.clientX,
2268
+ y: event.clientY,
2269
+ left: rect.left,
2270
+ top: rect.top,
2271
+ width: rect.width,
2272
+ height: rect.height,
2273
+ moved: false,
2274
+ }
2275
+ event.preventDefault()
2276
+ document.body.style.userSelect = 'none'
2277
+ document.body.style.cursor = 'grabbing'
2278
+ el.classList.add('is-dragging-panel')
2279
+
2280
+ function clamp(value, min, max) {
2281
+ return Math.max(min, Math.min(max, value))
2282
+ }
2283
+
2284
+ function onMove(moveEvent) {
2285
+ start.moved = true
2286
+ var x = clamp(
2287
+ start.left + (moveEvent.clientX - start.x),
2288
+ 8,
2289
+ Math.max(8, window.innerWidth - start.width - 8),
2290
+ )
2291
+ var y = clamp(
2292
+ start.top + (moveEvent.clientY - start.y),
2293
+ 8,
2294
+ Math.max(8, window.innerHeight - start.height - 8),
2295
+ )
2296
+ el.style.left = x + 'px'
2297
+ el.style.top = y + 'px'
2298
+ el.style.right = 'auto'
2299
+ el.style.bottom = 'auto'
2300
+ }
2301
+
2302
+ function onUp() {
2303
+ document.removeEventListener('pointermove', onMove)
2304
+ document.removeEventListener('pointerup', onUp)
2305
+ document.removeEventListener('pointercancel', onUp)
2306
+ document.body.style.userSelect = ''
2307
+ document.body.style.cursor = ''
2308
+ el.classList.remove('is-dragging-panel')
2309
+ if (start.moved) {
2310
+ var next = el.getBoundingClientRect()
2311
+ var position = { x: Math.round(next.left), y: Math.round(next.top) }
2312
+ setPos(position)
2313
+ savePrefs({ queuePos: position })
2314
+ }
2315
+ }
2316
+
2317
+ document.addEventListener('pointermove', onMove)
2318
+ document.addEventListener('pointerup', onUp)
2319
+ document.addEventListener('pointercancel', onUp)
2320
+ }
2321
+
2248
2322
  var rows = queueView.map(function (entry, position) {
2249
2323
  var track = entry.track
2250
2324
  var originalIndex = entry.originalIndex
@@ -2299,7 +2373,17 @@ window.__ModuleLoader__.load({
2299
2373
 
2300
2374
  return h(
2301
2375
  'div',
2302
- { className: 'mu-qoverlay', ref: ref },
2376
+ {
2377
+ className: 'mu-qoverlay',
2378
+ ref: ref,
2379
+ style:
2380
+ pos !== null
2381
+ ? { left: pos.x + 'px', top: pos.y + 'px', right: 'auto', bottom: 'auto' }
2382
+ : undefined,
2383
+ onPointerDown: function (event) {
2384
+ startPanelDrag(event)
2385
+ },
2386
+ },
2303
2387
  h(QueueNowPlaying, null),
2304
2388
  h(
2305
2389
  'div',
@@ -5419,7 +5503,7 @@ window.__ModuleLoader__.load({
5419
5503
  '.mu-list{flex:1;min-height:0;overflow-y:auto;scrollbar-gutter:stable;padding:0 16px 12px}',
5420
5504
  '.mu-vlist-inner{position:relative}',
5421
5505
  '.mu-vlist-row{position:absolute;left:0;right:0}',
5422
- '.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}',
5506
+ '.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;position:relative}',
5423
5507
  '.mu-prefs{min-width:240px;padding:12px}',
5424
5508
  '.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))}',
5425
5509
  '.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))}',
@@ -5457,16 +5541,17 @@ window.__ModuleLoader__.load({
5457
5541
  '.mu-btn-danger{background:var(--dsw-alias-state-error-primary,#c0392b);color:var(--dsw-alias-label-primary-foreground,#fff);border-color:transparent}',
5458
5542
  '.mu-btn-danger:hover{opacity:.9}',
5459
5543
  '.mu-row:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.05))}',
5460
- '.mu-row.is-current{background:rgba(244,244,245,.12);background:color-mix(in srgb,var(--dsw-alias-brand-primary,#f4f4f5) 12%,transparent);box-shadow:inset 3px 0 0 var(--dsw-alias-brand-primary,#f4f4f5);border-radius:var(--dsw-radius-md,8px)}',
5461
- '.mu-row.is-current:hover{background:rgba(244,244,245,.16);background:color-mix(in srgb,var(--dsw-alias-brand-primary,#f4f4f5) 16%,transparent)}',
5462
- '.mu-row.is-current .mu-row-title{color:var(--dsw-alias-brand-primary,#f4f4f5);font-weight:600}',
5544
+ '.mu-row.is-current{background:color-mix(in srgb,var(--dsw-static-deepseek-450,#5686fe) 8%,transparent);border-radius:10px;position:relative}',
5545
+ '.mu-row.is-current::before{content:"";position:absolute;left:3px;top:50%;transform:translateY(-50%);width:3px;height:20px;border-radius:2px;background:var(--dsw-static-deepseek-450,#5686fe)}',
5546
+ '.mu-row.is-current:hover{background:color-mix(in srgb,var(--dsw-static-deepseek-450,#5686fe) 12%,transparent)}',
5547
+ '.mu-row.is-current .mu-row-title{color:var(--dsw-static-deepseek-450,#5686fe);font-weight:600}',
5463
5548
  '.mu-row.is-current .mu-row-sub,.mu-row.is-current .mu-row-album,.mu-row.is-current .mu-row-dur{color:var(--dsw-alias-label-secondary,#a1a1aa)}',
5464
5549
  '.mu-row-play{position:relative;width:var(--mu-row-size,55px);height:var(--mu-row-size,55px);border:0;padding:0;background:transparent;cursor:pointer;border-radius:var(--dsw-radius-sm,6px);display:flex;align-items:center;justify-content:center}',
5465
5550
  '.mu-row-playmask{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;border-radius:var(--dsw-radius-sm,6px);background:rgba(0,0,0,.45);color:#fff;opacity:0;transition:opacity .12s ease}',
5466
5551
  '.mu-row-play:hover .mu-row-playmask,.mu-row.is-current .mu-row-playmask{opacity:1}',
5467
5552
  '.mu-row.is-current .mu-row-playmask{background:rgba(0,0,0,.35)}',
5468
5553
  '.mu-row.is-selected{background:var(--dsw-alias-interactive-bg-hover,rgba(255,255,255,.05))}',
5469
- '.mu-row.is-current.is-selected{background:rgba(244,244,245,.12);background:color-mix(in srgb,var(--dsw-alias-brand-primary,#f4f4f5) 12%,transparent);box-shadow:inset 3px 0 0 var(--dsw-alias-brand-primary,#f4f4f5)}',
5554
+ '.mu-row.is-current.is-selected{background:color-mix(in srgb,var(--dsw-static-deepseek-450,#5686fe) 8%,transparent)}',
5470
5555
  '.mu-row-actions{display:flex;align-items:center;justify-content:flex-end;gap:6px}',
5471
5556
  '.mu-check{width:20px;height:20px;margin:0;padding:0;border:1.5px solid var(--dsw-alias-border-l3,rgba(255,255,255,.24));border-radius:50%;background:transparent;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;flex:none;opacity:0;transition:opacity .12s ease}',
5472
5557
  '.mu-row:hover .mu-check,.mu-row.is-selected .mu-check,.mu-check:focus-visible{opacity:1}',
@@ -5477,7 +5562,7 @@ window.__ModuleLoader__.load({
5477
5562
  '.mu-row-main{min-width:0}',
5478
5563
  '.mu-row-title{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}',
5479
5564
  '.mu-eq{display:inline-flex;align-items:flex-end;gap:2px;height:12px;margin-right:8px;flex:none}',
5480
- '.mu-eq i{display:block;width:2px;height:4px;border-radius:1px;background:var(--dsw-alias-brand-primary,#f4f4f5);opacity:.9}',
5565
+ '.mu-eq i{display:block;width:2px;height:4px;border-radius:1px;background:var(--dsw-static-deepseek-450,#5686fe);opacity:.95}',
5481
5566
  '.mu-eq.is-playing i{animation:mu-eq-bounce .9s ease-in-out infinite}',
5482
5567
  '.mu-eq.is-playing i:nth-child(2){animation-delay:.15s}',
5483
5568
  '.mu-eq.is-playing i:nth-child(3){animation-delay:.3s}',
@@ -5526,7 +5611,10 @@ window.__ModuleLoader__.load({
5526
5611
  '.mu-bar-right{display:flex;align-items:center;gap:6px;justify-self:end}',
5527
5612
  '.mu-quality{font-size:12px;color:var(--dsw-alias-label-tertiary,#a1a1aa);font-variant-numeric:tabular-nums;white-space:nowrap}',
5528
5613
  '.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}',
5529
- '.mu-qoverlay{position:fixed;right:24px;bottom:96px;z-index:70;width:360px;max-width:calc(100vw - 48px);max-height:62vh;display:flex;flex-direction:column;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));border-radius:14px;background:var(--dsw-alias-bg-layer-1,#1a1a1e);box-shadow:var(--dsw-elevation-prominent,0 16px 48px rgba(0,0,0,.5));overflow:hidden}',
5614
+ '.mu-qoverlay{position:fixed;right:24px;bottom:96px;z-index:70;width:360px;max-width:calc(100vw - 48px);max-height:62vh;display:flex;flex-direction:column;border:.5px solid var(--dsw-alias-border-l2,rgba(255,255,255,.1));border-radius:14px;background:var(--dsw-alias-bg-layer-1,#1a1a1e);box-shadow:var(--dsw-elevation-prominent,0 16px 48px rgba(0,0,0,.5));overflow:hidden;user-select:none}',
5615
+ '.mu-qoverlay.is-dragging-panel{cursor:grabbing}',
5616
+ '.mu-qoverlay-now,.mu-qoverlay-head{cursor:grab}',
5617
+ '.mu-qoverlay-now:active,.mu-qoverlay-head:active{cursor:grabbing}',
5530
5618
  '.mu-qoverlay-now{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:.5px solid var(--dsw-alias-border-l1,rgba(255,255,255,.08))}',
5531
5619
  '.mu-qoverlay-now.is-empty{padding:14px 12px;color:var(--dsw-alias-label-tertiary,#8a8a93);font-size:12px}',
5532
5620
  '.mu-qoverlay-now-main{flex:1;min-width:0}',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-music-panel",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
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",