This commit is contained in:
Devon22 2025-07-09 23:50:15 +08:00
parent 054410125e
commit cfb912e76e
9 changed files with 461 additions and 303 deletions

View file

@ -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",

4
package-lock.json generated
View file

@ -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",

View file

@ -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": {

View file

@ -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);
}
}
// 為資料夾項目添加拖曳目標功能

View file

@ -147,8 +147,6 @@ export class MediaModal extends Modal {
this.isZoomed = false;
const mediaFile = this.mediaFiles[index];
if (isImageFile(mediaFile)) {
// 創建圖片元素

View file

@ -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);
});

View file

@ -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 в короткому описі',

View file

@ -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;
}

View file

@ -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"
}