diff --git a/manifest.json b/manifest.json index 24eaa05..1f2d63f 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "gridexplorer", "name": "GridExplorer", - "version": "2.6.0", + "version": "2.6.1", "minAppVersion": "1.1.0", "description": "Browse note files in a grid view.", "author": "Devon22", diff --git a/package-lock.json b/package-lock.json index 959f59f..a7da3d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gridexplorer", - "version": "2.6.0", + "version": "2.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gridexplorer", - "version": "2.6.0", + "version": "2.6.1", "license": "MIT", "devDependencies": { "@types/node": "^16.11.6", diff --git a/package.json b/package.json index 9bd8dfd..c53ee58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gridexplorer", - "version": "2.6.0", + "version": "2.6.1", "description": "Browse note files in a grid view.", "main": "main.js", "scripts": { diff --git a/src/GridView.ts b/src/GridView.ts index 1276304..1c37284 100644 --- a/src/GridView.ts +++ b/src/GridView.ts @@ -189,10 +189,7 @@ export class GridView extends ItemView { if(mode.startsWith('custom-')) { this.customOptionIndex = -1; // 切換自訂模式時重設選項索引 - this.sortType = ''; - this.folderSortType = ''; - } else { - this.sortType = this.plugin.settings.defaultSortType; + this.folderSortType = 'none'; } if(mode !== '') this.sourceMode = mode; @@ -1121,7 +1118,7 @@ export class GridView extends ItemView { // 設定網格項目寬度和高度等設定 const settings = this.plugin.settings; const gridItemWidth = this.cardLayout === 'vertical' ? settings.verticalGridItemWidth : settings.gridItemWidth; - const gridItemHeight = settings.gridItemHeight; + const gridItemHeight = this.cardLayout === 'vertical' ? settings.verticalGridItemHeight : settings.gridItemHeight; const imageAreaWidth = settings.imageAreaWidth; const imageAreaHeight = this.cardLayout === 'vertical' ? settings.verticalImageAreaHeight : settings.imageAreaHeight; @@ -1135,6 +1132,17 @@ export class GridView extends ItemView { container.style.setProperty('--image-area-height', imageAreaHeight + 'px'); container.style.setProperty('--title-font-size', settings.titleFontSize + 'em'); + // 依圖片位置設定切換樣式類別 + if (this.cardLayout === 'vertical') { + if (settings.verticalCardImagePosition === 'top') { + container.addClass('ge-image-top'); + container.removeClass('ge-image-bottom'); + } else { + container.addClass('ge-image-bottom'); + container.removeClass('ge-image-top'); + } + } + // 添加點擊空白處取消選中的事件處理器 container.addEventListener('click', (event) => { // 只有當點擊的是容器本身,而不是其子元素時才清除選中 @@ -1227,7 +1235,7 @@ export class GridView extends ItemView { if (noteFile instanceof TFile) { // 使用 span 代替 button,只顯示圖示 const noteIcon = titleContainer.createEl('span', { - cls: 'ge-note-button' + cls: 'ge-foldernote-button' }); setIcon(noteIcon, 'panel-left-open'); @@ -1241,11 +1249,8 @@ export class GridView extends ItemView { const metadata = this.app.metadataCache.getFileCache(noteFile)?.frontmatter; const colorValue = metadata?.color; if (colorValue) { - // 設置背景色、框線色和文字顏色 - folderEl.setAttribute('style', ` - background-color: rgba(var(--color-${colorValue}-rgb), 0.2); - border-color: rgba(var(--color-${colorValue}-rgb), 0.5); - `); + // 依顏色名稱加入對應的樣式類別 + folderEl.addClass(`ge-folder-color-${colorValue}`); } const iconValue = metadata?.icon; if (iconValue) { @@ -1962,26 +1967,47 @@ export class GridView extends ItemView { const currentToken = ++this.renderToken; // 設定批次渲染狀態 const state: DividerState = { lastDateString: lastDateString, pinDividerAdded: pinDividerAdded, blankDividerAdded: blankDividerAdded }; - const batchSize = 50; const paramsBase: FileRenderParams = { container, observer, files, dateDividerMode, sortType, shouldShowDateDividers, state }; const selfRef = this; - const processBatch = (start: number) => { - // 若 token 不符,代表使用者已切換資料夾或重新渲染,直接停止 - if (currentToken !== this.renderToken) return; - const end = Math.min(start + batchSize, files.length); - for (let i = start; i < end; i++) { - selfRef.processFile(files[i], paramsBase); - } - if (end < files.length) { - const cb = () => processBatch(end); - if (typeof (window as any).requestIdleCallback === 'function') { - (window as any).requestIdleCallback(cb); - } else { - setTimeout(cb, 0); + + if (Platform.isIosApp) { + // iOS 專用:以 time-slice 方式分批,避免阻塞點擊事件 + const TIME_BUDGET_MS = 6; // 每幀最多執行 6ms + const processChunk = (start: number) => { + if (currentToken !== this.renderToken) return; + const startTime = performance.now(); + let i = start; + for (; i < files.length; i++) { + selfRef.processFile(files[i], paramsBase); + if (performance.now() - startTime > TIME_BUDGET_MS) { + break; // 超過時間預算,讓出主執行緒 + } } - } - }; - processBatch(0); + if (i < files.length) { + requestAnimationFrame(() => processChunk(i)); // 下一幀繼續 + } + }; + processChunk(0); + } else { + // 其他平台維持原本固定 batchSize 的邏輯 + const batchSize = 50; + const processBatch = (start: number) => { + if (currentToken !== this.renderToken) return; + const end = Math.min(start + batchSize, files.length); + for (let i = start; i < end; i++) { + selfRef.processFile(files[i], paramsBase); + } + if (end < files.length) { + const cb = () => processBatch(end); + if (typeof (window as any).requestIdleCallback === 'function') { + (window as any).requestIdleCallback(cb); + } else { + setTimeout(cb, 0); + } + } + }; + processBatch(0); + } } // 為資料夾項目添加拖曳目標功能 diff --git a/src/modal/mediaModal.ts b/src/modal/mediaModal.ts index 26c85db..04f366b 100644 --- a/src/modal/mediaModal.ts +++ b/src/modal/mediaModal.ts @@ -147,8 +147,6 @@ export class MediaModal extends Modal { this.isZoomed = false; const mediaFile = this.mediaFiles[index]; - - if (isImageFile(mediaFile)) { // 創建圖片元素 diff --git a/src/settings.ts b/src/settings.ts index 98f9beb..7f7ac77 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -27,7 +27,9 @@ export interface GallerySettings { imageAreaWidth: number; // 圖片區域寬度 imageAreaHeight: number; // 圖片區域高度 verticalGridItemWidth: number; // 直向卡片 - 網格項目寬度 + verticalGridItemHeight: number; // 直向卡片 - 網格項目高度 verticalImageAreaHeight: number; // 直向卡片 - 圖片區域高度 + verticalCardImagePosition: 'top' | 'bottom'; // 直向卡片圖片位置 titleFontSize: number; // 筆記標題的字型大小 multiLineTitle: boolean; // 標題允許兩行顯示 summaryLength: number; // 筆記摘要的字數 @@ -62,7 +64,7 @@ export interface GallerySettings { interceptBreadcrumbClicks: boolean; // 攔截Breadcrumb點擊事件 customModes: CustomMode[]; // 自訂模式 quickAccessCommandPath: string; // Path used by "Open quick access folder" command - quickAccessModeType: 'bookmarks' | 'search' | 'backlinks' | 'outgoinglinks' | 'all-files' | 'recent-files' | 'random-note' | 'tasks'; // View types used by "Open quick access view" command + quickAccessModeType: string; // View types used by "Open quick access view" command useQuickAccessAsNewTabMode: 'default' | 'folder' | 'mode'; // Use quick access (folder or mode) as a new tab view } @@ -76,7 +78,9 @@ export const DEFAULT_SETTINGS: GallerySettings = { imageAreaWidth: 100, // 圖片區域寬度,預設 100 imageAreaHeight: 80, // 圖片區域高度,預設 80 verticalGridItemWidth: 200, // 直向卡片 - 網格項目寬度 + verticalGridItemHeight: 0, // 直向卡片 - 網格項目高度 verticalImageAreaHeight: 180, // 直向卡片 - 圖片區域高度 + verticalCardImagePosition: 'top', // 直向卡片圖片位置 titleFontSize: 1.0, // 筆記標題的字型大小,預設 1.0 multiLineTitle: false, summaryLength: 100, // 筆記摘要的字數,預設 100 @@ -867,6 +871,21 @@ export class GridExplorerSettingTab extends PluginSettingTab { }); }); + // 直向卡片 - 網格項目高度 + const vGridItemHeightSetting = new Setting(containerEl) + .setName(`${t('vertical_card')} ${t('grid_item_height')}`) + .setDesc(`${t('grid_item_height_desc')} (now: ${this.plugin.settings.verticalGridItemHeight}px)`) + .addSlider(slider => { + slider.setLimits(0, 600, 10) + .setValue(this.plugin.settings.verticalGridItemHeight) + .setDynamicTooltip() + .onChange(async (value) => { + vGridItemHeightSetting.setDesc(`${t('grid_item_height_desc')} (now: ${value}px)`); + this.plugin.settings.verticalGridItemHeight = value; + await this.plugin.saveSettings(); + }); + }); + // 直向卡片 - 圖片區域高度 const vImageAreaHeightSetting = new Setting(containerEl) .setName(`${t('vertical_card')} ${t('image_area_height')}`) @@ -882,6 +901,20 @@ export class GridExplorerSettingTab extends PluginSettingTab { }); }); + // 直向卡片圖片位置 + new Setting(containerEl) + .setName(`${t('vertical_card')} ${t('image_position')}`) + .setDesc(t('image_position_desc')) + .addDropdown(dropdown => { + dropdown.addOption('top', t('top')); + dropdown.addOption('bottom', t('bottom')); + dropdown.setValue(this.plugin.settings.verticalCardImagePosition); + dropdown.onChange(async (value: 'top' | 'bottom') => { + this.plugin.settings.verticalCardImagePosition = value; + await this.plugin.saveSettings(); + }); + }); + //筆記標題的字型大小 const titleFontSizeSetting = new Setting(containerEl) .setName(t('title_font_size')) @@ -980,17 +1013,20 @@ export class GridExplorerSettingTab extends PluginSettingTab { .setName(t('quick_access_mode_name')) .setDesc(t('quick_access_mode_desc')) .addDropdown(dropdown => { + for(let i = 0; i < this.plugin.settings.customModes.length; i++) { + dropdown.addOption(this.plugin.settings.customModes[i].internalName, `🧩 ${this.plugin.settings.customModes[i].displayName}`); + } dropdown - .addOption('bookmarks', t('bookmarks_mode')) - .addOption('search', t('search_results')) - .addOption('backlinks', t('backlinks_mode')) - .addOption('outgoinglinks', t('outgoinglinks_mode')) - .addOption('all-files', t('all_files_mode')) - .addOption('recent-files', t('recent_files_mode')) - .addOption('random-note', t('random_note_mode')) - .addOption('tasks', t('tasks_mode')) + .addOption('bookmarks', `📑 ${t('bookmarks_mode')}`) + .addOption('search', `🔍 ${t('search_results')}`) + .addOption('backlinks', `🔗 ${t('backlinks_mode')}`) + .addOption('outgoinglinks', `🔗 ${t('outgoinglinks_mode')}`) + .addOption('all-files', `📔 ${t('all_files_mode')}`) + .addOption('recent-files', `📅 ${t('recent_files_mode')}`) + .addOption('random-note', `🎲 ${t('random_note_mode')}`) + .addOption('tasks', `☑️ ${t('tasks_mode')}`) .setValue(this.plugin.settings.quickAccessModeType) - .onChange(async (value: 'bookmarks' | 'search' | 'backlinks' | 'outgoinglinks' | 'all-files' | 'recent-files' | 'random-note' | 'tasks') => { + .onChange(async (value: string) => { this.plugin.settings.quickAccessModeType = value; await this.plugin.saveSettings(false); }); diff --git a/src/translations.ts b/src/translations.ts index 9ce5358..a1f925a 100644 --- a/src/translations.ts +++ b/src/translations.ts @@ -120,6 +120,10 @@ export const TRANSLATIONS: Translations = { 'card_layout_desc': '選擇預設的卡片版面樣式', 'horizontal_card': '橫向卡片', 'vertical_card': '直向卡片', + 'image_position': '圖片位置', + 'image_position_desc': '設定圖片的位置', + 'top': '頂部', + 'bottom': '底部', 'multi_line_title': '標題支援多行顯示', 'multi_line_title_desc': '設定是否允許標題多行顯示', 'show_code_block_in_summary': '摘要中顯示CodeBlock', @@ -377,6 +381,10 @@ export const TRANSLATIONS: Translations = { 'card_layout_desc': 'Choose default card layout', 'horizontal_card': 'Horizontal card', 'vertical_card': 'Vertical card', + 'image_position': 'Image position', + 'image_position_desc': 'Set the position of the image', + 'top': 'Top', + 'bottom': 'Bottom', 'multi_line_title': 'Multi-line title', 'multi_line_title_desc': 'Set whether to allow multi-line title', 'show_code_block_in_summary': 'Show code block in summary', @@ -634,6 +642,10 @@ export const TRANSLATIONS: Translations = { 'card_layout_desc': '选择默认卡片布局', 'horizontal_card': '水平卡片', 'vertical_card': '垂直卡片', + 'image_position': '图片位置', + 'image_position_desc': '设置图片的位置', + 'top': '顶部', + 'bottom': '底部', 'multi_line_title': '标题支持多行显示', 'multi_line_title_desc': '设置是否允许标题多行显示', 'show_code_block_in_summary': '摘要中显示CodeBlock', @@ -891,6 +903,10 @@ export const TRANSLATIONS: Translations = { 'card_layout_desc': 'デフォルトのカードレイアウトを選択', 'horizontal_card': '水平カード', 'vertical_card': '垂直カード', + 'image_position': '画像位置', + 'image_position_desc': '画像の位置を設定', + 'top': '上部', + 'bottom': '下部', 'multi_line_title': 'タイトルサポート多行表示', 'multi_line_title_desc': 'タイトルを多行表示するかどうかを設定', 'show_code_block_in_summary': '要約にCodeBlockを表示', @@ -1149,6 +1165,10 @@ export const TRANSLATIONS: Translations = { 'card_layout_desc': 'Выберите макет карточки по умолчанию', 'horizontal_card': 'Горизонтальная карточка', 'vertical_card': 'Вертикальная карточка', + 'image_position': 'Позиция изображения', + 'image_position_desc': 'Установите позицию изображения', + 'top': 'Верх', + 'bottom': 'Низ', 'multi_line_title': 'Поддержка многоточия заголовка', 'multi_line_title_desc': 'Установите, чтобы разрешить многоточие заголовка', 'show_code_block_in_summary': 'Показывать CodeBlock в кратком описании', @@ -1406,6 +1426,10 @@ export const TRANSLATIONS: Translations = { 'card_layout_desc': 'Виберіть макет карточки за замовчуванням', 'horizontal_card': 'Горизонтальна карточка', 'vertical_card': 'Вертикальна карточка', + 'image_position': 'Позиція зображення', + 'image_position_desc': 'Встановіть позицію зображення', + 'top': 'Верх', + 'bottom': 'Нижче', 'multi_line_title': 'Подтримка многоточня заголовка', 'multi_line_title_desc': 'Встановіть, щоб дозволити многоточня заголовка', 'show_code_block_in_summary': 'Показувати CodeBlock в короткому описі', diff --git a/styles.css b/styles.css index 7f66410..7646b1f 100644 --- a/styles.css +++ b/styles.css @@ -1,29 +1,14 @@ +/* 網格視圖容器 Grid View Container */ .ge-grid-view-container { padding: 0px; height: 100%; } -/* 選擇資料夾的樣式 */ -.ge-grid-view-folder-option { - cursor: pointer; - padding: 8px; - margin-bottom: 8px; - border: 1px solid var(--background-modifier-border); - border-radius: 4px; -} -.ge-grid-view-folder-option:hover { - background-color: var(--background-modifier-hover); -} -/* ascii tree prefix */ -.ge-folder-tree-prefix { - font-family: monospace; - white-space: pre; - color: var(--text-muted); -} +/* --------------------------------------------------------------------------- */ -/* Grid 樣式 */ +/* 網格容器 Grid Container */ .ge-grid-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--grid-item-width, 300px), 1fr)); @@ -36,12 +21,13 @@ overflow-y: auto; } +/* 行動裝置隱藏滾動條 Mobile hidden Scrollbar */ .is-mobile .ge-grid-container::-webkit-scrollbar { display: none !important; width: 0 !important; } -/* Grid 項目樣式 */ +/* 網格項目 Grid Item */ .ge-grid-item { background-color: var(--background-primary); border: 1px solid var(--background-modifier-border); @@ -60,6 +46,7 @@ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } +/* 摘要區域 Content Area */ .ge-content-area { flex: 1; min-width: 0; @@ -68,15 +55,7 @@ justify-content: flex-start; } -.ge-break { - grid-column: 1 / -1; - height: 0; - margin: 0; - padding: 0; - border-top: 1px solid var(--background-modifier-border); - border-bottom: 1px solid var(--background-primary); -} - +/* 標題容器 Title Container */ .ge-title-container { display: flex; align-items: center; @@ -84,6 +63,7 @@ width: 100%; } +/* 標題圖示 Icon Container */ .ge-icon-container { display: flex; align-items: center; @@ -92,34 +72,39 @@ width: 18px; height: 18px; color: var(--text-muted); - align-self: flex-start; /* 讓icon自身靠上 */ - margin-top: 1px; } +/* 圖片圖示 Image Icon */ .ge-icon-container.ge-img { color: var(--color-blue); } +/* 影片圖示 Video Icon */ .ge-icon-container.ge-video { color: var(--color-red); } +/* 音樂圖示 Audio Icon */ .ge-icon-container.ge-audio { color: var(--color-purple); } +/* PDF圖示 PDF Icon */ .ge-icon-container.ge-pdf { color: var(--color-orange); } +/* Canvas圖示 Canvas Icon */ .ge-icon-container.ge-canvas { color: var(--color-green); } +/* 基礎圖示 Base Icon */ .ge-icon-container.ge-base { color: var(--color-cyan); } +/* 標題 Title */ .ge-title { margin: 0 0 0 3px; font-size: var(--title-font-size); @@ -131,7 +116,7 @@ width: 100%; } -/* 多行標題支援 */ +/* 多行標題支援 Multiline Title */ .ge-multiline-title { white-space: normal !important; display: -webkit-box; @@ -141,29 +126,7 @@ overflow: hidden; } -.ge-note-button { - color: var(--text-muted); - cursor: pointer; - margin-left: 8px; - opacity: 0.7; - transition: opacity 0.2s ease; - background: none; - border: none; - padding: 0; - display: flex; - align-items: center; -} - -.ge-note-button:hover { - opacity: 1; - color: var(--text-accent); -} - -.ge-note-button svg { - width: 18px; - height: 18px; -} - +/* 摘要p Content Area p */ .ge-content-area p { margin: 5px 0 0 0; color: var(--text-faint); @@ -185,6 +148,7 @@ margin: 0; } +/* 圖片區域 Image Area */ .ge-image-area { width: var(--image-area-width); height: var(--image-area-height); @@ -205,15 +169,14 @@ border-radius: 4px; } -/* 卡片模式 ------------------------------------------------------------------ */ -/* 將 ge-grid-container 包在帶有 .ge-vertical-card 的容器中以啟用 */ +/* 直向卡片容器 Vertical Card Container */ .ge-vertical-card .ge-grid-container { /* 使用既有的欄寬變數,僅改 gap 與 padding 以符合卡片視覺 */ gap: 16px; padding: 16px !important; } -/* 單一卡片 */ +/* 直向卡片 Vertical Card Item */ .ge-vertical-card .ge-grid-item { /* 垂直排列 */ flex-direction: column; @@ -222,14 +185,14 @@ gap: 12px; } -/* 摘要文字跟隨標題之後 */ +/* 摘要文字 Content Area */ .ge-vertical-card .ge-content-area { order: 1; flex: 1 1 auto; /* 使摘要區撐開,標籤可貼底 */ flex-grow: 1; /* Add this line */ } -/* 圖片置中,滿版顯示 */ +/* 圖片置中,滿版顯示 Image Area */ .ge-vertical-card .ge-image-area { order: 3; width: 100%; @@ -241,18 +204,36 @@ border-radius: 6px; } -/* 標籤列置底 */ +/* 標籤列置底 Tags Container */ .ge-vertical-card .ge-tags-container { order: 4; margin-top: 6px; } +/* 按設定切換直向卡片圖片位置 */ +.ge-vertical-card.ge-image-top .ge-image-area { + order: 1; +} + +.ge-vertical-card.ge-image-top .ge-content-area { + order: 3; +} + +/* 預設 bottom 可維持原有順序,以下為明確設置 */ +.ge-vertical-card.ge-image-bottom .ge-image-area { + order: 3; +} + +.ge-vertical-card.ge-image-bottom .ge-content-area { + order: 1; +} + /* 鼠標懸停效果:整張卡片微抬升 */ .ge-vertical-card .ge-grid-item:hover { transform: translateY(-2px); } -/* 僅圖片/影片的直向卡片 ---------------------------------------------- */ +/* 僅圖片/影片的直向卡片 Media Card */ .ge-vertical-card .ge-media-card { padding: 0; /* 移除內距,讓媒體填滿 */ border: none; @@ -277,9 +258,7 @@ display: none !important; /* 隱藏標題、摘要、標籤 */ } -/* --------------------------------------------------------------------------- */ - -/* 標籤樣式 */ +/* 標籤容器 Tags Container */ .ge-tags-container { display: flex; flex-wrap: wrap; @@ -288,6 +267,7 @@ margin-bottom: 2px; } +/* 標籤樣式 Tag Style */ .ge-tag { display: inline-flex; align-items: center; @@ -303,7 +283,46 @@ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } -/* 資料夾項目的特殊樣式 */ +/* 影片縮圖樣式 */ +.ge-video-thumbnail { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--background-secondary); + border-radius: 4px; +} + +.ge-video-thumbnail svg { + width: 40px; + height: 40px; + color: var(--text-accent); +} + +/* 選中項目的樣式 Selected Item */ +.ge-selected-item { + outline: 1px solid var(--vault-profile-color-hover) !important; + outline-offset: -1px; + position: relative; + z-index: 1; +} + +/* 拖曳相關樣式 Dragging */ +.ge-grid-item.ge-dragging { + opacity: 0.5; + transform: scale(0.95); + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); +} + +.ge-folder-item.ge-dragover { + border: 2px dashed var(--interactive-accent); + transform: scale(1.05); +} + +/* --------------------------------------------------------------------------- */ + +/* 資料夾項目 Folder Item */ .ge-grid-item.ge-folder-item { background-color: var(--background-primary-alt); border: 2px solid var(--background-modifier-border); @@ -327,9 +346,8 @@ color: var(--text-normal); } -/* 調整資料夾項目的高度 */ .ge-grid-item.ge-folder-item .ge-content-area { - min-height: 0px; + min-height: 0px; /* 設定最小高度 */ justify-content: center; } @@ -337,6 +355,76 @@ align-items: center; } +/* 資料夾顏色 Folder Color */ +.ge-grid-item.ge-folder-item.ge-folder-color-red { + background-color: rgba(var(--color-red-rgb), 0.2); + border-color: rgba(var(--color-red-rgb), 0.5); +} +.ge-grid-item.ge-folder-item.ge-folder-color-orange { + background-color: rgba(var(--color-orange-rgb), 0.2); + border-color: rgba(var(--color-orange-rgb), 0.5); +} +.ge-grid-item.ge-folder-item.ge-folder-color-yellow { + background-color: rgba(var(--color-yellow-rgb), 0.2); + border-color: rgba(var(--color-yellow-rgb), 0.5); +} +.ge-grid-item.ge-folder-item.ge-folder-color-green { + background-color: rgba(var(--color-green-rgb), 0.2); + border-color: rgba(var(--color-green-rgb), 0.5); +} +.ge-grid-item.ge-folder-item.ge-folder-color-cyan { + background-color: rgba(var(--color-cyan-rgb), 0.2); + border-color: rgba(var(--color-cyan-rgb), 0.5); +} +.ge-grid-item.ge-folder-item.ge-folder-color-blue { + background-color: rgba(var(--color-blue-rgb), 0.2); + border-color: rgba(var(--color-blue-rgb), 0.5); +} +.ge-grid-item.ge-folder-item.ge-folder-color-purple { + background-color: rgba(var(--color-purple-rgb), 0.2); + border-color: rgba(var(--color-purple-rgb), 0.5); +} +.ge-grid-item.ge-folder-item.ge-folder-color-pink { + background-color: rgba(var(--color-pink-rgb), 0.2); + border-color: rgba(var(--color-pink-rgb), 0.5); +} + +/* 資料夾上的資料夾筆記按鈕 Folder Note Button */ +.ge-foldernote-button { + color: var(--text-muted); + cursor: pointer; + margin-left: 8px; + opacity: 0.7; + transition: opacity 0.2s ease; + background: none; + border: none; + padding: 0; + display: flex; + align-items: center; +} + +.ge-foldernote-button:hover { + opacity: 1; + color: var(--text-accent); +} + +.ge-foldernote-button svg { + width: 18px; + height: 18px; +} + +/* --------------------------------------------------------------------------- */ + +/* 分隔線 Break */ +.ge-break { + grid-column: 1 / -1; + height: 0; + margin: 0; + padding: 0; + border-top: 1px solid var(--background-modifier-border); + border-bottom: 1px solid var(--background-primary); +} + /* 日期分隔器樣式 */ .ge-date-divider { width: 100%; @@ -377,7 +465,29 @@ margin-left: 2px; } -/* 頂部按鈕區域樣式 */ +/* 搜尋載入中 Loading Indicator */ +.ge-loading-indicator { + grid-column: 1 / -1; + display: flex; + justify-content: center; + align-items: center; + height: 100px; + font-size: 1.2em; + color: var(--text-muted); +} + +/* 沒有找到文件 No Files Found */ +.ge-no-files { + grid-column: 1 / -1; + text-align: center; + padding: 2em; + color: var(--text-muted); + font-size: 1.2em; +} + +/* --------------------------------------------------------------------------- */ + +/* 頂部按鈕區域樣式 Header Buttons */ .ge-header-buttons { display: flex; gap: 8px; @@ -415,7 +525,6 @@ transform: translateY(0); } -/* 特定按鈕樣式 */ .ge-header-buttons .sort-button, .ge-header-buttons .reselect-button, .ge-header-buttons .refresh-button, @@ -424,6 +533,9 @@ align-items: center; } +/* --------------------------------------------------------------------------- */ + +/* 資料夾名稱區域樣式 Folder Name Content */ .ge-foldername-content { justify-content: center; padding: 10px 8px 9px 8px; @@ -453,6 +565,7 @@ margin-right: 6px; } +/* 上層資料夾連結樣式 Parent Folder Link */ .ge-parent-folder-link { text-decoration: none; padding: 5px; @@ -481,7 +594,9 @@ text-decoration: none; } -/* 搜尋對話框樣式 */ +/* --------------------------------------------------------------------------- */ + +/* 搜尋對話框樣式 Search Container */ .ge-search-container { margin-bottom: 8px; position: relative; @@ -527,7 +642,7 @@ height: 16px; } -/* 標籤顯示區域 */ +/* 標籤顯示區域 Search Tag Display Area */ .ge-search-tag-display-area { display: flex; flex-wrap: wrap; @@ -583,7 +698,7 @@ height: 22px; } -/* 標籤自動完成下拉選單 */ +/* 標籤自動完成下拉選單 Search Tag Suggestions */ .ge-search-tag-suggestions { position: relative; margin-top: 4px; @@ -629,14 +744,14 @@ color: var(--text-muted); } -/* 搜尋選項容器 */ +/* 搜尋選項容器 Search Options Container */ .ge-search-options-container { display: flex; gap: 16px; margin: 4px; } -/* 搜尋範圍設定樣式 */ +/* 搜尋範圍設定樣式 Search Scope Container */ .ge-search-scope-container { display: flex; align-items: center; @@ -654,7 +769,7 @@ color: var(--text-normal); } -/* 搜尋媒體檔案設定樣式 */ +/* 搜尋媒體檔案設定樣式 Search Media Files Container */ .ge-search-media-files-container { display: flex; align-items: center; @@ -678,6 +793,7 @@ justify-content: flex-end; } +/* 搜尋視窗內的按鈕容器 Search Modal Button Container */ .ge-button-container button { padding: 6px 12px; border-radius: 4px; @@ -712,7 +828,26 @@ transform: translateY(0); } -/* 搜尋按鈕容器 */ +/* 搜尋視窗內的清除按鈕 Search Modal Clear Button */ +.ge-search-clear-button { + color: var(--text-muted); + border-radius: 50%; + width: 18px; + height: 18px; + position: absolute; + right: 5px; + cursor: pointer; + align-items: center; + justify-content: center; + padding: 3px; +} + +.ge-search-clear-button:hover { + color: var(--text-normal); + background-color: var(--background-modifier-hover); +} + +/* 頂部欄搜尋按鈕容器 Header Search Button Container */ .ge-search-button-container { display: flex; align-items: center; @@ -722,13 +857,13 @@ padding: 0; } -/* 搜尋按鈕啟用狀態 */ +/* 搜尋按鈕啟用狀態 Header Search Button Active */ .ge-search-button-container button.active { background-color: var(--interactive-accent); color: var(--text-on-accent); } -/* 搜尋文字容器 */ +/* 搜尋文字容器 Header Search Text Container */ .ge-search-text-container { position: relative; display: flex; @@ -748,7 +883,7 @@ border-color: var(--interactive-accent); } -/* 搜尋文字 */ +/* 搜尋文字 Header Search Text */ .ge-search-text { font-size: 14px; color: var(--text-normal); @@ -760,7 +895,7 @@ margin-left: 8px; } -/* 取消按鈕 */ +/* 取消按鈕 Header Search Clear Button */ .ge-clear-button { width: 22px; height: 22px; @@ -771,8 +906,8 @@ cursor: pointer; color: var(--text-muted); font-size: 14px; - margin-right:4px; /* 添加右边距 */ - flex-shrink: 0; /* 防止被压缩*/ + margin-right:4px; + flex-shrink: 0; } .ge-clear-button:hover { @@ -785,48 +920,15 @@ height: 18px; } -.ge-search-clear-button { - color: var(--text-muted); - border-radius: 50%; - width: 18px; - height: 18px; - position: absolute; - right: 5px; - cursor: pointer; - align-items: center; - justify-content: center; - padding: 3px; -} +/* --------------------------------------------------------------------------- */ -.ge-search-clear-button:hover { - color: var(--text-normal); - background-color: var(--background-modifier-hover); -} - -.ge-loading-indicator { - grid-column: 1 / -1; - display: flex; - justify-content: center; - align-items: center; - height: 100px; - font-size: 1.2em; - color: var(--text-muted); -} - -.ge-no-files { - grid-column: 1 / -1; - text-align: center; - padding: 2em; - color: var(--text-muted); - font-size: 1.2em; -} - -/* 資料夾搜尋輸入框樣式 */ +/* 資料夾選擇器的搜尋輸入框容器 */ .ge-folder-search-container { margin-bottom: 16px; padding: 0 4px; } +/* 資料夾選擇器的搜尋輸入框 */ .ge-folder-search-input { width: 100%; padding: 8px 12px; @@ -843,12 +945,33 @@ outline: none; } +/* 資料夾選擇器的項目容器 */ .ge-folder-options-container { max-height: 70vh; overflow-y: auto; padding-right: 4px; } +/* 資料夾選擇器的項目樣式 */ +.ge-grid-view-folder-option { + cursor: pointer; + padding: 8px; + margin-bottom: 8px; + border: 1px solid var(--background-modifier-border); + border-radius: 4px; +} + +.ge-grid-view-folder-option:hover { + background-color: var(--background-modifier-hover); +} + +/* ascii tree prefix */ +.ge-folder-tree-prefix { + font-family: monospace; + white-space: pre; + color: var(--text-muted); +} + /* 鍵盤導航選中項的樣式 */ .ge-selected-option { background-color: var(--background-modifier-hover); @@ -856,90 +979,43 @@ padding-left: 5px !important; } -/* 忽略資料夾設定 */ -.ge-ignored-folders-container { - margin-bottom: 16px; +/* --------------------------------------------------------------------------- */ + +/* Media Modal */ +.ge-media-modal { + padding: 0 !important; + background-color: rgba(0, 0, 0, 0.9) !important; + border: none !important; + border-radius: 0 !important; + box-shadow: none !important; + max-width: 100% !important; + max-height: 100% !important; + width: 100% !important; + height: 100% !important; + margin: 0 !important; } -.ge-ignored-folders-list { - list-style: none; - padding: 0; +.ge-media-modal .modal-header { + margin: 0 !important; } -.ge-ignored-folder-item { +.ge-media-modal .modal-close-button { + display: none !important; +} + +.ge-media-modal-content { + background-color: transparent !important; + padding: 0 !important; + margin: 0 !important; display: flex; + justify-content: center; align-items: center; - justify-content: space-between; - padding: 8px; - margin-bottom: 4px; - border: 1px solid var(--background-modifier-border); - border-radius: 4px; - background-color: var(--background-primary); -} - -.ge-ignored-folder-path { - flex-grow: 1; - margin-right: 8px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.ge-ignored-folder-remove { - background-color: var(--interactive-normal); - color: var(--text-normal); - border: none; - padding: 4px 8px; - border-radius: 4px; - cursor: pointer; - transition: background-color 0.2s; -} - -.ge-ignored-folder-remove:hover { - background-color: var(--interactive-hover); -} - -/* 忽略資料夾樣式 */ -.ignored-folder-patterns-container { - margin-bottom: 16px; -} - -.ge-ignored-folder-patterns-list { - list-style: none; - padding: 0; -} - -/* 影片縮圖樣式 */ -.ge-video-thumbnail { + position: relative; width: 100%; height: 100%; - display: flex; - align-items: center; - justify-content: center; - background-color: var(--background-secondary); - border-radius: 4px; -} - -.ge-video-thumbnail svg { - width: 40px; - height: 40px; - color: var(--text-accent); -} - -/* 媒體檔案全螢幕顯示樣式 */ -.ge-media-fullscreen-container { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.9); - z-index: 1000; - display: flex; - justify-content: center; - align-items: center; } +/* Media View */ .ge-media-view { position: relative; width: 100%; @@ -1028,72 +1104,9 @@ right: 0; } -/* MediaModal 樣式 */ -.ge-media-modal { - padding: 0 !important; - background-color: rgba(0, 0, 0, 0.9) !important; - border: none !important; - border-radius: 0 !important; - box-shadow: none !important; - max-width: 100% !important; - max-height: 100% !important; - width: 100% !important; - height: 100% !important; - margin: 0 !important; -} +/* --------------------------------------------------------------------------- */ -.ge-media-modal .modal-header { - margin: 0 !important; -} - -.ge-media-modal .modal-close-button { - display: none !important; -} - -.ge-media-modal-content { - background-color: transparent !important; - padding: 0 !important; - margin: 0 !important; - display: flex; - justify-content: center; - align-items: center; - position: relative; - width: 100%; - height: 100%; -} - -/* 媒體 Modal 樣式 */ -.ge-media-modal { - padding: 0 !important; - background-color: rgba(0, 0, 0, 0.9) !important; - border: none !important; - border-radius: 0 !important; - box-shadow: none !important; - max-width: 100% !important; - max-height: 100% !important; -} - -/* 選中項目的樣式 */ -.ge-selected-item { - outline: 1px solid var(--vault-profile-color-hover) !important; - outline-offset: -1px; - position: relative; - z-index: 1; -} - -/* 拖曳相關樣式 */ -.ge-grid-item.ge-dragging { - opacity: 0.5; - transform: scale(0.95); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); -} - -.ge-folder-item.ge-dragover { - border: 2px dashed var(--interactive-accent); - transform: scale(1.05); -} - -/* 音樂播放器 */ +/* 音樂播放器 Floating Audio Player */ .ge-floating-audio-player { position: fixed; width: 300px; @@ -1167,7 +1180,9 @@ user-select: none; } -/* 設定描述區域樣式 */ +/* --------------------------------------------------------------------------- */ + +/* 設定描述區域樣式 Setting Description */ .ge-setting-desc { display: flex; align-items: center; @@ -1177,3 +1192,61 @@ .ge-setting-number-input { width: 60px; } + +/* 忽略資料夾設定 */ +.ge-ignored-folders-container { + margin-bottom: 16px; +} + +/* 忽略資料夾列表 */ +.ge-ignored-folders-list { + list-style: none; + padding: 0; +} + +/* 忽略資料夾項目 */ +.ge-ignored-folder-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px; + margin-bottom: 4px; + border: 1px solid var(--background-modifier-border); + border-radius: 4px; + background-color: var(--background-primary); +} + +/* 忽略資料夾路徑 */ +.ge-ignored-folder-path { + flex-grow: 1; + margin-right: 8px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* 忽略資料夾刪除按鈕 */ +.ge-ignored-folder-remove { + background-color: var(--interactive-normal); + color: var(--text-normal); + border: none; + padding: 4px 8px; + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s; +} + +.ge-ignored-folder-remove:hover { + background-color: var(--interactive-hover); +} + +/* 忽略資料夾模式的容器 */ +.ignored-folder-patterns-container { + margin-bottom: 16px; +} + +/* 忽略資料夾模式列表 */ +.ge-ignored-folder-patterns-list { + list-style: none; + padding: 0; +} diff --git a/versions.json b/versions.json index afdba4b..75683bf 100644 --- a/versions.json +++ b/versions.json @@ -1,5 +1,6 @@ { "2.5.6": "1.1.0", "2.5.7": "1.1.0", - "2.6.0": "1.1.0" + "2.6.0": "1.1.0", + "2.6.1": "1.1.0" } \ No newline at end of file