From 053c9c744085824cb07eb07035f681d964f6d76b Mon Sep 17 00:00:00 2001 From: festoney8 Date: Sat, 4 Jan 2025 14:51:09 +0800 Subject: [PATCH 01/17] update: new space page comment filter --- CHANGELOG.md | 4 + src/modules/filters/index.ts | 16 +- .../filters/variety/comment/pages/common.ts | 4 +- .../filters/variety/comment/pages/legacy.ts | 694 ------------------ vite.config.ts | 2 +- 5 files changed, 9 insertions(+), 711 deletions(-) delete mode 100644 src/modules/filters/variety/comment/pages/legacy.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index b3fe625..69a17b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 4.1.2 + +- 更新:评论过滤 适配新版空间页,移除旧版适配 + ## 4.1.1 - 新增:直播页 默认网页全屏播放 diff --git a/src/modules/filters/index.ts b/src/modules/filters/index.ts index c6ef869..54afebd 100644 --- a/src/modules/filters/index.ts +++ b/src/modules/filters/index.ts @@ -18,11 +18,6 @@ import { commentFilterCommonGroups, commentFilterCommonHandler, } from './variety/comment/pages/common' -import { - commentFilterLegacyEntry, - commentFilterLegacyGroups, - commentFilterLegacyHandler, -} from './variety/comment/pages/legacy' import { dynamicFilterDynamicEntry, dynamicFilterDynamicGroups, @@ -91,16 +86,10 @@ export const videoFilters: Filter[] = [ /** 评论过滤器 */ export const commentFilters: Filter[] = [ { - name: '视频页/番剧页/动态页 视频评论过滤', + name: '视频页/番剧页/动态页/空间页 视频评论过滤', groups: commentFilterCommonGroups, entry: commentFilterCommonEntry, - checkFn: () => isPageVideo() || isPageBangumi() || isPagePlaylist() || isPageDynamic(), - }, - { - name: '空间页 动态评论过滤', - groups: commentFilterLegacyGroups, - entry: commentFilterLegacyEntry, - checkFn: () => isPageSpace(), + checkFn: () => isPageVideo() || isPageBangumi() || isPagePlaylist() || isPageDynamic() || isPageSpace(), }, ] @@ -171,5 +160,4 @@ export const filterContextMenuHandlers = [ videoFilterHomepageHandler, dynamicFilterDynamicHandler, commentFilterCommonHandler, - commentFilterLegacyHandler, ] diff --git a/src/modules/filters/variety/comment/pages/common.ts b/src/modules/filters/variety/comment/pages/common.ts index 4cd7ca9..5f7d09f 100644 --- a/src/modules/filters/variety/comment/pages/common.ts +++ b/src/modules/filters/variety/comment/pages/common.ts @@ -4,7 +4,7 @@ import { Group } from '@/types/collection' import { ContextMenuTargetHandler, FilterContextMenu, IMainFilter, SelectorResult, SubFilterPair } from '@/types/filter' import fetchHook from '@/utils/fetch' import { debugFilter as debug, error } from '@/utils/logger' -import { isPageBangumi, isPageDynamic, isPagePlaylist, isPageVideo } from '@/utils/pageType' +import { isPageBangumi, isPageDynamic, isPagePlaylist, isPageSpace, isPageVideo } from '@/utils/pageType' import ShadowInstance from '@/utils/shadow' import { BiliCleanerStorage } from '@/utils/storage' import { orderedUniq, showEle } from '@/utils/tool' @@ -842,7 +842,7 @@ export const commentFilterCommonGroups: Group[] = [ // 右键菜单handler export const commentFilterCommonHandler: ContextMenuTargetHandler = (target: HTMLElement): FilterContextMenu[] => { - if (!(isPageVideo() || isPagePlaylist() || isPageBangumi() || isPageDynamic())) { + if (!(isPageVideo() || isPagePlaylist() || isPageBangumi() || isPageDynamic() || isPageSpace())) { return [] } diff --git a/src/modules/filters/variety/comment/pages/legacy.ts b/src/modules/filters/variety/comment/pages/legacy.ts deleted file mode 100644 index 80651da..0000000 --- a/src/modules/filters/variety/comment/pages/legacy.ts +++ /dev/null @@ -1,694 +0,0 @@ -import { coreCheck } from '@/modules/filters/core/core' -import settings from '@/settings' -import { Group } from '@/types/collection' -import { ContextMenuTargetHandler, FilterContextMenu, IMainFilter, SelectorResult, SubFilterPair } from '@/types/filter' -import fetchHook from '@/utils/fetch' -import { debugFilter as debug, error } from '@/utils/logger' -import { isPageSpace } from '@/utils/pageType' -import { BiliCleanerStorage } from '@/utils/storage' -import { orderedUniq, showEle, waitForEle } from '@/utils/tool' -import { bots, botsSet } from '../extra/bots' -import { - CommentBotFilter, - CommentCallBotFilter, - CommentCallUserFilter, - CommentCallUserOnlyFilter, - CommentContentFilter, - CommentLevelFilter, - CommentUsernameFilter, -} from '../subFilters/black' -import { CommentIsLinkFilter, CommentIsNoteFilter, CommentIsPinFilter, CommentIsUpFilter } from '../subFilters/white' - -const GM_KEYS = { - black: { - username: { - statusKey: 'video-comment-username-filter-status', - valueKey: 'global-comment-username-filter-value', - }, - content: { - statusKey: 'video-comment-content-filter-status', - valueKey: 'global-comment-content-filter-value', - }, - level: { - statusKey: 'video-comment-level-filter-status', - valueKey: 'global-comment-level-filter-value', - }, - bot: { - statusKey: 'video-comment-bot-filter-status', - }, - callBot: { - statusKey: 'video-comment-call-bot-filter-status', - }, - callUser: { - statusKey: 'video-comment-call-user-filter-status', - }, - callUserOnly: { - statusKey: 'video-comment-call-user-only-filter-status', - }, - isAD: { - statusKey: 'video-comment-ad-filter-status', - }, - }, - white: { - root: { - statusKey: 'video-comment-root-whitelist-status', - }, - sub: { - statusKey: 'video-comment-sub-whitelist-status', - }, - isUp: { - statusKey: 'video-comment-uploader-whitelist-status', - }, - isPin: { - statusKey: 'video-comment-pinned-whitelist-status', - }, - isNote: { - statusKey: 'video-comment-note-whitelist-status', - }, - isLink: { - statusKey: 'video-comment-link-whitelist-status', - }, - }, -} - -// 一二级评论信息提取 -const selectorFns = { - root: { - username: (comment: HTMLElement): SelectorResult => { - return comment.querySelector('.root-reply-container .user-name')?.textContent?.trim() - }, - content: (comment: HTMLElement): SelectorResult => { - return comment - .querySelector('.root-reply-container .reply-content') - ?.textContent?.trim() - .replace(/@[^@\s]+/g, ' ') - .trim() - }, - callBot: (comment: HTMLElement): SelectorResult => { - const members = Array.from( - comment.querySelectorAll('.root-reply-container .reply-content .jump-link.user'), - ) - return members.some((v: HTMLElement) => botsSet.has(v.textContent!.replace('@', ''))) - }, - callUser: (comment: HTMLElement): SelectorResult => { - return comment - .querySelector('.root-reply-container .reply-content .jump-link.user') - ?.textContent?.replace('@', '') - .trim() - }, - callUserOnly: (comment: HTMLElement): SelectorResult => { - return ( - comment - .querySelector('.root-reply-container .reply-content') - ?.textContent?.replace(/@[^@\s]+/g, ' ') - .trim() === '' - ) - }, - level: (comment: HTMLElement): SelectorResult => { - const c = comment.querySelector('.root-reply-container .user-level')?.className - const lv = c?.match(/level-([1-6])/)?.[1] // 忽略level-hardcore - return lv ? parseInt(lv) : undefined - }, - isUp: (comment: HTMLElement): SelectorResult => { - return !!comment.querySelector('.root-reply-container .up-icon') - }, - isPin: (comment: HTMLElement): SelectorResult => { - return !!comment.querySelector('.root-reply-container .top-icon') - }, - isNote: (comment: HTMLElement): SelectorResult => { - return !!comment.querySelector('.root-reply-container .note-prefix') - }, - isLink: (comment: HTMLElement): SelectorResult => { - return !!comment.querySelector('.root-reply-container .jump-link:is(.normal, .video)') - }, - }, - sub: { - username: (comment: HTMLElement): SelectorResult => { - return comment.querySelector('.sub-user-name')?.textContent?.trim() - }, - content: (comment: HTMLElement): SelectorResult => { - return comment - .querySelector('.reply-content') - ?.textContent?.trim() - ?.replace(/^回复\s?@[^@\s]+\s?:/, '') - ?.replace(/@[^@\s]+/g, ' ') - .trim() - }, - callBot: (comment: HTMLElement): SelectorResult => { - const members = Array.from(comment.querySelectorAll('.reply-content .jump-link.user')) - return members.some((v: HTMLElement) => botsSet.has(v.textContent!.replace('@', ''))) - }, - callUser: (comment: HTMLElement): SelectorResult => { - return comment - .querySelector('.reply-content') - ?.textContent?.trim() - ?.replace(/^回复\s?@[^@\s]+\s?:/, '') - ?.match(/@[^@\s]+/)?.[0] - .replace('@', '') - .trim() - }, - callUserOnly: (comment: HTMLElement): SelectorResult => { - return ( - comment - .querySelector('.reply-content') - ?.textContent?.trim() - ?.replace(/^回复\s?@[^@\s]+\s?:/, '') - ?.replace(/@[^@\s]+/g, ' ') - .trim() === '' - ) - }, - level: (comment: HTMLElement): SelectorResult => { - const c = comment.querySelector('.sub-user-level')?.className - const lv = c?.match(/level-([1-6])/)?.[1] // 忽略level-hardcore - return lv ? parseInt(lv) : undefined - }, - isUp: (comment: HTMLElement): SelectorResult => { - return !!comment.querySelector('.sub-up-icon') - }, - isLink: (comment: HTMLElement): SelectorResult => { - return !!comment.querySelector('.sub-reply-content .jump-link:is(.normal, .video)') - }, - }, -} - -let isRootWhite = false -let isSubWhite = false - -class CommentFilterLegacy implements IMainFilter { - target: HTMLElement | undefined - - // 黑名单 - commentUsernameFilter = new CommentUsernameFilter() - commentContentFilter = new CommentContentFilter() - commentLevelFilter = new CommentLevelFilter() - commentBotFilter = new CommentBotFilter() - commentCallBotFilter = new CommentCallBotFilter() - commentCallUserFilter = new CommentCallUserFilter() - commentCallUserOnlyFilter = new CommentCallUserOnlyFilter() - // 白名单 - commentIsUpFilter = new CommentIsUpFilter() - commentIsPinFilter = new CommentIsPinFilter() - commentIsNoteFilter = new CommentIsNoteFilter() - commentIsLinkFilter = new CommentIsLinkFilter() - - init() { - // 黑名单 - this.commentUsernameFilter.setParam(BiliCleanerStorage.get(GM_KEYS.black.username.valueKey, [])) - this.commentContentFilter.setParam(BiliCleanerStorage.get(GM_KEYS.black.content.valueKey, [])) - this.commentLevelFilter.setParam(BiliCleanerStorage.get(GM_KEYS.black.level.valueKey, 0)) - this.commentBotFilter.setParam(bots) - } - - async check(mode?: 'full' | 'incr') { - if (location.host === 'space.bilibili.com' && !location.pathname.includes('/dynamic')) { - return - } - if (!this.target) { - return - } - - let revertAll = false - const timer = performance.now() - if ( - !( - this.commentUsernameFilter.isEnable || - this.commentContentFilter.isEnable || - this.commentLevelFilter.isEnable || - this.commentBotFilter.isEnable || - this.commentCallBotFilter.isEnable || - this.commentCallUserFilter.isEnable || - this.commentCallUserOnlyFilter.isEnable - ) - ) { - revertAll = true - } - - // 提取元素:一级评论、二级评论 - const rootSelector = `.reply-item` + (mode === 'incr' ? `:not([${settings.filterSign}])` : '') - const subSelector = `.sub-reply-item` + (mode === 'incr' ? `:not([${settings.filterSign}])` : '') - const rootComments = Array.from(this.target.querySelectorAll(rootSelector)) - const subComments = Array.from(this.target.querySelectorAll(subSelector)) - - if (settings.enableDebugFilter) { - rootComments.forEach((v) => { - debug( - [ - `CommentFilterLegacy rootComments`, - `username: ${selectorFns.root.username(v)}`, - `content: ${selectorFns.root.content(v)}`, - `callUser: ${selectorFns.root.callUser(v)}`, - `callUserOnly: ${selectorFns.root.callUserOnly(v)}`, - `level: ${selectorFns.root.level(v)}`, - `isUp: ${selectorFns.root.isUp(v)}`, - `isPin: ${selectorFns.root.isPin(v)}`, - `isNote: ${selectorFns.root.isNote(v)}`, - `isLink: ${selectorFns.root.isLink(v)}`, - ].join('\n'), - ) - }) - subComments.forEach((v) => { - debug( - [ - `CommentFilterLegacy subComments`, - `username: ${selectorFns.sub.username(v)}`, - `content: ${selectorFns.sub.content(v)}`, - `callUser: ${selectorFns.sub.callUser(v)}`, - `callUserOnly: ${selectorFns.sub.callUserOnly(v)}`, - `level: ${selectorFns.sub.level(v)}`, - `isUp: ${selectorFns.sub.isUp(v)}`, - `isLink: ${selectorFns.sub.isLink(v)}`, - ].join('\n'), - ) - }) - } - - if (!rootComments.length && !subComments.length) { - return - } - if (isRootWhite || revertAll) { - rootComments.forEach((el) => showEle(el)) - } - if (isSubWhite || revertAll) { - subComments.forEach((el) => showEle(el)) - } - if (revertAll) { - return - } - - // 构建黑白检测任务 - let rootBlackCnt = 0 - let subBlackCnt = 0 - if (!isRootWhite && rootComments.length) { - const blackPairs: SubFilterPair[] = [] - this.commentUsernameFilter.isEnable && - blackPairs.push([this.commentUsernameFilter, selectorFns.root.username]) - this.commentContentFilter.isEnable && blackPairs.push([this.commentContentFilter, selectorFns.root.content]) - this.commentLevelFilter.isEnable && blackPairs.push([this.commentLevelFilter, selectorFns.root.level]) - this.commentBotFilter.isEnable && blackPairs.push([this.commentBotFilter, selectorFns.root.username]) - this.commentCallBotFilter.isEnable && blackPairs.push([this.commentCallBotFilter, selectorFns.root.callBot]) - this.commentCallUserFilter.isEnable && - blackPairs.push([this.commentCallUserFilter, selectorFns.root.callUser]) - this.commentCallUserOnlyFilter.isEnable && - blackPairs.push([this.commentCallUserOnlyFilter, selectorFns.root.callUserOnly]) - - const whitePairs: SubFilterPair[] = [] - this.commentIsUpFilter.isEnable && whitePairs.push([this.commentIsUpFilter, selectorFns.root.isUp]) - this.commentIsPinFilter.isEnable && whitePairs.push([this.commentIsPinFilter, selectorFns.root.isPin]) - this.commentIsNoteFilter.isEnable && whitePairs.push([this.commentIsNoteFilter, selectorFns.root.isNote]) - this.commentIsLinkFilter.isEnable && whitePairs.push([this.commentIsLinkFilter, selectorFns.root.isLink]) - - rootBlackCnt = await coreCheck(rootComments, true, blackPairs, whitePairs) - } - if (!isSubWhite && subComments.length) { - const blackPairs: SubFilterPair[] = [] - this.commentUsernameFilter.isEnable && - blackPairs.push([this.commentUsernameFilter, selectorFns.sub.username]) - this.commentContentFilter.isEnable && blackPairs.push([this.commentContentFilter, selectorFns.sub.content]) - this.commentLevelFilter.isEnable && blackPairs.push([this.commentLevelFilter, selectorFns.sub.level]) - this.commentBotFilter.isEnable && blackPairs.push([this.commentBotFilter, selectorFns.sub.username]) - this.commentCallBotFilter.isEnable && blackPairs.push([this.commentCallBotFilter, selectorFns.sub.callBot]) - this.commentCallUserFilter.isEnable && - blackPairs.push([this.commentCallUserFilter, selectorFns.sub.callUser]) - this.commentCallUserOnlyFilter.isEnable && - blackPairs.push([this.commentCallUserOnlyFilter, selectorFns.sub.callUserOnly]) - - const whitePairs: SubFilterPair[] = [] - this.commentIsUpFilter.isEnable && whitePairs.push([this.commentIsUpFilter, selectorFns.sub.isUp]) - this.commentIsLinkFilter.isEnable && whitePairs.push([this.commentIsLinkFilter, selectorFns.sub.isLink]) - - subBlackCnt = await coreCheck(subComments, true, blackPairs, whitePairs) - } - - const time = (performance.now() - timer).toFixed(1) - debug( - `CommentFilterLegacy hide ${rootBlackCnt} in ${rootComments.length} root, ${subBlackCnt} in ${subComments.length} sub, mode=${mode}, time=${time}`, - ) - } - - checkFull() { - this.check('full') - .then() - .catch((err) => { - error('CommentFilterLegacy check full error', err) - }) - } - - checkIncr() { - this.check('incr') - .then() - .catch((err) => { - error('CommentFilterLegacy check incr error', err) - }) - } - - observe() { - waitForEle(document, '#app', (node: HTMLElement): boolean => { - return node.id === 'app' - }).then((ele) => { - if (ele) { - debug('CommentFilterLegacy target appear') - this.target = ele - this.checkFull() - const commentObserver = new MutationObserver(() => { - this.checkIncr() - }) - commentObserver.observe(this.target, { childList: true, subtree: true }) - } - }) - } -} -//================================================================================================== - -const mainFilter = new CommentFilterLegacy() - -export const commentFilterLegacyEntry = async () => { - mainFilter.init() - mainFilter.observe() -} - -export const commentFilterLegacyGroups: Group[] = [ - { - name: '评论用户过滤', - items: [ - { - type: 'switch', - id: GM_KEYS.black.username.statusKey, - name: '启用 评论用户过滤 (右键单击用户名)', - noStyle: true, - enableFn: () => { - mainFilter.commentUsernameFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentUsernameFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'editor', - id: GM_KEYS.black.username.valueKey, - name: '编辑 评论用户黑名单', - description: ['本黑名单与UP主黑名单互不影响', '右键屏蔽的用户会出现在首行'], - editorTitle: '评论区 用户黑名单', - editorDescription: ['每行一个用户名,保存时自动去重'], - saveFn: async () => { - mainFilter.commentUsernameFilter.setParam( - BiliCleanerStorage.get(GM_KEYS.black.username.valueKey, []), - ) - mainFilter.checkFull() - }, - }, - ], - }, - { - name: '评论内容过滤', - items: [ - { - type: 'switch', - id: GM_KEYS.black.content.statusKey, - name: '启用 评论关键词过滤', - noStyle: true, - enableFn: () => { - mainFilter.commentContentFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentContentFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'editor', - id: GM_KEYS.black.content.valueKey, - name: '编辑 评论关键词黑名单', - editorTitle: '评论关键词 黑名单', - editorDescription: [ - '每行一个关键词或正则,不区分大小写', - '请勿使用过于激进的关键词或正则', - '正则默认 ius 模式,无需 flag,语法:/abc|\\d+/', - ], - saveFn: async () => { - mainFilter.commentContentFilter.setParam(BiliCleanerStorage.get(GM_KEYS.black.content.valueKey, [])) - mainFilter.checkFull() - }, - }, - ], - }, - { - name: '按类型过滤', - items: [ - { - type: 'switch', - id: GM_KEYS.black.callBot.statusKey, - name: '过滤 召唤AI的评论', - noStyle: true, - enableFn: () => { - mainFilter.commentCallBotFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentCallBotFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.black.bot.statusKey, - name: '过滤 AI发布的评论', - noStyle: true, - enableFn: () => { - mainFilter.commentBotFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentBotFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.black.isAD.statusKey, - name: '过滤 带货评论 (实验功能)', - noStyle: true, - enableFn: () => { - fetchHook.addPostFn( - async ( - input: RequestInfo | URL, - init: RequestInit | undefined, - resp?: Response, - ): Promise => { - if (!resp) { - return - } - if ( - typeof input === 'string' && - init?.method?.toUpperCase() === 'GET' && - input.includes('api.bilibili.com/x/v2/reply/wbi/main') - ) { - try { - const respData = await resp.clone().json() - const msg = respData?.data?.top?.upper?.content?.message - if (msg && /b23\.tv\/mall-|领券|gaoneng\.bilibili\.com/.test(msg)) { - respData.data.top = null - respData.data.top_replies = null - return new Response(JSON.stringify(respData), { - status: resp.status, - statusText: resp.statusText, - headers: resp.headers, - }) - } - } catch { - return resp - } - return resp - } - }, - ) - }, - }, - { - type: 'switch', - id: GM_KEYS.black.callUserOnly.statusKey, - name: '过滤 只含 @其他用户 的评论', - noStyle: true, - enableFn: () => { - mainFilter.commentCallUserOnlyFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentCallUserOnlyFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.black.callUser.statusKey, - name: '过滤 包含 @其他用户 的评论', - noStyle: true, - enableFn: () => { - mainFilter.commentCallUserFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentCallUserFilter.disable() - mainFilter.checkFull() - }, - }, - ], - }, - { - name: '等级过滤', - items: [ - { - type: 'switch', - id: GM_KEYS.black.level.statusKey, - name: '启用 用户等级过滤', - noStyle: true, - enableFn: () => { - mainFilter.commentLevelFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentLevelFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'number', - id: GM_KEYS.black.level.valueKey, - name: '设定最低等级 (0~6)', - minValue: 0, - maxValue: 6, - step: 1, - defaultValue: 0, - disableValue: 0, - fn: (value: number) => { - mainFilter.commentLevelFilter.setParam(value) - mainFilter.checkFull() - }, - }, - ], - }, - { - name: '白名单 免过滤', - items: [ - { - type: 'switch', - id: GM_KEYS.white.root.statusKey, - name: '一级评论(主评论) 免过滤', - noStyle: true, - enableFn: () => { - isRootWhite = true - mainFilter.checkFull() - }, - disableFn: () => { - isRootWhite = false - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.white.sub.statusKey, - name: '二级评论(回复) 免过滤', - noStyle: true, - enableFn: () => { - isSubWhite = true - mainFilter.checkFull() - }, - disableFn: () => { - isSubWhite = false - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.white.isUp.statusKey, - name: 'UP主的评论 免过滤', - noStyle: true, - enableFn: () => { - mainFilter.commentIsUpFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentIsUpFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.white.isPin.statusKey, - name: '置顶评论 免过滤', - noStyle: true, - enableFn: () => { - mainFilter.commentIsPinFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentIsPinFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.white.isNote.statusKey, - name: '笔记/图片评论 免过滤', - noStyle: true, - enableFn: () => { - mainFilter.commentIsNoteFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentIsNoteFilter.disable() - mainFilter.checkFull() - }, - }, - { - type: 'switch', - id: GM_KEYS.white.isLink.statusKey, - name: '含超链接的评论 免过滤', - noStyle: true, - enableFn: () => { - mainFilter.commentIsLinkFilter.enable() - mainFilter.checkFull() - }, - disableFn: () => { - mainFilter.commentIsLinkFilter.disable() - mainFilter.checkFull() - }, - }, - ], - }, -] - -// 右键菜单handler -export const commentFilterLegacyHandler: ContextMenuTargetHandler = (target: HTMLElement): FilterContextMenu[] => { - if (!isPageSpace()) { - return [] - } - - const menus: FilterContextMenu[] = [] - if ( - target.parentElement?.id === 'user-name' || - target.classList.contains('user-name') || - target.classList.contains('sub-user-name') - ) { - const username = target.textContent?.trim() - if (username && mainFilter.commentUsernameFilter.isEnable) { - menus.push({ - name: `屏蔽用户:${username}`, - fn: async () => { - try { - mainFilter.commentUsernameFilter.addParam(username) - mainFilter.checkFull() - const arr: string[] = BiliCleanerStorage.get(GM_KEYS.black.username.valueKey, []) - arr.unshift(username) - BiliCleanerStorage.set(GM_KEYS.black.username.valueKey, orderedUniq(arr)) - } catch (err) { - error(`commentFilterLegacyHandler add username ${username} failed`, err) - } - }, - }) - } - } - return menus -} diff --git a/vite.config.ts b/vite.config.ts index ecfb9fd..d3b618e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ userscript: { name: 'bilibili 页面净化大师', namespace: 'http://tampermonkey.net/', - version: '4.1.1', + version: '4.1.2', description: '净化 B站/哔哩哔哩 页面,支持「精简功能、播放器净化、过滤视频、过滤评论、全站黑白名单」,提供 300+ 功能,定制自己的 B 站', author: 'festoney8', From 867a5383964a769c8811893541739455111ed789 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Fri, 10 Jan 2025 10:06:53 +0800 Subject: [PATCH 02/17] feat: share domain --- CHANGELOG.md | 1 + src/components/items/ListComp.vue | 2 +- src/modules/rules/video/groups/basic.ts | 46 +++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69a17b7..c3c0e21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 4.1.2 +- 新增:播放页 使用短域名分享 - 更新:评论过滤 适配新版空间页,移除旧版适配 ## 4.1.1 diff --git a/src/components/items/ListComp.vue b/src/components/items/ListComp.vue index 31615d8..d91db55 100644 --- a/src/components/items/ListComp.vue +++ b/src/components/items/ListComp.vue @@ -18,7 +18,7 @@ leave-to-class="opacity-0" > Date: Sat, 11 Jan 2025 14:02:50 +0800 Subject: [PATCH 03/17] feat: festival video page items --- CHANGELOG.md | 1 + .../rules/festival/groups/danmaku.scss | 15 ++ src/modules/rules/festival/groups/danmaku.ts | 32 +++ .../rules/festival/groups/danmakuControl.scss | 117 +++++++++++ .../rules/festival/groups/danmakuControl.ts | 62 ++++++ src/modules/rules/festival/groups/player.scss | 188 ++++++++++++++++++ src/modules/rules/festival/groups/player.ts | 108 ++++++++++ .../rules/festival/groups/playerControl.scss | 128 ++++++++++++ .../rules/festival/groups/playerControl.ts | 96 +++++++++ .../rules/festival/groups/subtitle.scss | 43 ++++ src/modules/rules/festival/groups/subtitle.ts | 74 +++++++ src/modules/rules/festival/index.scss | 5 + src/modules/rules/festival/index.ts | 34 ++++ src/modules/rules/index.ts | 18 ++ src/utils/pageType.ts | 4 +- 15 files changed, 923 insertions(+), 2 deletions(-) create mode 100644 src/modules/rules/festival/groups/danmaku.scss create mode 100644 src/modules/rules/festival/groups/danmaku.ts create mode 100644 src/modules/rules/festival/groups/danmakuControl.scss create mode 100644 src/modules/rules/festival/groups/danmakuControl.ts create mode 100644 src/modules/rules/festival/groups/player.scss create mode 100644 src/modules/rules/festival/groups/player.ts create mode 100644 src/modules/rules/festival/groups/playerControl.scss create mode 100644 src/modules/rules/festival/groups/playerControl.ts create mode 100644 src/modules/rules/festival/groups/subtitle.scss create mode 100644 src/modules/rules/festival/groups/subtitle.ts create mode 100644 src/modules/rules/festival/index.scss create mode 100644 src/modules/rules/festival/index.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c3c0e21..ae24403 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 4.1.2 - 新增:播放页 使用短域名分享 +- 新增:活动播放页 播放器相关净化功能与播放页同步 - 更新:评论过滤 适配新版空间页,移除旧版适配 ## 4.1.1 diff --git a/src/modules/rules/festival/groups/danmaku.scss b/src/modules/rules/festival/groups/danmaku.scss new file mode 100644 index 0000000..9ba77e7 --- /dev/null +++ b/src/modules/rules/festival/groups/danmaku.scss @@ -0,0 +1,15 @@ +/* 测试视频 https://www.bilibili.com/video/av487000361/ */ + +// 弹幕字体 +html[video-page-danmaku-font-family] { + .bili-danmaku-x-dm { + --fontFamily: var(--video-page-danmaku-font-family) !important; + } +} + +// 弹幕字重 +html[video-page-danmaku-font-weight] { + .bili-danmaku-x-dm { + --fontWeight: var(--video-page-danmaku-font-weight) !important; + } +} diff --git a/src/modules/rules/festival/groups/danmaku.ts b/src/modules/rules/festival/groups/danmaku.ts new file mode 100644 index 0000000..9726a8d --- /dev/null +++ b/src/modules/rules/festival/groups/danmaku.ts @@ -0,0 +1,32 @@ +import { Item } from '@/types/item' + +export const festivalDanmakuItems: Item[] = [ + { + type: 'string', + id: 'video-page-danmaku-font-family', + name: '弹幕字体', + description: ['遵循 CSS font-family 语法,留空为禁用', '确保本地已安装该字体,检查家族名是否正确'], + defaultValue: 'PingFang SC,HarmonyOS_Regular,Helvetica Neue,Microsoft YaHei,sans-serif', + disableValue: '', + fn: (value: string) => { + document.documentElement.style.setProperty( + '--video-page-danmaku-font-family', + value.trim().replace(/;$/, ''), + ) + }, + }, + { + type: 'string', + id: 'video-page-danmaku-font-weight', + name: '弹幕字重', + description: ['遵循 CSS font-weight 语法,留空为禁用', '确保本地字体支持该字重'], + defaultValue: '', + disableValue: '', + fn: (value: string) => { + document.documentElement.style.setProperty( + '--video-page-danmaku-font-weight', + value.trim().replace(/;$/, ''), + ) + }, + }, +] diff --git a/src/modules/rules/festival/groups/danmakuControl.scss b/src/modules/rules/festival/groups/danmakuControl.scss new file mode 100644 index 0000000..ddb88cd --- /dev/null +++ b/src/modules/rules/festival/groups/danmakuControl.scss @@ -0,0 +1,117 @@ +// 隐藏 同时在看人数 +html[video-page-hide-bpx-player-video-info-online] { + .bpx-player-video-info-online, + .bpx-player-video-info-divide { + display: none !important; + } +} + +// 隐藏 装填弹幕数量 +html[video-page-hide-bpx-player-video-info-dm] { + .bpx-player-video-info-dm, + .bpx-player-video-info-divide { + display: none !important; + } +} + +// 隐藏 弹幕开关 +html[video-page-hide-bpx-player-dm-switch] { + .bpx-player-dm-switch { + display: none !important; + } +} + +// 隐藏 弹幕显示设置 +html[video-page-hide-bpx-player-dm-setting] { + .bpx-player-dm-setting { + display: none !important; + } +} + +// 隐藏 弹幕样式 +html[video-page-hide-bpx-player-video-btn-dm] { + .bpx-player-video-btn-dm { + display: none !important; + } +} + +// 隐藏 占位文字 +html[video-page-hide-bpx-player-dm-input] { + .bpx-player-dm-input::placeholder { + color: transparent !important; + } +} + +// 隐藏 弹幕礼仪 +html[video-page-hide-bpx-player-dm-hint] { + .bpx-player-dm-hint { + display: none !important; + } +} + +// 隐藏 发送按钮 +html[video-page-hide-bpx-player-dm-btn-send] { + .bpx-player-dm-btn-send { + display: none !important; + } +} + +// 隐藏 智能弹幕/广告弹幕 +html[video-page-hide-bpx-player-postpanel] { + .bpx-player-postpanel-sug, + .bpx-player-postpanel-carousel, + .bpx-player-postpanel-popup { + display: none !important; + } +} + +// 非全屏下 关闭弹幕栏 +html[video-page-hide-bpx-player-sending-area] { + .bpx-player-sending-area { + display: none !important; + } + #bilibili-player-placeholder-bottom { + display: none !important; + } + #playerWrap:has(.bpx-player-container:not([data-screen='web'], [data-screen='full'])) { + height: unset !important; + aspect-ratio: 16 / 9; + } + #playerWrap:has(.bpx-player-container:not([data-screen='web'], [data-screen='full'])) #bilibili-player { + height: unset !important; + aspect-ratio: 16 / 9; + } + + // 活动播放器直接去黑边 + .page-main-content:has(.festival-video-player) .video-player-box { + height: fit-content !important; + } + .festival-video-player { + height: fit-content !important; + } + .festival-video-player #bilibili-player:not(.mode-webscreen) { + height: calc(100% - 46px) !important; + } +} + +// 全屏下 关闭弹幕输入框 +html[video-page-hide-bpx-player-video-inputbar] { + .bpx-player-container[data-screen='full'] .bpx-player-control-bottom-center .bpx-player-video-inputbar, + .bpx-player-container[data-screen='web'] .bpx-player-control-bottom-center .bpx-player-video-inputbar { + display: none !important; + } + .bpx-player-container[data-screen='full'] .bpx-player-control-bottom-center, + .bpx-player-container[data-screen='web'] .bpx-player-control-bottom-center { + padding: 0 15px !important; + } + + // 弹幕开关按钮贴紧左侧, 有章节列表时增大列表宽度 + .bpx-player-container[data-screen='full'] .bpx-player-control-bottom-left, + .bpx-player-container[data-screen='web'] .bpx-player-control-bottom-left { + min-width: unset !important; + } + .bpx-player-container[data-screen='full'] .bpx-player-ctrl-viewpoint, + .bpx-player-container[data-screen='web'] .bpx-player-ctrl-viewpoint { + width: fit-content !important; + } +} diff --git a/src/modules/rules/festival/groups/danmakuControl.ts b/src/modules/rules/festival/groups/danmakuControl.ts new file mode 100644 index 0000000..8c0457d --- /dev/null +++ b/src/modules/rules/festival/groups/danmakuControl.ts @@ -0,0 +1,62 @@ +import { Item } from '@/types/item' + +export const festivalDanmakuControlItems: Item[] = [ + { + type: 'switch', + id: 'video-page-hide-bpx-player-video-info-online', + name: '隐藏 同时在看人数', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-video-info-dm', + name: '隐藏 装填弹幕数量', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-dm-switch', + name: '隐藏 弹幕开关', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-dm-setting', + name: '隐藏 弹幕显示设置', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-video-btn-dm', + name: '隐藏 弹幕样式', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-dm-input', + name: '隐藏 占位文字', + defaultEnable: true, + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-dm-hint', + name: '隐藏 弹幕礼仪', + defaultEnable: true, + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-dm-btn-send', + name: '隐藏 发送按钮', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-postpanel', + name: '隐藏 智能弹幕/广告弹幕', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-sending-area', + name: '非全屏下 关闭弹幕栏', + description: ['字母 D 是弹幕开关快捷键'], + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-video-inputbar', + name: '全屏下 关闭弹幕输入框', + }, +] diff --git a/src/modules/rules/festival/groups/player.scss b/src/modules/rules/festival/groups/player.scss new file mode 100644 index 0000000..fd697eb --- /dev/null +++ b/src/modules/rules/festival/groups/player.scss @@ -0,0 +1,188 @@ +// 隐藏 一键三连 +html[video-page-hide-bpx-player-bili-guide-all] { + .bili-follow-to-electric, + .bili-guide, + .bili-guide-all, + .bili-guide-animate, + .bili-guide-cyc, + .bili-guide-electric, + .bili-guide-follow, + .bili-guide-followed, + .bili-danmaku-x-guide, + .bili-danmaku-x-guide-all, + .bili-danmaku-x-guide-follow, + .bili-danmaku-x-guide-gray { + display: none !important; + } +} + +// 隐藏 投票 +html[video-page-hide-bpx-player-bili-vote] { + .bili-vote, + .bili-danmaku-x-vote { + display: none !important; + } +} + +// 隐藏 播放效果调查 +html[video-page-hide-bpx-player-bili-qoe-feedback] { + .bpx-player-qoeFeedback, + .bili-qoeFeedback, + .bili-qoeFeedback-score, + .bili-qoeFeedback-vote { + display: none !important; + } +} + +// 隐藏 评分 +html[video-page-hide-bpx-player-bili-score] { + .bili-score, + .bili-danmaku-x-score, + .bili-danmaku-x-superRating { + display: none !important; + } +} + +// 隐藏 评分总结 +html[video-page-hide-bpx-player-bili-score-sum] { + .bili-scoreSum, + .bili-danmaku-x-scoreSum { + display: none !important; + } +} + +// 隐藏 打卡 +html[video-page-hide-bpx-player-bili-clock] { + .bili-clock, + .bili-danmaku-x-clock { + display: none !important; + } +} + +// 隐藏 心动 +html[video-page-hide-bpx-player-bili-cmtime] { + .bili-cmtime, + .bili-danmaku-x-cmtime { + display: none !important; + } +} + +// 隐藏 迷你弹窗 +html[video-page-hide-bpx-player-bili-cmd-shrink] { + .bili-cmd-shrink, + .bili-danmaku-x-cmd-shrink { + display: none !important; + } +} + +// 隐藏 视频预告 +html[video-page-hide-bpx-player-bili-reserve] { + .bili-reserve, + .bili-danmaku-x-reserve { + display: none !important; + } +} + +// 隐藏 视频链接 (稍后再看) +html[video-page-hide-bpx-player-bili-link] { + .bili-link, + .bili-danmaku-x-link { + display: none !important; + } +} + +// 隐藏 播放器内所有弹窗 (强制) +html[video-page-hide-bpx-player-cmd-dm-wrap] { + .bpx-player-cmd-dm-wrap { + display: none !important; + } +} + +// 隐藏 全屏下 播放器内标题 +html[video-page-hide-bpx-player-top-left-title] { + .bpx-player-top-title { + display: none !important; + } + .bpx-player-top-left-title { + display: none !important; + } + + // 播放器上方阴影渐变 + .bpx-player-top-mask { + display: none !important; + } +} + +// 隐藏 视频音乐链接 +html[video-page-hide-bpx-player-top-left-music] { + .bpx-player-top-left-music { + display: none !important; + } +} + +// 隐藏 左上角 关注UP主 +html[video-page-hide-bpx-player-top-left-follow] { + .bpx-player-top-left-follow { + display: none !important; + } +} + +// 隐藏 右上角 反馈按钮 +html[video-page-hide-bpx-player-top-issue] { + .bpx-player-top-issue { + display: none !important; + } +} + +// 隐藏 视频暂停时大Logo +html[video-page-hide-bpx-player-state-wrap] { + .bpx-player-state-wrap { + display: none !important; + } +} + +// 隐藏 播放结束后视频推荐 +html[video-page-hide-bpx-player-ending-related] { + .bpx-player-ending-related { + display: none !important; + } + .bpx-player-ending-content { + display: flex !important; + align-items: center !important; + } +} + +// 隐藏 弹幕悬停点赞/复制/举报 +html[video-page-hide-bpx-player-dialog-wrap] { + .bpx-player-dialog-wrap { + display: none !important; + } +} + +// 隐藏 高赞弹幕前点赞按钮 +html[video-page-bpx-player-bili-high-icon] { + .bili-dm .bili-high-icon, + .bili-danmaku-x-high-icon { + display: none !important; + } +} + +// 彩色渐变弹幕 变成白色 +html[video-page-bpx-player-bili-dm-vip-white] { + .bili-dm > .bili-dm-vip, + .bili-danmaku-x-dm-vip { + background: unset !important; + background-image: unset !important; + background-size: unset !important; + + // 父元素未指定 var(--textShadow), 默认重墨描边凑合用 + text-shadow: + 1px 0 1px #000, + 0 1px 1px #000, + 0 -1px 1px #000, + -1px 0 1px #000 !important; + -webkit-text-stroke: none !important; + -moz-text-stroke: none !important; + -ms-text-stroke: none !important; + } +} diff --git a/src/modules/rules/festival/groups/player.ts b/src/modules/rules/festival/groups/player.ts new file mode 100644 index 0000000..86038da --- /dev/null +++ b/src/modules/rules/festival/groups/player.ts @@ -0,0 +1,108 @@ +import { Item } from '@/types/item' + +export const festivalPlayerItems: Item[] = [ + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-guide-all', + name: '隐藏 一键三连', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-vote', + name: '隐藏 投票', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-qoe-feedback', + name: '隐藏 播放效果调查', + defaultEnable: true, + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-score', + name: '隐藏 评分', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-score-sum', + name: '隐藏 评分总结', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-clock', + name: '隐藏 打卡', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-cmtime', + name: '隐藏 心动', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-cmd-shrink', + name: '隐藏 迷你弹窗', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-reserve', + name: '隐藏 视频预告', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-bili-link', + name: '隐藏 视频链接 (稍后再看)', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-cmd-dm-wrap', + name: '隐藏 播放器内所有弹窗 (强制)', + description: ['启用本项时 无需开启上述功能'], + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-top-left-title', + name: '隐藏 全屏下 播放器内标题', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-top-left-music', + name: '隐藏 视频音乐链接', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-top-left-follow', + name: '隐藏 左上角 关注UP主', + defaultEnable: true, + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-top-issue', + name: '隐藏 右上角 反馈按钮', + defaultEnable: true, + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-state-wrap', + name: '隐藏 视频暂停时大Logo', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ending-related', + name: '隐藏 播放结束后视频推荐', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-dialog-wrap', + name: '隐藏 弹幕悬停点赞/复制/举报', + }, + { + type: 'switch', + id: 'video-page-bpx-player-bili-high-icon', + name: '隐藏 高赞弹幕前点赞按钮', + }, + { + type: 'switch', + id: 'video-page-bpx-player-bili-dm-vip-white', + name: '彩色渐变弹幕 变成白色', + }, +] diff --git a/src/modules/rules/festival/groups/playerControl.scss b/src/modules/rules/festival/groups/playerControl.scss new file mode 100644 index 0000000..796ef2a --- /dev/null +++ b/src/modules/rules/festival/groups/playerControl.scss @@ -0,0 +1,128 @@ +// 隐藏 上一个视频 +html[video-page-hide-bpx-player-ctrl-prev] { + .bpx-player-ctrl-prev { + display: none !important; + } +} + +// 隐藏 播放/暂停 +html[video-page-hide-bpx-player-ctrl-play] { + .bpx-player-ctrl-play { + display: none !important; + } +} + +// 隐藏 下一个视频 +html[video-page-hide-bpx-player-ctrl-next] { + .bpx-player-ctrl-next { + display: none !important; + } +} + +// 隐藏 章节列表 +html[video-page-hide-bpx-player-ctrl-viewpoint] { + .bpx-player-ctrl-viewpoint { + display: none !important; + } +} + +// 隐藏 Hi-Res无损 +html[video-page-hide-bpx-player-ctrl-flac] { + .bpx-player-ctrl-flac { + display: none !important; + } +} + +// 隐藏 清晰度 +html[video-page-hide-bpx-player-ctrl-quality] { + .bpx-player-ctrl-quality { + display: none !important; + } +} + +// 隐藏 选集 +html[video-page-hide-bpx-player-ctrl-eplist] { + .bpx-player-ctrl-eplist { + display: none !important; + } +} + +// 隐藏 倍速 +html[video-page-hide-bpx-player-ctrl-playbackrate] { + .bpx-player-ctrl-playbackrate { + display: none !important; + } +} + +// 隐藏 字幕 +html[video-page-hide-bpx-player-ctrl-subtitle] { + .bpx-player-ctrl-subtitle { + display: none !important; + } +} + +// 隐藏 音量 +html[video-page-hide-bpx-player-ctrl-volume] { + .bpx-player-ctrl-volume { + display: none !important; + } +} + +// 隐藏 视频设置 +html[video-page-hide-bpx-player-ctrl-setting] { + .bpx-player-ctrl-setting { + display: none !important; + } +} + +// 隐藏 画中画 +html[video-page-hide-bpx-player-ctrl-pip] { + .bpx-player-ctrl-pip { + display: none !important; + } +} + +// 隐藏 宽屏 +html[video-page-hide-bpx-player-ctrl-wide] { + .bpx-player-ctrl-wide { + display: none !important; + } +} + +// 隐藏 网页全屏 +html[video-page-hide-bpx-player-ctrl-web] { + .bpx-player-ctrl-web { + display: none !important; + } +} + +// 隐藏 全屏 +html[video-page-hide-bpx-player-ctrl-full] { + .bpx-player-ctrl-full { + display: none !important; + } +} + +// 隐藏 高能进度条 图钉按钮 +html[video-page-hide-bpx-player-pbp-pin] { + .bpx-player-pbp-pin { + display: none !important; + } +} + +// 隐藏 底边mini视频进度 +html[video-page-hide-bpx-player-shadow-progress-area] { + .bpx-player-shadow-progress-area { + display: none !important; + } + .bpx-player-pbp:not(.show) { + bottom: 0 !important; + } +} + +// 控制栏收起时 显示高能进度条 +html[video-page-show-bpx-player-pbp] { + .bpx-player-pbp:not(.show) { + opacity: 1 !important; + } +} diff --git a/src/modules/rules/festival/groups/playerControl.ts b/src/modules/rules/festival/groups/playerControl.ts new file mode 100644 index 0000000..aa8da13 --- /dev/null +++ b/src/modules/rules/festival/groups/playerControl.ts @@ -0,0 +1,96 @@ +import { Item } from '@/types/item' + +export const festivalPlayerControlItems: Item[] = [ + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-prev', + name: '隐藏 上一个视频', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-play', + name: '隐藏 播放/暂停', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-next', + name: '隐藏 下一个视频', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-viewpoint', + name: '隐藏 章节列表', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-flac', + name: '隐藏 Hi-Res无损', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-quality', + name: '隐藏 清晰度', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-eplist', + name: '隐藏 选集', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-playbackrate', + name: '隐藏 倍速', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-subtitle', + name: '隐藏 字幕', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-volume', + name: '隐藏 音量', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-setting', + name: '隐藏 视频设置', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-pip', + name: '隐藏 画中画', + description: ['Chrome / Edge 浏览器可用', 'Firefox 可在浏览器设置中关闭'], + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-wide', + name: '隐藏 宽屏', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-web', + name: '隐藏 网页全屏', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-ctrl-full', + name: '隐藏 全屏', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-pbp-pin', + name: '隐藏 高能进度条 图钉按钮', + }, + { + type: 'switch', + id: 'video-page-hide-bpx-player-shadow-progress-area', + name: '隐藏 底边mini视频进度', + defaultEnable: true, + }, + { + type: 'switch', + id: 'video-page-show-bpx-player-pbp', + name: '控制栏收起时 显示高能进度条', + }, +] diff --git a/src/modules/rules/festival/groups/subtitle.scss b/src/modules/rules/festival/groups/subtitle.scss new file mode 100644 index 0000000..62cea39 --- /dev/null +++ b/src/modules/rules/festival/groups/subtitle.scss @@ -0,0 +1,43 @@ +// 字幕颜色 +html[video-page-subtitle-font-color] { + .bpx-player-subtitle-panel-text { + color: var(--video-page-subtitle-font-color) !important; + } +} + +// 字体设定 +html[video-page-subtitle-font-family] { + .bpx-player-subtitle-panel-text { + font-family: var(--video-page-subtitle-font-family) !important; + } +} + +// 字重设定 +html[video-page-subtitle-font-weight] { + .bpx-player-subtitle-panel-text { + font-weight: var(--video-page-subtitle-font-weight) !important; + } +} + +// 描边颜色 +html[video-page-subtitle-text-stroke-color] { + .bpx-player-subtitle-panel-text { + background: unset !important; + background-color: var(--video-page-subtitle-text-stroke-color) !important; + background-clip: text !important; + } +} + +// 描边宽度 +html[video-page-subtitle-text-stroke-width] { + .bpx-player-container:where([data-screen='normal'], [data-screen='wide']) .bpx-player-subtitle-panel-text { + -webkit-text-stroke: calc(0.6 * var(--video-page-subtitle-text-stroke-width)) transparent !important; + -moz-text-stroke: calc(0.6 * var(--video-page-subtitle-text-stroke-width)) transparent !important; + -ms-text-stroke: calc(0.6 * var(--video-page-subtitle-text-stroke-width)) transparent !important; + } + .bpx-player-container:where([data-screen='web'], [data-screen='full']) .bpx-player-subtitle-panel-text { + -webkit-text-stroke: var(--video-page-subtitle-text-stroke-width) transparent !important; + -moz-text-stroke: var(--video-page-subtitle-text-stroke-width) transparent !important; + -ms-text-stroke: var(--video-page-subtitle-text-stroke-width) transparent !important; + } +} diff --git a/src/modules/rules/festival/groups/subtitle.ts b/src/modules/rules/festival/groups/subtitle.ts new file mode 100644 index 0000000..91e8192 --- /dev/null +++ b/src/modules/rules/festival/groups/subtitle.ts @@ -0,0 +1,74 @@ +import { Item } from '@/types/item' + +export const festivalSubtitleItems: Item[] = [ + { + type: 'string', + id: 'video-page-subtitle-font-color', + name: '字幕颜色', + description: ['遵循 CSS color 语法,留空为禁用'], + defaultValue: '', + disableValue: '', + fn: (value: string) => { + document.documentElement.style.setProperty( + '--video-page-subtitle-font-color', + value.trim().replace(/;$/, ''), + ) + }, + }, + { + type: 'string', + id: 'video-page-subtitle-font-family', + name: '字幕字体', + description: ['遵循 CSS font-family 语法,留空为禁用', '确保本地已安装该字体,检查家族名是否正确'], + defaultValue: 'PingFang SC,HarmonyOS_Regular,Helvetica Neue,Microsoft YaHei,sans-serif', + disableValue: '', + fn: (value: string) => { + document.documentElement.style.setProperty( + '--video-page-subtitle-font-family', + value.trim().replace(/;$/, ''), + ) + }, + }, + { + type: 'string', + id: 'video-page-subtitle-font-weight', + name: '字幕字重', + description: ['遵循 CSS font-weight 语法,留空为禁用', '确保本地字体支持该字重'], + defaultValue: '', + disableValue: '', + fn: (value: string) => { + document.documentElement.style.setProperty( + '--video-page-subtitle-font-weight', + value.trim().replace(/;$/, ''), + ) + }, + }, + { + type: 'string', + id: 'video-page-subtitle-text-stroke-color', + name: '描边颜色', + description: ['遵循 CSS color 语法,留空为禁用', '官方字幕设定需选择 "无描边"'], + defaultValue: '', + disableValue: '', + fn: (value: string) => { + document.documentElement.style.setProperty( + '--video-page-subtitle-text-stroke-color', + value.trim().replace(/;$/, ''), + ) + }, + }, + { + type: 'number', + id: 'video-page-subtitle-text-stroke-width', + name: '描边宽度 (0为禁用)', + minValue: 0, + maxValue: 10, + step: 0.01, + defaultValue: 3.5, + disableValue: 0, + addonText: 'px', + fn: (value: number) => { + document.documentElement.style.setProperty('--video-page-subtitle-text-stroke-width', `${value}px`) + }, + }, +] diff --git a/src/modules/rules/festival/index.scss b/src/modules/rules/festival/index.scss new file mode 100644 index 0000000..a732dd6 --- /dev/null +++ b/src/modules/rules/festival/index.scss @@ -0,0 +1,5 @@ +@use './groups/danmaku'; +@use './groups/danmakuControl'; +@use './groups/player'; +@use './groups/subtitle'; +@use './groups/playerControl'; diff --git a/src/modules/rules/festival/index.ts b/src/modules/rules/festival/index.ts new file mode 100644 index 0000000..6289d72 --- /dev/null +++ b/src/modules/rules/festival/index.ts @@ -0,0 +1,34 @@ +import { Group } from '@/types/collection' +import { festivalDanmakuItems } from './groups/danmaku' +import { festivalDanmakuControlItems } from './groups/danmakuControl' +import { festivalPlayerItems } from './groups/player' +import { festivalPlayerControlItems } from './groups/playerControl' +import { festivalSubtitleItems } from './groups/subtitle' + +export const festivalGroups: Group[] = [ + { + name: '播放器', + fold: true, + items: festivalPlayerItems, + }, + { + name: '播放控制栏', + fold: true, + items: festivalPlayerControlItems, + }, + { + name: '弹幕控制栏', + fold: true, + items: festivalDanmakuControlItems, + }, + { + name: '弹幕样式', + fold: true, + items: festivalDanmakuItems, + }, + { + name: '字幕样式', + fold: true, + items: festivalSubtitleItems, + }, +] diff --git a/src/modules/rules/index.ts b/src/modules/rules/index.ts index afb8c3a..8a24e1e 100644 --- a/src/modules/rules/index.ts +++ b/src/modules/rules/index.ts @@ -3,6 +3,7 @@ import { isPageBangumi, isPageChannel, isPageDynamic, + isPageFestival, isPageHomepage, isPageLive, isPagePlaylist, @@ -23,6 +24,7 @@ import { commentGroups } from './comment' import { commonGroups } from './common' import { debugGroups } from './debug' import { dynamicGroups } from './dynamic' +import { festivalGroups } from './festival' import { homepageGroups } from './homepage' import { liveGroups } from './live' import { popularGroups } from './popular' @@ -37,6 +39,7 @@ import channelStyle from './channel/index.scss?inline' import commentStyle from './comment/index.scss?inline' import commonStyle from './common/index.scss?inline' import dynamicStyle from './dynamic/index.scss?inline' +import festivalStyle from './festival/index.scss?inline' import homepageStyle from './homepage/index.scss?inline' import liveStyle from './live/index.scss?inline' import popularStyle from './popular/index.scss?inline' @@ -59,6 +62,12 @@ export const rules: Rule[] = [ style: videoStyle, checkFn: () => isPageVideo() || isPagePlaylist(), }, + { + name: 'festival', + groups: festivalGroups, + style: festivalStyle, + checkFn: isPageFestival, + }, { name: 'bangumi', groups: bangumiGroups, @@ -180,6 +189,7 @@ export const loadStyles = () => { [ './homepage/index.scss?inline', './video/index.scss?inline', + './festival/index.scss?inline', './bangumi/index.scss?inline', './dynamic/index.scss?inline', './live/index.scss?inline', @@ -194,6 +204,7 @@ export const loadStyles = () => { ([ homepageModule, videoModule, + festivalModule, bangumiModule, dynamicModule, liveModule, @@ -219,6 +230,13 @@ export const loadStyles = () => { style.textContent = newCSS } } + if (festivalModule) { + const newCSS = festivalModule.default as string + const style = document.querySelector('style.bili-cleaner-css.festival') + if (style && newCSS) { + style.textContent = newCSS + } + } if (bangumiModule) { const newCSS = bangumiModule.default as string const style = document.querySelector('style.bili-cleaner-css.bangumi') diff --git a/src/utils/pageType.ts b/src/utils/pageType.ts index 1c67162..5ec3b64 100644 --- a/src/utils/pageType.ts +++ b/src/utils/pageType.ts @@ -41,8 +41,8 @@ const currPage = (): string => { if (!href.includes('bilibili.com/v/popular/') && href.includes('bilibili.com/v/')) { return 'channel' } - // 拜年祭等活动 - if (href.includes('www.bilibili.com/festival/')) { + // 拜年祭等活动播放页 + if (/www\.bilibili\.com\/festival\/.*bvid/.test(href)) { return 'festival' } if (href.includes('bilibili.com/watchlater')) { From 60683e99f96aa1d2fe0c803160a1e48e610e4fa8 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Sat, 11 Jan 2025 15:22:12 +0800 Subject: [PATCH 04/17] fix: festival video page danmaku style --- CHANGELOG.md | 2 +- src/modules/rules/festival/groups/danmaku.scss | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ae24403..61c0a84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## 4.1.2 - 新增:播放页 使用短域名分享 -- 新增:活动播放页 播放器相关净化功能与播放页同步 +- 新增:活动播放页 支持播放器相关净化功能 - 更新:评论过滤 适配新版空间页,移除旧版适配 ## 4.1.1 diff --git a/src/modules/rules/festival/groups/danmaku.scss b/src/modules/rules/festival/groups/danmaku.scss index 9ba77e7..82cee49 100644 --- a/src/modules/rules/festival/groups/danmaku.scss +++ b/src/modules/rules/festival/groups/danmaku.scss @@ -1,15 +1,19 @@ -/* 测试视频 https://www.bilibili.com/video/av487000361/ */ +/* 测试视频 https://www.bilibili.com/festival/bnj2024?bvid=BV1iU421d7aG/ */ // 弹幕字体 html[video-page-danmaku-font-family] { - .bili-danmaku-x-dm { - --fontFamily: var(--video-page-danmaku-font-family) !important; + .bili-danmaku-x-dm, + .bili-dm, + .bili-dm * { + font-family: var(--video-page-danmaku-font-family) !important; } } // 弹幕字重 html[video-page-danmaku-font-weight] { - .bili-danmaku-x-dm { - --fontWeight: var(--video-page-danmaku-font-weight) !important; + .bili-danmaku-x-dm, + .bili-dm, + .bili-dm * { + font-weight: var(--video-page-danmaku-font-weight) !important; } } From 7a8c9d71b2da1348ca30c903ff3423bd2d441ad3 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Mon, 20 Jan 2025 15:58:36 +0800 Subject: [PATCH 05/17] fix: live page default webscreen bug --- CHANGELOG.md | 1 + src/modules/rules/live/groups/basic.ts | 12 +++++++----- src/modules/rules/video/groups/basic.ts | 10 +++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c0a84..edc7032 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - 新增:播放页 使用短域名分享 - 新增:活动播放页 支持播放器相关净化功能 - 更新:评论过滤 适配新版空间页,移除旧版适配 +- 更新:部分功能细节 ## 4.1.1 diff --git a/src/modules/rules/live/groups/basic.ts b/src/modules/rules/live/groups/basic.ts index e108a70..7dcb994 100644 --- a/src/modules/rules/live/groups/basic.ts +++ b/src/modules/rules/live/groups/basic.ts @@ -46,6 +46,9 @@ export const liveBasicItems: Item[] = [ name: '默认网页全屏播放 (实验功能)', noStyle: true, enableFn: async () => { + if (!/\/\d+|\/blanc\/\d+/.test(location.pathname)) { + return + } if (window.self !== window.top) { return } @@ -64,11 +67,10 @@ export const liveBasicItems: Item[] = [ player.setFullscreenStatus(1) }) clearInterval(id) - } else { - cnt++ - if (cnt > 10) { - clearInterval(id) - } + } + cnt++ + if (cnt > 10) { + clearInterval(id) } }, 1000) }) diff --git a/src/modules/rules/video/groups/basic.ts b/src/modules/rules/video/groups/basic.ts index ec8cd07..96c294d 100644 --- a/src/modules/rules/video/groups/basic.ts +++ b/src/modules/rules/video/groups/basic.ts @@ -59,6 +59,11 @@ export const videoBasicItems: Item[] = [ URLCleanerInstance.clean() }, }, + { + type: 'switch', + id: 'video-page-hide-fixed-header', + name: '顶栏 滚动页面后 不再吸附顶部', + }, { type: 'switch', id: 'video-page-simple-share', @@ -140,9 +145,4 @@ export const videoBasicItems: Item[] = [ }, ], }, - { - type: 'switch', - id: 'video-page-hide-fixed-header', - name: '顶栏 滚动页面后 不再吸附顶部', - }, ] From 8c184f4ead54dc1625d64983dd23611972683f40 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Mon, 20 Jan 2025 17:44:39 +0800 Subject: [PATCH 06/17] feat: space page bvid filter --- CHANGELOG.md | 1 + src/modules/filters/index.ts | 4 +- .../filters/variety/video/pages/space.ts | 104 ++++++++++++------ 3 files changed, 74 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edc7032..d9afa7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - 新增:播放页 使用短域名分享 - 新增:活动播放页 支持播放器相关净化功能 +- 新增:视频过滤 BV号过滤适配新版空间页 - 更新:评论过滤 适配新版空间页,移除旧版适配 - 更新:部分功能细节 diff --git a/src/modules/filters/index.ts b/src/modules/filters/index.ts index 54afebd..a05db8d 100644 --- a/src/modules/filters/index.ts +++ b/src/modules/filters/index.ts @@ -39,12 +39,11 @@ import { videoFilterPopularHandler, } from './variety/video/pages/popular' import { videoFilterSearchEntry, videoFilterSearchGroups, videoFilterSearchHandler } from './variety/video/pages/search' -import { videoFilterSpaceEntry, videoFilterSpaceGroups } from './variety/video/pages/space' +import { videoFilterSpaceEntry, videoFilterSpaceGroups, videoFilterSpaceHandler } from './variety/video/pages/space' import { videoFilterVideoEntry, videoFilterVideoGroups, videoFilterVideoHandler } from './variety/video/pages/video' /** 视频过滤器 */ export const videoFilters: Filter[] = [ - // 视频过滤 { name: '首页 视频过滤', groups: videoFilterHomepageGroups, @@ -158,6 +157,7 @@ export const filterContextMenuHandlers = [ videoFilterChannelHandler, videoFilterPopularHandler, videoFilterHomepageHandler, + videoFilterSpaceHandler, dynamicFilterDynamicHandler, commentFilterCommonHandler, ] diff --git a/src/modules/filters/variety/video/pages/space.ts b/src/modules/filters/variety/video/pages/space.ts index 9b08aea..35590ac 100644 --- a/src/modules/filters/variety/video/pages/space.ts +++ b/src/modules/filters/variety/video/pages/space.ts @@ -1,10 +1,11 @@ import { coreCheck } from '@/modules/filters/core/core' import settings from '@/settings' import { Group } from '@/types/collection' -import { IMainFilter, SelectorResult, SubFilterPair } from '@/types/filter' +import { ContextMenuTargetHandler, FilterContextMenu, IMainFilter, SelectorResult, SubFilterPair } from '@/types/filter' import { debugFilter as debug, error } from '@/utils/logger' +import { isPageSpace } from '@/utils/pageType' import { BiliCleanerStorage } from '@/utils/storage' -import { convertTimeToSec, matchBvid, showEle, waitForEle } from '@/utils/tool' +import { convertTimeToSec, matchBvid, orderedUniq, showEle, waitForEle } from '@/utils/tool' import { VideoBvidFilter, VideoDurationFilter, VideoTitleFilter } from '../subFilters/black' import { VideoTitleWhiteFilter } from '../subFilters/white' @@ -255,37 +256,37 @@ export const videoFilterSpaceGroups: Group[] = [ }, ], }, - // { - // name: 'BV号过滤', - // items: [ - // { - // type: 'switch', - // id: GM_KEYS.black.bvid.statusKey, - // name: '启用 BV号过滤 (右键单击标题)', - // noStyle: true, - // enableFn: () => { - // mainFilter.videoBvidFilter.enable() - // mainFilter.checkFull() - // }, - // disableFn: () => { - // mainFilter.videoBvidFilter.disable() - // mainFilter.checkFull() - // }, - // }, - // { - // type: 'editor', - // id: GM_KEYS.black.bvid.valueKey, - // name: '编辑 BV号黑名单', - // description: ['右键屏蔽的BV号会出现在首行'], - // editorTitle: 'BV号 黑名单', - // editorDescription: ['每行一个BV号,保存时自动去重'], - // saveFn: async () => { - // mainFilter.videoBvidFilter.setParam(BiliCleanerStorage.get(GM_KEYS.black.bvid.valueKey, [])) - // mainFilter.checkFull() - // }, - // }, - // ], - // }, + { + name: 'BV号过滤', + items: [ + { + type: 'switch', + id: GM_KEYS.black.bvid.statusKey, + name: '启用 BV号过滤 (右键单击标题)', + noStyle: true, + enableFn: () => { + mainFilter.videoBvidFilter.enable() + mainFilter.checkFull() + }, + disableFn: () => { + mainFilter.videoBvidFilter.disable() + mainFilter.checkFull() + }, + }, + { + type: 'editor', + id: GM_KEYS.black.bvid.valueKey, + name: '编辑 BV号黑名单', + description: ['右键屏蔽的BV号会出现在首行'], + editorTitle: 'BV号 黑名单', + editorDescription: ['每行一个BV号,保存时自动去重'], + saveFn: async () => { + mainFilter.videoBvidFilter.setParam(BiliCleanerStorage.get(GM_KEYS.black.bvid.valueKey, [])) + mainFilter.checkFull() + }, + }, + ], + }, { name: '白名单 免过滤', items: [ @@ -321,3 +322,40 @@ export const videoFilterSpaceGroups: Group[] = [ ], }, ] + +// 右键菜单handler +export const videoFilterSpaceHandler: ContextMenuTargetHandler = (target: HTMLElement): FilterContextMenu[] => { + if (!isPageSpace()) { + return [] + } + + const menus: FilterContextMenu[] = [] + // BVID + if (target.closest('.bili-video-card__title')) { + const url = (target as HTMLAnchorElement).href + if (url && mainFilter.videoBvidFilter.isEnable) { + const bvid = matchBvid(url) + if (bvid) { + menus.push({ + name: `屏蔽视频 ${bvid}`, + fn: async () => { + try { + mainFilter.videoBvidFilter.addParam(bvid) + mainFilter.checkFull() + const arr: string[] = BiliCleanerStorage.get(GM_KEYS.black.bvid.valueKey, []) + arr.unshift(bvid) + BiliCleanerStorage.set(GM_KEYS.black.bvid.valueKey, orderedUniq(arr)) + } catch (err) { + error(`videoFilterSearchHandler add bvid ${bvid} failed`, err) + } + }, + }) + menus.push({ + name: '复制视频链接', + fn: () => navigator.clipboard.writeText(`https://www.bilibili.com/video/${bvid}`).then().catch(), + }) + } + } + } + return menus +} From 3098d112c778c608d7246676f5905097e93cb14d Mon Sep 17 00:00:00 2001 From: festoney8 Date: Tue, 21 Jan 2025 00:33:14 +0800 Subject: [PATCH 07/17] update: handle iframe --- CHANGELOG.md | 1 + src/main.ts | 4 ++++ src/modules/rules/live/groups/basic.ts | 15 ++++++++++----- src/types/global.d.ts | 2 ++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9afa7d..c721acb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - 新增:播放页 使用短域名分享 - 新增:活动播放页 支持播放器相关净化功能 - 新增:视频过滤 BV号过滤适配新版空间页 +- 优化:iframe页面适配 - 更新:评论过滤 适配新版空间页,移除旧版适配 - 更新:部分功能细节 diff --git a/src/main.ts b/src/main.ts index a6d61a4..331603b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -67,6 +67,10 @@ const main = () => { } const menu = () => { + // skip iframe + if (self !== top) { + return + } const ruleStore = useRulePanelStore() const videoStore = useVideoFilterPanelStore() const commentStore = useCommentFilterPanelStore() diff --git a/src/modules/rules/live/groups/basic.ts b/src/modules/rules/live/groups/basic.ts index 7dcb994..9720482 100644 --- a/src/modules/rules/live/groups/basic.ts +++ b/src/modules/rules/live/groups/basic.ts @@ -49,7 +49,7 @@ export const liveBasicItems: Item[] = [ if (!/\/\d+|\/blanc\/\d+/.test(location.pathname)) { return } - if (window.self !== window.top) { + if (self !== top) { return } waitForBody().then(() => { @@ -64,7 +64,9 @@ export const liveBasicItems: Item[] = [ requestAnimationFrame(() => { document.body.classList.remove('player-full-win') document.body.classList.remove('over-hidden') - player.setFullscreenStatus(1) + if (!document.querySelector('iframe[src*="live.bilibili.com/blanc"]')) { + player.setFullscreenStatus(1) + } }) clearInterval(id) } @@ -82,6 +84,12 @@ export const liveBasicItems: Item[] = [ name: '自动切换最高画质 (不稳定功能)', noStyle: true, enableFn: async () => { + if (!/\/\d+|\/blanc\/\d+/.test(location.pathname)) { + return + } + if (self !== top) { + return + } const qualityFn = () => { const player = unsafeWindow.EmbedPlayer?.instance || unsafeWindow.livePlayer if (player) { @@ -105,9 +113,6 @@ export const liveBasicItems: Item[] = [ } } setTimeout(qualityFn, 2000) - setTimeout(qualityFn, 4000) - setTimeout(qualityFn, 6000) - setTimeout(qualityFn, 8000) }, enableFnRunAt: 'document-end', }, diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 7a73e3f..58f9fcc 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -10,6 +10,7 @@ export declare global { EmbedPlayer?: { instance?: { getPlayerInfo: () => { + playerStatus?: number quality?: string qualityCandidates?: { qn?: string @@ -22,6 +23,7 @@ export declare global { } livePlayer?: { getPlayerInfo: () => { + playerStatus?: number quality?: string qualityCandidates?: { qn?: string From a4a7aa2fc3feb836c53ad3a9fe628d168acbddbc Mon Sep 17 00:00:00 2001 From: festoney8 Date: Tue, 21 Jan 2025 02:13:44 +0800 Subject: [PATCH 08/17] update: iframe adaption --- src/modules/rules/live/groups/basic.ts | 31 +++++++++++++----------- src/modules/rules/live/groups/right.scss | 3 ++- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/modules/rules/live/groups/basic.ts b/src/modules/rules/live/groups/basic.ts index 9720482..a232805 100644 --- a/src/modules/rules/live/groups/basic.ts +++ b/src/modules/rules/live/groups/basic.ts @@ -26,19 +26,25 @@ export const liveBasicItems: Item[] = [ name: '活动直播自动跳转普通直播 (实验功能)', noStyle: true, enableFn: async () => { + if (!/\/\d+/.test(location.pathname)) { + return + } + if (self !== top) { + return + } let cnt = 0 const id = setInterval(() => { - if (document.querySelector('.rendererRoot, #main.live-activity-full-main, #internationalHeader')) { - if (!location.href.includes('/blanc/')) { - window.location.href = location.href.replace('live.bilibili.com/', 'live.bilibili.com/blanc/') - clearInterval(id) - } + if ( + document.querySelector( + '.rendererRoot, #main.live-activity-full-main, #internationalHeader, iframe[src*="live.bilibili.com/blanc/"]', + ) + ) { + location.href = location.href.replace('live.bilibili.com/', 'live.bilibili.com/blanc/') + clearInterval(id) } - cnt++ - cnt > 50 && clearInterval(id) + ++cnt > 50 && clearInterval(id) }, 200) }, - enableFnRunAt: 'document-end', }, { type: 'switch', @@ -59,7 +65,7 @@ export const liveBasicItems: Item[] = [ document.addEventListener('DOMContentLoaded', () => { let cnt = 0 const id = setInterval(() => { - const player = unsafeWindow.EmbedPlayer?.instance || unsafeWindow.livePlayer + const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance if (player) { requestAnimationFrame(() => { document.body.classList.remove('player-full-win') @@ -70,10 +76,7 @@ export const liveBasicItems: Item[] = [ }) clearInterval(id) } - cnt++ - if (cnt > 10) { - clearInterval(id) - } + ++cnt > 10 && clearInterval(id) }, 1000) }) }, @@ -91,7 +94,7 @@ export const liveBasicItems: Item[] = [ return } const qualityFn = () => { - const player = unsafeWindow.EmbedPlayer?.instance || unsafeWindow.livePlayer + const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance if (player) { try { const info = player?.getPlayerInfo() diff --git a/src/modules/rules/live/groups/right.scss b/src/modules/rules/live/groups/right.scss index 3ebbe1a..2807bea 100644 --- a/src/modules/rules/live/groups/right.scss +++ b/src/modules/rules/live/groups/right.scss @@ -145,7 +145,8 @@ html[live-page-brush-prompt] { // 隐藏 互动框 (倒计时互动) html[live-page-combo-card-countdown] { - #combo-card:has(.countDownBtn) { + #combo-card:has(.countDownBtn), + .gift-wish-card-root { display: none !important; } .chat-history-panel { From 2a38c0557ebbb40d690f5d4effa4ce3ee948dd28 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Tue, 21 Jan 2025 14:53:23 +0800 Subject: [PATCH 09/17] update: live page default webscreen --- src/modules/rules/live/groups/basic.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/rules/live/groups/basic.ts b/src/modules/rules/live/groups/basic.ts index a232805..58f4971 100644 --- a/src/modules/rules/live/groups/basic.ts +++ b/src/modules/rules/live/groups/basic.ts @@ -66,7 +66,7 @@ export const liveBasicItems: Item[] = [ let cnt = 0 const id = setInterval(() => { const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance - if (player) { + if (player && player.getPlayerInfo()?.playerStatus !== 1) { requestAnimationFrame(() => { document.body.classList.remove('player-full-win') document.body.classList.remove('over-hidden') @@ -76,8 +76,8 @@ export const liveBasicItems: Item[] = [ }) clearInterval(id) } - ++cnt > 10 && clearInterval(id) - }, 1000) + ++cnt > 20 && clearInterval(id) + }, 500) }) }, }, From f3de4c7db3da9e2c45a83ecbdbc33102e17b2a8e Mon Sep 17 00:00:00 2001 From: festoney8 Date: Thu, 23 Jan 2025 09:26:19 +0800 Subject: [PATCH 10/17] update: border radius --- src/modules/rules/common/groups/basic.scss | 17 +++++++++++++++++ src/modules/rules/common/groups/basic.ts | 3 +++ 2 files changed, 20 insertions(+) diff --git a/src/modules/rules/common/groups/basic.scss b/src/modules/rules/common/groups/basic.scss index ffb7b5d..ad3685d 100644 --- a/src/modules/rules/common/groups/basic.scss +++ b/src/modules/rules/common/groups/basic.scss @@ -239,6 +239,23 @@ html[border-radius-popular] { } } +// 圆角化 热门页 +html[border-radius-space] { + #nav-searchform, + .home-aside-section > *, + .living-section__follow, + .side-nav__item, + .radio-filter__item, + .vui_button, + .space-follow-btn, + .message-btn, + .more-actions__trigger, + .bili-cover-card *, + .bili-video-card * { + border-radius: 3px !important; + } +} + // 圆角化 分区页 html[border-radius-channel] { #nav-searchform, diff --git a/src/modules/rules/common/groups/basic.ts b/src/modules/rules/common/groups/basic.ts index 837b772..c40c1a9 100644 --- a/src/modules/rules/common/groups/basic.ts +++ b/src/modules/rules/common/groups/basic.ts @@ -42,6 +42,9 @@ export const commonBasicItems: Item[] = [ if (isPagePopular()) { return 'border-radius-popular' } + if (isPageSpace()) { + return 'border-radius-space' + } if (isPageChannel()) { return 'border-radius-channel' } From a4f64efc369c4ee529e7194ffb6f6cfd1b9fa8ed Mon Sep 17 00:00:00 2001 From: festoney8 Date: Thu, 23 Jan 2025 12:06:28 +0800 Subject: [PATCH 11/17] chore: update deps --- package.json | 24 +- pnpm-lock.yaml | 852 ++++++++++++++++++++++++++----------------------- 2 files changed, 471 insertions(+), 405 deletions(-) diff --git a/package.json b/package.json index 6d0adcf..6160e52 100644 --- a/package.json +++ b/package.json @@ -12,31 +12,31 @@ "dependencies": { "@headlessui/vue": "^1.7.23", "@heroicons/vue": "^2.2.0", - "@vueuse/core": "^12.3.0", - "pinia": "^2.3.0", + "@vueuse/core": "^12.5.0", + "pinia": "^2.3.1", "vue": "^3.5.13" }, "devDependencies": { - "@eslint/js": "^9.17.0", + "@eslint/js": "^9.18.0", "@thedutchcoder/postcss-rem-to-px": "^0.0.2", "@vitejs/plugin-vue": "^5.2.1", "autoprefixer": "^10.4.20", - "eslint": "^9.17.0", + "eslint": "^9.18.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-vue": "^9.32.0", "globals": "^15.14.0", "husky": "^9.1.7", - "lint-staged": "^15.3.0", - "postcss": "^8.4.49", + "lint-staged": "^15.4.1", + "postcss": "^8.5.1", "prettier": "3.4.2", - "prettier-plugin-tailwindcss": "^0.6.9", - "stylelint": "^16.12.0", + "prettier-plugin-tailwindcss": "^0.6.10", + "stylelint": "^16.13.2", "stylelint-config-standard-scss": "^14.0.0", "tailwindcss": "^3.4.17", - "typescript": "^5.7.2", - "typescript-eslint": "^8.19.0", - "vite": "^6.0.6", - "vite-plugin-monkey": "^5.0.4", + "typescript": "^5.7.3", + "typescript-eslint": "^8.21.0", + "vite": "^6.0.11", + "vite-plugin-monkey": "^5.0.5", "vue-tsc": "^2.2.0" }, "lint-staged": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b6ab810..7526d6b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,41 +9,41 @@ importers: dependencies: '@headlessui/vue': specifier: ^1.7.23 - version: 1.7.23(vue@3.5.13(typescript@5.7.2)) + version: 1.7.23(vue@3.5.13(typescript@5.7.3)) '@heroicons/vue': specifier: ^2.2.0 - version: 2.2.0(vue@3.5.13(typescript@5.7.2)) + version: 2.2.0(vue@3.5.13(typescript@5.7.3)) '@vueuse/core': - specifier: ^12.3.0 - version: 12.3.0(typescript@5.7.2) + specifier: ^12.5.0 + version: 12.5.0(typescript@5.7.3) pinia: - specifier: ^2.3.0 - version: 2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) + specifier: ^2.3.1 + version: 2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) vue: specifier: ^3.5.13 - version: 3.5.13(typescript@5.7.2) + version: 3.5.13(typescript@5.7.3) devDependencies: '@eslint/js': - specifier: ^9.17.0 - version: 9.17.0 + specifier: ^9.18.0 + version: 9.18.0 '@thedutchcoder/postcss-rem-to-px': specifier: ^0.0.2 - version: 0.0.2(postcss@8.4.49) + version: 0.0.2(postcss@8.5.1) '@vitejs/plugin-vue': specifier: ^5.2.1 - version: 5.2.1(vite@6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.2)) + version: 5.2.1(vite@6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.49) + version: 10.4.20(postcss@8.5.1) eslint: - specifier: ^9.17.0 - version: 9.17.0(jiti@1.21.7) + specifier: ^9.18.0 + version: 9.18.0(jiti@1.21.7) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.17.0(jiti@1.21.7)) + version: 9.1.0(eslint@9.18.0(jiti@1.21.7)) eslint-plugin-vue: specifier: ^9.32.0 - version: 9.32.0(eslint@9.17.0(jiti@1.21.7)) + version: 9.32.0(eslint@9.18.0(jiti@1.21.7)) globals: specifier: ^15.14.0 version: 15.14.0 @@ -51,41 +51,41 @@ importers: specifier: ^9.1.7 version: 9.1.7 lint-staged: - specifier: ^15.3.0 - version: 15.3.0 + specifier: ^15.4.1 + version: 15.4.1 postcss: - specifier: ^8.4.49 - version: 8.4.49 + specifier: ^8.5.1 + version: 8.5.1 prettier: specifier: 3.4.2 version: 3.4.2 prettier-plugin-tailwindcss: - specifier: ^0.6.9 - version: 0.6.9(prettier@3.4.2) + specifier: ^0.6.10 + version: 0.6.10(prettier@3.4.2) stylelint: - specifier: ^16.12.0 - version: 16.12.0(typescript@5.7.2) + specifier: ^16.13.2 + version: 16.13.2(typescript@5.7.3) stylelint-config-standard-scss: specifier: ^14.0.0 - version: 14.0.0(postcss@8.4.49)(stylelint@16.12.0(typescript@5.7.2)) + version: 14.0.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)) tailwindcss: specifier: ^3.4.17 version: 3.4.17 typescript: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.7.3 + version: 5.7.3 typescript-eslint: - specifier: ^8.19.0 - version: 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) + specifier: ^8.21.0 + version: 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) vite: - specifier: ^6.0.6 - version: 6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0) + specifier: ^6.0.11 + version: 6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0) vite-plugin-monkey: - specifier: ^5.0.4 - version: 5.0.4(vite@6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0)) + specifier: ^5.0.5 + version: 5.0.5(vite@6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0)) vue-tsc: specifier: ^2.2.0 - version: 2.2.0(typescript@5.7.2) + version: 2.2.0(typescript@5.7.3) packages: '@alloc/quick-lru@5.2.0': @@ -116,18 +116,18 @@ packages: } engines: { node: '>=6.9.0' } - '@babel/parser@7.26.3': + '@babel/parser@7.26.5': resolution: { - integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==, + integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==, } engines: { node: '>=6.0.0' } hasBin: true - '@babel/types@7.26.3': + '@babel/types@7.26.5': resolution: { - integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==, + integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==, } engines: { node: '>=6.9.0' } @@ -426,10 +426,10 @@ packages: } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/core@0.9.1': + '@eslint/core@0.10.0': resolution: { - integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==, + integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -440,10 +440,10 @@ packages: } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/js@9.17.0': + '@eslint/js@9.18.0': resolution: { - integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==, + integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -454,10 +454,10 @@ packages: } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.2.5': resolution: { - integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==, + integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -553,6 +553,12 @@ packages: integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, } + '@keyv/serialize@1.0.2': + resolution: + { + integrity: sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==, + } + '@nodelib/fs.scandir@2.1.5': resolution: { @@ -581,164 +587,164 @@ packages: } engines: { node: '>=14' } - '@rollup/rollup-android-arm-eabi@4.29.1': + '@rollup/rollup-android-arm-eabi@4.31.0': resolution: { - integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==, + integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==, } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.29.1': + '@rollup/rollup-android-arm64@4.31.0': resolution: { - integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==, + integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==, } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.29.1': + '@rollup/rollup-darwin-arm64@4.31.0': resolution: { - integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==, + integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==, } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.29.1': + '@rollup/rollup-darwin-x64@4.31.0': resolution: { - integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==, + integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==, } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.29.1': + '@rollup/rollup-freebsd-arm64@4.31.0': resolution: { - integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==, + integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==, } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.29.1': + '@rollup/rollup-freebsd-x64@4.31.0': resolution: { - integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==, + integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==, } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + '@rollup/rollup-linux-arm-gnueabihf@4.31.0': resolution: { - integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==, + integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==, } cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.29.1': + '@rollup/rollup-linux-arm-musleabihf@4.31.0': resolution: { - integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==, + integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==, } cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.29.1': + '@rollup/rollup-linux-arm64-gnu@4.31.0': resolution: { - integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==, + integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==, } cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.29.1': + '@rollup/rollup-linux-arm64-musl@4.31.0': resolution: { - integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==, + integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==, } cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + '@rollup/rollup-linux-loongarch64-gnu@4.31.0': resolution: { - integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==, + integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==, } cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': resolution: { - integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==, + integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==, } cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.29.1': + '@rollup/rollup-linux-riscv64-gnu@4.31.0': resolution: { - integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==, + integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==, } cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.29.1': + '@rollup/rollup-linux-s390x-gnu@4.31.0': resolution: { - integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==, + integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==, } cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.29.1': + '@rollup/rollup-linux-x64-gnu@4.31.0': resolution: { - integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==, + integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==, } cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.29.1': + '@rollup/rollup-linux-x64-musl@4.31.0': resolution: { - integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==, + integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==, } cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-win32-arm64-msvc@4.29.1': + '@rollup/rollup-win32-arm64-msvc@4.31.0': resolution: { - integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==, + integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==, } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.29.1': + '@rollup/rollup-win32-ia32-msvc@4.31.0': resolution: { - integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==, + integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==, } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.29.1': + '@rollup/rollup-win32-x64-msvc@4.31.0': resolution: { - integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==, + integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==, } cpu: [x64] os: [win32] @@ -790,10 +796,10 @@ packages: integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, } - '@typescript-eslint/eslint-plugin@8.19.0': + '@typescript-eslint/eslint-plugin@8.21.0': resolution: { - integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==, + integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: @@ -801,63 +807,63 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.19.0': + '@typescript-eslint/parser@8.21.0': resolution: { - integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==, + integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.19.0': + '@typescript-eslint/scope-manager@8.21.0': resolution: { - integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==, + integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/type-utils@8.19.0': + '@typescript-eslint/type-utils@8.21.0': resolution: { - integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==, + integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.19.0': + '@typescript-eslint/types@8.21.0': resolution: { - integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==, + integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/typescript-estree@8.19.0': + '@typescript-eslint/typescript-estree@8.21.0': resolution: { - integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==, + integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.19.0': + '@typescript-eslint/utils@8.21.0': resolution: { - integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==, + integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.19.0': + '@typescript-eslint/visitor-keys@8.21.0': resolution: { - integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==, + integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -968,22 +974,22 @@ packages: integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==, } - '@vueuse/core@12.3.0': + '@vueuse/core@12.5.0': resolution: { - integrity: sha512-cnV8QDKZrsyKC7tWjPbeEUz2cD9sa9faxF2YkR8QqNwfofgbOhmfIgvSYmkp+ttSvfOw4E6hLcQx15mRPr0yBA==, + integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==, } - '@vueuse/metadata@12.3.0': + '@vueuse/metadata@12.5.0': resolution: { - integrity: sha512-M/iQHHjMffOv2npsw2ihlUx1CTiBwPEgb7DzByLq7zpg1+Ke8r7s9p5ybUWc5OIeGewtpY4Xy0R2cKqFqM8hFg==, + integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==, } - '@vueuse/shared@12.3.0': + '@vueuse/shared@12.5.0': resolution: { - integrity: sha512-X3YD35GUeW0d5Gajcwv9jdLAJTV2Jdb/Ll6Ii2JIYcKLYZqv5wxyLeKtiQkqWmHg3v0J0ZWjDUMVOw2E7RCXfA==, + integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==, } acorn-jsx@5.3.2: @@ -1021,10 +1027,10 @@ packages: integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, } - alien-signals@0.4.12: + alien-signals@0.4.14: resolution: { - integrity: sha512-Og0PgAihxlp1R22bsoBsyhhMG4+qhU+fkkLPoGBQkYVc3qt9rYnrwYTf+M6kqUqUZpf3rXDnpL90iKa0QcSVVg==, + integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==, } ansi-escapes@7.0.0: @@ -1123,6 +1129,12 @@ packages: integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==, } + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + binary-extensions@2.3.0: resolution: { @@ -1155,10 +1167,10 @@ packages: } engines: { node: '>=8' } - browserslist@4.24.3: + browserslist@4.24.4: resolution: { - integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==, + integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, } engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true @@ -1169,6 +1181,12 @@ packages: integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==, } + buffer@6.0.3: + resolution: + { + integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, + } + bundle-name@4.1.0: resolution: { @@ -1176,6 +1194,12 @@ packages: } engines: { node: '>=18' } + cacheable@1.8.7: + resolution: + { + integrity: sha512-AbfG7dAuYNjYxFUtL1lAqmlWdxczCJ47w7cFjhGcnGnUdwSo6VgmSojfoW3tUI12HUkgTJ5kqj78yyq6TsFtlg==, + } + callsites@3.1.0: resolution: { @@ -1190,10 +1214,10 @@ packages: } engines: { node: '>= 6' } - caniuse-lite@1.0.30001690: + caniuse-lite@1.0.30001695: resolution: { - integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==, + integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==, } chalk@4.1.2: @@ -1412,10 +1436,10 @@ packages: } engines: { node: '>= 4' } - domutils@3.2.1: + domutils@3.2.2: resolution: { - integrity: sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==, + integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, } eastasianwidth@0.2.0: @@ -1424,10 +1448,10 @@ packages: integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, } - electron-to-chromium@1.5.76: + electron-to-chromium@1.5.84: resolution: { - integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==, + integrity: sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==, } emoji-regex@10.4.0: @@ -1543,10 +1567,10 @@ packages: } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - eslint@9.17.0: + eslint@9.18.0: resolution: { - integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==, + integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true @@ -1623,10 +1647,10 @@ packages: integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, } - fast-glob@3.3.2: + fast-glob@3.3.3: resolution: { - integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, } engines: { node: '>=8.6.0' } @@ -1642,10 +1666,10 @@ packages: integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, } - fast-uri@3.0.3: + fast-uri@3.0.6: resolution: { - integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==, + integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, } fastest-levenshtein@1.0.16: @@ -1661,19 +1685,18 @@ packages: integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==, } - file-entry-cache@8.0.0: + file-entry-cache@10.0.5: resolution: { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + integrity: sha512-umpQsJrBNsdMDgreSryMEXvJh66XeLtZUwA8Gj7rHGearGufUFv6rB/bcXRFsiGWw/VeSUgUofF4Rf2UKEOrTA==, } - engines: { node: '>=16.0.0' } - file-entry-cache@9.1.0: + file-entry-cache@8.0.0: resolution: { - integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==, + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, } - engines: { node: '>=18' } + engines: { node: '>=16.0.0' } fill-range@7.1.1: resolution: @@ -1696,12 +1719,11 @@ packages: } engines: { node: '>=16' } - flat-cache@5.0.0: + flat-cache@6.1.5: resolution: { - integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==, + integrity: sha512-QR+2kN38f8nMfiIQ1LHYjuDEmZNZVjxuxY+HufbS3BW0EX01Q5OnH7iduOYRutmgiXb797HAKcXUeXrvRjjgSQ==, } - engines: { node: '>=18' } flatted@3.3.2: resolution: @@ -1846,6 +1868,12 @@ packages: } hasBin: true + hookified@1.7.0: + resolution: + { + integrity: sha512-XQdMjqC1AyeOzfs+17cnIk7Wdfu1hh2JtcyNfBf5u9jHrT3iZUlGHxLTntFBuk5lwkqJ6l3+daeQdHK5yByHVA==, + } + html-tags@3.3.1: resolution: { @@ -1874,6 +1902,12 @@ packages: engines: { node: '>=18' } hasBin: true + ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + ignore@5.3.2: resolution: { @@ -1881,10 +1915,10 @@ packages: } engines: { node: '>= 4' } - ignore@6.0.2: + ignore@7.0.3: resolution: { - integrity: sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==, + integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==, } engines: { node: '>= 4' } @@ -2093,6 +2127,12 @@ packages: integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, } + keyv@5.2.3: + resolution: + { + integrity: sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw==, + } + kind-of@6.0.3: resolution: { @@ -2126,10 +2166,10 @@ packages: integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, } - lint-staged@15.3.0: + lint-staged@15.4.1: resolution: { - integrity: sha512-vHFahytLoF2enJklgtOtCtIjZrKD/LoxlaUusd5nh7dWv/dkKQJY74ndFSzxCdv7g0ueGg1ORgTSt4Y9LPZn9A==, + integrity: sha512-P8yJuVRyLrm5KxCtFx+gjI5Bil+wO7wnTl7C3bXhvtTaAFGirzeB24++D0wGoUwxrUKecNiehemgCob9YL39NA==, } engines: { node: '>=18.12.0' } hasBin: true @@ -2197,10 +2237,10 @@ packages: integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==, } - mdn-data@2.14.0: + mdn-data@2.15.0: resolution: { - integrity: sha512-QjcSiIvUHjmXp5wNLClRjQeU0Zp+I2Dag+AhtQto0nyKYZ3IF/pUzCuHe7Bv77EC92XE5t3EXeEiEv/to2Bwig==, + integrity: sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ==, } meow@13.2.0: @@ -2487,10 +2527,10 @@ packages: } engines: { node: '>=0.10.0' } - pinia@2.3.0: + pinia@2.3.1: resolution: { - integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==, + integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==, } peerDependencies: typescript: '>=4.4.4' @@ -2598,10 +2638,10 @@ packages: integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, } - postcss@8.4.49: + postcss@8.5.1: resolution: { - integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==, + integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==, } engines: { node: ^10 || ^12 || >=14 } @@ -2612,10 +2652,10 @@ packages: } engines: { node: '>= 0.8.0' } - prettier-plugin-tailwindcss@0.6.9: + prettier-plugin-tailwindcss@0.6.10: resolution: { - integrity: sha512-r0i3uhaZAXYP0At5xGfJH876W3HHGHDp+LCRUJrs57PBeQ6mYHMwr25KH8NPX44F2yGTvdnH7OqCshlQx183Eg==, + integrity: sha512-ndj2WLDaMzACnr1gAYZiZZLs5ZdOeBYgOsbBmHj3nvW/6q8h8PymsXiEnKvj/9qgCCAoHyvLOisoQdIcsDvIgw==, } engines: { node: '>=14.21.3' } peerDependencies: @@ -2623,7 +2663,7 @@ packages: '@prettier/plugin-pug': '*' '@shopify/prettier-plugin-liquid': '*' '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig-melody': '*' + '@zackad/prettier-plugin-twig': '*' prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' @@ -2645,7 +2685,7 @@ packages: optional: true '@trivago/prettier-plugin-sort-imports': optional: true - '@zackad/prettier-plugin-twig-melody': + '@zackad/prettier-plugin-twig': optional: true prettier-plugin-astro: optional: true @@ -2753,10 +2793,10 @@ packages: integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, } - rollup@4.29.1: + rollup@4.31.0: resolution: { - integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==, + integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==, } engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true @@ -3140,19 +3180,19 @@ packages: peerDependencies: stylelint: ^16.1.0 - stylelint-scss@6.10.0: + stylelint-scss@6.10.1: resolution: { - integrity: sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==, + integrity: sha512-CBqs0jecftIyhic6xba+4OvZUp4B0wNbX19w6Rq1fPo+lBDmTevk+olo8H7u/WQpTSDCDbBN4f3oocQurvXLTQ==, } engines: { node: '>=18.12.0' } peerDependencies: stylelint: ^16.0.2 - stylelint@16.12.0: + stylelint@16.13.2: resolution: { - integrity: sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==, + integrity: sha512-wDlgh0mRO9RtSa3TdidqHd0nOG8MmUyVKl+dxA6C1j8aZRzpNeEgdhFmU5y4sZx4Fc6r46p0fI7p1vR5O2DZqA==, } engines: { node: '>=18.12.0' } hasBin: true @@ -3254,14 +3294,14 @@ packages: } engines: { node: '>=8.0' } - ts-api-utils@1.4.3: + ts-api-utils@2.0.0: resolution: { - integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==, + integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==, } - engines: { node: '>=16' } + engines: { node: '>=18.12' } peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-interface-checker@0.1.13: resolution: @@ -3289,20 +3329,20 @@ packages: } engines: { node: '>=10' } - typescript-eslint@8.19.0: + typescript-eslint@8.21.0: resolution: { - integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==, + integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - typescript@5.7.2: + typescript@5.7.3: resolution: { - integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==, + integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==, } engines: { node: '>=14.17' } hasBin: true @@ -3313,10 +3353,10 @@ packages: integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, } - update-browserslist-db@1.1.1: + update-browserslist-db@1.1.2: resolution: { - integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==, + integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==, } hasBin: true peerDependencies: @@ -3340,10 +3380,10 @@ packages: integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==, } - vite-plugin-monkey@5.0.4: + vite-plugin-monkey@5.0.5: resolution: { - integrity: sha512-8Iw3B914TulOo0gBRFNAifCsRW2nMbIj8zfME7iToIWw2e+sWnZKAsYOkgBqGnC2RwHVWxeUMxzTq8NhU6h4pg==, + integrity: sha512-zhqChSckAHniYY9f7qpS0mETW7PAedIVja44CA0eahJk31rHL9tCjXCBqOd50mMJKHEtbOu0MHjfeYmaKz1hZg==, } peerDependencies: vite: ^5.4.11 || ^6.0.0 @@ -3351,10 +3391,10 @@ packages: vite: optional: true - vite@6.0.6: + vite@6.0.11: resolution: { - integrity: sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==, + integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==, } engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true @@ -3536,11 +3576,11 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.3': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 - '@babel/types@7.26.3': + '@babel/types@7.26.5': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -3640,9 +3680,9 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))': dependencies: - eslint: 9.17.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3655,7 +3695,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.9.1': + '@eslint/core@0.10.0': dependencies: '@types/json-schema': 7.0.15 @@ -3673,22 +3713,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.18.0': {} '@eslint/object-schema@2.1.5': {} - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.2.5': dependencies: + '@eslint/core': 0.10.0 levn: 0.4.1 - '@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.2))': + '@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.3))': dependencies: - '@tanstack/vue-virtual': 3.11.2(vue@3.5.13(typescript@5.7.2)) - vue: 3.5.13(typescript@5.7.2) + '@tanstack/vue-virtual': 3.11.2(vue@3.5.13(typescript@5.7.3)) + vue: 3.5.13(typescript@5.7.3) - '@heroicons/vue@2.2.0(vue@3.5.13(typescript@5.7.2))': + '@heroicons/vue@2.2.0(vue@3.5.13(typescript@5.7.3))': dependencies: - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) '@humanfs/core@0.19.1': {} @@ -3729,6 +3770,10 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@keyv/serialize@1.0.2': + dependencies: + buffer: 6.0.3 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3744,73 +3789,73 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.29.1': + '@rollup/rollup-android-arm-eabi@4.31.0': optional: true - '@rollup/rollup-android-arm64@4.29.1': + '@rollup/rollup-android-arm64@4.31.0': optional: true - '@rollup/rollup-darwin-arm64@4.29.1': + '@rollup/rollup-darwin-arm64@4.31.0': optional: true - '@rollup/rollup-darwin-x64@4.29.1': + '@rollup/rollup-darwin-x64@4.31.0': optional: true - '@rollup/rollup-freebsd-arm64@4.29.1': + '@rollup/rollup-freebsd-arm64@4.31.0': optional: true - '@rollup/rollup-freebsd-x64@4.29.1': + '@rollup/rollup-freebsd-x64@4.31.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': + '@rollup/rollup-linux-arm-gnueabihf@4.31.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.29.1': + '@rollup/rollup-linux-arm-musleabihf@4.31.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.29.1': + '@rollup/rollup-linux-arm64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.29.1': + '@rollup/rollup-linux-arm64-musl@4.31.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': + '@rollup/rollup-linux-loongarch64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.29.1': + '@rollup/rollup-linux-riscv64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.29.1': + '@rollup/rollup-linux-s390x-gnu@4.31.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.29.1': + '@rollup/rollup-linux-x64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-x64-musl@4.29.1': + '@rollup/rollup-linux-x64-musl@4.31.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.29.1': + '@rollup/rollup-win32-arm64-msvc@4.31.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.29.1': + '@rollup/rollup-win32-ia32-msvc@4.31.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.29.1': + '@rollup/rollup-win32-x64-msvc@4.31.0': optional: true '@tanstack/virtual-core@3.11.2': {} - '@tanstack/vue-virtual@3.11.2(vue@3.5.13(typescript@5.7.2))': + '@tanstack/vue-virtual@3.11.2(vue@3.5.13(typescript@5.7.3))': dependencies: '@tanstack/virtual-core': 3.11.2 - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) - '@thedutchcoder/postcss-rem-to-px@0.0.2(postcss@8.4.49)': + '@thedutchcoder/postcss-rem-to-px@0.0.2(postcss@8.5.1)': dependencies: - postcss: 8.4.49 + postcss: 8.5.1 '@types/estree@1.0.6': {} @@ -3823,87 +3868,87 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.19.0 - eslint: 9.17.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/type-utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.21.0 + eslint: 9.18.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)': + '@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.21.0 debug: 4.4.0 - eslint: 9.17.0(jiti@1.21.7) - typescript: 5.7.2 + eslint: 9.18.0(jiti@1.21.7) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.19.0': + '@typescript-eslint/scope-manager@8.21.0': dependencies: - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 - '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.17.0(jiti@1.21.7) - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + eslint: 9.18.0(jiti@1.21.7) + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.19.0': {} + '@typescript-eslint/types@8.21.0': {} - '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/visitor-keys': 8.19.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.0(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2)': + '@typescript-eslint/utils@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.19.0 - '@typescript-eslint/types': 8.19.0 - '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.7) - typescript: 5.7.2 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.7) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.19.0': + '@typescript-eslint/visitor-keys@8.21.0': dependencies: - '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/types': 8.21.0 eslint-visitor-keys: 4.2.0 - '@vitejs/plugin-vue@5.2.1(vite@6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue@5.2.1(vite@6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))': dependencies: - vite: 6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0) - vue: 3.5.13(typescript@5.7.2) + vite: 6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0) + vue: 3.5.13(typescript@5.7.3) '@volar/language-core@2.4.11': dependencies: @@ -3919,7 +3964,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -3932,14 +3977,14 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.4.49 + postcss: 8.5.1 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -3954,18 +3999,18 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/language-core@2.2.0(typescript@5.7.2)': + '@vue/language-core@2.2.0(typescript@5.7.3)': dependencies: '@volar/language-core': 2.4.11 '@vue/compiler-dom': 3.5.13 '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.13 - alien-signals: 0.4.12 + alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 '@vue/reactivity@3.5.13': dependencies: @@ -3983,28 +4028,28 @@ snapshots: '@vue/shared': 3.5.13 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))': + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': dependencies: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) '@vue/shared@3.5.13': {} - '@vueuse/core@12.3.0(typescript@5.7.2)': + '@vueuse/core@12.5.0(typescript@5.7.3)': dependencies: '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 12.3.0 - '@vueuse/shared': 12.3.0(typescript@5.7.2) - vue: 3.5.13(typescript@5.7.2) + '@vueuse/metadata': 12.5.0 + '@vueuse/shared': 12.5.0(typescript@5.7.3) + vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: - typescript - '@vueuse/metadata@12.3.0': {} + '@vueuse/metadata@12.5.0': {} - '@vueuse/shared@12.3.0(typescript@5.7.2)': + '@vueuse/shared@12.5.0(typescript@5.7.3)': dependencies: - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: - typescript @@ -4028,11 +4073,11 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alien-signals@0.4.12: {} + alien-signals@0.4.14: {} ansi-escapes@7.0.0: dependencies: @@ -4063,20 +4108,22 @@ snapshots: astral-regex@2.0.0: {} - autoprefixer@10.4.20(postcss@8.4.49): + autoprefixer@10.4.20(postcss@8.5.1): dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001690 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001695 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 balanced-match@1.0.2: {} balanced-match@2.0.0: {} + base64-js@1.5.1: {} + binary-extensions@2.3.0: {} boolbase@1.0.0: {} @@ -4094,25 +4141,35 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.3: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001690 - electron-to-chromium: 1.5.76 + caniuse-lite: 1.0.30001695 + electron-to-chromium: 1.5.84 node-releases: 2.0.19 - update-browserslist-db: 1.1.1(browserslist@4.24.3) + update-browserslist-db: 1.1.2(browserslist@4.24.4) buffer-builder@0.2.0: optional: true + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bundle-name@4.1.0: dependencies: run-applescript: 7.0.0 + cacheable@1.8.7: + dependencies: + hookified: 1.7.0 + keyv: 5.2.3 + callsites@3.1.0: {} camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001690: {} + caniuse-lite@1.0.30001695: {} chalk@4.1.2: dependencies: @@ -4161,14 +4218,14 @@ snapshots: concat-map@0.0.1: {} - cosmiconfig@9.0.0(typescript@5.7.2): + cosmiconfig@9.0.0(typescript@5.7.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 cross-spawn@7.0.6: dependencies: @@ -4224,7 +4281,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - domutils@3.2.1: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -4232,7 +4289,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.76: {} + electron-to-chromium@1.5.84: {} emoji-regex@10.4.0: {} @@ -4282,20 +4339,20 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@1.21.7)): + eslint-config-prettier@9.1.0(eslint@9.18.0(jiti@1.21.7)): dependencies: - eslint: 9.17.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) - eslint-plugin-vue@9.32.0(eslint@9.17.0(jiti@1.21.7)): + eslint-plugin-vue@9.32.0(eslint@9.18.0(jiti@1.21.7)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7)) - eslint: 9.17.0(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + eslint: 9.18.0(jiti@1.21.7) globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.6.3 - vue-eslint-parser: 9.4.3(eslint@9.17.0(jiti@1.21.7)) + vue-eslint-parser: 9.4.3(eslint@9.18.0(jiti@1.21.7)) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -4314,15 +4371,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0(jiti@1.21.7): + eslint@9.18.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 - '@eslint/core': 0.9.1 + '@eslint/core': 0.10.0 '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.4 + '@eslint/js': 9.18.0 + '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 @@ -4397,7 +4454,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -4409,7 +4466,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.3: {} + fast-uri@3.0.6: {} fastest-levenshtein@1.0.16: {} @@ -4417,13 +4474,13 @@ snapshots: dependencies: reusify: 1.0.4 - file-entry-cache@8.0.0: + file-entry-cache@10.0.5: dependencies: - flat-cache: 4.0.1 + flat-cache: 6.1.5 - file-entry-cache@9.1.0: + file-entry-cache@8.0.0: dependencies: - flat-cache: 5.0.0 + flat-cache: 4.0.1 fill-range@7.1.1: dependencies: @@ -4439,10 +4496,11 @@ snapshots: flatted: 3.3.2 keyv: 4.5.4 - flat-cache@5.0.0: + flat-cache@6.1.5: dependencies: + cacheable: 1.8.7 flatted: 3.3.2 - keyv: 4.5.4 + hookified: 1.7.0 flatted@3.3.2: {} @@ -4501,7 +4559,7 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -4518,22 +4576,26 @@ snapshots: he@1.2.0: {} + hookified@1.7.0: {} + html-tags@3.3.1: {} htmlparser2@9.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.2.1 + domutils: 3.2.2 entities: 4.5.0 human-signals@5.0.0: {} husky@9.1.7: {} + ieee754@1.2.1: {} + ignore@5.3.2: {} - ignore@6.0.2: {} + ignore@7.0.3: {} immutable@4.3.7: optional: true @@ -4622,6 +4684,10 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.2.3: + dependencies: + '@keyv/serialize': 1.0.2 + kind-of@6.0.3: {} known-css-properties@0.35.0: {} @@ -4635,7 +4701,7 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@15.3.0: + lint-staged@15.4.1: dependencies: chalk: 5.4.1 commander: 12.1.0 @@ -4687,7 +4753,7 @@ snapshots: mdn-data@2.12.2: {} - mdn-data@2.14.0: {} + mdn-data@2.15.0: {} meow@13.2.0: {} @@ -4818,53 +4884,53 @@ snapshots: pify@2.3.0: {} - pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)): + pinia@2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.7.2) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + vue: 3.5.13(typescript@5.7.3) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - '@vue/composition-api' pirates@4.0.6: {} - postcss-import@15.1.0(postcss@8.4.49): + postcss-import@15.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.4.49): + postcss-js@4.0.1(postcss@8.5.1): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.49 + postcss: 8.5.1 - postcss-load-config@4.0.2(postcss@8.4.49): + postcss-load-config@4.0.2(postcss@8.5.1): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-media-query-parser@0.2.3: {} - postcss-nested@6.2.0(postcss@8.4.49): + postcss-nested@6.2.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser: 6.1.2 postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@7.0.1(postcss@8.4.49): + postcss-safe-parser@7.0.1(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-scss@4.0.9(postcss@8.4.49): + postcss-scss@4.0.9(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser@6.1.2: dependencies: @@ -4878,7 +4944,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -4886,7 +4952,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.6.9(prettier@3.4.2): + prettier-plugin-tailwindcss@0.6.10(prettier@3.4.2): dependencies: prettier: 3.4.2 @@ -4925,29 +4991,29 @@ snapshots: rfdc@1.4.1: {} - rollup@4.29.1: + rollup@4.31.0: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.29.1 - '@rollup/rollup-android-arm64': 4.29.1 - '@rollup/rollup-darwin-arm64': 4.29.1 - '@rollup/rollup-darwin-x64': 4.29.1 - '@rollup/rollup-freebsd-arm64': 4.29.1 - '@rollup/rollup-freebsd-x64': 4.29.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 - '@rollup/rollup-linux-arm-musleabihf': 4.29.1 - '@rollup/rollup-linux-arm64-gnu': 4.29.1 - '@rollup/rollup-linux-arm64-musl': 4.29.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 - '@rollup/rollup-linux-riscv64-gnu': 4.29.1 - '@rollup/rollup-linux-s390x-gnu': 4.29.1 - '@rollup/rollup-linux-x64-gnu': 4.29.1 - '@rollup/rollup-linux-x64-musl': 4.29.1 - '@rollup/rollup-win32-arm64-msvc': 4.29.1 - '@rollup/rollup-win32-ia32-msvc': 4.29.1 - '@rollup/rollup-win32-x64-msvc': 4.29.1 + '@rollup/rollup-android-arm-eabi': 4.31.0 + '@rollup/rollup-android-arm64': 4.31.0 + '@rollup/rollup-darwin-arm64': 4.31.0 + '@rollup/rollup-darwin-x64': 4.31.0 + '@rollup/rollup-freebsd-arm64': 4.31.0 + '@rollup/rollup-freebsd-x64': 4.31.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.31.0 + '@rollup/rollup-linux-arm-musleabihf': 4.31.0 + '@rollup/rollup-linux-arm64-gnu': 4.31.0 + '@rollup/rollup-linux-arm64-musl': 4.31.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.31.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0 + '@rollup/rollup-linux-riscv64-gnu': 4.31.0 + '@rollup/rollup-linux-s390x-gnu': 4.31.0 + '@rollup/rollup-linux-x64-gnu': 4.31.0 + '@rollup/rollup-linux-x64-musl': 4.31.0 + '@rollup/rollup-win32-arm64-msvc': 4.31.0 + '@rollup/rollup-win32-ia32-msvc': 4.31.0 + '@rollup/rollup-win32-x64-msvc': 4.31.0 fsevents: 2.3.3 run-applescript@7.0.0: {} @@ -5123,45 +5189,45 @@ snapshots: strip-json-comments@3.1.1: {} - stylelint-config-recommended-scss@14.1.0(postcss@8.4.49)(stylelint@16.12.0(typescript@5.7.2)): + stylelint-config-recommended-scss@14.1.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)): dependencies: - postcss-scss: 4.0.9(postcss@8.4.49) - stylelint: 16.12.0(typescript@5.7.2) - stylelint-config-recommended: 14.0.1(stylelint@16.12.0(typescript@5.7.2)) - stylelint-scss: 6.10.0(stylelint@16.12.0(typescript@5.7.2)) + postcss-scss: 4.0.9(postcss@8.5.1) + stylelint: 16.13.2(typescript@5.7.3) + stylelint-config-recommended: 14.0.1(stylelint@16.13.2(typescript@5.7.3)) + stylelint-scss: 6.10.1(stylelint@16.13.2(typescript@5.7.3)) optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 - stylelint-config-recommended@14.0.1(stylelint@16.12.0(typescript@5.7.2)): + stylelint-config-recommended@14.0.1(stylelint@16.13.2(typescript@5.7.3)): dependencies: - stylelint: 16.12.0(typescript@5.7.2) + stylelint: 16.13.2(typescript@5.7.3) - stylelint-config-standard-scss@14.0.0(postcss@8.4.49)(stylelint@16.12.0(typescript@5.7.2)): + stylelint-config-standard-scss@14.0.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)): dependencies: - stylelint: 16.12.0(typescript@5.7.2) - stylelint-config-recommended-scss: 14.1.0(postcss@8.4.49)(stylelint@16.12.0(typescript@5.7.2)) - stylelint-config-standard: 36.0.1(stylelint@16.12.0(typescript@5.7.2)) + stylelint: 16.13.2(typescript@5.7.3) + stylelint-config-recommended-scss: 14.1.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)) + stylelint-config-standard: 36.0.1(stylelint@16.13.2(typescript@5.7.3)) optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 - stylelint-config-standard@36.0.1(stylelint@16.12.0(typescript@5.7.2)): + stylelint-config-standard@36.0.1(stylelint@16.13.2(typescript@5.7.3)): dependencies: - stylelint: 16.12.0(typescript@5.7.2) - stylelint-config-recommended: 14.0.1(stylelint@16.12.0(typescript@5.7.2)) + stylelint: 16.13.2(typescript@5.7.3) + stylelint-config-recommended: 14.0.1(stylelint@16.13.2(typescript@5.7.3)) - stylelint-scss@6.10.0(stylelint@16.12.0(typescript@5.7.2)): + stylelint-scss@6.10.1(stylelint@16.13.2(typescript@5.7.3)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 known-css-properties: 0.35.0 - mdn-data: 2.14.0 + mdn-data: 2.15.0 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 - stylelint: 16.12.0(typescript@5.7.2) + stylelint: 16.13.2(typescript@5.7.3) - stylelint@16.12.0(typescript@5.7.2): + stylelint@16.13.2(typescript@5.7.3): dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 @@ -5170,18 +5236,18 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.7.2) + cosmiconfig: 9.0.0(typescript@5.7.3) css-functions-list: 3.2.3 css-tree: 3.1.0 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 9.1.0 + file-entry-cache: 10.0.5 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 html-tags: 3.3.1 - ignore: 6.0.2 + ignore: 7.0.3 imurmurhash: 0.1.4 is-plain-object: 5.0.0 known-css-properties: 0.35.0 @@ -5190,9 +5256,9 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 + postcss: 8.5.1 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.4.49) + postcss-safe-parser: 7.0.1(postcss@8.5.1) postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -5258,7 +5324,7 @@ snapshots: chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob-parent: 6.0.2 is-glob: 4.0.3 jiti: 1.21.7 @@ -5267,11 +5333,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49) - postcss-nested: 6.2.0(postcss@8.4.49) + postcss: 8.5.1 + postcss-import: 15.1.0(postcss@8.5.1) + postcss-js: 4.0.1(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1) + postcss-nested: 6.2.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -5290,9 +5356,9 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@1.4.3(typescript@5.7.2): + ts-api-utils@2.0.0(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 ts-interface-checker@0.1.13: {} @@ -5305,24 +5371,24 @@ snapshots: type-fest@0.20.2: {} - typescript-eslint@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2): + typescript-eslint@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) - '@typescript-eslint/utils': 8.19.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.7) - typescript: 5.7.2 + '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.7) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - typescript@5.7.2: {} + typescript@5.7.3: {} undici-types@6.20.0: optional: true - update-browserslist-db@1.1.1(browserslist@4.24.3): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -5335,7 +5401,7 @@ snapshots: varint@6.0.0: optional: true - vite-plugin-monkey@5.0.4(vite@6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0)): + vite-plugin-monkey@5.0.5(vite@6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0)): dependencies: acorn-walk: 8.3.4 cross-spawn: 7.0.6 @@ -5347,13 +5413,13 @@ snapshots: picocolors: 1.1.1 systemjs: 6.15.1 optionalDependencies: - vite: 6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0) + vite: 6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0) - vite@6.0.6(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0): + vite@6.0.11(@types/node@22.10.2)(jiti@1.21.7)(sass-embedded@1.83.0)(sass@1.78.0)(yaml@2.7.0): dependencies: esbuild: 0.24.2 - postcss: 8.4.49 - rollup: 4.29.1 + postcss: 8.5.1 + rollup: 4.31.0 optionalDependencies: '@types/node': 22.10.2 fsevents: 2.3.3 @@ -5364,14 +5430,14 @@ snapshots: vscode-uri@3.0.8: {} - vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): dependencies: - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) - vue-eslint-parser@9.4.3(eslint@9.17.0(jiti@1.21.7)): + vue-eslint-parser@9.4.3(eslint@9.18.0(jiti@1.21.7)): dependencies: debug: 4.4.0 - eslint: 9.17.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -5381,21 +5447,21 @@ snapshots: transitivePeerDependencies: - supports-color - vue-tsc@2.2.0(typescript@5.7.2): + vue-tsc@2.2.0(typescript@5.7.3): dependencies: '@volar/typescript': 2.4.11 - '@vue/language-core': 2.2.0(typescript@5.7.2) - typescript: 5.7.2 + '@vue/language-core': 2.2.0(typescript@5.7.3) + typescript: 5.7.3 - vue@3.5.13(typescript@5.7.2): + vue@3.5.13(typescript@5.7.3): dependencies: '@vue/compiler-dom': 3.5.13 '@vue/compiler-sfc': 3.5.13 '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2)) + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) '@vue/shared': 3.5.13 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 which@1.3.1: dependencies: From 00eed116d83863e6f94ed0aeecad9a2e0783f8ae Mon Sep 17 00:00:00 2001 From: festoney8 Date: Thu, 23 Jan 2025 12:06:43 +0800 Subject: [PATCH 12/17] udpate: homepage adapt bewly --- src/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index 331603b..0963d43 100644 --- a/src/main.ts +++ b/src/main.ts @@ -67,8 +67,8 @@ const main = () => { } const menu = () => { - // skip iframe - if (self !== top) { + // skip iframe except homepage, adapt bewly + if (!isPageHomepage() && self !== top) { return } const ruleStore = useRulePanelStore() From 8f254b89e2f1ea9f649e191a371c7369b57049ab Mon Sep 17 00:00:00 2001 From: festoney8 Date: Thu, 23 Jan 2025 19:05:25 +0800 Subject: [PATCH 13/17] update: live page default webscreen --- src/modules/rules/live/groups/basic.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/modules/rules/live/groups/basic.ts b/src/modules/rules/live/groups/basic.ts index 58f4971..34579fe 100644 --- a/src/modules/rules/live/groups/basic.ts +++ b/src/modules/rules/live/groups/basic.ts @@ -63,17 +63,26 @@ export const liveBasicItems: Item[] = [ document.body.classList.add('over-hidden') }) document.addEventListener('DOMContentLoaded', () => { + setInterval(() => { + const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance + console.log( + performance.now(), + player?.getPlayerInfo()?.playerStatus, + document.body.classList.toString(), + ) + }, 50) let cnt = 0 const id = setInterval(() => { const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance - if (player && player.getPlayerInfo()?.playerStatus !== 1) { + const status = player?.getPlayerInfo()?.playerStatus + if (player && status === 0) { requestAnimationFrame(() => { - document.body.classList.remove('player-full-win') - document.body.classList.remove('over-hidden') if (!document.querySelector('iframe[src*="live.bilibili.com/blanc"]')) { player.setFullscreenStatus(1) } }) + // classList去重 + document.body.className = [...new Set(document.body.classList)].join(' ') clearInterval(id) } ++cnt > 20 && clearInterval(id) From 419952004ece9de4b6c3595632fc51cf70c348c9 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Fri, 24 Jan 2025 12:22:41 +0800 Subject: [PATCH 14/17] update: live page default webscreen --- src/modules/rules/live/groups/basic.ts | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/modules/rules/live/groups/basic.ts b/src/modules/rules/live/groups/basic.ts index 34579fe..125498b 100644 --- a/src/modules/rules/live/groups/basic.ts +++ b/src/modules/rules/live/groups/basic.ts @@ -59,30 +59,24 @@ export const liveBasicItems: Item[] = [ return } waitForBody().then(() => { - document.body.classList.add('player-full-win') - document.body.classList.add('over-hidden') + requestAnimationFrame(() => { + document.body.classList.add('player-full-win') + document.body.classList.add('over-hidden') + }) }) document.addEventListener('DOMContentLoaded', () => { - setInterval(() => { - const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance - console.log( - performance.now(), - player?.getPlayerInfo()?.playerStatus, - document.body.classList.toString(), - ) - }, 50) let cnt = 0 const id = setInterval(() => { const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance const status = player?.getPlayerInfo()?.playerStatus if (player && status === 0) { requestAnimationFrame(() => { + document.body.classList.remove('player-full-win') + document.body.classList.remove('over-hidden') if (!document.querySelector('iframe[src*="live.bilibili.com/blanc"]')) { player.setFullscreenStatus(1) } }) - // classList去重 - document.body.className = [...new Set(document.body.classList)].join(' ') clearInterval(id) } ++cnt > 20 && clearInterval(id) From d407876bd06846c476a7837bc1a4d64ee319d790 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Fri, 24 Jan 2025 12:45:43 +0800 Subject: [PATCH 15/17] update: comment filter --- src/modules/filters/variety/comment/pages/common.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/filters/variety/comment/pages/common.ts b/src/modules/filters/variety/comment/pages/common.ts index 5f7d09f..7acb18a 100644 --- a/src/modules/filters/variety/comment/pages/common.ts +++ b/src/modules/filters/variety/comment/pages/common.ts @@ -640,7 +640,10 @@ export const commentFilterCommonGroups: Group[] = [ try { const respData = await resp.clone().json() const msg = respData?.data?.top?.upper?.content?.message - if (msg && /b23\.tv\/mall-|领券|gaoneng\.bilibili\.com/.test(msg)) { + if ( + msg && + /(bili2233\.cn|b23\.tv)\/(mall-|cm-)|领券|gaoneng\.bilibili\.com/.test(msg) + ) { respData.data.top = null respData.data.top_replies = null return new Response(JSON.stringify(respData), { From a4ebfa67279c6fa8ce8c0a0dda4bb99bf0f141d9 Mon Sep 17 00:00:00 2001 From: festoney8 Date: Fri, 24 Jan 2025 17:45:45 +0800 Subject: [PATCH 16/17] update: item details --- src/modules/rules/live/groups/basic.ts | 17 ++++++++--------- src/modules/rules/search/groups/basic.scss | 16 ++++++++-------- src/modules/rules/search/groups/basic.ts | 12 ++++++------ 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/modules/rules/live/groups/basic.ts b/src/modules/rules/live/groups/basic.ts index 125498b..4c24fa6 100644 --- a/src/modules/rules/live/groups/basic.ts +++ b/src/modules/rules/live/groups/basic.ts @@ -23,7 +23,7 @@ export const liveBasicItems: Item[] = [ { type: 'switch', id: 'activity-live-auto-jump', - name: '活动直播自动跳转普通直播 (实验功能)', + name: '活动直播自动跳转普通直播', noStyle: true, enableFn: async () => { if (!/\/\d+/.test(location.pathname)) { @@ -49,7 +49,8 @@ export const liveBasicItems: Item[] = [ { type: 'switch', id: 'live-page-default-webscreen', - name: '默认网页全屏播放 (实验功能)', + name: '默认网页全屏播放', + description: ['实验功能,偶尔会失效'], noStyle: true, enableFn: async () => { if (!/\/\d+|\/blanc\/\d+/.test(location.pathname)) { @@ -70,13 +71,11 @@ export const liveBasicItems: Item[] = [ const player = unsafeWindow.livePlayer || unsafeWindow.EmbedPlayer?.instance const status = player?.getPlayerInfo()?.playerStatus if (player && status === 0) { - requestAnimationFrame(() => { - document.body.classList.remove('player-full-win') - document.body.classList.remove('over-hidden') - if (!document.querySelector('iframe[src*="live.bilibili.com/blanc"]')) { - player.setFullscreenStatus(1) - } - }) + document.body.classList.remove('player-full-win') + document.body.classList.remove('over-hidden') + if (!document.querySelector('iframe[src*="live.bilibili.com/blanc"]')) { + player.setFullscreenStatus(1) + } clearInterval(id) } ++cnt > 20 && clearInterval(id) diff --git a/src/modules/rules/search/groups/basic.scss b/src/modules/rules/search/groups/basic.scss index 3061296..2c10565 100644 --- a/src/modules/rules/search/groups/basic.scss +++ b/src/modules/rules/search/groups/basic.scss @@ -5,14 +5,6 @@ html[hide-search-page-search-sticky-header] { } } -// 隐藏 搜索结果中的广告 -html[hide-search-page-ad] { - .video-list.row - > div:has([href*='cm.bilibili.com'], .bili-video-card__info--ad, .bili-video-card__info--ad-creative) { - display: none !important; - } -} - // 隐藏 搜索结果顶部 版权作品 html[hide-search-page-bangumi-pgc-list] { .bangumi-pgc-list { @@ -27,6 +19,14 @@ html[hide-search-page-activity-game-list] { } } +// 隐藏 搜索结果中的广告 +html[hide-search-page-ad] { + .video-list.row + > div:has([href*='cm.bilibili.com'], .bili-video-card__info--ad, .bili-video-card__info--ad-creative) { + display: none !important; + } +} + // 隐藏 搜索结果中的直播 html[hide-search-page-live-room-result] { .video-list > div:has([href*='live.bilibili.com']) { diff --git a/src/modules/rules/search/groups/basic.ts b/src/modules/rules/search/groups/basic.ts index 3c305e4..d7464db 100644 --- a/src/modules/rules/search/groups/basic.ts +++ b/src/modules/rules/search/groups/basic.ts @@ -6,12 +6,6 @@ export const searchBasicItems: Item[] = [ id: 'hide-search-page-search-sticky-header', name: '顶栏 滚动页面后 不再吸附顶部', }, - { - type: 'switch', - id: 'hide-search-page-ad', - name: '隐藏 搜索结果中的广告', - defaultEnable: true, - }, { type: 'switch', id: 'hide-search-page-bangumi-pgc-list', @@ -22,6 +16,12 @@ export const searchBasicItems: Item[] = [ id: 'hide-search-page-activity-game-list', name: '隐藏 搜索结果顶部 游戏、热搜话题', }, + { + type: 'switch', + id: 'hide-search-page-ad', + name: '隐藏 搜索结果中的广告', + defaultEnable: true, + }, { type: 'switch', id: 'hide-search-page-live-room-result', From f7ea79b4600de4f240b15bd789fcfd84b8a83f0a Mon Sep 17 00:00:00 2001 From: festoney8 Date: Fri, 24 Jan 2025 18:39:57 +0800 Subject: [PATCH 17/17] update: move hide watchlater button item to common #189 --- CHANGELOG.md | 1 + src/modules/rules/channel/groups/rcmd.scss | 7 ---- src/modules/rules/channel/groups/rcmd.ts | 5 --- src/modules/rules/common/groups/basic.scss | 35 +++++++++++++++++++ src/modules/rules/common/groups/basic.ts | 5 +++ .../rules/dynamic/groups/centerDyn.scss | 7 ---- src/modules/rules/dynamic/groups/centerDyn.ts | 5 --- src/modules/rules/festival/groups/player.scss | 2 +- src/modules/rules/festival/groups/player.ts | 2 +- src/modules/rules/homepage/groups/rcmd.scss | 7 ---- src/modules/rules/homepage/groups/rcmd.ts | 5 --- src/modules/rules/popular/groups/basic.scss | 13 ------- src/modules/rules/popular/groups/basic.ts | 5 --- src/modules/rules/search/groups/basic.scss | 7 ---- src/modules/rules/search/groups/basic.ts | 5 --- src/modules/rules/space/groups/dynamic.scss | 7 ---- src/modules/rules/space/groups/dynamic.ts | 5 --- src/modules/rules/video/groups/player.scss | 2 +- src/modules/rules/video/groups/player.ts | 2 +- src/modules/rules/video/groups/right.scss | 12 ------- src/modules/rules/video/groups/right.ts | 5 --- src/modules/rules/video/groups/toolbar.scss | 2 +- src/modules/rules/video/groups/toolbar.ts | 2 +- 23 files changed, 47 insertions(+), 101 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c721acb..4a9dd88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - 新增:活动播放页 支持播放器相关净化功能 - 新增:视频过滤 BV号过滤适配新版空间页 - 优化:iframe页面适配 +- 更新:隐藏视频卡片稍后再看按钮 移入全站通用项 - 更新:评论过滤 适配新版空间页,移除旧版适配 - 更新:部分功能细节 diff --git a/src/modules/rules/channel/groups/rcmd.scss b/src/modules/rules/channel/groups/rcmd.scss index f7f3025..7962211 100644 --- a/src/modules/rules/channel/groups/rcmd.scss +++ b/src/modules/rules/channel/groups/rcmd.scss @@ -201,13 +201,6 @@ html[channel-hide-danmaku-count] { } } -// 隐藏 稍后再看按钮 -html[channel-hide-bili-watch-later] { - .bili-watch-later { - display: none !important; - } -} - // 优化 近期投稿栏目 视频行距 html[channel-feed-card-body-grid-gap] { .feed-card-body { diff --git a/src/modules/rules/channel/groups/rcmd.ts b/src/modules/rules/channel/groups/rcmd.ts index e5e053b..ccb7f8f 100644 --- a/src/modules/rules/channel/groups/rcmd.ts +++ b/src/modules/rules/channel/groups/rcmd.ts @@ -33,11 +33,6 @@ export const channelRcmdItems: Item[] = [ name: '隐藏 弹幕数', defaultEnable: true, }, - { - type: 'switch', - id: 'channel-hide-bili-watch-later', - name: '隐藏 稍后再看按钮', - }, { type: 'switch', id: 'channel-feed-card-body-grid-gap', diff --git a/src/modules/rules/common/groups/basic.scss b/src/modules/rules/common/groups/basic.scss index ad3685d..8cfb644 100644 --- a/src/modules/rules/common/groups/basic.scss +++ b/src/modules/rules/common/groups/basic.scss @@ -334,6 +334,41 @@ html[beauty-scrollbar] { } } +// 隐藏 视频卡片 稍后再看按钮 +html[hide-watchlater-button] { + .bili-watch-later { + display: none !important; + } + .bili-dyn-card-video__mark { + display: none !important; + } + + // 播放页 + .right-container .watch-later-video { + display: none !important; + } + .recommend-list-container .watch-later-video { + display: none !important; + } + + // 热门排行榜页 + .rank-container .rank-item .van-watchlater, + .history-list .video-card .van-watchlater, + .history-list .video-card .watch-later, + .weekly-list .video-card .van-watchlater, + .weekly-list .video-card .watch-later, + .popular-list .video-card .van-watchlater, + .popular-list .video-card .watch-later { + display: none !important; + } + + // 空间页 + .i-watchlater, + .bili-card-watch-later { + display: none !important; + } +} + // 隐藏 页底footer html[hide-footer] { .footer.bili-footer, diff --git a/src/modules/rules/common/groups/basic.ts b/src/modules/rules/common/groups/basic.ts index c40c1a9..84a7c7b 100644 --- a/src/modules/rules/common/groups/basic.ts +++ b/src/modules/rules/common/groups/basic.ts @@ -57,6 +57,11 @@ export const commonBasicItems: Item[] = [ name: '美化页面滚动条', defaultEnable: true, }, + { + type: 'switch', + id: 'hide-watchlater-button', + name: '隐藏 视频卡片 稍后再看按钮', + }, { type: 'switch', id: 'url-cleaner', diff --git a/src/modules/rules/dynamic/groups/centerDyn.scss b/src/modules/rules/dynamic/groups/centerDyn.scss index e14a280..6689e69 100644 --- a/src/modules/rules/dynamic/groups/centerDyn.scss +++ b/src/modules/rules/dynamic/groups/centerDyn.scss @@ -36,13 +36,6 @@ html[hide-dynamic-page-bili-dyn-dispute] { } } -// 隐藏 稍后再看按钮 -html[hide-dynamic-page-bili-dyn-watchlater] { - .bili-dyn-card-video__mark { - display: none !important; - } -} - // 隐藏 官方话题Tag html[hide-dynamic-page-bili-dyn-official-topic] { .bili-dyn-content__orig__topic, diff --git a/src/modules/rules/dynamic/groups/centerDyn.ts b/src/modules/rules/dynamic/groups/centerDyn.ts index ea40cbe..f1aa9f0 100644 --- a/src/modules/rules/dynamic/groups/centerDyn.ts +++ b/src/modules/rules/dynamic/groups/centerDyn.ts @@ -22,11 +22,6 @@ export const dynamicCenterDynItems: Item[] = [ name: '隐藏 警告notice', defaultEnable: true, }, - { - type: 'switch', - id: 'hide-dynamic-page-bili-dyn-watchlater', - name: '隐藏 稍后再看按钮', - }, { type: 'switch', id: 'hide-dynamic-page-bili-dyn-official-topic', diff --git a/src/modules/rules/festival/groups/player.scss b/src/modules/rules/festival/groups/player.scss index fd697eb..4fd9e08 100644 --- a/src/modules/rules/festival/groups/player.scss +++ b/src/modules/rules/festival/groups/player.scss @@ -83,7 +83,7 @@ html[video-page-hide-bpx-player-bili-reserve] { } } -// 隐藏 视频链接 (稍后再看) +// 隐藏 视频链接 html[video-page-hide-bpx-player-bili-link] { .bili-link, .bili-danmaku-x-link { diff --git a/src/modules/rules/festival/groups/player.ts b/src/modules/rules/festival/groups/player.ts index 86038da..5a082a3 100644 --- a/src/modules/rules/festival/groups/player.ts +++ b/src/modules/rules/festival/groups/player.ts @@ -50,7 +50,7 @@ export const festivalPlayerItems: Item[] = [ { type: 'switch', id: 'video-page-hide-bpx-player-bili-link', - name: '隐藏 视频链接 (稍后再看)', + name: '隐藏 视频链接', }, { type: 'switch', diff --git a/src/modules/rules/homepage/groups/rcmd.scss b/src/modules/rules/homepage/groups/rcmd.scss index d9e9bd0..af1c29e 100644 --- a/src/modules/rules/homepage/groups/rcmd.scss +++ b/src/modules/rules/homepage/groups/rcmd.scss @@ -91,13 +91,6 @@ html[homepage-hide-bili-watch-later-tip] main { } } -// 隐藏 稍后再看按钮 -html[homepage-hide-bili-watch-later] main { - .bili-watch-later { - display: none !important; - } -} - // 隐藏 视频预览中的弹幕 html[homepage-hide-inline-player-danmaku] main { .bpx-player-row-dm-wrap, diff --git a/src/modules/rules/homepage/groups/rcmd.ts b/src/modules/rules/homepage/groups/rcmd.ts index 8cffe83..815db68 100644 --- a/src/modules/rules/homepage/groups/rcmd.ts +++ b/src/modules/rules/homepage/groups/rcmd.ts @@ -39,11 +39,6 @@ export const homepageRcmdItems: Item[] = [ id: 'homepage-hide-bili-watch-later-tip', name: '隐藏 稍后再看提示语', }, - { - type: 'switch', - id: 'homepage-hide-bili-watch-later', - name: '隐藏 稍后再看按钮', - }, { type: 'switch', id: 'homepage-hide-inline-player-danmaku', diff --git a/src/modules/rules/popular/groups/basic.scss b/src/modules/rules/popular/groups/basic.scss index d467564..f678ba5 100644 --- a/src/modules/rules/popular/groups/basic.scss +++ b/src/modules/rules/popular/groups/basic.scss @@ -152,19 +152,6 @@ html[popular-hide-tips] { } } -// 隐藏 稍后再看按钮 -html[popular-hide-watchlater] { - .rank-container .rank-item .van-watchlater, - .history-list .video-card .van-watchlater, - .history-list .video-card .watch-later, - .weekly-list .video-card .van-watchlater, - .weekly-list .video-card .watch-later, - .popular-list .video-card .van-watchlater, - .popular-list .video-card .watch-later { - display: none !important; - } -} - // 隐藏 弹幕数 html[popular-hide-danmaku-count] { .popular-list .video-stat .like-text, diff --git a/src/modules/rules/popular/groups/basic.ts b/src/modules/rules/popular/groups/basic.ts index aa4f1df..0579b7d 100644 --- a/src/modules/rules/popular/groups/basic.ts +++ b/src/modules/rules/popular/groups/basic.ts @@ -18,11 +18,6 @@ export const popularBasicItems: Item[] = [ name: '隐藏 tips', defaultEnable: true, }, - { - type: 'switch', - id: 'popular-hide-watchlater', - name: '隐藏 稍后再看按钮', - }, { type: 'switch', id: 'popular-hide-danmaku-count', diff --git a/src/modules/rules/search/groups/basic.scss b/src/modules/rules/search/groups/basic.scss index 2c10565..08ece79 100644 --- a/src/modules/rules/search/groups/basic.scss +++ b/src/modules/rules/search/groups/basic.scss @@ -47,10 +47,3 @@ html[hide-search-page-date] { display: none !important; } } - -// 隐藏 稍后再看按钮 -html[hide-search-page-bili-watch-later] { - .bili-video-card .bili-watch-later { - display: none !important; - } -} diff --git a/src/modules/rules/search/groups/basic.ts b/src/modules/rules/search/groups/basic.ts index d7464db..ffb64c2 100644 --- a/src/modules/rules/search/groups/basic.ts +++ b/src/modules/rules/search/groups/basic.ts @@ -38,9 +38,4 @@ export const searchBasicItems: Item[] = [ id: 'hide-search-page-date', name: '隐藏 视频日期', }, - { - type: 'switch', - id: 'hide-search-page-bili-watch-later', - name: '隐藏 稍后再看按钮', - }, ] diff --git a/src/modules/rules/space/groups/dynamic.scss b/src/modules/rules/space/groups/dynamic.scss index e14a280..6689e69 100644 --- a/src/modules/rules/space/groups/dynamic.scss +++ b/src/modules/rules/space/groups/dynamic.scss @@ -36,13 +36,6 @@ html[hide-dynamic-page-bili-dyn-dispute] { } } -// 隐藏 稍后再看按钮 -html[hide-dynamic-page-bili-dyn-watchlater] { - .bili-dyn-card-video__mark { - display: none !important; - } -} - // 隐藏 官方话题Tag html[hide-dynamic-page-bili-dyn-official-topic] { .bili-dyn-content__orig__topic, diff --git a/src/modules/rules/space/groups/dynamic.ts b/src/modules/rules/space/groups/dynamic.ts index 7fa32e7..fcee854 100644 --- a/src/modules/rules/space/groups/dynamic.ts +++ b/src/modules/rules/space/groups/dynamic.ts @@ -21,11 +21,6 @@ export const spaceDynamicItems: Item[] = [ id: 'hide-dynamic-page-bili-dyn-dispute', name: '隐藏 警告notice', }, - { - type: 'switch', - id: 'hide-dynamic-page-bili-dyn-watchlater', - name: '隐藏 稍后再看按钮', - }, { type: 'switch', id: 'hide-dynamic-page-bili-dyn-official-topic', diff --git a/src/modules/rules/video/groups/player.scss b/src/modules/rules/video/groups/player.scss index fd697eb..4fd9e08 100644 --- a/src/modules/rules/video/groups/player.scss +++ b/src/modules/rules/video/groups/player.scss @@ -83,7 +83,7 @@ html[video-page-hide-bpx-player-bili-reserve] { } } -// 隐藏 视频链接 (稍后再看) +// 隐藏 视频链接 html[video-page-hide-bpx-player-bili-link] { .bili-link, .bili-danmaku-x-link { diff --git a/src/modules/rules/video/groups/player.ts b/src/modules/rules/video/groups/player.ts index 2576dba..467e164 100644 --- a/src/modules/rules/video/groups/player.ts +++ b/src/modules/rules/video/groups/player.ts @@ -50,7 +50,7 @@ export const videoPlayerItems: Item[] = [ { type: 'switch', id: 'video-page-hide-bpx-player-bili-link', - name: '隐藏 视频链接 (稍后再看)', + name: '隐藏 视频链接', }, { type: 'switch', diff --git a/src/modules/rules/video/groups/right.scss b/src/modules/rules/video/groups/right.scss index eab4e9d..87d64a3 100644 --- a/src/modules/rules/video/groups/right.scss +++ b/src/modules/rules/video/groups/right.scss @@ -218,18 +218,6 @@ html[video-page-hide-right-container-duration] { } } -// 隐藏 相关视频 稍后再看按钮 -html[video-page-hide-right-container-reco-list-watch-later-video] { - .right-container .watch-later-video { - display: none !important; - } - - // 适配watchlater, favlist - .recommend-list-container .watch-later-video { - display: none !important; - } -} - // 隐藏 相关视频 UP主 html[video-page-hide-right-container-reco-list-rec-list-info-up] { .right-container .info { diff --git a/src/modules/rules/video/groups/right.ts b/src/modules/rules/video/groups/right.ts index abeb273..032fc80 100644 --- a/src/modules/rules/video/groups/right.ts +++ b/src/modules/rules/video/groups/right.ts @@ -86,11 +86,6 @@ export const videoRightItems: Item[] = [ id: 'video-page-hide-right-container-duration', name: '隐藏 相关视频 视频时长', }, - { - type: 'switch', - id: 'video-page-hide-right-container-reco-list-watch-later-video', - name: '隐藏 相关视频 稍后再看按钮', - }, { type: 'switch', id: 'video-page-hide-right-container-reco-list-rec-list-info-up', diff --git a/src/modules/rules/video/groups/toolbar.scss b/src/modules/rules/video/groups/toolbar.scss index 16bada5..66e2b1b 100644 --- a/src/modules/rules/video/groups/toolbar.scss +++ b/src/modules/rules/video/groups/toolbar.scss @@ -26,7 +26,7 @@ html[video-page-hide-below-info-video-note] { } } -// 隐藏 举报/笔记/稍后再看 +// 隐藏 折叠菜单 html[video-page-hide-below-info-video-report-menu] { .video-toolbar-right .video-tool-more { display: none !important; diff --git a/src/modules/rules/video/groups/toolbar.ts b/src/modules/rules/video/groups/toolbar.ts index 3e46b05..73761f3 100644 --- a/src/modules/rules/video/groups/toolbar.ts +++ b/src/modules/rules/video/groups/toolbar.ts @@ -63,7 +63,7 @@ export const videoToolbarItems: Item[] = [ { type: 'switch', id: 'video-page-hide-below-info-video-report-menu', - name: '隐藏 举报/笔记/稍后再看', + name: '隐藏 折叠菜单', }, { type: 'switch',