v0.2.0-rc3
Pre-release
Pre-release
Added
- 歌词翻译开关:新增
lyricTranslation设置项(默认开启),关闭时翻译行通过<Transition name="translation-toggle">以max-height: 2.2em → 0+translate: 0 → -0.18em+opacity: 0.76 → 0三重过渡动画收起;PlayerSettings类型与migrateSettings均新增该字段,默认值true保证向后兼容;displayedLinescomputed 在关闭时逐行剥离translation字段,同时emitSnapshot改发displayedLines而非原始lines,歌词小窗同步响应翻译开关 - 管理后台移动端导航面板:
AdminSidebar< 760px 时折叠为 sticky 顶栏(站点名 + 面包屑 + 汉堡按钮),新增<Teleport to="body">底部抽屉式mobile-nav-panel,复用useDrawerSheet实现全屏/半屏/关闭三段吸附拖拽,isMobileViewport()动态启用;面板内双列grid布局容纳 7 个导航标签,底部sidebar-footer包含「保存全部」(跨列占满)、「退出登录」、「返回播放器」三按钮;关闭时选中标签/保存/退出均自动触发dismissMobileNavAnimated(),遮挡层.mobile-nav-backdrop半屏时扩大 inset 覆盖全屏并加深背景;面板样式统一玻璃拟态(backdrop-filter: blur(52px) saturate(180%))+ 圆角顶部 + 底部 safe-area-inset 适配,420px 以下进一步紧凑间距 useFocusTrapautoFocus选项:新增可选的options.autoFocus参数,类型为MaybeRefOrGetter<boolean>,默认true;当toValue(options?.autoFocus) === false时跳过自动聚焦但仍设置pendingActivation = false避免状态卡死,移动端 sheet 抽屉(libraryDrawerRef)传入autoFocus: () => !isMobileSheet.value以跳过移动端自动对焦PlayerControls竖排布局variant="vertical":新增长 54px 的纵向排列模式,播放/上一首/下一首按钮按列堆叠(flex-direction: column),播放按钮 46×46px 带box-shadow强调,不渲染进度条行(variant !== 'bar' && variant !== 'vertical'),用于歌词小窗等窄空间场景- 开发模式本地配置同步:
vite.config.ts新增melioraLocalConfigPlugin,在 Vite dev server 注册POST /__meliora-dev/config中间件;管理后台saveConfig在import.meta.env.DEV下自动将清洗后的配置POST到该端点,插件经validateMusicConfig校验后写入.meliora/config.local.json并调用generatePublicConfig重新生成src/generated/public-config.ts,最后通过server.ws.send('full-reload')触发热更新,开发环境改配置后无需手动重启;SaveResult新增warning?字段,同步失败时ok: true但携带 warning 提示 - 本地开发配置优先读取:
generatePublicConfig在MELIORA_LOAD_DEV_VARS=true且.meliora/config.local.json存在时,优先以它作为配置源生成本地公开配置,代替public/config.json;pnpm generate:public-config:dev复用此逻辑 createTrackShareId确定性分享标识:src/utils/tracks.ts新增基于 FNV-1a 哈希(hashShareIdentity)的确定性 share ID,输入为trackIdentity(标题+艺术家归一化),输出为 36 进制短字符串(不含内部 URL 敏感信息);分享 URL 从?track=<track.id>改为?share=<hash>,useTrackShare分享文案从「正在 Meliora 收听」改为「Meliora: <标题 - 艺术家>」,剪贴板内容同步简化;loadTracks改为按share参数匹配加载后自动移除参数避免分享链接残留shouldUseIOSBackgroundSafeAudio浏览器能力检测:src/utils/browser.ts新增该函数,返回isIOSDevice() && isSafariBrowser()的合取,统一标识 iOS Safari 后台播放受限场景useDeviceDetectioncomposable:新增src/composables/useDeviceDetection.ts,抽离原本散布在App.vue中的compactViewport、portableDevice、phoneDevice、lyricsWindowSupported和isMobileSheet、viewportMode(枚举wide/narrow/phone)等设备检测逻辑为独立 composable
Changed
- 播放器架构拆分:原 2500 行
App.vue拆为两文件——App.vue缩至 ~25 行,仅保留<router-view>+<Transition mode="out-in">作为路由壳(接管原AppShell.vue职责);播放器全部业务逻辑迁移至src/views/PlayerView.vue;路由从component: App改为component: PlayerView;main.ts直接挂载App而非AppShell;AppShell.vue已删除;agent.md分层图同步更新为src/main.ts → src/App.vue → src/views/PlayerView.vue SettingsPanel去 props 化:组件不再通过 props 接收settings: PlayerSettings,改为内部直接storeToRefs(usePlayerStore())获取响应式settings;PlayerView.vue移除:settings="settings"传递;消除了 15 处vue/no-mutating-propsESLint 违规;PlayerSettings类型导入从 SettingsPanel 移除,不再依赖src/types/musicLyricsPanel滚动对齐全面重构:新增syncActiveLyric/scheduleRealign统一入口、ScrollToIndexOptions动画控制、programmaticScroll标记防误触发、键盘滚动检测、ResizeObserver监听布局变化、.distance-0~.distance-5CSS class 代替 inline style、--lyric-size上移面板根节点;行间距改为动态clamp(22px, calc(var(--lyric-size) * 1.28), 42px);浏览模式 hover 行加::before伪元素高亮;新增activeprop 控制对齐策略- 翻译切换动画:翻译行包裹
<Transition name="translation-toggle">,CSS 定义max-height(2.2em ↔ 0)、margin-top、opacity(0.76 ↔ 0)、translate(0 ↔ -0.18em) 四属性 360ms cubic-out 过渡;prefers-reduced-motion下过渡时长清零 - iOS Safari 后台播放适配:
useAudioPlayer检测到 iOS Safari 时:(a)所有<audio>设置playsinline属性;(b)活跃音频挂载到 DOM 节点维持后台播放;(c)绕过 Web Audio 节拍分析;(d)关闭 crossfade;(e)初始化/切歌/错误恢复路径均调用挂载;(f)卸载时清理 DOM host useBeatAnalyser音频资源释放:停止节拍分析时挂起共享AudioContext释放音频硬件,后续可 resume 恢复- 分享链接去内部 ID 化:分享 URL 从
?track=<track.id>改为?share=<FNV-1a hash>,文案简化为「Meliora: <标题 - 艺术家>」 TrackList搜索输入简化:debouncedQuery直接v-model绑定,handleSearchInput由 watcher 驱动- 管理后台全页面移动端响应式增强:
AdminApp、DashboardView、SiteSettingsEditor、SecurityEditor、AdvancedSettingsEditor、AnalyticsSettingsEditor均补充 720px/420px 断点适配 useDrawerSheet事件去重:handle 发起的拖拽不再被 container 的pointermove重复触发useLyricsWindow歌词小窗跨 toggle 复用:window.open使用固定窗口名称'meliora-lyrics',跨 toggle 复用- 版本脚本路径参数化:
generatePublicConfig路径改为函数,DEV 模式支持.meliora/config.local.json优先 - 测试增强:
use-audio-player.test.ts新增 3 个 iOS 适配测试;tracks.test.ts新增createTrackShareId测试;player-store.test.ts新增lyricTranslation迁移测试;use-preload-pool.test.ts补默认 settings - README 补充:新增本地配置同步章节、路线图链接、署名补充
agent.md规范更新:分层图路径、依赖方向、路由过渡参考随架构拆分同步修正
Fixed
useFocusTrap未使用变量:移除声明后从未引用的局部autoFocus变量PlayerView.vue未使用导入:移除PlayerViewportMode类型导入与viewportMode解构变量SettingsPanel.vue15 处 props 直接修改:组件改为使用 Pinia store 后彻底消除vue/no-mutating-props违规- 4 处
vue-tsc -b严格类型错误:AdminSidebaremit 联合类型重载、HTMLAudioElement.playsInline非标准属性、测试文件类型断言缺失、测试playsInline断言 - 5 处 Prettier 格式化违规:
useFocusTrap.tsimport 语句、PlayerView.vue缩进/解构/多行属性、TrackList.vuev-model 换行
Tests
- 歌词面板测试:新增
lyrics-panel.test.ts,覆盖滚动对齐、字号变更重对齐、ResizeObserver 集成、用户浏览模式计时器暂停、active tab 切换时状态同步