vault backup: 2026-09-28 07:57:07
This commit is contained in:
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-fetch-x
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-read-pdf
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-web-fetch
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-web-search
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-youtube-transcript
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/json-canvas
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/obsidian-bases
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/obsidian-cli
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/obsidian-markdown
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/symposium-publish
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-fetch-x
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-read-pdf
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-web-fetch
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-web-search
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-youtube-transcript
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/json-canvas
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/obsidian-bases
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/obsidian-cli
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/obsidian-markdown
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/symposium-publish
|
||||
File diff suppressed because one or more lines are too long
+5
-59
@@ -10,72 +10,18 @@
|
||||
"highTextContrast": false
|
||||
},
|
||||
"knownTags": {
|
||||
"保存": 308,
|
||||
"备份": 267,
|
||||
"笔记": 309,
|
||||
"标签": 310,
|
||||
"定时任务": 268,
|
||||
"防火墙": 311,
|
||||
"飞牛os": 312,
|
||||
"服务器": 313,
|
||||
"掼蛋": 349,
|
||||
"健康": 315,
|
||||
"经验分享": 316,
|
||||
"开源": 317,
|
||||
"历史": 318,
|
||||
"绿联": 307,
|
||||
"桥牌": 350,
|
||||
"群晖": 306,
|
||||
"人文": 320,
|
||||
"容器": 321,
|
||||
"同步": 269,
|
||||
"学习": 351,
|
||||
"英语": 352,
|
||||
"硬盘": 353,
|
||||
"运动": 354,
|
||||
"运维": 326,
|
||||
"知识库": 327,
|
||||
"ai": 355,
|
||||
"books": 329,
|
||||
"calibre": 275,
|
||||
"clash": 356,
|
||||
"clientalivecountmax": 331,
|
||||
"clientaliveinterval": 332,
|
||||
"clippings": 12,
|
||||
"cmd": 357,
|
||||
"cookie": 358,
|
||||
"在这里插入代码片": 526,
|
||||
"clippings": 404,
|
||||
"copilot-conversation": 131,
|
||||
"crontab": 270,
|
||||
"cwa": 271,
|
||||
"dailynote": 1,
|
||||
"docker": 335,
|
||||
"excalidraw": 130,
|
||||
"fedora": 336,
|
||||
"home": 359,
|
||||
"hotel": 360,
|
||||
"excalidraw": 363,
|
||||
"iscsi": 191,
|
||||
"it": 339,
|
||||
"java": 340,
|
||||
"linux": 140,
|
||||
"mac": 272,
|
||||
"map": 341,
|
||||
"linux": 413,
|
||||
"memos": 299,
|
||||
"monthly-summary": 300,
|
||||
"nested": 361,
|
||||
"nvr": 184,
|
||||
"powershell": 362,
|
||||
"ppt": 363,
|
||||
"raid5": 273,
|
||||
"subway": 364,
|
||||
"tcpkeepalive": 345,
|
||||
"telegrambot": 303,
|
||||
"time": 346,
|
||||
"trip": 365,
|
||||
"turn": 348,
|
||||
"unofficial": 220,
|
||||
"weeklynote": 305,
|
||||
"wordpress": 274,
|
||||
"nested/tag": 1
|
||||
"weeklynote": 305
|
||||
},
|
||||
"tagColors": {},
|
||||
"_version": 4
|
||||
|
||||
+183
-74
@@ -32,7 +32,7 @@ __export(main_exports, {
|
||||
default: () => ColoredTagsPlugin
|
||||
});
|
||||
module.exports = __toCommonJS(main_exports);
|
||||
var import_obsidian3 = require("obsidian");
|
||||
var import_obsidian4 = require("obsidian");
|
||||
|
||||
// src/ColoredClassApplierPlugin.ts
|
||||
var import_view = require("@codemirror/view");
|
||||
@@ -78,8 +78,9 @@ var defaultTagTextGetter = (el) => {
|
||||
};
|
||||
function applyColoredTagClassesInRoot(root, selector, getTagText = defaultTagTextGetter, getTagTargets2 = (el) => [el]) {
|
||||
const candidates = [];
|
||||
if (root instanceof HTMLElement && root.matches(selector)) {
|
||||
candidates.push(root);
|
||||
const rootNode = root;
|
||||
if (rootNode.instanceOf(HTMLElement) && rootNode.matches(selector)) {
|
||||
candidates.push(rootNode);
|
||||
}
|
||||
root.querySelectorAll(selector).forEach((el) => {
|
||||
candidates.push(el);
|
||||
@@ -133,7 +134,7 @@ var TagApplier = class {
|
||||
return;
|
||||
}
|
||||
mutation.addedNodes.forEach((node) => {
|
||||
if (node instanceof HTMLElement || node instanceof DocumentFragment) {
|
||||
if (node.instanceOf(HTMLElement) || node.instanceOf(DocumentFragment)) {
|
||||
this.scheduleApply(node);
|
||||
}
|
||||
});
|
||||
@@ -243,7 +244,7 @@ var BaseViewTagApplier = class {
|
||||
};
|
||||
|
||||
// src/ColoredTagsPluginSettingTab.ts
|
||||
var import_obsidian2 = require("obsidian");
|
||||
var import_obsidian3 = require("obsidian");
|
||||
|
||||
// src/defaultSettings.ts
|
||||
var DEFAULT_SETTINGS = {
|
||||
@@ -262,6 +263,9 @@ var DEFAULT_SETTINGS = {
|
||||
_version: 4
|
||||
};
|
||||
|
||||
// src/i18n/index.ts
|
||||
var import_obsidian = require("obsidian");
|
||||
|
||||
// src/i18n/de.json
|
||||
var de_default = {
|
||||
settings: {
|
||||
@@ -890,9 +894,6 @@ var logger = {
|
||||
},
|
||||
error: (message) => {
|
||||
console.error(message);
|
||||
},
|
||||
log: (message) => {
|
||||
console.log(message);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -910,7 +911,7 @@ var locales = {
|
||||
};
|
||||
var I18n = class {
|
||||
static t(key, params) {
|
||||
const locale = window.localStorage.getItem("language") || "en";
|
||||
const locale = (0, import_obsidian.getLanguage)();
|
||||
const keys = key.split(".");
|
||||
let translations = locales[locale] || locales["en"];
|
||||
for (const k of keys) {
|
||||
@@ -971,7 +972,7 @@ function normalizePaletteIndex(index, length) {
|
||||
}
|
||||
|
||||
// src/CommunityPalettesService.ts
|
||||
var import_obsidian = require("obsidian");
|
||||
var import_obsidian2 = require("obsidian");
|
||||
var DISCUSSION_COMMENTS_URL = "https://api.github.com/repos/pfrankov/obsidian-colored-tags/discussions/18/comments";
|
||||
var PER_PAGE = 100;
|
||||
var POSITIVE_REACTIONS = [
|
||||
@@ -1041,7 +1042,7 @@ var CommunityPalettesService = class {
|
||||
}
|
||||
static async requestPage(page) {
|
||||
try {
|
||||
const response = await (0, import_obsidian.requestUrl)({
|
||||
const response = await (0, import_obsidian2.requestUrl)({
|
||||
url: `${DISCUSSION_COMMENTS_URL}?per_page=${PER_PAGE}&page=${page}`,
|
||||
headers: {
|
||||
Accept: "application/vnd.github+json"
|
||||
@@ -1120,7 +1121,8 @@ CommunityPalettesService.cache = null;
|
||||
|
||||
// src/ColoredTagsPluginSettingTab.ts
|
||||
var SELECTED_CLASS = "is-selected";
|
||||
var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTab {
|
||||
var PALETTE_HEADING_KEY = "settings.palette.heading";
|
||||
var ColoredTagsPluginSettingTab = class extends import_obsidian3.PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin);
|
||||
this.showExperimental = false;
|
||||
@@ -1128,8 +1130,89 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
this.communityPaletteDescriptionCounter = 0;
|
||||
this.communityPaletteCards = /* @__PURE__ */ new Map();
|
||||
this.paletteChangeSubscribers = [];
|
||||
this.declarativePaletteEl = null;
|
||||
this.plugin = plugin;
|
||||
}
|
||||
/**
|
||||
* Obsidian 1.13+ settings-search definitions.
|
||||
* Render callbacks reuse the existing section renderers while the settings
|
||||
* framework owns lifecycle, search, and refresh behavior.
|
||||
*/
|
||||
getSettingDefinitions() {
|
||||
return [
|
||||
{
|
||||
name: I18n.t(PALETTE_HEADING_KEY),
|
||||
searchable: false,
|
||||
render: (setting) => {
|
||||
this.paletteChangeSubscribers = [];
|
||||
const host = this.prepareDeclarativeHost(setting);
|
||||
this.renderTags(host);
|
||||
const paletteEl = host.createDiv({ cls: "palette" });
|
||||
this.renderPalette(paletteEl);
|
||||
this.declarativePaletteEl = paletteEl;
|
||||
return () => {
|
||||
this.declarativePaletteEl = null;
|
||||
};
|
||||
}
|
||||
},
|
||||
{
|
||||
name: I18n.t(PALETTE_HEADING_KEY),
|
||||
desc: I18n.t("settings.palette.description"),
|
||||
aliases: [
|
||||
I18n.t("settings.palette.custom.name"),
|
||||
I18n.t("settings.palette.shift.name"),
|
||||
I18n.t("settings.palette.custom.community.heading")
|
||||
],
|
||||
render: (setting) => {
|
||||
var _a;
|
||||
const host = this.prepareDeclarativeHost(setting);
|
||||
const paletteEl = (_a = this.declarativePaletteEl) != null ? _a : this.createDeclarativePalette(host);
|
||||
this.renderPaletteSettings(host, paletteEl);
|
||||
}
|
||||
},
|
||||
{
|
||||
name: I18n.t("settings.accessibility.heading"),
|
||||
desc: I18n.t("settings.accessibility.description"),
|
||||
aliases: [
|
||||
I18n.t("settings.accessibility.highTextContrast.name")
|
||||
],
|
||||
render: (setting) => {
|
||||
this.renderAccessibilitySettings(
|
||||
this.prepareDeclarativeHost(setting)
|
||||
);
|
||||
}
|
||||
},
|
||||
{
|
||||
name: I18n.t("settings.experimental.heading"),
|
||||
desc: I18n.t("settings.experimental.description"),
|
||||
aliases: [
|
||||
I18n.t("settings.experimental.mixColors.name"),
|
||||
I18n.t("settings.experimental.gradientTransition.name"),
|
||||
I18n.t("settings.experimental.tagColors.name"),
|
||||
I18n.t("settings.experimental.reset.name")
|
||||
],
|
||||
render: (setting) => {
|
||||
this.renderExperimentalSettings(
|
||||
this.prepareDeclarativeHost(setting)
|
||||
);
|
||||
}
|
||||
}
|
||||
];
|
||||
}
|
||||
prepareDeclarativeHost(setting) {
|
||||
this.containerEl.classList.add("colored-tags-settings");
|
||||
setting.settingEl.empty();
|
||||
setting.settingEl.classList.add("colored-tags-declarative-host");
|
||||
return setting.settingEl.createDiv({
|
||||
cls: "colored-tags-declarative-content"
|
||||
});
|
||||
}
|
||||
createDeclarativePalette(host) {
|
||||
const paletteEl = host.createDiv({ cls: "palette" });
|
||||
this.renderPalette(paletteEl);
|
||||
this.declarativePaletteEl = paletteEl;
|
||||
return paletteEl;
|
||||
}
|
||||
renderPalette(paletteEl, animate = false) {
|
||||
paletteEl.empty();
|
||||
const palette = this.getActivePalette();
|
||||
@@ -1143,7 +1226,7 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
`background-color: ${paletteColor}`,
|
||||
index === palette.length - 1 && lastElementStyles
|
||||
];
|
||||
paletteEl.createEl("div", {
|
||||
paletteEl.createDiv({
|
||||
attr: { style: styles.filter(Boolean).join(";") }
|
||||
});
|
||||
});
|
||||
@@ -1160,7 +1243,7 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
if (!tagsArray.length) {
|
||||
return;
|
||||
}
|
||||
const tagEl = containerEl.createEl("div", {
|
||||
const tagEl = containerEl.createDiv({
|
||||
cls: "tagsExample"
|
||||
});
|
||||
tagsArray.sort((a2, b2) => {
|
||||
@@ -1184,22 +1267,8 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
}
|
||||
);
|
||||
}
|
||||
display() {
|
||||
const { containerEl } = this;
|
||||
containerEl.empty();
|
||||
containerEl.classList.add("colored-tags-settings");
|
||||
this.paletteChangeSubscribers = [];
|
||||
this.renderTags(containerEl);
|
||||
const paletteEl = containerEl.createEl("div", {
|
||||
cls: "palette"
|
||||
});
|
||||
this.renderPalette(paletteEl);
|
||||
this.renderPaletteSettings(containerEl, paletteEl);
|
||||
this.renderAccessibilitySettings(containerEl);
|
||||
this.renderExperimentalSettings(containerEl);
|
||||
}
|
||||
renderPaletteSettings(containerEl, paletteEl) {
|
||||
new import_obsidian2.Setting(containerEl).setHeading().setName(I18n.t("settings.palette.heading")).setDesc(I18n.t("settings.palette.description")).addDropdown(
|
||||
new import_obsidian3.Setting(containerEl).setHeading().setName(I18n.t(PALETTE_HEADING_KEY)).setDesc(I18n.t("settings.palette.description")).addDropdown(
|
||||
(dropdown) => dropdown.addOptions({
|
||||
["adaptive-soft" /* ADAPTIVE_SOFT */]: I18n.t(
|
||||
"settings.palette.options.adaptiveSoft"
|
||||
@@ -1213,13 +1282,13 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
}).setValue(String(this.plugin.settings.palette.selected)).onChange(async (value) => {
|
||||
this.plugin.settings.palette.selected = value;
|
||||
await this.plugin.saveSettings();
|
||||
this.display();
|
||||
this.update();
|
||||
})
|
||||
);
|
||||
if (this.plugin.settings.palette.selected === "custom") {
|
||||
if (this.plugin.settings.palette.selected === "custom" /* CUSTOM */) {
|
||||
this.renderCustomPaletteField(containerEl, paletteEl);
|
||||
}
|
||||
new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.palette.shift.name")).setDesc(I18n.t("settings.palette.shift.description")).addSlider(
|
||||
new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.palette.shift.name")).setDesc(I18n.t("settings.palette.shift.description")).addSlider(
|
||||
(slider) => slider.setLimits(0, this.plugin.palettes.light.length - 1, 1).setValue(this.plugin.settings.palette.seed).onChange(async (value) => {
|
||||
slider.showTooltip();
|
||||
this.plugin.settings.palette.seed = value;
|
||||
@@ -1231,9 +1300,9 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
}
|
||||
renderCustomPaletteField(containerEl, paletteEl) {
|
||||
let customPaletteInput = null;
|
||||
const customPaletteField = new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.palette.custom.name")).setDesc("").addText((text) => {
|
||||
const customPaletteField = new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.palette.custom.name")).setDesc("").addText((text) => {
|
||||
customPaletteInput = text;
|
||||
text.inputEl.style.minWidth = "100%";
|
||||
text.inputEl.classList.add("colored-tags-custom-palette-input");
|
||||
text.setValue(
|
||||
this.plugin.settings.palette.custom
|
||||
).setPlaceholder(I18n.t("settings.palette.custom.placeholder"));
|
||||
@@ -1247,8 +1316,9 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
}
|
||||
});
|
||||
});
|
||||
customPaletteField.descEl.innerHTML = I18n.t(
|
||||
"settings.palette.custom.description"
|
||||
this.renderCodeDescription(
|
||||
customPaletteField.descEl,
|
||||
I18n.t("settings.palette.custom.description")
|
||||
);
|
||||
if (customPaletteInput) {
|
||||
this.renderCommunityPalettesSection(
|
||||
@@ -1258,22 +1328,58 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
);
|
||||
}
|
||||
}
|
||||
renderCodeDescription(containerEl, description) {
|
||||
const startTag = "<code>";
|
||||
const endTag = "</code>";
|
||||
const startIndex = description.indexOf(startTag);
|
||||
const endIndex = description.indexOf(endTag, startIndex + startTag.length);
|
||||
containerEl.empty();
|
||||
if (startIndex < 0 || endIndex < 0) {
|
||||
containerEl.textContent = description;
|
||||
return;
|
||||
}
|
||||
containerEl.append(description.slice(0, startIndex));
|
||||
containerEl.createEl("code", {
|
||||
text: description.slice(startIndex + startTag.length, endIndex)
|
||||
});
|
||||
containerEl.append(description.slice(endIndex + endTag.length));
|
||||
}
|
||||
renderCommunityDescription(containerEl) {
|
||||
const linkStart = "__COLORED_TAGS_LINK_START__";
|
||||
const linkEnd = "__COLORED_TAGS_LINK_END__";
|
||||
const description = I18n.t(
|
||||
"settings.palette.custom.community.description",
|
||||
{ communityLinkStart: linkStart, communityLinkEnd: linkEnd }
|
||||
);
|
||||
const startIndex = description.indexOf(linkStart);
|
||||
const endIndex = description.indexOf(linkEnd, startIndex + linkStart.length);
|
||||
containerEl.empty();
|
||||
if (startIndex < 0 || endIndex < 0) {
|
||||
containerEl.textContent = description.split(linkStart).join("").split(linkEnd).join("");
|
||||
return;
|
||||
}
|
||||
containerEl.append(description.slice(0, startIndex));
|
||||
const link = containerEl.createEl("a", {
|
||||
attr: {
|
||||
href: "https://github.com/pfrankov/obsidian-colored-tags/discussions/18",
|
||||
target: "_blank",
|
||||
rel: "noopener noreferrer"
|
||||
}
|
||||
});
|
||||
link.textContent = description.slice(startIndex + linkStart.length, endIndex);
|
||||
containerEl.append(description.slice(endIndex + linkEnd.length));
|
||||
}
|
||||
renderCommunityPalettesSection(containerEl, paletteEl, inputComponent) {
|
||||
this.communityPaletteDescriptionCounter = 0;
|
||||
this.communityPaletteCards = /* @__PURE__ */ new Map();
|
||||
const sectionSetting = new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.palette.custom.community.heading")).setDesc("");
|
||||
const sectionSetting = new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.palette.custom.community.heading")).setDesc("");
|
||||
sectionSetting.settingEl.classList.add("community-palettes");
|
||||
const descEl = sectionSetting.descEl;
|
||||
descEl.empty();
|
||||
const communityLinkStart = '<a href="https://github.com/pfrankov/obsidian-colored-tags/discussions/18" target="_blank">';
|
||||
const communityLinkEnd = "</a>";
|
||||
const descriptionEl = descEl.createDiv({
|
||||
cls: "community-palettes__description"
|
||||
});
|
||||
descriptionEl.innerHTML = I18n.t(
|
||||
"settings.palette.custom.community.description",
|
||||
{ communityLinkStart, communityLinkEnd }
|
||||
);
|
||||
this.renderCommunityDescription(descriptionEl);
|
||||
const scrollContainer = descEl.createDiv({
|
||||
cls: "community-palettes__scroll"
|
||||
});
|
||||
@@ -1368,7 +1474,7 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
this.renderPalette(paletteEl, true);
|
||||
this.notifyPaletteChange();
|
||||
this.updateCommunityPaletteSelection();
|
||||
new import_obsidian2.Notice(
|
||||
new import_obsidian3.Notice(
|
||||
I18n.t("notices.communityPaletteApplied", {
|
||||
author: palette.author
|
||||
}),
|
||||
@@ -1396,14 +1502,14 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
});
|
||||
}
|
||||
renderAccessibilitySettings(containerEl) {
|
||||
new import_obsidian2.Setting(containerEl).setHeading().setName(I18n.t("settings.accessibility.heading")).setDesc(I18n.t("settings.accessibility.description")).addToggle(
|
||||
new import_obsidian3.Setting(containerEl).setHeading().setName(I18n.t("settings.accessibility.heading")).setDesc(I18n.t("settings.accessibility.description")).addToggle(
|
||||
(toggle) => toggle.setValue(this.showAccessibility).onChange(async (value) => {
|
||||
this.showAccessibility = value;
|
||||
this.display();
|
||||
this.update();
|
||||
})
|
||||
);
|
||||
if (this.showAccessibility) {
|
||||
new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.accessibility.highTextContrast.name")).setDesc(
|
||||
new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.accessibility.highTextContrast.name")).setDesc(
|
||||
I18n.t(
|
||||
"settings.accessibility.highTextContrast.description"
|
||||
)
|
||||
@@ -1413,40 +1519,39 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
).onChange(async (value) => {
|
||||
this.plugin.settings.accessibility.highTextContrast = value;
|
||||
await this.plugin.saveSettings();
|
||||
this.display();
|
||||
this.update();
|
||||
})
|
||||
);
|
||||
}
|
||||
}
|
||||
renderExperimentalSettings(containerEl) {
|
||||
new import_obsidian2.Setting(containerEl).setHeading().setName(I18n.t("settings.experimental.heading")).setDesc(I18n.t("settings.experimental.description")).addToggle(
|
||||
new import_obsidian3.Setting(containerEl).setHeading().setName(I18n.t("settings.experimental.heading")).setDesc(I18n.t("settings.experimental.description")).addToggle(
|
||||
(toggle) => toggle.setValue(this.showExperimental).onChange(async (value) => {
|
||||
this.showExperimental = value;
|
||||
this.display();
|
||||
this.update();
|
||||
})
|
||||
);
|
||||
if (!this.showExperimental) {
|
||||
return;
|
||||
}
|
||||
new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.experimental.mixColors.name")).setDesc(I18n.t("settings.experimental.mixColors.description")).addToggle(
|
||||
new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.experimental.mixColors.name")).setDesc(I18n.t("settings.experimental.mixColors.description")).addToggle(
|
||||
(toggle) => toggle.setValue(this.plugin.settings.mixColors).onChange(async (value) => {
|
||||
this.plugin.settings.mixColors = value;
|
||||
await this.plugin.saveSettings();
|
||||
this.display();
|
||||
this.update();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.experimental.gradientTransition.name")).addToggle(
|
||||
new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.experimental.gradientTransition.name")).addToggle(
|
||||
(toggle) => toggle.setValue(this.plugin.settings.transition).onChange(async (value) => {
|
||||
this.plugin.settings.transition = value;
|
||||
await this.plugin.saveSettings();
|
||||
this.display();
|
||||
this.update();
|
||||
})
|
||||
);
|
||||
this.renderTagPaletteOverrides(containerEl);
|
||||
new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.experimental.reset.name")).setDesc(I18n.t("settings.experimental.reset.description")).addButton(
|
||||
new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.experimental.reset.name")).setDesc(I18n.t("settings.experimental.reset.description")).addButton(
|
||||
(button) => button.setButtonText(I18n.t("settings.experimental.reset.button")).setClass("mod-warning").onClick(async () => {
|
||||
new import_obsidian2.Notice(I18n.t("notices.resetDone"), 1e4);
|
||||
button.setDisabled(true);
|
||||
new import_obsidian3.Notice(I18n.t("notices.resetDone"), 1e4);
|
||||
button.buttonEl.setAttribute("disabled", "true");
|
||||
button.buttonEl.classList.remove("mod-warning");
|
||||
this.plugin.settings = Object.assign(
|
||||
@@ -1459,7 +1564,7 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
);
|
||||
}
|
||||
renderTagPaletteOverrides(containerEl) {
|
||||
const tagPaletteSetting = new import_obsidian2.Setting(containerEl).setName(I18n.t("settings.experimental.tagColors.name")).setDesc(I18n.t("settings.experimental.tagColors.description"));
|
||||
const tagPaletteSetting = new import_obsidian3.Setting(containerEl).setName(I18n.t("settings.experimental.tagColors.name")).setDesc(I18n.t("settings.experimental.tagColors.description"));
|
||||
tagPaletteSetting.settingEl.classList.add("tag-color-setting-item");
|
||||
tagPaletteSetting.controlEl.empty();
|
||||
const wrapper = tagPaletteSetting.controlEl.createDiv({
|
||||
@@ -1478,7 +1583,7 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
const refreshTagOptions = () => this.populateTagOptions(datalist);
|
||||
refreshTagOptions();
|
||||
let currentTag = "";
|
||||
const tagInput = new import_obsidian2.TextComponent(inputContainer);
|
||||
const tagInput = new import_obsidian3.TextComponent(inputContainer);
|
||||
tagInput.setPlaceholder(
|
||||
I18n.t("settings.experimental.tagColors.placeholder")
|
||||
).setValue("");
|
||||
@@ -1550,7 +1655,9 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
)} ${index + 1}`
|
||||
}
|
||||
});
|
||||
swatch.addEventListener("click", () => onSelect(index));
|
||||
swatch.addEventListener("click", () => {
|
||||
void onSelect(index);
|
||||
});
|
||||
});
|
||||
}
|
||||
renderTagColorAssignments(listEl, onChange) {
|
||||
@@ -1597,16 +1704,19 @@ var ColoredTagsPluginSettingTab = class extends import_obsidian2.PluginSettingTa
|
||||
},
|
||||
text: "\u2715"
|
||||
});
|
||||
removeButton.addEventListener("click", async (event) => {
|
||||
removeButton.addEventListener("click", (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
delete this.plugin.settings.tagColors[tag];
|
||||
await this.plugin.saveSettings();
|
||||
this.renderTagColorAssignments(listEl, onChange);
|
||||
void this.removeTagColorAssignment(tag, listEl, onChange);
|
||||
});
|
||||
});
|
||||
onChange == null ? void 0 : onChange();
|
||||
}
|
||||
async removeTagColorAssignment(tag, listEl, onChange) {
|
||||
delete this.plugin.settings.tagColors[tag];
|
||||
await this.plugin.saveSettings();
|
||||
this.renderTagColorAssignments(listEl, onChange);
|
||||
}
|
||||
populateTagOptions(datalist) {
|
||||
var _a, _b;
|
||||
datalist.empty();
|
||||
@@ -4945,7 +5055,7 @@ var CSSManager = class {
|
||||
return;
|
||||
}
|
||||
this.isPending = true;
|
||||
Promise.resolve().then(() => this.flush());
|
||||
void Promise.resolve().then(() => this.flush());
|
||||
}
|
||||
flush() {
|
||||
let styleEl = document.head.querySelector(`[${this.ATTRIBUTE}]`);
|
||||
@@ -5090,7 +5200,7 @@ var PropertiesTagApplier = class {
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
var _ColoredTagsPlugin = class extends import_obsidian3.Plugin {
|
||||
var _ColoredTagsPlugin = class extends import_obsidian4.Plugin {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.palettes = {
|
||||
@@ -5112,12 +5222,12 @@ var _ColoredTagsPlugin = class extends import_obsidian3.Plugin {
|
||||
await this.saveKnownTags();
|
||||
this.reload();
|
||||
window.setTimeout(() => {
|
||||
this.checkUpdates();
|
||||
void this.checkUpdates();
|
||||
}, _ColoredTagsPlugin.INITIAL_UPDATE_CHECK_DELAY);
|
||||
this.registerEvent(
|
||||
this.app.workspace.on(
|
||||
"editor-change",
|
||||
(0, import_obsidian3.debounce)(
|
||||
(0, import_obsidian4.debounce)(
|
||||
async () => {
|
||||
await this.saveKnownTags();
|
||||
this.update();
|
||||
@@ -5130,7 +5240,7 @@ var _ColoredTagsPlugin = class extends import_obsidian3.Plugin {
|
||||
this.registerEvent(
|
||||
this.app.workspace.on(
|
||||
"active-leaf-change",
|
||||
(0, import_obsidian3.debounce)(
|
||||
(0, import_obsidian4.debounce)(
|
||||
async () => {
|
||||
await this.saveKnownTags();
|
||||
this.update();
|
||||
@@ -5183,17 +5293,17 @@ var _ColoredTagsPlugin = class extends import_obsidian3.Plugin {
|
||||
async checkUpdates() {
|
||||
var _a, _b;
|
||||
try {
|
||||
const { json: response } = await (0, import_obsidian3.requestUrl)({
|
||||
const response = (await (0, import_obsidian4.requestUrl)({
|
||||
url: "https://api.github.com/repos/pfrankov/obsidian-colored-tags/releases/latest",
|
||||
method: "GET",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
contentType: "application/json"
|
||||
});
|
||||
})).json;
|
||||
if (response.tag_name !== this.manifest.version) {
|
||||
const pluginName = (_b = (_a = this.manifest) == null ? void 0 : _a.name) != null ? _b : "Colored Tags";
|
||||
new import_obsidian3.Notice(I18n.t("notices.updateAvailable", { pluginName }));
|
||||
new import_obsidian4.Notice(I18n.t("notices.updateAvailable", { pluginName }));
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
@@ -5307,7 +5417,6 @@ ${css}
|
||||
const loadedData = await this.loadData();
|
||||
this.settings = this.migrateSettings(loadedData);
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
migrateSettings(loadedData) {
|
||||
var _a;
|
||||
const data = loadedData ? { ...loadedData } : {};
|
||||
@@ -5341,7 +5450,7 @@ ${css}
|
||||
});
|
||||
const settings = Object.assign({}, DEFAULT_SETTINGS, data);
|
||||
if (needToSave) {
|
||||
this.saveData(settings);
|
||||
void this.saveData(settings);
|
||||
}
|
||||
return settings;
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"id": "colored-tags",
|
||||
"name": "Colored Tags",
|
||||
"version": "6.1.3",
|
||||
"minAppVersion": "0.15.0",
|
||||
"version": "7.0.0",
|
||||
"minAppVersion": "1.13.0",
|
||||
"description": "Colorizes tags in different colors. Colors of nested tags are mixed with the root tag to improve readability. Text color contrast is automatically matched to comply with AA level of WCAG 2.1.",
|
||||
"author": "Pavel Frankov",
|
||||
"authorUrl": "https://github.com/pfrankov",
|
||||
|
||||
+11
@@ -194,3 +194,14 @@
|
||||
color: var(--text-faint);
|
||||
font-style: italic;
|
||||
}
|
||||
.colored-tags-settings .colored-tags-custom-palette-input {
|
||||
min-width: 100%;
|
||||
}
|
||||
.colored-tags-settings .colored-tags-declarative-host {
|
||||
display: block;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
.colored-tags-settings .colored-tags-declarative-content {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
Vendored
+205
-153
@@ -10,11 +10,6 @@
|
||||
"huggingfaceApiKey": "",
|
||||
"cohereApiKey": "",
|
||||
"anthropicApiKey": "",
|
||||
"azureOpenAIApiKey": "",
|
||||
"azureOpenAIApiInstanceName": "",
|
||||
"azureOpenAIApiDeploymentName": "",
|
||||
"azureOpenAIApiVersion": "",
|
||||
"azureOpenAIApiEmbeddingDeploymentName": "",
|
||||
"googleApiKey": "",
|
||||
"openRouterAiApiKey": "",
|
||||
"xaiApiKey": "",
|
||||
@@ -23,12 +18,9 @@
|
||||
"siliconflowApiKey": "",
|
||||
"defaultChainType": "llm_chain",
|
||||
"defaultModelKey": "deepseek-ai/Deepseek-V3|openai",
|
||||
"embeddingModelKey": "BAAI/bge-m3|openai",
|
||||
"temperature": 0.1,
|
||||
"contextTurns": 15,
|
||||
"userSystemPrompt": "",
|
||||
"openAIProxyBaseUrl": "",
|
||||
"openAIEmbeddingProxyBaseUrl": "",
|
||||
"stream": true,
|
||||
"copilotFolder": "copilot",
|
||||
"copilotRootHistory": [
|
||||
@@ -42,12 +34,10 @@
|
||||
"defaultOpenArea": "view",
|
||||
"defaultSendShortcut": "enter",
|
||||
"customPromptsFolder": "copilot-custom-prompts",
|
||||
"indexVaultToVectorStore": "ON MODE SWITCH",
|
||||
"qaExclusions": "copilot",
|
||||
"qaInclusions": "",
|
||||
"chatNoteContextPath": "",
|
||||
"chatNoteContextTags": [],
|
||||
"enableIndexSync": true,
|
||||
"debug": false,
|
||||
"maxSourceChunks": 3,
|
||||
"enableInlineCitations": true,
|
||||
@@ -333,13 +323,6 @@
|
||||
"isBuiltIn": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "azure-openai",
|
||||
"provider": "azure openai",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "deepseek-chat",
|
||||
"provider": "deepseek",
|
||||
@@ -402,136 +385,6 @@
|
||||
"enableCors": false
|
||||
}
|
||||
],
|
||||
"activeEmbeddingModels": [
|
||||
{
|
||||
"name": "copilot-plus-small",
|
||||
"provider": "copilot-plus",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"plusExclusive": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "copilot-plus-large",
|
||||
"provider": "copilot-plus-jina",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"plusExclusive": true,
|
||||
"believerExclusive": true,
|
||||
"dimensions": 1024,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "copilot-plus-multilingual",
|
||||
"provider": "copilot-plus-jina",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"plusExclusive": true,
|
||||
"dimensions": 512,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "openai/text-embedding-3-small",
|
||||
"provider": "openrouterai",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "text-embedding-3-small",
|
||||
"provider": "openai",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "gemini-embedding-001",
|
||||
"provider": "google",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"apiKey": "",
|
||||
"enableCors": false
|
||||
},
|
||||
{
|
||||
"name": "gemini-embedding-2-preview",
|
||||
"provider": "google",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "Qwen/Qwen3-Embedding-0.6B",
|
||||
"provider": "siliconflow",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"core": true,
|
||||
"baseUrl": "https://api.siliconflow.com/v1",
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "text-embedding-3-large",
|
||||
"provider": "openai",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "embed-multilingual-light-v3.0",
|
||||
"provider": "cohereai",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "text-embedding-004",
|
||||
"provider": "google",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"apiKey": "",
|
||||
"enableCors": false
|
||||
},
|
||||
{
|
||||
"name": "azure-openai",
|
||||
"provider": "azure openai",
|
||||
"enabled": true,
|
||||
"isBuiltIn": true,
|
||||
"isEmbeddingModel": true,
|
||||
"apiKey": ""
|
||||
},
|
||||
{
|
||||
"name": "BAAI/bge-m3",
|
||||
"provider": "openai",
|
||||
"enabled": true,
|
||||
"isBuiltIn": false,
|
||||
"baseUrl": "https://api.siliconflow.cn/v1",
|
||||
"apiKey": "",
|
||||
"isEmbeddingModel": true,
|
||||
"capabilities": [],
|
||||
"enableCors": true
|
||||
}
|
||||
],
|
||||
"embeddingRequestsPerMin": 90,
|
||||
"embeddingBatchSize": 16,
|
||||
"disableIndexOnMobile": true,
|
||||
"numPartitions": 1,
|
||||
"lexicalSearchRamLimit": 100,
|
||||
"promptUsageTimestamps": {},
|
||||
"promptSortStrategy": "timestamp",
|
||||
@@ -541,24 +394,25 @@
|
||||
"inlineEditCommands": [],
|
||||
"projectList": [],
|
||||
"lastDismissedVersion": "3.1.2",
|
||||
"lastShownStartupVersion": "4.0.11",
|
||||
"passMarkdownImages": true,
|
||||
"enableAutonomousAgent": true,
|
||||
"enableCustomPromptTemplating": true,
|
||||
"enableSemanticSearchV3": false,
|
||||
"enableSelfHostMode": false,
|
||||
"enableMiyo": false,
|
||||
"enableMiyoSearchSkill": false,
|
||||
"miyoSearchAll": false,
|
||||
"relevantNotesLiveUpdate": true,
|
||||
"miyoServerUrl": "",
|
||||
"miyoSyncedExclusions": "",
|
||||
"selfHostSearchProvider": "firecrawl",
|
||||
"firecrawlApiKey": "",
|
||||
"perplexityApiKey": "",
|
||||
"parallelApiKey": "",
|
||||
"exaApiKey": "",
|
||||
"supadataApiKey": "",
|
||||
"docProcessorBackend": "plus",
|
||||
"enableLexicalBoosts": true,
|
||||
"suggestedDefaultCommands": true,
|
||||
"autonomousAgentMaxIterations": 4,
|
||||
"autonomousAgentEnabledToolIds": [
|
||||
"localSearch",
|
||||
"webSearch",
|
||||
@@ -574,8 +428,6 @@
|
||||
"maxRecentConversations": 30,
|
||||
"enableSavedMemory": false,
|
||||
"quickCommandIncludeNoteContext": true,
|
||||
"autoIncludeTextSelection": false,
|
||||
"autoAddSelectionToContext": false,
|
||||
"autoAcceptEdits": false,
|
||||
"diffViewMode": "split",
|
||||
"userSystemPromptsFolder": "copilot/system-prompts",
|
||||
@@ -587,6 +439,8 @@
|
||||
"activeBackend": "opencode",
|
||||
"backends": {},
|
||||
"debugFullFrames": true,
|
||||
"notificationSound": true,
|
||||
"notificationSoundId": "piano",
|
||||
"welcomeDismissed": false,
|
||||
"skills": {
|
||||
"folder": "copilot/skills"
|
||||
@@ -630,6 +484,203 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"copilotPlusCatalog": {
|
||||
"models": [
|
||||
{
|
||||
"id": "copilot-plus-flash",
|
||||
"displayName": "Copilot Plus Flash",
|
||||
"description": "The default model: fastest responses and the most quota.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text",
|
||||
"image"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 1048576
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "kimi-k2.6",
|
||||
"displayName": "Kimi K2.6",
|
||||
"description": "Good for long-running reasoning tasks.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 262144
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "glm-5.2",
|
||||
"displayName": "GLM-5.2",
|
||||
"description": "A frontier open-weight model.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [
|
||||
"none",
|
||||
"high"
|
||||
],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 1048576
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "glm-5.3-flash",
|
||||
"displayName": "GLM-5.3-Flash",
|
||||
"description": "Fast, cost-efficient coding and long-horizon agent tasks.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text",
|
||||
"image"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 1048576
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "deepseek-v4-pro",
|
||||
"displayName": "DeepSeek V4 Pro",
|
||||
"description": "A top-tier model for the hardest reasoning and agentic tasks.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 1048576
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "deepseek-v4-flash-0731",
|
||||
"displayName": "DeepSeek V4 Flash 0731",
|
||||
"description": "The July 2026 DeepSeek V4 Flash snapshot: fast, cheap, and broadly capable.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [
|
||||
"none",
|
||||
"high"
|
||||
],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 1048576
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "deepseek-v4.1-flash",
|
||||
"displayName": "DeepSeek V4.1 Flash",
|
||||
"description": "Fast multimodal reasoning for coding and agentic tasks.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text",
|
||||
"image"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 1048576
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "mimo-v2.6-flash",
|
||||
"displayName": "MiMo V2.6 Flash",
|
||||
"description": "Cost-effective model for everyday use.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text",
|
||||
"image"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 1048576
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "minimax-m3",
|
||||
"displayName": "MiniMax M3",
|
||||
"description": "Long-context model for coding and agentic tasks.",
|
||||
"toolCall": true,
|
||||
"reasoning": true,
|
||||
"reasoningEfforts": [],
|
||||
"modalities": {
|
||||
"input": [
|
||||
"text"
|
||||
],
|
||||
"output": [
|
||||
"text"
|
||||
]
|
||||
},
|
||||
"limits": {
|
||||
"context": 524288
|
||||
}
|
||||
}
|
||||
],
|
||||
"defaultEnabledIds": [
|
||||
"copilot-plus-flash",
|
||||
"glm-5.2",
|
||||
"glm-5.3-flash",
|
||||
"deepseek-v4-pro",
|
||||
"deepseek-v4.1-flash",
|
||||
"minimax-m3"
|
||||
]
|
||||
},
|
||||
"temperature": 0.1,
|
||||
"autonomousAgentMaxIterations": 4,
|
||||
"autoIncludeTextSelection": false,
|
||||
"autoAddSelectionToContext": false,
|
||||
"generateAIChatTitleOnSave": true,
|
||||
"showSuggestedPrompts": true,
|
||||
"showRelevantNotes": true,
|
||||
@@ -644,5 +695,6 @@
|
||||
"allowAdditionalContext": true,
|
||||
"enableWordCompletion": false,
|
||||
"_keychainVaultId": "6608d338",
|
||||
"settingsVersion": 11
|
||||
"settingsVersion": 14,
|
||||
"miyoConnectionMode": "local"
|
||||
}
|
||||
Vendored
+2383
-3137
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "copilot",
|
||||
"name": "Copilot",
|
||||
"version": "4.0.2",
|
||||
"version": "4.0.11",
|
||||
"minAppVersion": "1.11.4",
|
||||
"isDesktopOnly": false,
|
||||
"description": "Run AI agents such as Claude Code, Codex, and OpenCode inside your vault. Turn your second brain into a smart assistant that gets knowledge work done.",
|
||||
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+6
-6
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "diary-ics",
|
||||
"name": "Diary ICS",
|
||||
"version": "1.0.11",
|
||||
"version": "1.0.13",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Sync diary entries to system calendar via ICS feed.",
|
||||
"author": "Mousebomb",
|
||||
|
||||
+5824
-2007
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "digitalgarden",
|
||||
"name": "Digital Garden",
|
||||
"version": "2.84.0",
|
||||
"version": "2.94.1",
|
||||
"minAppVersion": "1.10.0",
|
||||
"description": "Publish your notes to the web for others to enjoy. For free.",
|
||||
"author": "Ole Eskild Steensen",
|
||||
|
||||
+71
@@ -577,3 +577,74 @@ h4 {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
/* Forestry site-update status bar item */
|
||||
.dg-site-status {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.dg-site-status.dg-site-status-updating {
|
||||
animation: dg-site-status-pulse 1.5s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.dg-site-status.dg-site-status-failed {
|
||||
color: var(--text-error);
|
||||
}
|
||||
|
||||
@keyframes dg-site-status-pulse {
|
||||
0%,
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.4;
|
||||
}
|
||||
}
|
||||
|
||||
/* Home page onboarding */
|
||||
.dg-pc-home-banner {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 6px;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
font-size: 0.85rem;
|
||||
background: var(--background-secondary);
|
||||
}
|
||||
|
||||
.dg-pc-home-banner .dg-pc-callout-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.dg-pc-home-banner .dg-pc-callout-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.dg-home-prompt-hint {
|
||||
color: var(--text-muted);
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.dg-home-prompt-buttons {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
justify-content: flex-end;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.dg-notice-clickable {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.dg-forestry-connect-error {
|
||||
color: var(--text-error);
|
||||
font-size: 0.9em;
|
||||
margin: 6px 0;
|
||||
}
|
||||
|
||||
.dg-forestry-connect-hint {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"lastVersion": "4.1.1",
|
||||
"lastVersion": "4.1.4",
|
||||
"aestheticStyle": "default",
|
||||
"positionStyle": "top",
|
||||
"menuCommands": [
|
||||
|
||||
+3
-3
File diff suppressed because one or more lines are too long
+3
-3
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"id": "editing-toolbar",
|
||||
"name": "Editing Toolbar",
|
||||
"version": "4.1.1",
|
||||
"version": "4.1.4",
|
||||
"minAppVersion": "0.14.0",
|
||||
"description": "The Obsidian Editing Toolbar is modified from cmenu, which provides more powerful customization settings and has many built-in editing commands to be a MS Word-like toolbar editing experience.",
|
||||
"description": "The Editing Toolbar is modified from cmenu, which provides more powerful customization settings and has many built-in editing commands to be a MS Word-like toolbar editing experience.",
|
||||
"author": "Cuman",
|
||||
"authorUrl": "https://github.com/cumany/obsidian-editing-toolbar",
|
||||
"authorUrl": "https://github.com/cumany",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
|
||||
+21
-2
@@ -214,7 +214,7 @@ editingToolbar SETTING ITEMS
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
min-width: 0;
|
||||
padding: 8px 4px;
|
||||
padding: 8px 12px;
|
||||
}
|
||||
|
||||
.editingToolbarSettingsTabsContainer.editing-toolbar-native-command-list
|
||||
@@ -1827,7 +1827,6 @@ transition: none !important;
|
||||
display: flex !important;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
color: var(--text-muted); /* 文字直接变透明背景色 */
|
||||
filter: contrast(0.5);
|
||||
}
|
||||
.theme-dark .menu.editing-toolbar-dropdown-menu .menu-item.is-disabled
|
||||
@@ -2591,6 +2590,7 @@ body.auto-hide-header .workspace-tab-header-container + .workspace-tab-container
|
||||
|
||||
|
||||
.is-phone .mod-root .workspace-leaf-content[data-type="markdown"] .view-content:has(.editingToolbarModalBar){
|
||||
-webkit-mask-image: none;
|
||||
mask-image: none;
|
||||
}
|
||||
|
||||
@@ -2874,3 +2874,22 @@ body.auto-hide-header .workspace-tab-header-container + .workspace-tab-container
|
||||
.editing-toolbar-ai-inline-body .setting-item {
|
||||
border-top: 1px solid var(--background-modifier-border-hover);
|
||||
}
|
||||
|
||||
/* 更新提示弹窗(UpdateNoticeModal):样式集中在 styles.css,不再动态注入 <style> */
|
||||
.editing-toolbar-update-modal .changelog-container {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
padding: 10px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 5px;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.editing-toolbar-update-modal .changelog-content {
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.editing-toolbar-update-modal .changelog-content a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
Vendored
+431
-259
@@ -23199,6 +23199,179 @@ function update(forkRef, refs) {
|
||||
}
|
||||
|
||||
// node_modules/reselect/dist/reselect.mjs
|
||||
var CACHE_SIZE_CHECK_THRESHOLD = 1e3;
|
||||
var runCacheSizeCheck = (cacheSize, funcName) => {
|
||||
let stack = void 0;
|
||||
try {
|
||||
throw new Error();
|
||||
} catch (e) {
|
||||
;
|
||||
({ stack } = e);
|
||||
}
|
||||
console.warn(
|
||||
`A function memoized with weakMapMemoize${funcName ? ` (\`${funcName}\`)` : ""} has seen over ${cacheSize} distinct values for the same primitive argument position.
|
||||
Results keyed by primitive arguments are held strongly and are only released by \`clearCache()\`, so this cache will keep growing for as long as the function keeps seeing new values.
|
||||
If it is called with ever-changing primitives (ids, offsets, timestamps), pass the \`maxSize\` option to bound the cache, switch to \`lruMemoize\`, or call \`.clearCache()\` at a suitable point.
|
||||
See https://reselect.js.org/api/development-only-checks#cachesizecheck for details.`,
|
||||
{ stack }
|
||||
);
|
||||
};
|
||||
var globalDevModeChecks = {
|
||||
inputStabilityCheck: "once",
|
||||
identityFunctionCheck: "once",
|
||||
cacheSizeCheck: "once"
|
||||
};
|
||||
var StrongRef = class {
|
||||
constructor(value) {
|
||||
this.value = value;
|
||||
}
|
||||
deref() {
|
||||
return this.value;
|
||||
}
|
||||
};
|
||||
var getWeakRef = () => typeof WeakRef === "undefined" ? StrongRef : WeakRef;
|
||||
var Ref = /* @__PURE__ */ getWeakRef();
|
||||
var UNTERMINATED = 0;
|
||||
var TERMINATED = 1;
|
||||
function createCacheNode() {
|
||||
return {
|
||||
s: UNTERMINATED,
|
||||
v: void 0,
|
||||
o: null,
|
||||
p: null
|
||||
};
|
||||
}
|
||||
function maybeDeref(r2) {
|
||||
if (r2 instanceof Ref) {
|
||||
return r2.deref();
|
||||
}
|
||||
return r2;
|
||||
}
|
||||
function weakMapMemoize(func, options = {}) {
|
||||
let fnNode = createCacheNode();
|
||||
const { resultEqualityCheck, maxSize } = options;
|
||||
const useGenerations = maxSize !== void 0;
|
||||
if (useGenerations && (!Number.isInteger(maxSize) || maxSize < 1)) {
|
||||
throw new TypeError(
|
||||
`maxSize must be a positive integer, received: ${maxSize}`
|
||||
);
|
||||
}
|
||||
let prevNode = null;
|
||||
let insertionCount = 0;
|
||||
let lastResult;
|
||||
let resultsCount = 0;
|
||||
let hasWarnedAboutCacheSize = false;
|
||||
function maybeFlipGenerations() {
|
||||
if (insertionCount >= maxSize) {
|
||||
prevNode = fnNode;
|
||||
fnNode = createCacheNode();
|
||||
insertionCount = 0;
|
||||
}
|
||||
}
|
||||
function memoized() {
|
||||
let cacheNode = fnNode;
|
||||
const { length: length2 } = arguments;
|
||||
for (let i = 0, l = length2; i < l; i++) {
|
||||
const arg2 = arguments[i];
|
||||
if (typeof arg2 === "function" || typeof arg2 === "object" && arg2 !== null) {
|
||||
let objectCache = cacheNode.o;
|
||||
if (objectCache === null) {
|
||||
cacheNode.o = objectCache = /* @__PURE__ */ new WeakMap();
|
||||
}
|
||||
const objectNode = objectCache.get(arg2);
|
||||
if (objectNode === void 0) {
|
||||
cacheNode = createCacheNode();
|
||||
objectCache.set(arg2, cacheNode);
|
||||
} else {
|
||||
cacheNode = objectNode;
|
||||
}
|
||||
} else {
|
||||
let primitiveCache = cacheNode.p;
|
||||
if (primitiveCache === null) {
|
||||
cacheNode.p = primitiveCache = /* @__PURE__ */ new Map();
|
||||
}
|
||||
const primitiveNode = primitiveCache.get(arg2);
|
||||
if (primitiveNode === void 0) {
|
||||
cacheNode = createCacheNode();
|
||||
primitiveCache.set(arg2, cacheNode);
|
||||
insertionCount++;
|
||||
if (true) {
|
||||
if (primitiveCache.size > CACHE_SIZE_CHECK_THRESHOLD) {
|
||||
const { cacheSizeCheck } = globalDevModeChecks;
|
||||
if (cacheSizeCheck === "always" || cacheSizeCheck === "once" && !hasWarnedAboutCacheSize) {
|
||||
hasWarnedAboutCacheSize = true;
|
||||
runCacheSizeCheck(primitiveCache.size, func.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
cacheNode = primitiveNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cacheNode.s === TERMINATED) {
|
||||
return cacheNode.v;
|
||||
}
|
||||
if (prevNode !== null) {
|
||||
let prevCacheNode = prevNode;
|
||||
for (let i = 0, l = length2; i < l; i++) {
|
||||
const arg2 = arguments[i];
|
||||
let next2;
|
||||
if (typeof arg2 === "function" || typeof arg2 === "object" && arg2 !== null) {
|
||||
const prevObjectCache = prevCacheNode.o;
|
||||
next2 = prevObjectCache !== null ? prevObjectCache.get(arg2) : void 0;
|
||||
} else {
|
||||
const prevPrimitiveCache = prevCacheNode.p;
|
||||
next2 = prevPrimitiveCache !== null ? prevPrimitiveCache.get(arg2) : void 0;
|
||||
}
|
||||
if (next2 === void 0) {
|
||||
prevCacheNode = null;
|
||||
break;
|
||||
}
|
||||
prevCacheNode = next2;
|
||||
}
|
||||
if (prevCacheNode !== null && prevCacheNode.s === TERMINATED) {
|
||||
const promotedNode = cacheNode;
|
||||
promotedNode.s = TERMINATED;
|
||||
promotedNode.v = prevCacheNode.v;
|
||||
maybeFlipGenerations();
|
||||
return prevCacheNode.v;
|
||||
}
|
||||
}
|
||||
const terminatedNode = cacheNode;
|
||||
let result = func.apply(null, arguments);
|
||||
resultsCount++;
|
||||
if (resultEqualityCheck) {
|
||||
const lastResultValue = maybeDeref(lastResult);
|
||||
if (lastResultValue != null && resultEqualityCheck(lastResultValue, result)) {
|
||||
result = lastResultValue;
|
||||
resultsCount !== 0 && resultsCount--;
|
||||
}
|
||||
const needsWeakRef = typeof result === "object" && result !== null || typeof result === "function";
|
||||
lastResult = needsWeakRef ? /* @__PURE__ */ new Ref(result) : result;
|
||||
}
|
||||
terminatedNode.s = TERMINATED;
|
||||
terminatedNode.v = result;
|
||||
if (useGenerations) {
|
||||
maybeFlipGenerations();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
memoized.clearCache = () => {
|
||||
fnNode = createCacheNode();
|
||||
prevNode = null;
|
||||
insertionCount = 0;
|
||||
memoized.resetResultsCount();
|
||||
if (true) {
|
||||
hasWarnedAboutCacheSize = false;
|
||||
}
|
||||
};
|
||||
memoized.resultsCount = () => resultsCount;
|
||||
memoized.resetResultsCount = () => {
|
||||
resultsCount = 0;
|
||||
};
|
||||
return memoized;
|
||||
}
|
||||
var runIdentityFunctionCheck = (resultFunc, inputSelectorsResults, outputSelectorResult) => {
|
||||
if (inputSelectorsResults.length === 1 && inputSelectorsResults[0] === outputSelectorResult) {
|
||||
let isInputSameAsOutput = false;
|
||||
@@ -23222,10 +23395,23 @@ var runIdentityFunctionCheck = (resultFunc, inputSelectorsResults, outputSelecto
|
||||
}
|
||||
}
|
||||
};
|
||||
var withoutResultEqualityCheck = (option) => {
|
||||
if (option === null || typeof option !== "object" || !("resultEqualityCheck" in option)) {
|
||||
return option;
|
||||
}
|
||||
const optionCopy = __spreadValues({}, option);
|
||||
delete optionCopy.resultEqualityCheck;
|
||||
return optionCopy;
|
||||
};
|
||||
var runInputStabilityCheck = (inputSelectorResultsObject, options, inputSelectorArgs) => {
|
||||
const { memoize: memoize3, memoizeOptions } = options;
|
||||
const { inputSelectorResults, inputSelectorResultsCopy } = inputSelectorResultsObject;
|
||||
const createAnEmptyObject = memoize3(() => ({}), ...memoizeOptions);
|
||||
const probeMemoizeOptions = [];
|
||||
const { length: length2 } = memoizeOptions;
|
||||
for (let i = 0; i < length2; i++) {
|
||||
probeMemoizeOptions.push(withoutResultEqualityCheck(memoizeOptions[i]));
|
||||
}
|
||||
const createAnEmptyObject = memoize3(() => ({}), ...probeMemoizeOptions);
|
||||
const areInputSelectorResultsEqual = createAnEmptyObject.apply(null, inputSelectorResults) === createAnEmptyObject.apply(null, inputSelectorResultsCopy);
|
||||
if (!areInputSelectorResultsEqual) {
|
||||
let stack = void 0;
|
||||
@@ -23246,10 +23432,6 @@ var runInputStabilityCheck = (inputSelectorResultsObject, options, inputSelector
|
||||
);
|
||||
}
|
||||
};
|
||||
var globalDevModeChecks = {
|
||||
inputStabilityCheck: "once",
|
||||
identityFunctionCheck: "once"
|
||||
};
|
||||
var NOT_FOUND = /* @__PURE__ */ Symbol("NOT_FOUND");
|
||||
function assertIsFunction(func, errorMessage = `expected a function, instead received ${typeof func}`) {
|
||||
if (typeof func !== "function") {
|
||||
@@ -23283,216 +23465,6 @@ function collectInputSelectorResults(dependencies, inputSelectorArgs) {
|
||||
}
|
||||
return inputSelectorResults;
|
||||
}
|
||||
var getDevModeChecksExecutionInfo = (firstRun, devModeChecks) => {
|
||||
const { identityFunctionCheck, inputStabilityCheck } = __spreadValues(__spreadValues({}, globalDevModeChecks), devModeChecks);
|
||||
return {
|
||||
identityFunctionCheck: {
|
||||
shouldRun: identityFunctionCheck === "always" || identityFunctionCheck === "once" && firstRun,
|
||||
run: runIdentityFunctionCheck
|
||||
},
|
||||
inputStabilityCheck: {
|
||||
shouldRun: inputStabilityCheck === "always" || inputStabilityCheck === "once" && firstRun,
|
||||
run: runInputStabilityCheck
|
||||
}
|
||||
};
|
||||
};
|
||||
function createSingletonCache(equals) {
|
||||
let entry;
|
||||
return {
|
||||
get(key) {
|
||||
if (entry && equals(entry.key, key)) {
|
||||
return entry.value;
|
||||
}
|
||||
return NOT_FOUND;
|
||||
},
|
||||
put(key, value) {
|
||||
entry = { key, value };
|
||||
},
|
||||
getEntries() {
|
||||
return entry ? [entry] : [];
|
||||
},
|
||||
clear() {
|
||||
entry = void 0;
|
||||
}
|
||||
};
|
||||
}
|
||||
function createLruCache(maxSize, equals) {
|
||||
let entries = [];
|
||||
function get(key) {
|
||||
const cacheIndex = entries.findIndex((entry) => equals(key, entry.key));
|
||||
if (cacheIndex > -1) {
|
||||
const entry = entries[cacheIndex];
|
||||
if (cacheIndex > 0) {
|
||||
entries.splice(cacheIndex, 1);
|
||||
entries.unshift(entry);
|
||||
}
|
||||
return entry.value;
|
||||
}
|
||||
return NOT_FOUND;
|
||||
}
|
||||
function put(key, value) {
|
||||
if (get(key) === NOT_FOUND) {
|
||||
entries.unshift({ key, value });
|
||||
if (entries.length > maxSize) {
|
||||
entries.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
function getEntries() {
|
||||
return entries;
|
||||
}
|
||||
function clear() {
|
||||
entries = [];
|
||||
}
|
||||
return { get, put, getEntries, clear };
|
||||
}
|
||||
var referenceEqualityCheck = (a, b) => a === b;
|
||||
function createCacheKeyComparator(equalityCheck) {
|
||||
return function areArgumentsShallowlyEqual(prev2, next2) {
|
||||
if (prev2 === null || next2 === null || prev2.length !== next2.length) {
|
||||
return false;
|
||||
}
|
||||
const { length: length2 } = prev2;
|
||||
for (let i = 0; i < length2; i++) {
|
||||
if (!equalityCheck(prev2[i], next2[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
function lruMemoize(func, equalityCheckOrOptions) {
|
||||
const providedOptions = typeof equalityCheckOrOptions === "object" ? equalityCheckOrOptions : { equalityCheck: equalityCheckOrOptions };
|
||||
const {
|
||||
equalityCheck = referenceEqualityCheck,
|
||||
maxSize = 1,
|
||||
resultEqualityCheck
|
||||
} = providedOptions;
|
||||
const comparator = createCacheKeyComparator(equalityCheck);
|
||||
let resultsCount = 0;
|
||||
const cache = maxSize <= 1 ? createSingletonCache(comparator) : createLruCache(maxSize, comparator);
|
||||
function memoized() {
|
||||
let value = cache.get(arguments);
|
||||
if (value === NOT_FOUND) {
|
||||
value = func.apply(null, arguments);
|
||||
resultsCount++;
|
||||
if (resultEqualityCheck) {
|
||||
const entries = cache.getEntries();
|
||||
const matchingEntry = entries.find(
|
||||
(entry) => resultEqualityCheck(entry.value, value)
|
||||
);
|
||||
if (matchingEntry) {
|
||||
value = matchingEntry.value;
|
||||
resultsCount !== 0 && resultsCount--;
|
||||
}
|
||||
}
|
||||
cache.put(arguments, value);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
memoized.clearCache = () => {
|
||||
cache.clear();
|
||||
memoized.resetResultsCount();
|
||||
};
|
||||
memoized.resultsCount = () => resultsCount;
|
||||
memoized.resetResultsCount = () => {
|
||||
resultsCount = 0;
|
||||
};
|
||||
return memoized;
|
||||
}
|
||||
var StrongRef = class {
|
||||
constructor(value) {
|
||||
this.value = value;
|
||||
}
|
||||
deref() {
|
||||
return this.value;
|
||||
}
|
||||
};
|
||||
var getWeakRef = () => typeof WeakRef === "undefined" ? StrongRef : WeakRef;
|
||||
var Ref = /* @__PURE__ */ getWeakRef();
|
||||
var UNTERMINATED = 0;
|
||||
var TERMINATED = 1;
|
||||
function createCacheNode() {
|
||||
return {
|
||||
s: UNTERMINATED,
|
||||
v: void 0,
|
||||
o: null,
|
||||
p: null
|
||||
};
|
||||
}
|
||||
function maybeDeref(r2) {
|
||||
if (r2 instanceof Ref) {
|
||||
return r2.deref();
|
||||
}
|
||||
return r2;
|
||||
}
|
||||
function weakMapMemoize(func, options = {}) {
|
||||
let fnNode = createCacheNode();
|
||||
const { resultEqualityCheck } = options;
|
||||
let lastResult;
|
||||
let resultsCount = 0;
|
||||
function memoized() {
|
||||
let cacheNode = fnNode;
|
||||
const { length: length2 } = arguments;
|
||||
for (let i = 0, l = length2; i < l; i++) {
|
||||
const arg2 = arguments[i];
|
||||
if (typeof arg2 === "function" || typeof arg2 === "object" && arg2 !== null) {
|
||||
let objectCache = cacheNode.o;
|
||||
if (objectCache === null) {
|
||||
cacheNode.o = objectCache = /* @__PURE__ */ new WeakMap();
|
||||
}
|
||||
const objectNode = objectCache.get(arg2);
|
||||
if (objectNode === void 0) {
|
||||
cacheNode = createCacheNode();
|
||||
objectCache.set(arg2, cacheNode);
|
||||
} else {
|
||||
cacheNode = objectNode;
|
||||
}
|
||||
} else {
|
||||
let primitiveCache = cacheNode.p;
|
||||
if (primitiveCache === null) {
|
||||
cacheNode.p = primitiveCache = /* @__PURE__ */ new Map();
|
||||
}
|
||||
const primitiveNode = primitiveCache.get(arg2);
|
||||
if (primitiveNode === void 0) {
|
||||
cacheNode = createCacheNode();
|
||||
primitiveCache.set(arg2, cacheNode);
|
||||
} else {
|
||||
cacheNode = primitiveNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
const terminatedNode = cacheNode;
|
||||
let result;
|
||||
if (cacheNode.s === TERMINATED) {
|
||||
result = cacheNode.v;
|
||||
} else {
|
||||
result = func.apply(null, arguments);
|
||||
resultsCount++;
|
||||
if (resultEqualityCheck) {
|
||||
const lastResultValue = maybeDeref(lastResult);
|
||||
if (lastResultValue != null && resultEqualityCheck(lastResultValue, result)) {
|
||||
result = lastResultValue;
|
||||
resultsCount !== 0 && resultsCount--;
|
||||
}
|
||||
const needsWeakRef = typeof result === "object" && result !== null || typeof result === "function";
|
||||
lastResult = needsWeakRef ? /* @__PURE__ */ new Ref(result) : result;
|
||||
}
|
||||
}
|
||||
terminatedNode.s = TERMINATED;
|
||||
terminatedNode.v = result;
|
||||
return result;
|
||||
}
|
||||
memoized.clearCache = () => {
|
||||
fnNode = createCacheNode();
|
||||
memoized.resetResultsCount();
|
||||
};
|
||||
memoized.resultsCount = () => resultsCount;
|
||||
memoized.resetResultsCount = () => {
|
||||
resultsCount = 0;
|
||||
};
|
||||
return memoized;
|
||||
}
|
||||
function createSelectorCreator(memoizeOrOptions, ...memoizeOptionsFromArgs) {
|
||||
const createSelectorCreatorOptions = typeof memoizeOrOptions === "function" ? {
|
||||
memoize: memoizeOrOptions,
|
||||
@@ -23532,27 +23504,35 @@ function createSelectorCreator(memoizeOrOptions, ...memoizeOptionsFromArgs) {
|
||||
let firstRun = true;
|
||||
const selector = argsMemoize(function dependenciesChecker() {
|
||||
dependencyRecomputations++;
|
||||
const inputSelectorResults = collectInputSelectorResults(
|
||||
dependencies,
|
||||
arguments
|
||||
);
|
||||
const { length: length2 } = dependencies;
|
||||
const inputSelectorResults = new Array(length2);
|
||||
for (let i = 0; i < length2; i++) {
|
||||
inputSelectorResults[i] = dependencies[i].apply(null, arguments);
|
||||
}
|
||||
lastResult = memoizedResultFunc.apply(null, inputSelectorResults);
|
||||
if (true) {
|
||||
const { devModeChecks = {} } = combinedOptions;
|
||||
const { identityFunctionCheck, inputStabilityCheck } = getDevModeChecksExecutionInfo(firstRun, devModeChecks);
|
||||
if (identityFunctionCheck.shouldRun) {
|
||||
identityFunctionCheck.run(
|
||||
const { devModeChecks } = combinedOptions;
|
||||
const identityFunctionCheck = devModeChecks !== void 0 && Object.prototype.hasOwnProperty.call(
|
||||
devModeChecks,
|
||||
"identityFunctionCheck"
|
||||
) ? devModeChecks.identityFunctionCheck : globalDevModeChecks.identityFunctionCheck;
|
||||
const inputStabilityCheck = devModeChecks !== void 0 && Object.prototype.hasOwnProperty.call(
|
||||
devModeChecks,
|
||||
"inputStabilityCheck"
|
||||
) ? devModeChecks.inputStabilityCheck : globalDevModeChecks.inputStabilityCheck;
|
||||
if (identityFunctionCheck === "always" || identityFunctionCheck === "once" && firstRun) {
|
||||
runIdentityFunctionCheck(
|
||||
resultFunc,
|
||||
inputSelectorResults,
|
||||
lastResult
|
||||
);
|
||||
}
|
||||
if (inputStabilityCheck.shouldRun) {
|
||||
if (inputStabilityCheck === "always" || inputStabilityCheck === "once" && firstRun) {
|
||||
const inputSelectorResultsCopy = collectInputSelectorResults(
|
||||
dependencies,
|
||||
arguments
|
||||
);
|
||||
inputStabilityCheck.run(
|
||||
runInputStabilityCheck(
|
||||
{ inputSelectorResults, inputSelectorResultsCopy },
|
||||
{ memoize: memoize3, memoizeOptions: finalMemoizeOptions },
|
||||
arguments
|
||||
@@ -23584,6 +23564,117 @@ function createSelectorCreator(memoizeOrOptions, ...memoizeOptionsFromArgs) {
|
||||
});
|
||||
return createSelector2;
|
||||
}
|
||||
function createSingletonCache(equals) {
|
||||
let entry;
|
||||
return {
|
||||
get(key) {
|
||||
if (entry && equals(entry.key, key)) {
|
||||
return entry.value;
|
||||
}
|
||||
return NOT_FOUND;
|
||||
},
|
||||
put(key, value) {
|
||||
entry = { key, value };
|
||||
},
|
||||
findMatchingEntry(value, resultEqualityCheck) {
|
||||
const current = entry;
|
||||
return current !== void 0 && resultEqualityCheck(current.value, value) ? current : void 0;
|
||||
},
|
||||
clear() {
|
||||
entry = void 0;
|
||||
}
|
||||
};
|
||||
}
|
||||
function createLruCache(maxSize, equals) {
|
||||
let entries = [];
|
||||
function get(key) {
|
||||
const cacheIndex = entries.findIndex((entry) => equals(entry.key, key));
|
||||
if (cacheIndex > -1) {
|
||||
const entry = entries[cacheIndex];
|
||||
if (cacheIndex > 0) {
|
||||
entries.splice(cacheIndex, 1);
|
||||
entries.unshift(entry);
|
||||
}
|
||||
return entry.value;
|
||||
}
|
||||
return NOT_FOUND;
|
||||
}
|
||||
function put(key, value) {
|
||||
entries.unshift({ key, value });
|
||||
if (entries.length > maxSize) {
|
||||
entries.pop();
|
||||
}
|
||||
}
|
||||
function findMatchingEntry(value, resultEqualityCheck) {
|
||||
const currentEntries = entries;
|
||||
const { length: length2 } = currentEntries;
|
||||
for (let i = 0; i < length2; i++) {
|
||||
const entry = currentEntries[i];
|
||||
if (resultEqualityCheck(entry.value, value)) {
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
return void 0;
|
||||
}
|
||||
function clear() {
|
||||
entries = [];
|
||||
}
|
||||
return { get, put, findMatchingEntry, clear };
|
||||
}
|
||||
var referenceEqualityCheck = (a, b) => a === b;
|
||||
function createCacheKeyComparator(equalityCheck) {
|
||||
return function areArgumentsShallowlyEqual(prev2, next2) {
|
||||
if (prev2 === null || next2 === null || prev2.length !== next2.length) {
|
||||
return false;
|
||||
}
|
||||
const { length: length2 } = prev2;
|
||||
for (let i = 0; i < length2; i++) {
|
||||
if (!equalityCheck(prev2[i], next2[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
function lruMemoize(func, equalityCheckOrOptions) {
|
||||
const providedOptions = typeof equalityCheckOrOptions === "object" ? equalityCheckOrOptions : { equalityCheck: equalityCheckOrOptions };
|
||||
const {
|
||||
equalityCheck = referenceEqualityCheck,
|
||||
maxSize = 1,
|
||||
resultEqualityCheck
|
||||
} = providedOptions;
|
||||
const comparator = createCacheKeyComparator(equalityCheck);
|
||||
let resultsCount = 0;
|
||||
const cache = maxSize <= 1 ? createSingletonCache(comparator) : createLruCache(maxSize, comparator);
|
||||
function memoized() {
|
||||
let value = cache.get(arguments);
|
||||
if (value === NOT_FOUND) {
|
||||
value = func.apply(null, arguments);
|
||||
resultsCount++;
|
||||
if (resultEqualityCheck) {
|
||||
const matchingEntry = cache.findMatchingEntry(
|
||||
value,
|
||||
resultEqualityCheck
|
||||
);
|
||||
if (matchingEntry) {
|
||||
value = matchingEntry.value;
|
||||
resultsCount !== 0 && resultsCount--;
|
||||
}
|
||||
}
|
||||
cache.put(arguments, value);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
memoized.clearCache = () => {
|
||||
cache.clear();
|
||||
memoized.resetResultsCount();
|
||||
};
|
||||
memoized.resultsCount = () => resultsCount;
|
||||
memoized.resetResultsCount = () => {
|
||||
resultsCount = 0;
|
||||
};
|
||||
return memoized;
|
||||
}
|
||||
|
||||
// node_modules/@mui/x-internals/store/createSelector.mjs
|
||||
var reselectCreateSelector = createSelectorCreator({
|
||||
@@ -38863,7 +38954,7 @@ var FlowershowClient = class {
|
||||
const url = `${this.apiUrl}${endpoint}`;
|
||||
const headers = __spreadProps(__spreadValues({}, options.headers), {
|
||||
Authorization: `Bearer ${this.token}`,
|
||||
"X-Flowershow-Plugin-Version": "4.2.0"
|
||||
"X-Flowershow-Plugin-Version": "4.2.3"
|
||||
});
|
||||
return (0, import_obsidian2.requestUrl)({
|
||||
url,
|
||||
@@ -38893,31 +38984,6 @@ var FlowershowClient = class {
|
||||
return response.json;
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Create a new site or get existing site by name
|
||||
*/
|
||||
createSite(projectName, overwrite = false) {
|
||||
return __async(this, null, function* () {
|
||||
const response = yield this.apiRequest("/api/sites", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
body: JSON.stringify({ projectName, overwrite })
|
||||
});
|
||||
if (response.status >= 300) {
|
||||
let error = {};
|
||||
try {
|
||||
error = response.json;
|
||||
} catch (_) {
|
||||
}
|
||||
throw new Error(
|
||||
error.message || `Failed to create site: ${response.status}`
|
||||
);
|
||||
}
|
||||
return response.json;
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Get a site by name
|
||||
*/
|
||||
@@ -39241,6 +39307,29 @@ function rewriteRootDirPaths(content, rootDir) {
|
||||
result = rewriteBaseQueryPaths(result, rootDir);
|
||||
return result;
|
||||
}
|
||||
function rewriteCanvasPaths(content, rootDir) {
|
||||
if (!rootDir) return content;
|
||||
const root = normalizeRootDir(rootDir);
|
||||
let data;
|
||||
try {
|
||||
data = JSON.parse(content);
|
||||
} catch (e) {
|
||||
return content;
|
||||
}
|
||||
if (!data || typeof data !== "object" || !Array.isArray(data.nodes)) {
|
||||
return content;
|
||||
}
|
||||
const nodes = data.nodes;
|
||||
for (const node2 of nodes) {
|
||||
if (!node2 || typeof node2 !== "object") continue;
|
||||
if (node2.type === "file" && typeof node2.file === "string") {
|
||||
node2.file = stripRootDirPrefix(node2.file, root);
|
||||
} else if (node2.type === "text" && typeof node2.text === "string") {
|
||||
node2.text = rewriteRootDirPaths(node2.text, rootDir);
|
||||
}
|
||||
}
|
||||
return JSON.stringify(data, null, " ");
|
||||
}
|
||||
function rewriteBaseQueryPaths(content, rootDir) {
|
||||
if (!rootDir) return content;
|
||||
const root = normalizeRootDir(rootDir);
|
||||
@@ -39304,24 +39393,96 @@ var Publisher = class {
|
||||
return null;
|
||||
});
|
||||
}
|
||||
/** Get or create the site */
|
||||
/**
|
||||
* Resolve the existing site. The plugin never creates sites — the site must
|
||||
* already exist on Flowershow with the exact same name as `siteName`.
|
||||
*/
|
||||
ensureSite() {
|
||||
return __async(this, null, function* () {
|
||||
const existingSiteId = yield this.getSiteId();
|
||||
if (existingSiteId) {
|
||||
return existingSiteId;
|
||||
}
|
||||
const { site } = yield this.client.createSite(this.getSiteName());
|
||||
this.siteId = site.id;
|
||||
return this.siteId;
|
||||
throw new FlowershowError(
|
||||
`Site "${this.getSiteName()}" was not found. Create it on Flowershow first, then set "Site Name" to the exact same name.`
|
||||
);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Files whose contents we read, rewrite, and upload as UTF-8 text (rather than
|
||||
* raw bytes). Beyond the plain-text formats, `.canvas` files are JSON that we
|
||||
* must rewrite so their internal `file`/`text` references drop the rootDir
|
||||
* prefix — otherwise the published canvas points at blob keys that don't exist.
|
||||
*/
|
||||
isTextFile(file) {
|
||||
return isPlainTextExtension(file.extension) || file.extension === "canvas";
|
||||
}
|
||||
getTextContent(file) {
|
||||
return __async(this, null, function* () {
|
||||
const text = yield this.app.vault.cachedRead(file);
|
||||
if (file.extension === "canvas") {
|
||||
return rewriteCanvasPaths(text, this.settings.rootDir);
|
||||
}
|
||||
return rewriteRootDirPaths(text, this.settings.rootDir);
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Poll the server until it has finished processing the latest publish.
|
||||
*
|
||||
* Uploading a file to R2 only stages it; the server's finalizer workflow
|
||||
* then processes the blob asynchronously. Until it finishes, a dry-run sync
|
||||
* still reports the file as new/changed. Waiting here keeps the publish
|
||||
* status accurate once we return.
|
||||
*/
|
||||
waitForProcessing(siteId) {
|
||||
return __async(this, null, function* () {
|
||||
const maxAttempts = 60;
|
||||
const pollInterval = 1e3;
|
||||
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
||||
let status;
|
||||
try {
|
||||
status = yield this.client.getSiteStatus(siteId);
|
||||
} catch (error) {
|
||||
console.error("Error polling site status:", error);
|
||||
return;
|
||||
}
|
||||
if (status.status !== "pending" && status.files.pending === 0) {
|
||||
return;
|
||||
}
|
||||
yield new Promise((resolve) => setTimeout(resolve, pollInterval));
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Poll the server until the given paths have been removed from the site.
|
||||
*
|
||||
* Unpublishing deletes the R2 object synchronously, but the blob record is
|
||||
* removed asynchronously (via an R2 event). Unlike a publish, this path has
|
||||
* no Publish record to poll, so we detect completion by listing the site's
|
||||
* remaining blobs (a dry-run sync with an empty file list reports every
|
||||
* existing blob under `deleted`) and waiting until none of ours remain.
|
||||
*/
|
||||
waitForDeletion(siteId, paths) {
|
||||
return __async(this, null, function* () {
|
||||
const maxAttempts = 60;
|
||||
const pollInterval = 1e3;
|
||||
const pending = new Set(paths);
|
||||
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
||||
let remainingBlobs;
|
||||
try {
|
||||
const sync = yield this.client.syncFiles(siteId, [], true);
|
||||
remainingBlobs = new Set(sync.deleted);
|
||||
} catch (error) {
|
||||
console.error("Error polling deletion status:", error);
|
||||
return;
|
||||
}
|
||||
if (![...pending].some((path) => remainingBlobs.has(path))) {
|
||||
return;
|
||||
}
|
||||
yield new Promise((resolve) => setTimeout(resolve, pollInterval));
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Publish note and optionally its embeds
|
||||
* @returns Site URL and publish status
|
||||
@@ -39374,10 +39535,12 @@ var Publisher = class {
|
||||
const progress = new import_obsidian4.Notice(`\u231B ${label} (0/${total})...`, 0);
|
||||
try {
|
||||
const siteId = yield this.ensureSite();
|
||||
let deletedPaths = [];
|
||||
if (opts.filesToDelete && opts.filesToDelete.length > 0) {
|
||||
const normalizedPathsToDelete = opts.filesToDelete.map(
|
||||
(path) => normalizePath(path, this.settings.rootDir)
|
||||
);
|
||||
deletedPaths = normalizedPathsToDelete;
|
||||
const deleteResult = yield this.client.deleteFiles(
|
||||
siteId,
|
||||
normalizedPathsToDelete
|
||||
@@ -39401,7 +39564,7 @@ var Publisher = class {
|
||||
this.settings.rootDir
|
||||
);
|
||||
let sha;
|
||||
if (isPlainTextExtension(file.extension)) {
|
||||
if (this.isTextFile(file)) {
|
||||
const text = yield this.getTextContent(file);
|
||||
sha = yield calculateTextSha(text);
|
||||
} else {
|
||||
@@ -39424,7 +39587,7 @@ var Publisher = class {
|
||||
);
|
||||
if (!file) continue;
|
||||
let content;
|
||||
if (isPlainTextExtension(file.extension)) {
|
||||
if (this.isTextFile(file)) {
|
||||
const text = yield this.getTextContent(file);
|
||||
content = new TextEncoder().encode(text);
|
||||
} else {
|
||||
@@ -39441,6 +39604,15 @@ var Publisher = class {
|
||||
progress.setMessage(`\u231B ${label} (${done}/${total})...`);
|
||||
}
|
||||
}
|
||||
if (opts.filesToPublish && opts.filesToPublish.length > 0 || deletedPaths.length > 0) {
|
||||
progress.setMessage("\u231B Finalizing processing...");
|
||||
if (opts.filesToPublish && opts.filesToPublish.length > 0) {
|
||||
yield this.waitForProcessing(siteId);
|
||||
}
|
||||
if (deletedPaths.length > 0) {
|
||||
yield this.waitForDeletion(siteId, deletedPaths);
|
||||
}
|
||||
}
|
||||
progress.hide();
|
||||
const username = yield this.getUsername();
|
||||
const site = yield this.client.getSiteByName(
|
||||
@@ -39500,7 +39672,7 @@ var Publisher = class {
|
||||
}
|
||||
const normalizedPath = normalizePath(file.path, this.settings.rootDir);
|
||||
let sha;
|
||||
if (isPlainTextExtension(file.extension)) {
|
||||
if (this.isTextFile(file)) {
|
||||
const text = yield this.getTextContent(file);
|
||||
sha = yield calculateTextSha(text);
|
||||
} else {
|
||||
@@ -39630,7 +39802,7 @@ var SettingView = class {
|
||||
}
|
||||
initializeSiteNameSetting() {
|
||||
new import_obsidian5.Setting(this.settingsRootElement).setName("Site Name").setDesc(
|
||||
"Name of your Flowershow site (will be created if it doesn't exist)"
|
||||
"Name of an existing Flowershow site. Create the site on Flowershow first, then enter its exact name here."
|
||||
).addText(
|
||||
(text) => text.setPlaceholder("my-notes").setValue(this.settings.siteName).onChange((value) => __async(this, null, function* () {
|
||||
this.settings.siteName = value;
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "flowershow",
|
||||
"name": "Publish with Flowershow",
|
||||
"version": "4.2.0",
|
||||
"version": "4.2.3",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Publish your vault as a website with Flowershow.",
|
||||
"author": "Flowershow",
|
||||
|
||||
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
@@ -5,5 +5,5 @@
|
||||
"author": "lazyloong",
|
||||
|
||||
"minAppVersion": "1.0.0",
|
||||
"version": "2.29.2"
|
||||
"version": "2.29.4"
|
||||
}
|
||||
|
||||
+34
-32
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"id": "mp-publisher",
|
||||
"name": "MP Publisher",
|
||||
"version": "2.7.10",
|
||||
"version": "2.7.11",
|
||||
"minAppVersion": "1.12.0",
|
||||
"description": "Preview with custom CSS themes and publish articles to WeChat Official Accounts with one click.",
|
||||
"author": "joeytoday",
|
||||
"authorUrl": "https://github.com/joeytoday",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+3021
-1958
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "note-to-mp",
|
||||
"name": "NoteToMP",
|
||||
"version": "2.3.2",
|
||||
"version": "2.4.0",
|
||||
"minAppVersion": "1.4.5",
|
||||
"description": "Send notes to WeChat MP drafts, or copy notes to WeChat MP editor, perfect preservation of note styles, support code highlighting, line numbers in code, and support local image uploads.",
|
||||
"author": "Sun Booshi",
|
||||
|
||||
+573
@@ -116,6 +116,9 @@
|
||||
}
|
||||
|
||||
/* src/ui/components/Cover.module.css */
|
||||
.Cover_CoverContainer {
|
||||
position: relative;
|
||||
}
|
||||
.Cover_CoverLabel {
|
||||
width: 120px;
|
||||
height: 80px;
|
||||
@@ -136,6 +139,44 @@
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
}
|
||||
.Cover_CoverSourceOptions {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
height: 100%;
|
||||
}
|
||||
.Cover_CoverSourceButton {
|
||||
display: block;
|
||||
box-sizing: border-box;
|
||||
width: calc(100% - 16px);
|
||||
padding: 6px 0;
|
||||
margin: 0;
|
||||
appearance: none;
|
||||
border-radius: var(--button-radius, 5px);
|
||||
background-color: var(--interactive-normal);
|
||||
box-shadow: var(--input-shadow);
|
||||
color: var(--text-normal);
|
||||
font-family: inherit;
|
||||
font-size: 12px;
|
||||
font-weight: inherit;
|
||||
line-height: inherit;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
white-space: nowrap;
|
||||
user-select: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
.Cover_CoverSourceButton:hover {
|
||||
background-color: var(--interactive-hover);
|
||||
box-shadow: var(--input-shadow-hover);
|
||||
color: var(--text-normal);
|
||||
}
|
||||
.Cover_CoverSourceButton:focus-visible {
|
||||
outline: 2px solid var(--interactive-accent);
|
||||
outline-offset: -2px;
|
||||
}
|
||||
.Cover_CoverPreview {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
@@ -163,6 +204,251 @@
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
/* src/ui/components/UnsplashCoverPicker.module.css */
|
||||
.UnsplashCoverPicker_PickerBody {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-height: 0;
|
||||
}
|
||||
.UnsplashCoverPicker_ContentArea {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-direction: column;
|
||||
min-height: 0;
|
||||
}
|
||||
.UnsplashCoverPicker_LoadingToast {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 10px;
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
}
|
||||
.UnsplashCoverPicker_Spinner {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border: 2px solid rgba(255, 255, 255, 0.35);
|
||||
border-top-color: #fff;
|
||||
border-radius: 50%;
|
||||
animation: UnsplashCoverPicker_ntm-spin 0.8s linear infinite;
|
||||
}
|
||||
@keyframes UnsplashCoverPicker_ntm-spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
.UnsplashCoverPicker_Toolbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.UnsplashCoverPicker_CategoryBar {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
.UnsplashCoverPicker_ToolbarDivider {
|
||||
width: 1px;
|
||||
align-self: stretch;
|
||||
flex-shrink: 0;
|
||||
background-color: var(--background-modifier-border);
|
||||
}
|
||||
.UnsplashCoverPicker_CategoryButton {
|
||||
padding: 5px 12px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 16px;
|
||||
background: transparent;
|
||||
color: var(--text-normal);
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
transition:
|
||||
background-color 150ms,
|
||||
border-color 150ms,
|
||||
color 150ms;
|
||||
}
|
||||
.UnsplashCoverPicker_CategoryButton:hover {
|
||||
background-color: var(--background-modifier-hover);
|
||||
}
|
||||
.UnsplashCoverPicker_CategoryActive {
|
||||
border-color: var(--interactive-accent);
|
||||
background-color: color-mix(in srgb, var(--interactive-accent) 15%, transparent);
|
||||
color: var(--interactive-accent);
|
||||
}
|
||||
.UnsplashCoverPicker_ToolButton {
|
||||
padding: 4px 10px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 6px;
|
||||
background: var(--background-secondary);
|
||||
color: var(--text-normal);
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.UnsplashCoverPicker_ToolButton:hover:not(:disabled) {
|
||||
background-color: var(--background-modifier-hover);
|
||||
}
|
||||
.UnsplashCoverPicker_ToolButton:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoGrid {
|
||||
display: grid;
|
||||
flex: 1;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 12px;
|
||||
overflow-y: auto;
|
||||
padding: 2px;
|
||||
min-height: 0;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoCard {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoCard .UnsplashCoverPicker_FavoriteButton {
|
||||
position: absolute;
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
z-index: 2;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 0;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
transition: background-color 150ms, transform 150ms;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoCard .UnsplashCoverPicker_FavoriteButton:hover {
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
transform: scale(1.1);
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoCard .UnsplashCoverPicker_FavoriteButton.UnsplashCoverPicker_FavoriteActive {
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
color: #ffcf3f;
|
||||
box-shadow: 0 0 0 1px rgba(255, 207, 63, 0.8);
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoLink {
|
||||
position: relative;
|
||||
display: block;
|
||||
aspect-ratio: 3 / 2;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
background-color: var(--background-secondary);
|
||||
text-decoration: none;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoThumbLink {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoThumb {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
display: block;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoOverlay {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 6px;
|
||||
padding: 4px 8px;
|
||||
background: linear-gradient(transparent, rgba(0, 0, 0, 0.65));
|
||||
color: #fff;
|
||||
font-size: 11px;
|
||||
opacity: 1;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoAuthor {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.UnsplashCoverPicker_PhotoAuthor:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.UnsplashCoverPicker_UseButton {
|
||||
padding: 4px 0;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
background-color: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.UnsplashCoverPicker_UseButton:hover:not(:disabled) {
|
||||
background-color: color-mix(in srgb, var(--interactive-accent) 88%, white);
|
||||
}
|
||||
.UnsplashCoverPicker_UseButton:disabled {
|
||||
background-color: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
opacity: 0.6;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.UnsplashCoverPicker_ErrorBox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
padding: 24px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 8px;
|
||||
background-color: color-mix(in srgb, var(--color-red) 8%, transparent);
|
||||
color: var(--color-red);
|
||||
font-size: 13px;
|
||||
}
|
||||
.UnsplashCoverPicker_LoadingBox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
color: var(--text-muted);
|
||||
font-size: 13px;
|
||||
}
|
||||
.UnsplashCoverPicker_EmptyBox {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
padding: 24px;
|
||||
color: var(--text-muted);
|
||||
font-size: 13px;
|
||||
}
|
||||
.UnsplashCoverPicker_Footer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 8px;
|
||||
padding-top: 10px;
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
font-size: 11px;
|
||||
color: var(--text-faint);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* src/ui/components/AccountSelect.module.css */
|
||||
.AccountSelect_Trigger {
|
||||
all: unset;
|
||||
@@ -2272,3 +2558,290 @@
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
/* src/ui/wechat-manager.module.css */
|
||||
.wechat_manager_Root {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 60vh;
|
||||
gap: 12px;
|
||||
}
|
||||
.wechat_manager_Toolbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.wechat_manager_Tabs {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
.wechat_manager_Tab,
|
||||
.wechat_manager_TabActive {
|
||||
padding: 6px 16px;
|
||||
border: none;
|
||||
border-radius: 4px 4px 0 0;
|
||||
background: transparent;
|
||||
color: var(--text-muted);
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.wechat_manager_Tab:hover {
|
||||
color: var(--text-normal);
|
||||
background: var(--background-modifier-hover);
|
||||
}
|
||||
.wechat_manager_TabActive {
|
||||
color: var(--text-accent);
|
||||
border-bottom: 2px solid var(--interactive-accent);
|
||||
background: var(--background-modifier-hover);
|
||||
font-weight: 600;
|
||||
}
|
||||
.wechat_manager_Body {
|
||||
position: relative;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
}
|
||||
.wechat_manager_Content {
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
}
|
||||
.wechat_manager_Empty {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
color: var(--text-muted);
|
||||
font-size: 14px;
|
||||
}
|
||||
.wechat_manager_Loading {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
color: var(--text-muted);
|
||||
font-size: 14px;
|
||||
}
|
||||
.wechat_manager_DraftList {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
.wechat_manager_DraftItem {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
height: 90px;
|
||||
padding: 8px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 8px;
|
||||
background: var(--background-secondary);
|
||||
gap: 12px;
|
||||
}
|
||||
.wechat_manager_DraftItem:hover {
|
||||
border-color: var(--interactive-accent);
|
||||
}
|
||||
.wechat_manager_DraftCoverWrap {
|
||||
width: 120px;
|
||||
height: 100%;
|
||||
flex-shrink: 0;
|
||||
overflow: hidden;
|
||||
border-radius: 6px;
|
||||
background: var(--background-modifier-hover);
|
||||
}
|
||||
.wechat_manager_DraftCover {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
display: block;
|
||||
}
|
||||
.wechat_manager_DraftCoverEmpty {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: var(--text-faint);
|
||||
font-size: 12px;
|
||||
}
|
||||
.wechat_manager_DraftInfo {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.wechat_manager_DraftTitle {
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: var(--text-normal);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.wechat_manager_DraftDigest {
|
||||
font-size: 13px;
|
||||
color: var(--text-muted);
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 2;
|
||||
-webkit-box-orient: vertical;
|
||||
overflow: hidden;
|
||||
}
|
||||
.wechat_manager_DeleteButton {
|
||||
align-self: center;
|
||||
flex-shrink: 0;
|
||||
padding: 6px 14px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
background: var(--background-modifier-hover);
|
||||
color: var(--text-error);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.wechat_manager_DeleteButton:hover {
|
||||
background: var(--background-modifier-error-hover);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
.wechat_manager_MaterialWrap {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
height: 100%;
|
||||
}
|
||||
.wechat_manager_FloatUploadButton:not(.wechat_manager_clickable-icon) {
|
||||
position: absolute;
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
z-index: 10;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.wechat_manager_FloatUploadButton:not(.wechat_manager_clickable-icon):hover {
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
}
|
||||
.wechat_manager_FloatUploadButton:not(.wechat_manager_clickable-icon):disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.wechat_manager_UploadSpinner {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border: 2px solid currentColor;
|
||||
border-top-color: transparent;
|
||||
border-radius: 50%;
|
||||
animation: wechat_manager_wechat-manager-spin 0.8s linear infinite;
|
||||
}
|
||||
@keyframes wechat_manager_wechat-manager-spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
.wechat_manager_MaterialGrid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 12px;
|
||||
}
|
||||
.wechat_manager_MaterialItem {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
background: var(--background-secondary);
|
||||
}
|
||||
.wechat_manager_MaterialItem:hover {
|
||||
border-color: var(--interactive-accent);
|
||||
}
|
||||
.wechat_manager_MaterialImage {
|
||||
width: 100%;
|
||||
aspect-ratio: 1;
|
||||
object-fit: cover;
|
||||
display: block;
|
||||
background: var(--background-modifier-hover);
|
||||
}
|
||||
.wechat_manager_MaterialName {
|
||||
padding: 6px 8px 2px;
|
||||
font-size: 12px;
|
||||
color: var(--text-normal);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.wechat_manager_CopyButton {
|
||||
margin: 4px 8px 8px;
|
||||
padding: 4px 0;
|
||||
border-radius: 4px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
background: var(--background-modifier-hover);
|
||||
color: var(--text-accent);
|
||||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.wechat_manager_CopyButton:hover {
|
||||
background: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
.wechat_manager_Footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
flex-shrink: 0;
|
||||
padding-top: 8px;
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
.wechat_manager_Pagination {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.wechat_manager_Pagination button {
|
||||
padding: 5px 14px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
background: var(--background-modifier-hover);
|
||||
color: var(--text-normal);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.wechat_manager_Pagination button:hover:not(:disabled) {
|
||||
background: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
.wechat_manager_Pagination button:disabled {
|
||||
opacity: 0.4;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.wechat_manager_PageInfo {
|
||||
font-size: 13px;
|
||||
color: var(--text-muted);
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
.wechat_manager_ConfirmButtons {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
margin-top: 16px;
|
||||
}
|
||||
.wechat_manager_ConfirmButtons button {
|
||||
padding: 6px 16px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
background: var(--background-modifier-hover);
|
||||
color: var(--text-normal);
|
||||
cursor: pointer;
|
||||
}
|
||||
.wechat_manager_ConfirmButtons button.wechat_manager_mod-warning {
|
||||
background: var(--text-error);
|
||||
color: var(--text-on-accent);
|
||||
border: none;
|
||||
}
|
||||
|
||||
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"id": "nutstore-sync",
|
||||
"name": "Nutstore Sync",
|
||||
"version": "1.4.2",
|
||||
"minAppVersion": "0.15.0",
|
||||
"version": "1.5.0",
|
||||
"minAppVersion": "1.7.2",
|
||||
"description": "Sync your vault with Nutstore/坚果云 using WebDAV protocol.",
|
||||
"author": "nutstore",
|
||||
"authorUrl": "https://github.com/nutstore",
|
||||
|
||||
+104
-104
File diff suppressed because one or more lines are too long
+10
-3
@@ -16,6 +16,8 @@
|
||||
"embedUseExcalidrawFolder": false,
|
||||
"templateFilePath": "Excalidraw/Template.excalidraw",
|
||||
"scriptFolderPath": "Excalidraw/Scripts",
|
||||
"allowJavaScriptFiles": false,
|
||||
"storeScriptFilesAsJavaScript": false,
|
||||
"fontAssetsPath": "Excalidraw/CJK Fonts",
|
||||
"loadChineseFonts": false,
|
||||
"loadJapaneseFonts": false,
|
||||
@@ -23,8 +25,6 @@
|
||||
"compress": true,
|
||||
"decompressForMDView": false,
|
||||
"onceOffCompressFlagReset": true,
|
||||
"onceOffGPTVersionReset": true,
|
||||
"autosave": true,
|
||||
"autosaveIntervalDesktop": 60000,
|
||||
"autosaveIntervalMobile": 30000,
|
||||
"drawingFilenamePrefix": "Drawing ",
|
||||
@@ -159,9 +159,13 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"markdownImageDeletionPreference": "ask",
|
||||
"scriptEngineSettings": {},
|
||||
"previousRelease": "2.26.4",
|
||||
"autostartScripts": {},
|
||||
"autostartScriptFailures": {},
|
||||
"previousRelease": "2.27.3",
|
||||
"showReleaseNotes": true,
|
||||
"useDeclarativeSettings": true,
|
||||
"excalidrawMasteryPromoCollapsed": false,
|
||||
"compareManifestToPluginVersion": true,
|
||||
"showNewVersionNotification": true,
|
||||
@@ -791,6 +795,7 @@
|
||||
}
|
||||
},
|
||||
"aiDefaultTextModel": "gpt-3.5-turbo-1106",
|
||||
"aiDefaultMultimodalModel": "gpt-5-mini",
|
||||
"aiDefaultImageGenerationModel": "dall-e-3",
|
||||
"aiDefaultMaxOutgoingTokens": 0,
|
||||
"aiDefaultMaxResponseTokens": 4096,
|
||||
@@ -1115,6 +1120,8 @@
|
||||
"margin": "normal"
|
||||
},
|
||||
"disableContextMenu": false,
|
||||
"onceOffGPTVersionReset": true,
|
||||
"autosave": true,
|
||||
"isDebugMode": false,
|
||||
"defaultTrayMode": true,
|
||||
"compactModeOnTablets": true
|
||||
|
||||
+14
-9
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "obsidian-excalidraw-plugin",
|
||||
"name": "Excalidraw",
|
||||
"version": "2.26.4",
|
||||
"version": "2.27.3",
|
||||
"minAppVersion": "1.8.7",
|
||||
"description": "Sketch Your Mind. Edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
|
||||
"author": "Zsolt Viczian",
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+147
-147
File diff suppressed because one or more lines are too long
+1
-1
@@ -6,5 +6,5 @@
|
||||
"description": "Integrate Git version control with automatic backup and other advanced features.",
|
||||
"isDesktopOnly": false,
|
||||
"fundingUrl": "https://ko-fi.com/vinzent",
|
||||
"version": "2.39.0"
|
||||
"version": "2.40.0"
|
||||
}
|
||||
|
||||
+857
-317
File diff suppressed because one or more lines are too long
+3
-3
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"id": "obsidian-importer",
|
||||
"name": "Importer",
|
||||
"version": "3.0.0",
|
||||
"version": "3.1.7",
|
||||
"minAppVersion": "1.13.0",
|
||||
"description": "Import data from Airtable, Notion, Evernote, Apple Notes, Apple Journal, Microsoft OneNote, Google Keep, Bear, Roam, Tomboy, Textbundle, CSV, and HTML files.",
|
||||
"description": "Import data from Airtable, Notion, Evernote, Apple Notes, Apple Journal, Microsoft OneNote, Google Keep, Bear, Roam, Logseq, Tomboy, Textbundle, CSV, and HTML files.",
|
||||
"author": "Obsidian",
|
||||
"authorUrl": "https://obsidian.md",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
}
|
||||
+538
-326
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "obsidian-livesync",
|
||||
"name": "Self-hosted LiveSync",
|
||||
"version": "1.0.17",
|
||||
"version": "1.0.30",
|
||||
"minAppVersion": "1.7.2",
|
||||
"description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
|
||||
"author": "vorotamoroz",
|
||||
|
||||
+25
-10
@@ -299,14 +299,6 @@ body {
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.isWizard .wizardHidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sls-setting:not(.isWizard) .wizardOnly {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sls-item-dirty::before {
|
||||
content: "✏";
|
||||
}
|
||||
@@ -353,6 +345,12 @@ body {
|
||||
}
|
||||
|
||||
.sls-onboarding-invitation-action {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* Touch devices need a larger tap target; on desktop this would just pad the
|
||||
link with blank space and make it look like a misplaced button. */
|
||||
body.is-mobile .sls-onboarding-invitation-action {
|
||||
display: inline-flex;
|
||||
min-width: 44px;
|
||||
min-height: 44px;
|
||||
@@ -544,14 +542,31 @@ div.workspace-leaf-content[data-type="bases"] .livesync-status {
|
||||
}
|
||||
|
||||
.sls-setting-panel-title {
|
||||
position: sticky;
|
||||
font-size: medium;
|
||||
top: 2.5em;
|
||||
background-color: var(--background-secondary-alt);
|
||||
border-radius: 10px;
|
||||
padding: 0.5em 1em;
|
||||
}
|
||||
|
||||
body.is-mobile .sls-setting button {
|
||||
max-width: 100%;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
body.is-mobile .sls-setting-with-additional-actions {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
body.is-mobile .sls-setting-with-additional-actions .setting-item-control {
|
||||
min-width: 0;
|
||||
flex: 1 1 100%;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
body.is-mobile .sls-setting .sls-setting-additional-action {
|
||||
flex: 1 1 12rem;
|
||||
}
|
||||
|
||||
.active-pane .sls-setting-panel-title {
|
||||
border: 1px solid var(--interactive-accent);
|
||||
}
|
||||
|
||||
+48
-48
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "obsidian-reminder-plugin",
|
||||
"name": "Reminder",
|
||||
"version": "1.4.2",
|
||||
"version": "1.4.3",
|
||||
"minAppVersion": "1.0.3",
|
||||
"description": "Reminder plugin for Obsidian. This plugin adds feature to manage TODOs with reminder.",
|
||||
"author": "uphy",
|
||||
|
||||
+86
-78
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "obsidian-tasks-plugin",
|
||||
"name": "Tasks",
|
||||
"version": "8.3.0",
|
||||
"version": "8.4.0",
|
||||
"minAppVersion": "1.8.7",
|
||||
"description": "Track tasks across your vault. Supports due dates, recurring tasks, done dates, sub-set of checklist items, and filtering.",
|
||||
"helpUrl": "https://publish.obsidian.md/tasks/",
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "obsidian-weread-plugin",
|
||||
"name": "Weread",
|
||||
"version": "2.2.0",
|
||||
"version": "2.3.0",
|
||||
"minAppVersion": "0.14.0",
|
||||
"description": "Sync Tencent Weread highlights and annotations.",
|
||||
"author": "hankzhao",
|
||||
|
||||
+1
-1
@@ -10,6 +10,6 @@
|
||||
"autoLockInterval": 0,
|
||||
"pwdHintQuestion": "",
|
||||
"isLastVerifyPasswordCorrect": false,
|
||||
"timeOnUnload": "2026-01-13T06:43:44.115Z",
|
||||
"timeOnUnload": "2026-09-21T02:29:36.398Z",
|
||||
"forbidClosePassVerifyModal": false
|
||||
}
|
||||
+250
-11
@@ -528,6 +528,8 @@ var en_default = {
|
||||
setting_pwd_hint_question_name: "Password prompt",
|
||||
setting_pwd_hint_question_desc: "Please type a question to help you remember your password.",
|
||||
place_holder_enter_pwd_hint_question: "Password prompt question",
|
||||
setting_verify_password_blur_name: "Password modal background blur",
|
||||
setting_verify_password_blur_desc: "Background blur applied when the password verification modal opens. Unit: px.",
|
||||
setting_more_path: "More folders or files to be protected (up to 6)",
|
||||
setting_add_path: "Add protected path",
|
||||
setting_add_path_name: "Protected path",
|
||||
@@ -569,6 +571,8 @@ var es_default = {
|
||||
setting_pwd_hint_question_name: "Mensaje para recordar",
|
||||
setting_pwd_hint_question_desc: "Escribe una frase para ayudarte recordar la contrase\xF1a.",
|
||||
place_holder_enter_pwd_hint_question: "Mensaje para recordar",
|
||||
setting_verify_password_blur_name: "Desenfoque del modal de contrase\xF1a",
|
||||
setting_verify_password_blur_desc: "Desenfoque aplicado al fondo cuando se abre el modal de verificaci\xF3n de contrase\xF1a. Unidad: px.",
|
||||
setting_more_path: "M\xE1s carpetas o archivos a proteger (hasta 6)",
|
||||
setting_add_path: "A\xF1adir ruta protegida",
|
||||
setting_add_path_name: "Ruta protegida",
|
||||
@@ -609,6 +613,8 @@ var zh_cn_default = {
|
||||
setting_pwd_hint_question_name: "\u5BC6\u7801\u63D0\u793A\u95EE\u9898",
|
||||
setting_pwd_hint_question_desc: "\u5F53\u4F60\u5FD8\u8BB0\u5BC6\u7801\u65F6\uFF0C\u53EF\u4EE5\u901A\u8FC7\u8FD9\u4E2A\u95EE\u9898\u6765\u63D0\u793A\u4F60\u7684\u5BC6\u7801.",
|
||||
place_holder_enter_pwd_hint_question: "\u8F93\u5165\u5BC6\u7801\u63D0\u793A\u95EE\u9898",
|
||||
setting_verify_password_blur_name: "\u5BC6\u7801\u9A8C\u8BC1\u6846\u80CC\u666F\u6A21\u7CCA",
|
||||
setting_verify_password_blur_desc: "\u5BC6\u7801\u9A8C\u8BC1\u6846\u5F39\u51FA\u65F6\u80CC\u666F\u7684\u6A21\u7CCA\u7A0B\u5EA6\uFF0C\u5355\u4F4D\uFF1Apx\u3002",
|
||||
setting_more_path: "\u66F4\u591A\u9700\u8981\u4FDD\u62A4\u7684\u6587\u4EF6\u5939\u6216\u6587\u4EF6(\u6700\u591A6\u4E2A)",
|
||||
setting_add_path: "\u6DFB\u52A0\u4FDD\u62A4\u8DEF\u5F84",
|
||||
setting_add_path_name: "\u4FDD\u62A4\u8DEF\u5F84",
|
||||
@@ -649,6 +655,8 @@ var zh_tw_default = {
|
||||
setting_pwd_hint_question_name: "\u5BC6\u78BC\u63D0\u793A\u554F\u984C",
|
||||
setting_pwd_hint_question_desc: "\u7576\u4F60\u5FD8\u8A18\u5BC6\u78BC\u6642\uFF0C\u53EF\u4EE5\u901A\u904E\u9019\u500B\u554F\u984C\u4F86\u63D0\u793A\u4F60\u7684\u5BC6\u78BC.",
|
||||
place_holder_enter_pwd_hint_question: "\u8F38\u5165\u5BC6\u78BC\u63D0\u793A\u554F\u984C",
|
||||
setting_verify_password_blur_name: "\u5BC6\u78BC\u9A57\u8B49\u6846\u80CC\u666F\u6A21\u7CCA",
|
||||
setting_verify_password_blur_desc: "\u5BC6\u78BC\u9A57\u8B49\u6846\u5F48\u51FA\u6642\u80CC\u666F\u7684\u6A21\u7CCA\u7A0B\u5EA6\uFF0C\u55AE\u4F4D\uFF1Apx\u3002",
|
||||
setting_more_path: "\u66F4\u591A\u9700\u8981\u4FDD\u8B77\u7684\u6587\u4EF6\u593E\u6216\u6587\u4EF6(\u6700\u591A6\u500B)",
|
||||
setting_add_path: "\u6DFB\u52A0\u4FDD\u8B77\u8DEF\u5F91",
|
||||
setting_add_path_name: "\u4FDD\u8B77\u8DEF\u5F91",
|
||||
@@ -707,6 +715,7 @@ var DEFAULT_SETTINGS = {
|
||||
lang: "auto",
|
||||
autoLockInterval: 0,
|
||||
pwdHintQuestion: "",
|
||||
verifyPasswordBlurPx: 8,
|
||||
isLastVerifyPasswordCorrect: false,
|
||||
timeOnUnload: 0
|
||||
};
|
||||
@@ -717,6 +726,8 @@ var PasswordPlugin = class extends import_obsidian2.Plugin {
|
||||
this.isVerifyPasswordCorrect = false;
|
||||
this.isAutoLockRegistered = false;
|
||||
this.lastUnlockOrOpenFileTime = null;
|
||||
this.onceActionTimeoutId = null;
|
||||
this.fileExplorerProtectionRegistered = false;
|
||||
this.t = (x, vars) => {
|
||||
return this.i18n.t(x, vars);
|
||||
};
|
||||
@@ -765,14 +776,13 @@ var PasswordPlugin = class extends import_obsidian2.Plugin {
|
||||
});
|
||||
this.addSettingTab(new PasswordSettingTab(this.app, this));
|
||||
this.app.workspace.onLayoutReady(() => {
|
||||
if (this.settings.protectEnabled && this.isIncludeRootPath()) {
|
||||
if (!this.isVerifyPasswordCorrect) {
|
||||
let curTime = (0, import_obsidian2.moment)();
|
||||
if (curTime.diff(this.settings.timeOnUnload, "second") <= 2 && this.settings.isLastVerifyPasswordCorrect) {
|
||||
this.isVerifyPasswordCorrect = true;
|
||||
} else {
|
||||
this.verifyPasswordProtection(false);
|
||||
}
|
||||
this.registerFileExplorerProtection();
|
||||
if (this.settings.protectEnabled && !this.isVerifyPasswordCorrect && this.isIncludeRootPath()) {
|
||||
let curTime = (0, import_obsidian2.moment)();
|
||||
if (curTime.diff(this.settings.timeOnUnload, "second") <= 2 && this.settings.isLastVerifyPasswordCorrect) {
|
||||
this.isVerifyPasswordCorrect = true;
|
||||
} else {
|
||||
this.verifyPasswordProtection(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -790,7 +800,7 @@ var PasswordPlugin = class extends import_obsidian2.Plugin {
|
||||
this.registerEvent(this.app.workspace.on("active-leaf-change", (leaf) => {
|
||||
if (leaf != null && leaf.view != null) {
|
||||
let viewType = leaf.view.getViewType();
|
||||
if (viewType == "search") {
|
||||
if (this.isPasswordProtectedView(viewType)) {
|
||||
this.autoLockCheck();
|
||||
if (this.settings.protectEnabled && !this.isVerifyPasswordCorrect) {
|
||||
this.verifyPasswordProtection(true);
|
||||
@@ -804,8 +814,10 @@ var PasswordPlugin = class extends import_obsidian2.Plugin {
|
||||
this.app.vault.on("rename", this.handleRename);
|
||||
this.app.vault.on("modify", this.handleFileModify);
|
||||
this.registerAutoLock();
|
||||
this.registerOnceAction();
|
||||
}
|
||||
async onunload() {
|
||||
this.unregisterOnceAction();
|
||||
this.app.vault.off("modify", this.handleFileModify);
|
||||
this.app.vault.off("rename", this.handleRename);
|
||||
this.settings.isLastVerifyPasswordCorrect = this.isVerifyPasswordCorrect;
|
||||
@@ -831,6 +843,216 @@ var PasswordPlugin = class extends import_obsidian2.Plugin {
|
||||
}
|
||||
}
|
||||
}
|
||||
registerOnceAction() {
|
||||
if (this.onceActionTimeoutId != null) {
|
||||
return;
|
||||
}
|
||||
this.onceActionTimeoutId = window.setTimeout(() => this.onceAction(), 1 * 1e3);
|
||||
}
|
||||
onceAction() {
|
||||
this.unregisterOnceAction();
|
||||
this.collapseAllProtectedFolders();
|
||||
}
|
||||
unregisterOnceAction() {
|
||||
if (this.onceActionTimeoutId == null) {
|
||||
return;
|
||||
}
|
||||
window.clearTimeout(this.onceActionTimeoutId);
|
||||
this.onceActionTimeoutId = null;
|
||||
}
|
||||
// Check if the workspace view exposing protected note metadata is a password protected view, such as search or file-explorer.
|
||||
isPasswordProtectedView(viewType) {
|
||||
return viewType == "search" || viewType == "bookmarks";
|
||||
}
|
||||
// Check if any workspace view exposing protected note metadata is opened, such as search or file-explorer.
|
||||
isPasswordProtectedViewOpened() {
|
||||
let isOpened = false;
|
||||
this.app.workspace.iterateAllLeaves((leaf) => {
|
||||
if (leaf.view != null && this.isPasswordProtectedView(leaf.view.getViewType())) {
|
||||
isOpened = true;
|
||||
}
|
||||
});
|
||||
return isOpened;
|
||||
}
|
||||
// Register capture-phase handlers on the file explorer so protected folders can be checked before Obsidian expands them.
|
||||
registerFileExplorerProtection() {
|
||||
if (this.fileExplorerProtectionRegistered) {
|
||||
return;
|
||||
}
|
||||
this.fileExplorerProtectionRegistered = true;
|
||||
const captureOptions = { capture: true, passive: false };
|
||||
this.registerDomEvent(window, "pointerdown", (event) => {
|
||||
this.handleFileExplorerFolderExpand(event);
|
||||
}, captureOptions);
|
||||
this.registerDomEvent(window, "touchstart", (event) => {
|
||||
this.handleFileExplorerFolderExpand(event);
|
||||
}, captureOptions);
|
||||
this.registerDomEvent(window, "keydown", (event) => {
|
||||
this.handleFileExplorerFolderExpand(event);
|
||||
}, captureOptions);
|
||||
}
|
||||
// Stop attempts to expand a protected folder until the password has been verified.
|
||||
handleFileExplorerFolderExpand(event) {
|
||||
if (!this.settings.protectEnabled || this.isVerifyPasswordCorrect || this.isVerifyPasswordWaitting) {
|
||||
return;
|
||||
}
|
||||
console.log(`handleFileExplorerFolderExpand: event type: ${event.type}, key: ${event instanceof KeyboardEvent ? event.key : "N/A"}`);
|
||||
if (event instanceof KeyboardEvent && event.key != "Enter" && event.key != " " && event.key != "Spacebar" && event.key != "ArrowRight") {
|
||||
return;
|
||||
}
|
||||
const item = this.getFileExplorerFolderItemFromEvent(event);
|
||||
if (item == null || item.file == null || !(item.file instanceof import_obsidian2.TFolder)) {
|
||||
return;
|
||||
}
|
||||
if (!this.isFileExplorerItemCollapsed(item)) {
|
||||
return;
|
||||
}
|
||||
if (!this.isProtectedFile(item.file.path)) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
event.stopImmediatePropagation();
|
||||
this.verifyPasswordBeforeAction(() => {
|
||||
this.expandFileExplorerFolder(item);
|
||||
});
|
||||
}
|
||||
// Map a click or keyboard event in the file explorer DOM back to Obsidian's internal folder item.
|
||||
getFileExplorerFolderItemFromEvent(event) {
|
||||
let matchedItem = null;
|
||||
this.app.workspace.iterateAllLeaves((leaf) => {
|
||||
if (matchedItem != null || leaf.view == null || leaf.view.getViewType() != "file-explorer") {
|
||||
return;
|
||||
}
|
||||
const fileExplorerView = leaf.view;
|
||||
const item = this.getFileExplorerFolderItemFromEventInView(event, fileExplorerView);
|
||||
if (item != null) {
|
||||
matchedItem = item;
|
||||
}
|
||||
});
|
||||
return matchedItem;
|
||||
}
|
||||
getFileExplorerFolderItemFromEventInView(event, fileExplorerView) {
|
||||
var _a;
|
||||
const folderTitleEl = this.getFocusedFileExplorerFolderTitleEl(event, fileExplorerView);
|
||||
if (folderTitleEl == null || fileExplorerView.fileItems == null || !fileExplorerView.containerEl.contains(folderTitleEl)) {
|
||||
return null;
|
||||
}
|
||||
const path = folderTitleEl.getAttribute("data-path");
|
||||
if (path != null) {
|
||||
const item = fileExplorerView.fileItems[path];
|
||||
if ((item == null ? void 0 : item.file) instanceof import_obsidian2.TFolder) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
const folderEl = folderTitleEl.closest(".nav-folder");
|
||||
for (const fileItem of Object.values(fileExplorerView.fileItems)) {
|
||||
if (fileItem.file instanceof import_obsidian2.TFolder && (fileItem.titleEl == folderTitleEl || ((_a = fileItem.titleEl) == null ? void 0 : _a.contains(folderTitleEl)) || fileItem.selfEl == folderEl)) {
|
||||
return fileItem;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
getFocusedFileExplorerFolderTitleEl(event, fileExplorerView) {
|
||||
var _a, _b;
|
||||
const candidates = [];
|
||||
const uiEvent = event;
|
||||
const eventDoc = (_a = uiEvent.doc) != null ? _a : document;
|
||||
const pushCandidate = (value) => {
|
||||
if (value != null && typeof value === "object" && "instanceOf" in value) {
|
||||
candidates.push(value);
|
||||
}
|
||||
};
|
||||
pushCandidate(event.target);
|
||||
pushCandidate(uiEvent.targetNode);
|
||||
pushCandidate(eventDoc.activeElement);
|
||||
const activeDescendantId = (_b = eventDoc.activeElement) == null ? void 0 : _b.getAttribute("aria-activedescendant");
|
||||
if (activeDescendantId != null) {
|
||||
pushCandidate(eventDoc.getElementById(activeDescendantId));
|
||||
}
|
||||
for (const value of event.composedPath()) {
|
||||
pushCandidate(value);
|
||||
}
|
||||
pushCandidate(fileExplorerView.containerEl.querySelector(".nav-folder-title.is-active, .tree-item-self.is-active"));
|
||||
for (const candidate of candidates) {
|
||||
const folderTitleEl = this.getFolderTitleElFromNode(candidate);
|
||||
if (folderTitleEl != null) {
|
||||
return folderTitleEl;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
getFolderTitleElFromNode(node) {
|
||||
if (node == null || !node.instanceOf(Element)) {
|
||||
return null;
|
||||
}
|
||||
const element = node;
|
||||
if (element.hasClass("nav-folder-title") || element.hasClass("tree-item-self") || element.hasAttribute("data-path")) {
|
||||
return element;
|
||||
}
|
||||
const folderTitleEl = element.matchParent(".nav-folder-title, .tree-item-self, [data-path]");
|
||||
if (folderTitleEl != null && folderTitleEl.instanceOf(HTMLElement)) {
|
||||
return folderTitleEl;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// Prefer Obsidian's internal state, then fall back to the rendered DOM class.
|
||||
isFileExplorerItemCollapsed(item) {
|
||||
var _a, _b, _c;
|
||||
if (typeof item.collapsed == "boolean") {
|
||||
return item.collapsed;
|
||||
}
|
||||
if (typeof item.isCollapsed == "boolean") {
|
||||
return item.isCollapsed;
|
||||
}
|
||||
const folderEl = (_c = (_a = item.selfEl) == null ? void 0 : _a.closest(".nav-folder")) != null ? _c : (_b = item.titleEl) == null ? void 0 : _b.closest(".nav-folder");
|
||||
const isCollapsed = folderEl == null ? void 0 : folderEl.classList.contains("is-collapsed");
|
||||
return isCollapsed != null ? isCollapsed : false;
|
||||
}
|
||||
// Run an action only after a password modal completes successfully.
|
||||
verifyPasswordBeforeAction(onVerified) {
|
||||
if (!this.isVerifyPasswordWaitting) {
|
||||
const setModal = new VerifyPasswordModal(this.app, this, false, () => {
|
||||
if (this.isVerifyPasswordCorrect) {
|
||||
onVerified();
|
||||
}
|
||||
}).open();
|
||||
}
|
||||
}
|
||||
// Expand a folder through Obsidian's internal method, falling back to a title click for compatibility.
|
||||
expandFileExplorerFolder(item) {
|
||||
var _a;
|
||||
if (item.setCollapsed != null) {
|
||||
item.setCollapsed.call(item, false);
|
||||
return;
|
||||
}
|
||||
(_a = item.titleEl) == null ? void 0 : _a.click();
|
||||
}
|
||||
// Hide restored expanded protected folders before the user has verified the password.
|
||||
collapseProtectedFileExplorerFolders(fileExplorerView) {
|
||||
var _a;
|
||||
if (!this.settings.protectEnabled || this.isVerifyPasswordCorrect || fileExplorerView.fileItems == null) {
|
||||
return;
|
||||
}
|
||||
for (const fileItem of Object.values(fileExplorerView.fileItems)) {
|
||||
if (!this.isFileExplorerItemCollapsed(fileItem)) {
|
||||
if (fileItem.file instanceof import_obsidian2.TFolder && this.isProtectedFile(fileItem.file.path)) {
|
||||
if (fileItem.setCollapsed != null) {
|
||||
fileItem.setCollapsed.call(fileItem, true);
|
||||
} else {
|
||||
(_a = fileItem.titleEl) == null ? void 0 : _a.click();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
collapseAllProtectedFolders() {
|
||||
this.app.workspace.iterateAllLeaves((leaf) => {
|
||||
if (leaf.view != null && leaf.view.getViewType() == "file-explorer") {
|
||||
const fileExplorerView = leaf.view;
|
||||
this.collapseProtectedFileExplorerFolders(fileExplorerView);
|
||||
}
|
||||
});
|
||||
}
|
||||
// check if the file opened need to be protected.
|
||||
isProtectFileOpened() {
|
||||
let leaves = [];
|
||||
@@ -871,6 +1093,7 @@ var PasswordPlugin = class extends import_obsidian2.Plugin {
|
||||
if (this.isVerifyPasswordCorrect) {
|
||||
this.isVerifyPasswordCorrect = false;
|
||||
this.closeLeaves();
|
||||
this.collapseAllProtectedFolders();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -893,6 +1116,7 @@ var PasswordPlugin = class extends import_obsidian2.Plugin {
|
||||
new import_obsidian2.Notice(this.t("password_protection_closed"));
|
||||
} else {
|
||||
this.closeLeaves();
|
||||
this.collapseAllProtectedFolders();
|
||||
}
|
||||
}).open();
|
||||
}
|
||||
@@ -1048,6 +1272,7 @@ var PasswordSettingTab = class extends import_obsidian2.PluginSettingTab {
|
||||
this.plugin.saveSettings();
|
||||
this.plugin.closeLeaves();
|
||||
this.plugin.registerAutoLock();
|
||||
this.plugin.collapseAllProtectedFolders();
|
||||
}
|
||||
this.display();
|
||||
}).open();
|
||||
@@ -1080,6 +1305,16 @@ var PasswordSettingTab = class extends import_obsidian2.PluginSettingTab {
|
||||
}
|
||||
this.plugin.settings.pwdHintQuestion = value;
|
||||
})).setDisabled(this.plugin.settings.protectEnabled);
|
||||
new import_obsidian2.Setting(containerEl).setName(this.plugin.t("setting_verify_password_blur_name")).setDesc(this.plugin.t("setting_verify_password_blur_desc")).addText((text) => text.setPlaceholder("8").setValue(this.plugin.settings.verifyPasswordBlurPx.toString()).onChange(async (value) => {
|
||||
value = value.replace(/[^0-9]/g, "");
|
||||
if (!value) {
|
||||
return;
|
||||
}
|
||||
const blurPx = parseInt(value);
|
||||
if (blurPx != null && blurPx >= 0) {
|
||||
this.plugin.settings.verifyPasswordBlurPx = blurPx;
|
||||
}
|
||||
})).setDisabled(this.plugin.settings.protectEnabled);
|
||||
new import_obsidian2.Setting(containerEl).setName(this.plugin.t("setting_folder_name")).setDesc(this.plugin.t("setting_folder_desc")).addText((text) => text.setPlaceholder(this.plugin.t("place_holder_enter_path")).setValue(this.plugin.settings.protectedPath).onChange(async (value) => {
|
||||
let path = value.trim();
|
||||
if (path == "") {
|
||||
@@ -1233,13 +1468,17 @@ var VerifyPasswordModal = class extends import_obsidian2.Modal {
|
||||
onOpen() {
|
||||
if (this.forbidCloseModal) {
|
||||
const { modalEl } = this;
|
||||
const closeButton = modalEl.getElementsByClassName("modal-close-button")[0];
|
||||
let closeButton = modalEl.getElementsByClassName("modal-close-button")[0];
|
||||
if (closeButton == null) {
|
||||
closeButton = modalEl.getElementsByClassName("modal-header-button")[0];
|
||||
}
|
||||
if (closeButton != null) {
|
||||
closeButton.setAttribute("style", "display: none;");
|
||||
}
|
||||
}
|
||||
const blurPx = this.plugin.settings.verifyPasswordBlurPx;
|
||||
Object.assign(this.app.workspace.containerEl.style, {
|
||||
filter: "blur(8px)"
|
||||
filter: `blur(${blurPx}px)`
|
||||
});
|
||||
const { contentEl } = this;
|
||||
contentEl.empty();
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "password-protection",
|
||||
"name": "Password Protection",
|
||||
"version": "1.1.33",
|
||||
"version": "1.1.34",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Lock and protect your private notes and diary with a password, no encrypt, no decrypt.",
|
||||
"author": "Qing Li",
|
||||
|
||||
Vendored
+2
-1
@@ -3,12 +3,13 @@
|
||||
"inputPrompt": "single-line",
|
||||
"persistInputPromptDrafts": true,
|
||||
"useSelectionAsCaptureValue": true,
|
||||
"namePastedImagesAfterNoteTitle": false,
|
||||
"searchNestedChoices": true,
|
||||
"templateFolderLauncherRow": "bottom",
|
||||
"devMode": false,
|
||||
"templateFolderPaths": [],
|
||||
"announceUpdates": "all",
|
||||
"version": "2.22.0",
|
||||
"version": "2.27.0",
|
||||
"globalVariables": {},
|
||||
"onePageInputEnabled": false,
|
||||
"disableOnlineFeatures": true,
|
||||
|
||||
Vendored
+200
-201
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "quickadd",
|
||||
"name": "QuickAdd",
|
||||
"version": "2.22.0",
|
||||
"version": "2.27.0",
|
||||
"minAppVersion": "1.13.0",
|
||||
"description": "Quickly add new pages or content to your vault.",
|
||||
"author": "Christian B. B. Houmann",
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -67,6 +67,13 @@
|
||||
"useAbsolutePath": false,
|
||||
"pathSeparator": "\n"
|
||||
}
|
||||
},
|
||||
"plugin-filter": {
|
||||
"enabled": false,
|
||||
"config": {
|
||||
"groups": [],
|
||||
"protectedIds": []
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+13
-13
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "ravenhogwarts-toolkit",
|
||||
"name": "RavenHogwarts Toolkit",
|
||||
"version": "2.1.0",
|
||||
"version": "2.2.0",
|
||||
"minAppVersion": "1.13.0",
|
||||
"description": "A personal toolkit plugin (OTK) that integrates various utilities, designed to enhance personal note-taking experience.",
|
||||
"author": "RavenHogWarts",
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+100
-100
@@ -1,5 +1,17 @@
|
||||
{
|
||||
"recentFiles": [
|
||||
{
|
||||
"basename": "2026-09-28",
|
||||
"path": "01-工作日记/2026-09-28.md"
|
||||
},
|
||||
{
|
||||
"basename": "Draft202509",
|
||||
"path": "08-Inbox/Draft202509.md"
|
||||
},
|
||||
{
|
||||
"basename": "我的订阅",
|
||||
"path": "06-数字仓库/063-订阅/我的订阅.md"
|
||||
},
|
||||
{
|
||||
"basename": "本地应用部署笔记",
|
||||
"path": "03-工作笔记/应用部署/本地应用部署笔记.md"
|
||||
@@ -9,196 +21,184 @@
|
||||
"path": "03-工作笔记/应用部署/本地服务器重新规划.canvas"
|
||||
},
|
||||
{
|
||||
"basename": "Draft202509",
|
||||
"path": "08-Inbox/Draft202509.md"
|
||||
"basename": "JoyAIO部署和使用",
|
||||
"path": "JoyAIO部署和使用.md"
|
||||
},
|
||||
{
|
||||
"basename": "Draft202508",
|
||||
"path": "08-Inbox/Draft202508.md"
|
||||
"basename": "NAS(群晖+飞牛)MoviePilot_TMM TMDB刮削 终极稳定技术方案",
|
||||
"path": "02-学习笔记/NAS(群晖+飞牛)MoviePilot_TMM TMDB刮削 终极稳定技术方案.md"
|
||||
},
|
||||
{
|
||||
"basename": "Draft202607",
|
||||
"path": "08-Inbox/Draft202607.md"
|
||||
"basename": "2026-09-26",
|
||||
"path": "01-工作日记/2026-09-26.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-28",
|
||||
"path": "01-工作日记/2026-08-28.md"
|
||||
"basename": "2026-09-27",
|
||||
"path": "01-工作日记/2026-09-27.md"
|
||||
},
|
||||
{
|
||||
"basename": "应用内网穿透设计V0.4",
|
||||
"path": "03-工作笔记/应用部署/应用内网穿透设计V0.4.md"
|
||||
"basename": "网盘挂载规划0.2",
|
||||
"path": "03-工作笔记/AioPloto/网盘挂载规划0.2.md"
|
||||
},
|
||||
{
|
||||
"basename": "我的订阅",
|
||||
"path": "06-数字仓库/063-订阅/我的订阅.md"
|
||||
"basename": "云平台部署",
|
||||
"path": "03-工作笔记/应用部署/云平台部署.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026年9月11日-17日 沈阳锦州行程",
|
||||
"path": "07-个人事务/2026年9月11日-17日 沈阳锦州行程.md"
|
||||
"basename": "2026-09-25",
|
||||
"path": "01-工作日记/2026-09-25.md"
|
||||
},
|
||||
{
|
||||
"basename": "旅行规划2026年9月12日-17日,周日~周五",
|
||||
"path": "07-个人事务/旅行规划2026年9月12日-17日,周日~周五.md"
|
||||
"basename": "NAS媒体刮削TMDB接口访问问题完整排查+落地文档",
|
||||
"path": "02-学习笔记/NAS媒体刮削TMDB接口访问问题完整排查+落地文档.md"
|
||||
},
|
||||
{
|
||||
"basename": "以下是为您量身定制的 __长沙→沈阳→锦州→山海关→北戴河_",
|
||||
"path": "以下是为您量身定制的 __长沙→沈阳→锦州→山海关→北戴河_.md"
|
||||
"basename": "冷门视频与音频刮削美化完全指南",
|
||||
"path": "03-工作笔记/应用部署/冷门视频与音频刮削美化完全指南.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-26",
|
||||
"path": "01-工作日记/2026-08-26.md"
|
||||
"basename": "2026-09-22",
|
||||
"path": "01-工作日记/2026-09-22.md"
|
||||
},
|
||||
{
|
||||
"basename": "硬盘盒分布图",
|
||||
"path": "03-工作笔记/应用部署/硬盘盒分布图.md"
|
||||
"basename": "云盘Token",
|
||||
"path": "03-工作笔记/应用部署/云盘Token.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-24",
|
||||
"path": "01-工作日记/2026-08-24.md"
|
||||
"basename": "方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行)",
|
||||
"path": "03-工作笔记/应用部署/方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行).md"
|
||||
},
|
||||
{
|
||||
"basename": "PC及其他",
|
||||
"path": "06-数字仓库/062-设备/PC及其他.md"
|
||||
"basename": "日志关键信息提取",
|
||||
"path": "03-工作笔记/应用部署/日志关键信息提取.md"
|
||||
},
|
||||
{
|
||||
"basename": "路由器端口转发",
|
||||
"path": "03-工作笔记/应用部署/路由器端口转发.md"
|
||||
"basename": "✅ 核心思路",
|
||||
"path": "03-工作笔记/应用部署/✅ 核心思路.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-20",
|
||||
"path": "01-工作日记/2026-08-20.md"
|
||||
"basename": "2026-09-21",
|
||||
"path": "01-工作日记/2026-09-21.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-18",
|
||||
"path": "01-工作日记/2026-08-18.md"
|
||||
"basename": "关键数据同步备份流程-v0.3",
|
||||
"path": "03-工作笔记/应用部署/关键数据同步备份流程-v0.3.md"
|
||||
},
|
||||
{
|
||||
"basename": "数据备份列表",
|
||||
"path": "03-工作笔记/应用部署/数据备份列表.md"
|
||||
"basename": "未命名",
|
||||
"path": "未命名.md"
|
||||
},
|
||||
{
|
||||
"basename": "关键数据同步备份流程",
|
||||
"path": "03-工作笔记/应用部署/关键数据同步备份流程.md"
|
||||
"basename": "数据存储规划V2.1",
|
||||
"path": "03-工作笔记/应用部署/数据存储规划V2.1.md"
|
||||
},
|
||||
{
|
||||
"basename": "移动端不能登录和同步 (2025-07-27 10-02)",
|
||||
"path": "50-Memos/2025/07/移动端不能登录和同步 (2025-07-27 10-02).md"
|
||||
"basename": "数据存储规划V1.5",
|
||||
"path": "03-工作笔记/应用部署/数据存储规划V1.5.md"
|
||||
},
|
||||
{
|
||||
"basename": "从Linux服务器下载文件和文件夹到本地命令_linux下载文件到本地-CSDN博客",
|
||||
"path": "10-WebClipper/从Linux服务器下载文件和文件夹到本地命令_linux下载文件到本地-CSDN博客.md"
|
||||
"basename": "数据备份方案",
|
||||
"path": "03-工作笔记/数据备份方案.md"
|
||||
},
|
||||
{
|
||||
"basename": "59岁李若彤健身照曝光,身材紧致到犯规,这状态太能打了-2025-11-16",
|
||||
"path": "60-Imports/61-CuboX/59岁李若彤健身照曝光,身材紧致到犯规,这状态太能打了-2025-11-16.md"
|
||||
"basename": "端口映射对照表",
|
||||
"path": "03-工作笔记/端口映射对照表.md"
|
||||
},
|
||||
{
|
||||
"basename": "小雅专题",
|
||||
"path": "03-工作笔记/小雅部署/小雅专题.md"
|
||||
"basename": "联通云服务器",
|
||||
"path": "03-工作笔记/联通云服务器.md"
|
||||
},
|
||||
{
|
||||
"basename": "数据备份流程",
|
||||
"path": "08-Inbox/数据备份流程.xmind"
|
||||
"basename": "网盘挂载规划",
|
||||
"path": "03-工作笔记/AioPloto/网盘挂载规划.md"
|
||||
},
|
||||
{
|
||||
"basename": "数据备份流程",
|
||||
"path": "08-Inbox/数据备份流程.png"
|
||||
"basename": "JoyVault目录树V1.1",
|
||||
"path": "03-工作笔记/AioPloto/JoyVault目录树V1.1.smm"
|
||||
},
|
||||
{
|
||||
"basename": "marp-ppt-test",
|
||||
"path": "08-Inbox/marp-ppt-test.md"
|
||||
},
|
||||
{
|
||||
"basename": "草稿",
|
||||
"path": "08-Inbox/草稿.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-19",
|
||||
"path": "01-工作日记/2026-08-19.md"
|
||||
"basename": "JoyVault目录树 1",
|
||||
"path": "03-工作笔记/AioPloto/JoyVault目录树 1.smm"
|
||||
},
|
||||
{
|
||||
"basename": "Aio-fnT平台构建笔记",
|
||||
"path": "03-工作笔记/AioPloto/Aio-fnT平台构建笔记.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-16",
|
||||
"path": "01-工作日记/2026-08-16.md"
|
||||
"basename": "AioPloto架构图",
|
||||
"path": "03-工作笔记/AioPloto/AioPloto架构图.smm"
|
||||
},
|
||||
{
|
||||
"basename": "2026-05-03",
|
||||
"path": "01-工作日记/2026-05-03.md"
|
||||
"basename": "网盘文件自动同步图",
|
||||
"path": "03-工作笔记/应用部署/网盘文件自动同步图.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-03-01",
|
||||
"path": "01-工作日记/2026-03-01.md"
|
||||
"basename": "客户端安装步骤",
|
||||
"path": "03-工作笔记/应用部署/客户端安装步骤.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08 待办事宜",
|
||||
"path": "00-待办计划/2026-08 待办事宜.md"
|
||||
"basename": "视频资源处理流程",
|
||||
"path": "03-工作笔记/应用部署/视频资源处理流程.canvas"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-15",
|
||||
"path": "01-工作日记/2026-08-15.md"
|
||||
"basename": "数据备份列表",
|
||||
"path": "03-工作笔记/应用部署/数据备份列表.md"
|
||||
},
|
||||
{
|
||||
"basename": "Linux使用ssh超时断开连接的真正原因与解决【转】",
|
||||
"path": "10-WebClipper/Linux使用ssh超时断开连接的真正原因与解决【转】.md"
|
||||
"basename": "关键数据同步备份流程-v0.2",
|
||||
"path": "03-工作笔记/应用部署/关键数据同步备份流程-v0.2.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-13",
|
||||
"path": "01-工作日记/2026-08-13.md"
|
||||
"basename": "应用内网穿透设计V0.4",
|
||||
"path": "03-工作笔记/应用部署/应用内网穿透设计V0.4.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-12",
|
||||
"path": "01-工作日记/2026-08-12.md"
|
||||
"basename": "硬盘盒分布图变更后",
|
||||
"path": "03-工作笔记/应用部署/硬盘盒分布图变更后.md"
|
||||
},
|
||||
{
|
||||
"basename": "吴起悖论:有才无德的人也许能赢事业,但是绝对赢不了人生-",
|
||||
"path": "04-博客发布/041-人文历史/吴起悖论:有才无德的人也许能赢事业,但是绝对赢不了人生-.md"
|
||||
"basename": "Ting Reader(听悦) vs Audiobookshelf",
|
||||
"path": "03-工作笔记/应用部署/Ting Reader(听悦) vs Audiobookshelf.md"
|
||||
},
|
||||
{
|
||||
"basename": "吴起悖论:有才无德的人也许能赢事业,但是绝对赢不了人生-历史-私德-田文-输赢-底线_新浪新闻-2026-08-08",
|
||||
"path": "60-Imports/61-CuboX/吴起悖论:有才无德的人也许能赢事业,但是绝对赢不了人生-历史-私德-田文-输赢-底线_新浪新闻-2026-08-08.md"
|
||||
"basename": "自建音乐库和有声书库",
|
||||
"path": "03-工作笔记/应用部署/自建音乐库和有声书库.md"
|
||||
},
|
||||
{
|
||||
"basename": "23岁OpenAI天才少女,也走了!-小米-大模型-模型-信号-念头_新浪新闻-2026-08-08",
|
||||
"path": "60-Imports/61-CuboX/23岁OpenAI天才少女,也走了!-小米-大模型-模型-信号-念头_新浪新闻-2026-08-08.md"
|
||||
"basename": "方案2:批量脚本下载喜马拉雅专辑封面",
|
||||
"path": "03-工作笔记/应用部署/方案2:批量脚本下载喜马拉雅专辑封面.md"
|
||||
},
|
||||
{
|
||||
"basename": "会见莫迪,中方这三句话很意味深长_手机新浪网-2025-09-01",
|
||||
"path": "60-Imports/61-CuboX/会见莫迪,中方这三句话很意味深长_手机新浪网-2025-09-01.md"
|
||||
"basename": "小雅帐号部署表0.2",
|
||||
"path": "03-工作笔记/小雅部署/小雅帐号部署表0.2.md"
|
||||
},
|
||||
{
|
||||
"basename": "KOBO无线传输书籍的两个办法 - 知乎-2025-12-26",
|
||||
"path": "60-Imports/61-CuboX/KOBO无线传输书籍的两个办法 - 知乎-2025-12-26.md"
|
||||
"basename": "小雅帐号部署表",
|
||||
"path": "03-工作笔记/小雅部署/小雅帐号部署表.md"
|
||||
},
|
||||
{
|
||||
"basename": "中塔领土之争,2.8万平方公里争议面积,凭啥中国只拿回1158公里-2025-11-02",
|
||||
"path": "60-Imports/61-CuboX/中塔领土之争,2.8万平方公里争议面积,凭啥中国只拿回1158公里-2025-11-02.md"
|
||||
"basename": "小雅专题",
|
||||
"path": "03-工作笔记/小雅部署/小雅专题.md"
|
||||
},
|
||||
{
|
||||
"basename": "曾国藩:一个人能成事的关键,不是学历能力,不是人脉背景,也不是智商情商,而是懂得这两件事-2025-11-02",
|
||||
"path": "60-Imports/61-CuboX/曾国藩:一个人能成事的关键,不是学历能力,不是人脉背景,也不是智商情商,而是懂得这两件事-2025-11-02.md"
|
||||
"basename": "天园节点",
|
||||
"path": "03-工作笔记/小雅部署/天园节点.md"
|
||||
},
|
||||
{
|
||||
"basename": "女人叫你“哥”,是在暗示这4个意思,别后知后觉!-2025-10-30",
|
||||
"path": "60-Imports/61-CuboX/女人叫你“哥”,是在暗示这4个意思,别后知后觉!-2025-10-30.md"
|
||||
"basename": "东玺门节点",
|
||||
"path": "03-工作笔记/小雅部署/东玺门节点.md"
|
||||
},
|
||||
{
|
||||
"basename": "为什么失败叫“败北”,而不是“败南”?-2025-12-12",
|
||||
"path": "60-Imports/61-CuboX/为什么失败叫“败北”,而不是“败南”?-2025-12-12.md"
|
||||
"basename": "80 条消息) 群晖NAS中@eaDir文件夹的删除 - 知乎",
|
||||
"path": "10-WebClipper/(99+ 封私信 /80 条消息) 群晖NAS中@eaDir文件夹的删除 - 知乎.md"
|
||||
},
|
||||
{
|
||||
"basename": "不想被勒索软件毁掉数据,就按照「3-2-1 原则」来备份文件 - 少数派",
|
||||
"path": "10-WebClipper/不想被勒索软件毁掉数据,就按照「3-2-1 原则」来备份文件 - 少数派.md"
|
||||
"basename": "mac电脑禁止生成 .DS_Store 文件的解决方法 - 星云惊蛰 - 博客园",
|
||||
"path": "10-WebClipper/mac电脑禁止生成 .DS_Store 文件的解决方法 - 星云惊蛰 - 博客园.md"
|
||||
},
|
||||
{
|
||||
"basename": "当爱已成往事",
|
||||
"path": "08-Inbox/当爱已成往事.md"
|
||||
},
|
||||
{
|
||||
"basename": "2026-08-08",
|
||||
"path": "01-工作日记/2026-08-08.md"
|
||||
"basename": "以下是为您量身定制的 __长沙→沈阳→锦州→山海关→北戴河_",
|
||||
"path": "08-Inbox/以下是为您量身定制的 __长沙→沈阳→锦州→山海关→北戴河_.md"
|
||||
}
|
||||
],
|
||||
"omittedPaths": [],
|
||||
|
||||
+6
-162332
File diff suppressed because one or more lines are too long
Vendored
+707
-12548
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"id": "share-note",
|
||||
"name": "Share Note",
|
||||
"version": "1.5.5",
|
||||
"minAppVersion": "1.8.7",
|
||||
"version": "1.6.1",
|
||||
"minAppVersion": "1.13.0",
|
||||
"description": "Instantly share a note, with the full theme and content exactly like you see in Reading View. Data is shared encrypted by default, and only you and the person you send it to have the key.",
|
||||
"author": "Alan Grainger",
|
||||
"authorUrl": "https://github.com/alangrainger",
|
||||
|
||||
+18
@@ -26,3 +26,21 @@
|
||||
margin-left: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* First-share style prompt */
|
||||
.share-note-style-modal .setting-item-name {
|
||||
font-weight: var(--font-bold);
|
||||
}
|
||||
|
||||
.share-note-style-example {
|
||||
margin-top: var(--size-4-2);
|
||||
}
|
||||
|
||||
.share-note-style-example code {
|
||||
color: var(--text-accent);
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.share-note-style-modal-footer {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
Vendored
+425
-421
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "sheet-plus",
|
||||
"name": "Sheet Plus",
|
||||
"version": "2.12.15",
|
||||
"version": "2.13.2",
|
||||
"minAppVersion": "1.5.11",
|
||||
"description": "Create Excel-like spreadsheets and easily embed them in Markdown.",
|
||||
"author": "ljcoder",
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+955
-4809
File diff suppressed because one or more lines are too long
+3
-3
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"id": "tasks-calendar-wrapper",
|
||||
"name": "Tasks Calendar Wrapper",
|
||||
"version": "0.3.2",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "This is a simple wrapper for Obsidian-Tasks-Calendar (https://github.com/702573N/Obsidian-Tasks-Calendar) and Obsidian-Tasks-Timeline (https://github.com/702573N/Obsidian-Tasks-Timeline).",
|
||||
"version": "0.3.4",
|
||||
"minAppVersion": "1.7.2",
|
||||
"description": "Shows the tasks in your vault on a timeline view, based on the Tasks Calendar and Tasks Timeline scripts.",
|
||||
"author": "zhuwenq",
|
||||
"authorUrl": "https://github.com/Leonezz",
|
||||
"isDesktopOnly": false
|
||||
|
||||
+118
-76
@@ -19,19 +19,31 @@ If your plugin does not need CSS, delete this file.
|
||||
--taskido-color-process: var(--color-orange);
|
||||
}
|
||||
|
||||
.taskido a {
|
||||
text-decoration: none !important;
|
||||
color: inherit !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.taskido span {
|
||||
display: contents;
|
||||
/*
|
||||
* Links and badges inherit their color unless a scoped rule (tag, overdue, done, noColor) sets one.
|
||||
* The repeated class lifts this above the unscoped badge rules such as `.taskido .task .info .file`.
|
||||
*/
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.taskido.taskido a {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* The year list is wrapped in a span directly under .taskido; lay it out as a block. */
|
||||
.taskido > span {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.taskido .task .internal-link,
|
||||
.taskido .task .external-link {
|
||||
color: var(--text-accent, var(--interactive-accent));
|
||||
text-decoration: underline !important;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .internal-link,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .external-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.taskido .year {
|
||||
@@ -195,12 +207,12 @@ If your plugin does not need CSS, delete this file.
|
||||
background-color: var(--taskido-color-process);
|
||||
}
|
||||
|
||||
.taskido .task.overdue .timeline .icon svg {
|
||||
stroke: var(--taskido-color-overdue) !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.overdue .timeline .icon svg {
|
||||
stroke: var(--taskido-color-overdue);
|
||||
}
|
||||
|
||||
.taskido .task.done .timeline .icon svg {
|
||||
stroke: var(--taskido-color-done) !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.done .timeline .icon svg {
|
||||
stroke: var(--taskido-color-done);
|
||||
}
|
||||
|
||||
.taskido .task.process .timeline .icon svg,
|
||||
@@ -220,10 +232,22 @@ If your plugin does not need CSS, delete this file.
|
||||
.taskido .task.cancelled .info .priority,
|
||||
.taskido .task.cancelled .info .relative,
|
||||
.taskido .task.cancelled .info .file {
|
||||
color: var(--text-muted) !important;
|
||||
line-height: 0;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.done .info .tag,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.done .info .repeat,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.done .info .priority,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.done .info .relative,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.done .info .file,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.cancelled .info .tag,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.cancelled .info .repeat,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.cancelled .info .priority,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.cancelled .info .relative,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.cancelled .info .file {
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.taskido .task.done .content,
|
||||
.taskido .task.cancelled .content {
|
||||
text-decoration: line-through;
|
||||
@@ -252,14 +276,6 @@ If your plugin does not need CSS, delete this file.
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.taskido .timeline icon {
|
||||
text-align: center;
|
||||
height: 22px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
background-position: center;
|
||||
}
|
||||
|
||||
.taskido .timeline input.icon,
|
||||
.taskido .timeline input.icon:checked {
|
||||
visibility: hidden;
|
||||
@@ -312,11 +328,17 @@ If your plugin does not need CSS, delete this file.
|
||||
font-weight: normal;
|
||||
margin: 2px 5px 2px 0;
|
||||
color: var(--text-muted);
|
||||
padding: 0px;
|
||||
border: none;
|
||||
line-height: 1 !important;
|
||||
padding: 0;
|
||||
border-radius: 3px !important;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .info .tag,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .info .repeat,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .info .priority,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .info .relative,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .info .file {
|
||||
line-height: 1;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.taskido .task .info .file {
|
||||
@@ -324,11 +346,14 @@ If your plugin does not need CSS, delete this file.
|
||||
}
|
||||
|
||||
.taskido .task .info .tag {
|
||||
color: var(--tag-color) !important;
|
||||
background: none !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task .info .tag {
|
||||
color: var(--tag-color);
|
||||
background: none;
|
||||
}
|
||||
|
||||
.taskido .info .icon {
|
||||
text-align: center;
|
||||
height: 15px;
|
||||
@@ -344,8 +369,8 @@ If your plugin does not need CSS, delete this file.
|
||||
stroke-width: 1.75px;
|
||||
}
|
||||
|
||||
.taskido .task.overdue .info .relative {
|
||||
color: var(--taskido-color-overdue) !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .task.overdue .info .relative {
|
||||
color: var(--taskido-color-overdue);
|
||||
}
|
||||
|
||||
/* Quick Entry Panel */
|
||||
@@ -369,7 +394,10 @@ If your plugin does not need CSS, delete this file.
|
||||
flex-grow: 1;
|
||||
overflow: hidden;
|
||||
border-radius: 5px;
|
||||
padding: 0 5px !important;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel .left {
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.taskido .quickEntryPanel .left .actionSelect {
|
||||
@@ -414,13 +442,13 @@ If your plugin does not need CSS, delete this file.
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.taskido .quickEntryPanel select,
|
||||
.taskido .quickEntryPanel input,
|
||||
.taskido .quickEntryPanel button {
|
||||
box-shadow: none !important;
|
||||
border: none !important;
|
||||
background: none !important;
|
||||
border-radius: 0 !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel select,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel input,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel button {
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.taskido .quickEntryPanel select,
|
||||
@@ -439,11 +467,14 @@ If your plugin does not need CSS, delete this file.
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
padding: 0 !important;
|
||||
margin: 2.5px 0 !important;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel select {
|
||||
padding: 0;
|
||||
margin: 2.5px 0;
|
||||
}
|
||||
|
||||
.taskido .quickEntryPanel select:hover,
|
||||
.taskido .quickEntryPanel button:hover {
|
||||
color: var(--text-normal);
|
||||
@@ -463,11 +494,14 @@ If your plugin does not need CSS, delete this file.
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel input {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.taskido .quickEntryPanel button {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
@@ -476,23 +510,26 @@ If your plugin does not need CSS, delete this file.
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
width: auto;
|
||||
padding: 0 5px !important;
|
||||
margin: 0 !important;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel button {
|
||||
padding: 0 5px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.taskido .quickEntryPanel svg {
|
||||
height: 15px;
|
||||
width: 15px;
|
||||
stroke-width: 1.75px;
|
||||
}
|
||||
|
||||
.taskido .quickEntryPanel select:active,
|
||||
.taskido .quickEntryPanel input:active,
|
||||
.taskido .quickEntryPanel button:active {
|
||||
border: none !important;
|
||||
box-shadow: none !important;
|
||||
transition: none !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel select:active,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel input:active,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .quickEntryPanel button:active {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
/* Classes */
|
||||
@@ -511,48 +548,48 @@ If your plugin does not need CSS, delete this file.
|
||||
box-shadow: var(--input-shadow);
|
||||
}
|
||||
|
||||
.taskido.noYear .year,
|
||||
.taskido.noRepeat .repeat,
|
||||
.taskido.noTag .tag,
|
||||
.taskido.noPriority .priority,
|
||||
.taskido.noFile .task .file,
|
||||
.taskido.noHeader .task .header,
|
||||
.taskido.noFile .task .info>.file,
|
||||
.taskido.noInfo .task .line:nth-child(2),
|
||||
.taskido.noDone .year[data-types="done"],
|
||||
.taskido.noDone .details[data-types="done"],
|
||||
.taskido.noDone .task.done,
|
||||
.taskido.noUnplanned .task.unplanned,
|
||||
.taskido.noUnplanned .counter#unplanned,
|
||||
.taskido.noUnplanned .year[data-types="unplanned"],
|
||||
.taskido.noUnplanned .details[data-types="unplanned"],
|
||||
.taskido.noRelative .relative,
|
||||
.taskido.noQuickEntry .quickEntryPanel,
|
||||
.taskido.noCounters .counters {
|
||||
display: none !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noYear .year,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noRepeat .repeat,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noTag .tag,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noPriority .priority,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noFile .task .file,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noHeader .task .header,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noFile .task .info>.file,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noInfo .task .line:nth-child(2),
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noDone .year[data-types="done"],
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noDone .details[data-types="done"],
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noDone .task.done,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noUnplanned .task.unplanned,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noUnplanned .counter#unplanned,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noUnplanned .year[data-types="unplanned"],
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noUnplanned .details[data-types="unplanned"],
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noRelative .relative,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noQuickEntry .quickEntryPanel,
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noCounters .counters {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.taskido.noColor .task .file {
|
||||
color: var(--text-muted) !important
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noColor .task .file {
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.taskido.noColor .task .info .file {
|
||||
color: var(--text-muted) !important
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.noColor .task .info .file {
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
/* Focus */
|
||||
.taskido.todayFocus .details:not(.today),
|
||||
.taskido.todayFocus .year {
|
||||
display: none !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.todayFocus .details:not(.today),
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido.todayFocus .year {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.taskido.todayFocus .details.today {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.taskido .details.today {
|
||||
background: transparent !important;
|
||||
background-color: transparent !important;
|
||||
.workspace-leaf-content[data-type="tasks_timeline_view"] .taskido .details.today {
|
||||
background: transparent;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.taskido.todoFocus .task.due,
|
||||
@@ -603,4 +640,9 @@ If your plugin does not need CSS, delete this file.
|
||||
|
||||
.taskido.unplannedFilter .task:not(.unplanned) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Warning note in setting descriptions, e.g. the path filters. */
|
||||
.tasks-calendar-wrapper-setting-warning {
|
||||
color: var(--text-error);
|
||||
}
|
||||
|
||||
+12
-12
File diff suppressed because one or more lines are too long
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "templater-obsidian",
|
||||
"name": "Templater",
|
||||
"version": "2.25.0",
|
||||
"version": "2.25.1",
|
||||
"description": "Advanced templating and automation using handlebars-like syntax.",
|
||||
"minAppVersion": "1.13.0",
|
||||
"author": "SilentVoid",
|
||||
|
||||
@@ -30,6 +30,11 @@ textarea.templater-prompt-input:focus {
|
||||
|
||||
.templater-multisuggester-list {
|
||||
margin: 1.5em 0;
|
||||
|
||||
.templater-multisuggester-list-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-command-bg {
|
||||
|
||||
+12
-1
@@ -143,6 +143,17 @@ var YuquePublishSettingTab = class extends import_obsidian3.PluginSettingTab {
|
||||
}
|
||||
};
|
||||
|
||||
// src/frontmatter.ts
|
||||
function stripFrontMatter(content, boundary) {
|
||||
if (!boundary.exists) {
|
||||
if (/^---(?:\r?\n|$)/.test(content)) {
|
||||
throw new Error("Front matter is not closed with a --- delimiter");
|
||||
}
|
||||
throw new Error("No front matter found in the document");
|
||||
}
|
||||
return content.slice(boundary.contentStart);
|
||||
}
|
||||
|
||||
// src/main.ts
|
||||
var YuquePublishPlugin = class extends import_obsidian4.Plugin {
|
||||
constructor(app, manifest) {
|
||||
@@ -171,6 +182,7 @@ var YuquePublishPlugin = class extends import_obsidian4.Plugin {
|
||||
async publishToYuque(file) {
|
||||
var _a;
|
||||
const content = await this.app.vault.read(file);
|
||||
const contentWithoutFrontMatter = stripFrontMatter(content, (0, import_obsidian4.getFrontMatterInfo)(content));
|
||||
const frontMatter = (_a = this.app.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter;
|
||||
if (!frontMatter) {
|
||||
throw new Error("No front matter found in the document");
|
||||
@@ -221,7 +233,6 @@ var YuquePublishPlugin = class extends import_obsidian4.Plugin {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
const contentWithoutFrontMatter = content.split("---")[2] || content;
|
||||
const payload = {
|
||||
slug: docSlug,
|
||||
title,
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "yuque-publish",
|
||||
"name": "Yuque Publish",
|
||||
"version": "1.0.3",
|
||||
"version": "1.0.4",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Publish your notes to Yuque.",
|
||||
"author": "oylbin",
|
||||
|
||||
Vendored
+74
-133
@@ -7,30 +7,6 @@
|
||||
"id": "7f053065a0404e27",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "49d02d817b2ee557",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "excalidraw",
|
||||
"state": {
|
||||
"file": "03-工作笔记/应用部署/硬盘盒分布图.md"
|
||||
},
|
||||
"icon": "excalidraw-icon",
|
||||
"title": "硬盘盒分布图"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "bbc48f1772f2a66c",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "excalidraw",
|
||||
"state": {
|
||||
"file": "03-工作笔记/应用部署/应用内网穿透设计V0.4.md"
|
||||
},
|
||||
"icon": "excalidraw-icon",
|
||||
"title": "应用内网穿透设计V0.4"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "49d7e290fdc692d3",
|
||||
"type": "leaf",
|
||||
@@ -60,34 +36,17 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "75eee0f93491608f",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "canvas",
|
||||
"state": {
|
||||
"file": "03-工作笔记/应用部署/本地服务器重新规划.canvas",
|
||||
"viewState": {
|
||||
"x": -30.18699416942266,
|
||||
"y": -143.85766263194887,
|
||||
"zoom": -0.2916688128636282
|
||||
}
|
||||
},
|
||||
"icon": "lucide-layout-dashboard",
|
||||
"title": "本地服务器重新规划"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "71231b234a416941",
|
||||
"id": "3e08b707d6a1cbf8",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "01-工作日记/2026-08-28.md",
|
||||
"file": "01-工作日记/2026-09-28.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "2026-08-28"
|
||||
"title": "2026-09-28"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -160,27 +119,7 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "c8daa91d629209eb",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-tree-view",
|
||||
"state": {},
|
||||
"icon": "sheets-in-box",
|
||||
"title": "File Tree"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "20b97b441cd05168",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-tree-view",
|
||||
"state": {},
|
||||
"icon": "sheets-in-box",
|
||||
"title": "File Tree"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "7a340fdc96a2a989",
|
||||
"id": "71e847cca8775146",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-tree-view",
|
||||
@@ -190,7 +129,7 @@
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 6
|
||||
"currentTab": 4
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
@@ -273,7 +212,7 @@
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "03-工作笔记/应用部署/本地应用部署笔记.md",
|
||||
"file": "01-工作日记/2026-09-28.md",
|
||||
"followCursor": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
@@ -298,8 +237,8 @@
|
||||
"state": {
|
||||
"type": "RSS_FEED",
|
||||
"state": {},
|
||||
"icon": "lucide-ghost",
|
||||
"title": "RSS_FEED"
|
||||
"icon": "rss",
|
||||
"title": "订阅源"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -313,13 +252,13 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "499b85c911f45156",
|
||||
"id": "132ca6352b0ea2a8",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "reminder-list",
|
||||
"state": {},
|
||||
"icon": "lucide-ghost",
|
||||
"title": "reminder-list"
|
||||
"icon": "clock",
|
||||
"title": "Reminders"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -336,8 +275,8 @@
|
||||
"state": {
|
||||
"type": "calendar",
|
||||
"state": {},
|
||||
"icon": "calendar-with-checkmark",
|
||||
"title": "Calendar"
|
||||
"icon": "lucide-ghost",
|
||||
"title": "calendar"
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -346,10 +285,10 @@
|
||||
"state": {
|
||||
"type": "calculite",
|
||||
"state": {
|
||||
"previousResult": 2700,
|
||||
"previousOperator": "÷",
|
||||
"previousInput": 15,
|
||||
"currentResult": 180,
|
||||
"previousResult": 46,
|
||||
"previousOperator": "+",
|
||||
"previousInput": 56,
|
||||
"currentResult": 102,
|
||||
"currentOperator": null,
|
||||
"currentInput": null,
|
||||
"currentError": null
|
||||
@@ -363,10 +302,33 @@
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 203.7109375
|
||||
"width": 313.6640625
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"sheet-plus:创建 Excel 文件": false,
|
||||
"wucai-highlights-official:Start WuCai syncing": false,
|
||||
"note-to-mp:复制到公众号": false,
|
||||
"timelines-revamped:Insert Timeline Event": false,
|
||||
"timelines-revamped:Insert Timeline Event (Frontmatter)": false,
|
||||
"obsidian42-brat:BRAT": false,
|
||||
"pdf-plus:PDF++: Toggle auto-copy": false,
|
||||
"pdf-plus:PDF++: Toggle auto-focus": false,
|
||||
"pdf-plus:PDF++: Toggle auto-paste": false,
|
||||
"marp-slides:Show Slide Preview": false,
|
||||
"smart-composer:Open smart composer": false,
|
||||
"quick-tagger:Add tag to current note": false,
|
||||
"quick-tagger:Remove tag from current note": false,
|
||||
"callout-manager:Insert Callout": false,
|
||||
"ledger-obsidian:Add to Ledger": false,
|
||||
"file-tree-alternative:File Tree Alternative Plugin": false,
|
||||
"calculite:Show calculator": false,
|
||||
"ace-code-editor:打开css片段管理器": false,
|
||||
"mermaid-tools:Open Mermaid Toolbar": false,
|
||||
"mp-publisher:打开公众号发布": false,
|
||||
"cubox-sync:Cubox": false,
|
||||
"github-sync:Sync with Remote": false,
|
||||
"obsidian-git:Open Git source control": false,
|
||||
"switcher:打开快速切换": false,
|
||||
"graph:查看关系图谱": false,
|
||||
"canvas:新建白板": false,
|
||||
@@ -393,70 +355,49 @@
|
||||
"diary-ics:日记日历订阅": false,
|
||||
"password-protection:开启密码保护": false,
|
||||
"podnotes:Show PodNotes": false,
|
||||
"sheet-plus:创建 Excel 文件": false,
|
||||
"wucai-highlights-official:Start WuCai syncing": false,
|
||||
"note-to-mp:复制到公众号": false,
|
||||
"timelines-revamped:Insert Timeline Event": false,
|
||||
"timelines-revamped:Insert Timeline Event (Frontmatter)": false,
|
||||
"obsidian42-brat:BRAT": false,
|
||||
"pdf-plus:PDF++: Toggle auto-copy": false,
|
||||
"pdf-plus:PDF++: Toggle auto-focus": false,
|
||||
"pdf-plus:PDF++: Toggle auto-paste": false,
|
||||
"marp-slides:Show Slide Preview": false,
|
||||
"smart-composer:Open smart composer": false,
|
||||
"quick-tagger:Add tag to current note": false,
|
||||
"quick-tagger:Remove tag from current note": false,
|
||||
"callout-manager:Insert Callout": false,
|
||||
"ledger-obsidian:Add to Ledger": false,
|
||||
"file-tree-alternative:File Tree Alternative Plugin": false,
|
||||
"calculite:Show calculator": false,
|
||||
"ace-code-editor:打开css片段管理器": false,
|
||||
"mermaid-tools:Open Mermaid Toolbar": false,
|
||||
"mp-publisher:打开公众号发布": false,
|
||||
"cubox-sync:Cubox": false,
|
||||
"github-sync:Sync with Remote": false,
|
||||
"obsidian-git:Open Git source control": false,
|
||||
"periodic-notes:Open today": false
|
||||
}
|
||||
},
|
||||
"active": "088400708d316532",
|
||||
"lastOpenFiles": [
|
||||
"03-工作笔记/应用部署/本地服务器重新规划.canvas",
|
||||
"01-工作日记/2026-09-28.md",
|
||||
"08-Inbox/Draft202509.md",
|
||||
"08-Inbox/Draft202508.md",
|
||||
"08-Inbox/Draft202607.md",
|
||||
"01-工作日记/2026-08-28.md",
|
||||
"03-工作笔记/应用部署/应用内网穿透设计V0.4.md",
|
||||
"03-工作笔记/应用部署/本地应用部署笔记.md",
|
||||
"06-数字仓库/063-订阅/我的订阅.md",
|
||||
"07-个人事务/2026年9月11日-17日 沈阳锦州行程.md",
|
||||
"07-个人事务/旅行规划2026年9月12日-17日,周日~周五.md",
|
||||
"以下是为您量身定制的 __长沙→沈阳→锦州→山海关→北戴河_.md",
|
||||
"01-工作日记/2026-08-26.md",
|
||||
"03-工作笔记/应用部署/硬盘盒分布图.md",
|
||||
"01-工作日记/2026-08-24.md",
|
||||
"copilot/skills/obsidian-cli/SKILL.md",
|
||||
"03-工作笔记/应用部署/本地应用部署笔记.md",
|
||||
"03-工作笔记/应用部署/本地服务器重新规划.canvas",
|
||||
"JoyAIO部署和使用.md",
|
||||
"02-学习笔记/NAS(群晖+飞牛)MoviePilot_TMM TMDB刮削 终极稳定技术方案.md",
|
||||
"01-工作日记/2026-09-26.md",
|
||||
"01-工作日记/2026-09-27.md",
|
||||
"03-工作笔记/AioPloto/网盘挂载规划0.2.md",
|
||||
"03-工作笔记/应用部署/云平台部署.md",
|
||||
"01-工作日记/2026-09-25.md",
|
||||
"02-学习笔记/NAS媒体刮削TMDB接口访问问题完整排查+落地文档.md",
|
||||
"03-工作笔记/应用部署/冷门视频与音频刮削美化完全指南.md",
|
||||
"01-工作日记/2026-09-22.md",
|
||||
"03-工作笔记/应用部署/云盘Token.md",
|
||||
"03-工作笔记/应用部署/方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行).md",
|
||||
"03-工作笔记/应用部署/日志关键信息提取.md",
|
||||
"03-工作笔记/应用部署/✅ 核心思路.md",
|
||||
"03-工作笔记/应用部署/个人英语学习私有服务器Docker部署方案.md",
|
||||
"03-工作笔记/应用部署/全套英语学习私有服务器配套方案.md",
|
||||
"01-工作日记/2026-09-21.md",
|
||||
"03-工作笔记/应用部署/关键数据同步备份流程-v0.3.md",
|
||||
"未命名.md",
|
||||
"01-工作日记/2026-09-20.md",
|
||||
"01-工作日记/2026-09-19.md",
|
||||
"03-工作笔记/应用部署/数据存储规划V2.1.md",
|
||||
"03-工作笔记/AioPloto/JoyVault目录树V1.1.smm",
|
||||
"03-工作笔记/AioPloto/JoyVault目录树 1.smm",
|
||||
"03-工作笔记/AioPloto/AioPloto架构图.smm",
|
||||
"03-工作笔记/应用部署/视频资源处理流程.canvas",
|
||||
"50-Memos/2026/08/resources/dsEdhYThwUoP9v3z76XWeh_E86A46BD-35E3-400F-9344-810A390E410E",
|
||||
"50-Memos/2026/08/resources",
|
||||
"50-Memos/2026/09",
|
||||
"60-Imports/64-AI/macOS 取消_停止_彻底删除后台服务(launchctl).docx",
|
||||
"copilot/skills/obsidian-cli/LICENSE",
|
||||
"copilot/skills/obsidian-cli",
|
||||
"copilot/skills/json-canvas/SKILL.md",
|
||||
"copilot/skills/json-canvas/LICENSE",
|
||||
"copilot/skills/json-canvas/references/EXAMPLES.md",
|
||||
"copilot/skills/json-canvas/references",
|
||||
"copilot/skills/json-canvas",
|
||||
"copilot/skills/obsidian-bases/SKILL.md",
|
||||
"copilot/skills/obsidian-bases/LICENSE",
|
||||
"copilot/skills/obsidian-bases/references/EXAMPLES.md",
|
||||
"copilot/skills/obsidian-bases/references/FUNCTIONS_REFERENCE.md",
|
||||
"copilot/skills/obsidian-bases/references",
|
||||
"copilot/skills/obsidian-bases",
|
||||
"copilot/skills/obsidian-markdown/SKILL.md",
|
||||
"copilot/skills/obsidian-markdown/LICENSE",
|
||||
"copilot/skills/obsidian-markdown/references/PROPERTIES.md",
|
||||
"copilot/skills/obsidian-markdown/references/EMBEDS.md",
|
||||
"copilot/skills/obsidian-markdown/references/CALLOUTS.md",
|
||||
"copilot/skills/obsidian-markdown/references",
|
||||
"copilot/skills/symposium-publish/SKILL.md",
|
||||
"copilot/skills/copilot-fetch-x/SKILL.md",
|
||||
"08-Inbox/数据备份流程.png"
|
||||
]
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-fetch-x
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-read-pdf
|
||||
@@ -1 +0,0 @@
|
||||
/Volumes/JoyDisk/iFiles/01我的笔记/StudyDiary/copilot/skills/copilot-web-fetch
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user