Compare commits

...
6 Commits
3092 changed files with 40772 additions and 77050 deletions
+2 -3
View File
@@ -11,7 +11,6 @@
"obsidian-reminder-plugin",
"templater-obsidian",
"fuzzy-chinese-pinyin",
"obsidian-raindrop-highlights",
"obsidian-full-calendar",
"obsidian-importer",
"copilot",
@@ -25,7 +24,6 @@
"obsidian-enhancing-mindmap",
"ob-smm",
"obsidian-image-toolkit",
"recent-files-obsidian",
"diary-ics",
"obsidian-annotator",
"oz-image-plugin",
@@ -68,5 +66,6 @@
"mp-publisher",
"cubox-sync",
"github-sync",
"obsidian-git"
"obsidian-git",
"recent-files-obsidian"
]
File diff suppressed because one or more lines are too long
+84 -8
View File
@@ -607,6 +607,15 @@ function toHexRGB(color) {
return parts.map((c) => c.toString(16).padStart(2, "0")).join("");
}
var REGEX_RGB = /^\s*rgba?\(\s*([\d.]+%?)\s*[, ]\s*([\d.]+%?)\s*[, ]\s*([\d.]+%?\s*)\)\s*$/i;
var REGEX_RGBA = /^\s*rgba\(\s*([\d.]+%?)\s*,\s*([\d.]+%?)\s*,\s*([\d.]+%?)\s*,\s*([\d.]+%?)\s*\)\s*$/i;
var REGEX_HEX = /^\s*#([\da-f]{3}|[\da-f]{4}|[\da-f]{6}|[\da-f]{8})\s*$/i;
function parseColor(color) {
const trimmed2 = color.trim();
if (trimmed2.startsWith("#")) {
return parseColorHex(color);
}
return parseColorRGBA(color);
}
function parseColorRGB(rgb) {
const matches2 = REGEX_RGB.exec(rgb);
if (matches2 === null)
@@ -625,6 +634,67 @@ function parseColorRGB(rgb) {
b: rgbComponents[2]
};
}
function parseColorRGBA(rgba) {
const asRGB = parseColorRGB(rgba);
if (asRGB != null) {
asRGB.a = 255;
return asRGB;
}
const matches2 = REGEX_RGBA.exec(rgba);
if (matches2 === null)
return null;
const components = matches2.slice(1).map((v) => v.trim());
const rgbComponents = rgbComponentStringsToNumber(components.slice(0, 3));
if (rgbComponents === null) {
return null;
}
let alphaComponent = 255;
const alphaString = components[3];
if (alphaString != null) {
if (alphaString.endsWith("%")) {
alphaComponent = Math.floor(parseFloat(alphaString.substring(0, alphaString.length - 1)) * 255 / 100);
} else {
alphaComponent = Math.floor(parseFloat(alphaString) * 255);
}
}
const allComponents = [...rgbComponents, alphaComponent];
if (void 0 !== allComponents.find((v) => isNaN(v) || v < 0 || v > 255)) {
return null;
}
return {
r: allComponents[0],
g: allComponents[1],
b: allComponents[2],
a: allComponents[3]
};
}
function parseColorHex(hex) {
const matches2 = REGEX_HEX.exec(hex);
if (matches2 === null)
return null;
const hexString = matches2[1];
let hexDigits;
if (hexString.length < 6)
hexDigits = hexString.split("").map((c) => `${c}${c}`);
else {
hexDigits = [hexString.slice(0, 2), hexString.slice(2, 4), hexString.slice(4, 6), hexString.slice(6, 8)].filter(
(v) => v != ""
);
}
const hexComponents = hexDigits.map((v) => parseInt(v, 16));
if (void 0 !== hexComponents.find((v) => isNaN(v) || v < 0 || v > 255)) {
return null;
}
const hexRGB = {
r: hexComponents[0],
g: hexComponents[1],
b: hexComponents[2]
};
if (hexComponents.length > 3) {
hexRGB.a = hexComponents[3];
}
return hexRGB;
}
function rgbComponentStringsToNumber(components) {
if (components[0].endsWith("%")) {
if (void 0 !== components.slice(1, 3).find((c) => !c.endsWith("%"))) {
@@ -640,7 +710,7 @@ function rgbComponentStringsToNumber(components) {
// src/callout-util.ts
function getColorFromCallout(callout) {
return parseColorRGB(`rgb(${callout.color})`);
return parseColor(callout.color);
}
function getTitleFromCallout(callout) {
const matches2 = /^(.)(.*)/u.exec(callout.id);
@@ -1233,7 +1303,7 @@ var CalloutPreviewComponent = class extends import_obsidian8.Component {
calloutEl.style.removeProperty("--callout-color");
return this;
}
calloutEl.style.setProperty("--callout-color", `${color.r}, ${color.g}, ${color.b}`);
calloutEl.style.setProperty("--callout-color", `rgb(${color.r}, ${color.g}, ${color.b})`);
return this;
}
/**
@@ -1512,7 +1582,7 @@ function calloutSettingsToStyles(settings, environment) {
}
const { changes } = setting;
if (changes.color != null)
styles.push(`--callout-color: ${changes.color}`);
styles.push(`--callout-color: rgb(${changes.color})`);
if (changes.icon != null)
styles.push(`--callout-icon: ${changes.icon}`);
if (changes.customStyles != null)
@@ -3852,7 +3922,12 @@ var import_obsidian24 = require("obsidian");
var import_obsidian23 = require("obsidian");
// CHANGELOG.md
var CHANGELOG_default = `# Version 1.1.1
var CHANGELOG_default = `# Version 1.1.2
> [!fix] Quick Fix for Obsidian 1.13
> Thank you to everyone who reported issues after upgrading to Obsidian 1.13. This release should fix any immediate issues.
# Version 1.1.1
> [!new] Export Callouts as CSS
> There's now a button to copy your callout changes.
@@ -3902,10 +3977,10 @@ The first release available on Obsidian's community plugin browser!
`;
// src/changelog.ts
function getSections(parent) {
function getSections(app, parent) {
const frag = document.createDocumentFragment();
const renderedEl = frag.createDiv();
import_obsidian23.MarkdownRenderer.renderMarkdown(CHANGELOG_default, renderedEl, "", parent);
import_obsidian23.MarkdownRenderer.render(app, CHANGELOG_default, renderedEl, "", parent);
const sections = /* @__PURE__ */ new Map();
let heading = null;
let sectionContainer = frag.createEl("details");
@@ -3961,7 +4036,7 @@ var ChangelogPane = class extends UIPane {
super();
this.title = "Changelog";
this.plugin = plugin;
const sections = getSections(plugin);
const sections = getSections(plugin.app, plugin);
const frag = document.createDocumentFragment();
this.changelogEl = frag.createDiv({ cls: "calloutmanager-changelog" });
Array.from(sections.values()).forEach(({ version, containerEl: el }) => {
@@ -4028,7 +4103,7 @@ var ManagePluginPane = class extends UIPane {
new import_obsidian24.Setting(containerEl).setHeading().setName("What's New").setDesc(`Version ${this.plugin.manifest.version}`).addExtraButton((btn) => {
btn.setIcon("lucide-more-horizontal").setTooltip("More Changelogs").onClick(() => this.nav.open(new ChangelogPane(plugin)));
});
const latestChanges = getSections(this.root).get(this.plugin.manifest.version);
const latestChanges = getSections(this.plugin.app, this.root).get(this.plugin.manifest.version);
if (latestChanges != null) {
const desc = document.createDocumentFragment();
desc.appendChild(latestChanges.contentsEl);
@@ -4403,4 +4478,5 @@ var CalloutManagerPlugin = class extends import_obsidian25.Plugin {
}
};
/* nosourcemap */
+2 -2
View File
@@ -1,10 +1,10 @@
{
"id": "callout-manager",
"version": "1.1.1",
"version": "1.1.2",
"description": "Easily create and customize callouts.",
"author": "eth-p",
"authorUrl": "https://github.com/eth-p",
"name": "Callout Manager",
"minAppVersion": "1.0.0",
"minAppVersion": "1.13.0",
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+8 -69
View File
@@ -10,79 +10,18 @@
"highTextContrast": false
},
"knownTags": {
"安装epel-release": 180,
"安装fail2ban": 181,
"把": 1,
"保存": 141,
"笔记": 121,
"标签": 223,
"表示没60秒去给服务端发起一次请求消息(这个设置好就行了)": 163,
"表示需要启用该规则的服务端(域名或ip)": 162,
"表示最大连续尝试连接次数(这个基本不用设置)": 164,
"表示tcp保持连接不断开": 159,
"定时任务": 190,
"飞牛os": 165,
"服务器": 155,
"掼蛋": 224,
"话题阅读量突破": 225,
"健康": 226,
"经验分享": 122,
"开启iptables防火墙": 182,
"开源": 227,
"历史": 228,
"桥牌": 229,
"人文": 230,
"容器": 166,
"设置防火墙开机启动": 183,
"学习": 231,
"移动应用开发框架": 232,
"英语": 233,
"硬盘": 234,
"运动": 235,
"运维": 167,
"找出失效的strm": 186,
"知识库": 236,
"指定服务端向客户端请求消息的时间间隔,单位是秒,默认是0,不发送。设置个300表示5分钟发送一次(注意,这里是服务端主动发起),然后等待客户端响应,成功,则保持连接。": 160,
"指服务端发出请求后客户端无响应则自动断开的最大次数。使用默认给的3即可。": 161,
"ai": 237,
"books": 238,
"clash": 239,
"clientalivecountmax": 158,
"clientaliveinterval": 157,
"clippings": 12,
"cmd": 240,
"cookie": 241,
"在这里插入代码片": 526,
"clippings": 404,
"copilot-conversation": 131,
"crontab": 189,
"cwa": 221,
"dailynote": 1,
"docker": 165,
"excalidraw": 130,
"fedora": 169,
"g": 187,
"home": 242,
"hotel": 243,
"excalidraw": 363,
"iscsi": 191,
"it": 244,
"java": 154,
"linux": 140,
"mac": 222,
"map": 192,
"memos": 2,
"monthly-summary": 10,
"linux": 413,
"memos": 299,
"monthly-summary": 300,
"nvr": 184,
"powershell": 245,
"ppt": 246,
"proftpd格式": 170,
"ps": 247,
"subway": 248,
"tcpkeepalive": 156,
"telegrambot": 3,
"time": 168,
"trip": 249,
"turn": 185,
"unofficial": 220,
"weeklynote": 9
"telegrambot": 303,
"weeklynote": 305
},
"tagColors": {},
"_version": 4
+183 -74
View File
@@ -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
View File
@@ -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
View File
@@ -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%;
}
@@ -0,0 +1,567 @@
{
"userId": "46358cc9-6654-46fa-8ff1-5ad21a4a185c",
"isPlusUser": false,
"plusLicenseKey": "",
"openAIApiKey": "",
"openAIOrgId": "",
"huggingfaceApiKey": "",
"cohereApiKey": "",
"anthropicApiKey": "",
"azureOpenAIApiKey": "",
"azureOpenAIApiInstanceName": "",
"azureOpenAIApiDeploymentName": "",
"azureOpenAIApiVersion": "",
"azureOpenAIApiEmbeddingDeploymentName": "",
"googleApiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk",
"openRouterAiApiKey": "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",
"xaiApiKey": "",
"mistralApiKey": "",
"deepseekApiKey": "sk-f383279b08424c6a86c8ff4124e7186f",
"amazonBedrockApiKey": "",
"amazonBedrockRegion": "",
"siliconflowApiKey": "",
"githubCopilotAccessToken": "",
"githubCopilotToken": "",
"githubCopilotTokenExpiresAt": 0,
"defaultChainType": "llm_chain",
"defaultModelKey": "deepseek-ai/Deepseek-V3|openai",
"embeddingModelKey": "BAAI/bge-m3|openai",
"temperature": 0.1,
"maxTokens": 6000,
"contextTurns": 15,
"userSystemPrompt": "",
"openAIProxyBaseUrl": "",
"openAIEmbeddingProxyBaseUrl": "",
"stream": true,
"defaultSaveFolder": "60-Imports/64-AI",
"defaultConversationTag": "copilot-conversation",
"autosaveChat": false,
"generateAIChatTitleOnSave": true,
"autoAddActiveContentToContext": true,
"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,
"groqApiKey": "",
"activeModels": [
{
"name": "copilot-plus-flash",
"provider": "copilot-plus",
"enabled": false,
"isBuiltIn": true,
"core": true,
"plusExclusive": true,
"projectEnabled": false,
"capabilities": [
"vision"
]
},
{
"name": "google/gemini-2.5-flash",
"provider": "openrouterai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"projectEnabled": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "gpt-5.5",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "gpt-5.4-mini",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "gpt-5.4",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "gpt-5-mini",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "gpt-5.2",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "google/gemini-2.5-flash-lite",
"provider": "openrouterai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"projectEnabled": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "google/gemini-2.5-pro",
"provider": "openrouterai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"projectEnabled": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "gpt-5",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"reasoning",
"vision",
"websearch"
],
"apiKey": "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"
},
{
"name": "gpt-4.1",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"projectEnabled": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "gpt-4.1-mini",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"projectEnabled": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "gpt-5-nano",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "google/gemini-2.5-flash-lite-preview-06-17",
"provider": "openrouterai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"projectEnabled": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "gpt-4.1-nano",
"provider": "openai",
"enabled": false,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
],
"apiKey": "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"
},
{
"name": "o4-mini",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"core": true,
"capabilities": [
"reasoning"
],
"apiKey": "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"
},
{
"name": "claude-3-5-sonnet-latest",
"provider": "anthropic",
"enabled": false,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "claude-sonnet-4-20250514",
"provider": "anthropic",
"enabled": false,
"isBuiltIn": true,
"capabilities": [
"reasoning",
"vision"
]
},
{
"name": "claude-3-7-sonnet-latest",
"provider": "anthropic",
"enabled": false,
"isBuiltIn": true,
"capabilities": [
"reasoning",
"vision"
]
},
{
"name": "claude-3-5-haiku-latest",
"provider": "anthropic",
"enabled": false,
"isBuiltIn": true
},
{
"name": "grok-3-beta",
"provider": "xai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "grok-3-mini-beta",
"provider": "xai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "gemini-2.5-flash",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"projectEnabled": true,
"capabilities": [
"reasoning",
"vision",
"websearch"
],
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk"
},
{
"name": "gemini-2.5-pro",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"projectEnabled": true,
"capabilities": [
"reasoning",
"vision",
"websearch"
],
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk"
},
{
"name": "command-r",
"provider": "cohereai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "command-r-plus",
"provider": "cohereai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "azure-openai",
"provider": "azure openai",
"enabled": true,
"isBuiltIn": true
},
{
"name": "deepseek-chat",
"provider": "deepseek",
"enabled": true,
"isBuiltIn": true
},
{
"name": "deepseek-reasoner",
"provider": "deepseek",
"enabled": true,
"isBuiltIn": true,
"capabilities": [
"reasoning",
"websearch"
]
},
{
"name": "deepseek-ai/DeepSeek-R1",
"provider": "openai",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://api.siliconflow.cn",
"apiKey": "sk-lggeonednsxmpqfbupczumsdctrbnlbbstmjdyrisnoxlggy",
"isEmbeddingModel": false,
"capabilities": [
"reasoning",
"vision",
"websearch"
],
"stream": true,
"enableCors": true
},
{
"name": "deepseek-ai/Deepseek-V3",
"provider": "openai",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://api.siliconflow.cn/v1",
"apiKey": "sk-xzmhqxzznrizfixryeazutrxfffbkoimuamdelfpleylhgqy",
"isEmbeddingModel": false,
"capabilities": [],
"stream": true,
"openAIOrgId": "",
"enableCors": true
},
{
"name": "Deepseek-r1:1.5b",
"provider": "ollama",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "http://himan.picp.net:11434",
"apiKey": "",
"isEmbeddingModel": false,
"capabilities": [
"reasoning"
],
"stream": true,
"enableCors": false
}
],
"activeEmbeddingModels": [
{
"name": "copilot-plus-small",
"provider": "copilot-plus",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true
},
{
"name": "copilot-plus-large",
"provider": "copilot-plus-jina",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true,
"believerExclusive": true,
"dimensions": 1024
},
{
"name": "copilot-plus-multilingual",
"provider": "copilot-plus-jina",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true,
"dimensions": 512
},
{
"name": "openai/text-embedding-3-small",
"provider": "openrouterai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true
},
{
"name": "text-embedding-3-small",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true
},
{
"name": "gemini-embedding-001",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk",
"enableCors": false
},
{
"name": "gemini-embedding-2-preview",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true
},
{
"name": "Qwen/Qwen3-Embedding-0.6B",
"provider": "siliconflow",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"baseUrl": "https://api.siliconflow.com/v1"
},
{
"name": "text-embedding-3-large",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "embed-multilingual-light-v3.0",
"provider": "cohereai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "text-embedding-004",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk",
"enableCors": false
},
{
"name": "azure-openai",
"provider": "azure openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "BAAI/bge-m3",
"provider": "openai",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://api.siliconflow.cn/v1",
"apiKey": "sk-xzmhqxzznrizfixryeazutrxfffbkoimuamdelfpleylhgqy",
"isEmbeddingModel": true,
"capabilities": [],
"enableCors": true
}
],
"embeddingRequestsPerMin": 90,
"embeddingBatchSize": 16,
"disableIndexOnMobile": true,
"showSuggestedPrompts": true,
"showRelevantNotes": true,
"numPartitions": 1,
"lexicalSearchRamLimit": 100,
"promptUsageTimestamps": {},
"promptSortStrategy": "timestamp",
"chatHistorySortStrategy": "recent",
"projectListSortStrategy": "recent",
"projectsFolder": "copilot/projects",
"defaultConversationNoteName": "{$topic}@{$date}_{$time}",
"inlineEditCommands": [],
"projectList": [],
"lastDismissedVersion": "3.1.2",
"passMarkdownImages": true,
"enableAutonomousAgent": true,
"enableCustomPromptTemplating": true,
"enableSemanticSearchV3": false,
"enableSelfHostMode": false,
"enableMiyo": false,
"miyoSearchAll": false,
"selfHostModeValidatedAt": null,
"selfHostValidationCount": 0,
"selfHostUrl": "",
"selfHostApiKey": "",
"miyoServerUrl": "",
"selfHostSearchProvider": "firecrawl",
"firecrawlApiKey": "",
"perplexityApiKey": "",
"supadataApiKey": "",
"enableLexicalBoosts": true,
"suggestedDefaultCommands": true,
"autonomousAgentMaxIterations": 4,
"autonomousAgentEnabledToolIds": [
"localSearch",
"webSearch",
"pomodoro",
"youtubeTranscription",
"writeFile",
"editFile"
],
"reasoningEffort": "low",
"verbosity": "medium",
"memoryFolderName": "copilot/memory",
"enableRecentConversations": false,
"maxRecentConversations": 30,
"enableSavedMemory": false,
"quickCommandIncludeNoteContext": true,
"autoIncludeTextSelection": false,
"autoAddSelectionToContext": false,
"autoAcceptEdits": false,
"diffViewMode": "split",
"userSystemPromptsFolder": "copilot/system-prompts",
"defaultSystemPromptTitle": "",
"autoCompactThreshold": 128000,
"convertedDocOutputFolder": "",
"includeActiveNoteAsContext": true,
"enableAutocomplete": false,
"autocompleteAcceptKey": "Tab",
"allowAdditionalContext": true,
"enableWordCompletion": false,
"_keychainVaultId": "6608d338"
}
+323 -190
View File
@@ -1,52 +1,43 @@
{
"userId": "46358cc9-6654-46fa-8ff1-5ad21a4a185c",
"isPaidUser": false,
"isPlusUser": false,
"entitlementToken": "",
"entitlementExpiresAt": 0,
"plusLicenseKey": "",
"openAIApiKey": "",
"openAIOrgId": "",
"huggingfaceApiKey": "",
"cohereApiKey": "",
"anthropicApiKey": "",
"azureOpenAIApiKey": "",
"azureOpenAIApiInstanceName": "",
"azureOpenAIApiDeploymentName": "",
"azureOpenAIApiVersion": "",
"azureOpenAIApiEmbeddingDeploymentName": "",
"googleApiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk",
"openRouterAiApiKey": "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",
"googleApiKey": "",
"openRouterAiApiKey": "",
"xaiApiKey": "",
"mistralApiKey": "",
"deepseekApiKey": "sk-f383279b08424c6a86c8ff4124e7186f",
"amazonBedrockApiKey": "",
"amazonBedrockRegion": "",
"deepseekApiKey": "",
"siliconflowApiKey": "",
"githubCopilotAccessToken": "",
"githubCopilotToken": "",
"githubCopilotTokenExpiresAt": 0,
"defaultChainType": "llm_chain",
"defaultModelKey": "deepseek-ai/Deepseek-V3|openai",
"embeddingModelKey": "BAAI/bge-m3|openai",
"temperature": 0.1,
"maxTokens": 6000,
"contextTurns": 15,
"userSystemPrompt": "",
"openAIProxyBaseUrl": "",
"openAIEmbeddingProxyBaseUrl": "",
"stream": true,
"copilotFolder": "copilot",
"copilotRootHistory": [
"copilot"
],
"upgradedToV8FromLegacy": false,
"defaultSaveFolder": "60-Imports/64-AI",
"defaultConversationTag": "copilot-conversation",
"autosaveChat": false,
"generateAIChatTitleOnSave": true,
"autoAddActiveContentToContext": true,
"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,
@@ -59,10 +50,11 @@
"isBuiltIn": true,
"core": true,
"plusExclusive": true,
"projectEnabled": false,
"capabilities": [
"vision"
]
],
"projectEnabled": false,
"apiKey": ""
},
{
"name": "google/gemini-2.5-flash",
@@ -70,11 +62,11 @@
"enabled": true,
"isBuiltIn": true,
"core": true,
"projectEnabled": true,
"capabilities": [
"vision"
],
"apiKey": "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"
"projectEnabled": true,
"apiKey": ""
},
{
"name": "gpt-5.5",
@@ -84,7 +76,8 @@
"core": true,
"capabilities": [
"vision"
]
],
"apiKey": ""
},
{
"name": "gpt-5.4-mini",
@@ -94,7 +87,8 @@
"core": true,
"capabilities": [
"vision"
]
],
"apiKey": ""
},
{
"name": "gpt-5.4",
@@ -104,7 +98,8 @@
"core": true,
"capabilities": [
"vision"
]
],
"apiKey": ""
},
{
"name": "gpt-5-mini",
@@ -115,7 +110,7 @@
"capabilities": [
"vision"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "gpt-5.2",
@@ -125,7 +120,8 @@
"core": true,
"capabilities": [
"vision"
]
],
"apiKey": ""
},
{
"name": "google/gemini-2.5-flash-lite",
@@ -137,7 +133,7 @@
"capabilities": [
"vision"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "google/gemini-2.5-pro",
@@ -149,7 +145,7 @@
"capabilities": [
"vision"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "gpt-5",
@@ -162,7 +158,7 @@
"vision",
"websearch"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "gpt-4.1",
@@ -174,7 +170,7 @@
"capabilities": [
"vision"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "gpt-4.1-mini",
@@ -186,7 +182,7 @@
"capabilities": [
"vision"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "gpt-5-nano",
@@ -196,7 +192,8 @@
"core": true,
"capabilities": [
"vision"
]
],
"apiKey": ""
},
{
"name": "google/gemini-2.5-flash-lite-preview-06-17",
@@ -208,7 +205,7 @@
"capabilities": [
"vision"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "gpt-4.1-nano",
@@ -219,7 +216,7 @@
"capabilities": [
"vision"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "o4-mini",
@@ -230,7 +227,7 @@
"capabilities": [
"reasoning"
],
"apiKey": "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"
"apiKey": ""
},
{
"name": "claude-3-5-sonnet-latest",
@@ -240,7 +237,8 @@
"core": true,
"capabilities": [
"vision"
]
],
"apiKey": ""
},
{
"name": "claude-sonnet-4-20250514",
@@ -250,7 +248,8 @@
"capabilities": [
"reasoning",
"vision"
]
],
"apiKey": ""
},
{
"name": "claude-3-7-sonnet-latest",
@@ -260,25 +259,29 @@
"capabilities": [
"reasoning",
"vision"
]
],
"apiKey": ""
},
{
"name": "claude-3-5-haiku-latest",
"provider": "anthropic",
"enabled": false,
"isBuiltIn": true
"isBuiltIn": true,
"apiKey": ""
},
{
"name": "grok-3-beta",
"provider": "xai",
"enabled": false,
"isBuiltIn": true
"isBuiltIn": true,
"apiKey": ""
},
{
"name": "grok-3-mini-beta",
"provider": "xai",
"enabled": false,
"isBuiltIn": true
"isBuiltIn": true,
"apiKey": ""
},
{
"name": "gemini-2.5-flash",
@@ -291,7 +294,7 @@
"vision",
"websearch"
],
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk"
"apiKey": ""
},
{
"name": "gemini-2.5-pro",
@@ -304,31 +307,28 @@
"vision",
"websearch"
],
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk"
"apiKey": ""
},
{
"name": "command-r",
"provider": "cohereai",
"enabled": false,
"isBuiltIn": true
"isBuiltIn": true,
"apiKey": ""
},
{
"name": "command-r-plus",
"provider": "cohereai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "azure-openai",
"provider": "azure openai",
"enabled": true,
"isBuiltIn": true
"isBuiltIn": true,
"apiKey": ""
},
{
"name": "deepseek-chat",
"provider": "deepseek",
"enabled": true,
"isBuiltIn": true
"isBuiltIn": true,
"apiKey": ""
},
{
"name": "deepseek-reasoner",
@@ -338,7 +338,8 @@
"capabilities": [
"reasoning",
"websearch"
]
],
"apiKey": ""
},
{
"name": "deepseek-ai/DeepSeek-R1",
@@ -346,7 +347,7 @@
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://api.siliconflow.cn",
"apiKey": "sk-lggeonednsxmpqfbupczumsdctrbnlbbstmjdyrisnoxlggy",
"apiKey": "",
"isEmbeddingModel": false,
"capabilities": [
"reasoning",
@@ -362,7 +363,7 @@
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://api.siliconflow.cn/v1",
"apiKey": "sk-xzmhqxzznrizfixryeazutrxfffbkoimuamdelfpleylhgqy",
"apiKey": "",
"isEmbeddingModel": false,
"capabilities": [],
"stream": true,
@@ -384,157 +385,34 @@
"enableCors": false
}
],
"activeEmbeddingModels": [
{
"name": "copilot-plus-small",
"provider": "copilot-plus",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true
},
{
"name": "copilot-plus-large",
"provider": "copilot-plus-jina",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true,
"believerExclusive": true,
"dimensions": 1024
},
{
"name": "copilot-plus-multilingual",
"provider": "copilot-plus-jina",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true,
"dimensions": 512
},
{
"name": "openai/text-embedding-3-small",
"provider": "openrouterai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true
},
{
"name": "text-embedding-3-small",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true
},
{
"name": "gemini-embedding-001",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk",
"enableCors": false
},
{
"name": "gemini-embedding-2-preview",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true
},
{
"name": "Qwen/Qwen3-Embedding-0.6B",
"provider": "siliconflow",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"baseUrl": "https://api.siliconflow.com/v1"
},
{
"name": "text-embedding-3-large",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "embed-multilingual-light-v3.0",
"provider": "cohereai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "text-embedding-004",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"apiKey": "AIzaSyAu5_a1iXCZEawJOTu7JiXoM2-C3d1iNnk",
"enableCors": false
},
{
"name": "azure-openai",
"provider": "azure openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "BAAI/bge-m3",
"provider": "openai",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://api.siliconflow.cn/v1",
"apiKey": "sk-xzmhqxzznrizfixryeazutrxfffbkoimuamdelfpleylhgqy",
"isEmbeddingModel": true,
"capabilities": [],
"enableCors": true
}
],
"embeddingRequestsPerMin": 90,
"embeddingBatchSize": 16,
"disableIndexOnMobile": true,
"showSuggestedPrompts": true,
"showRelevantNotes": true,
"numPartitions": 1,
"lexicalSearchRamLimit": 100,
"promptUsageTimestamps": {},
"promptSortStrategy": "timestamp",
"chatHistorySortStrategy": "recent",
"projectListSortStrategy": "recent",
"projectsFolder": "copilot/projects",
"defaultConversationNoteName": "{$topic}@{$date}_{$time}",
"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,
"selfHostModeValidatedAt": null,
"selfHostValidationCount": 0,
"selfHostUrl": "",
"selfHostApiKey": "",
"relevantNotesLiveUpdate": true,
"miyoServerUrl": "",
"selfHostSearchProvider": "firecrawl",
"firecrawlApiKey": "",
"perplexityApiKey": "",
"parallelApiKey": "",
"exaApiKey": "",
"supadataApiKey": "",
"docProcessorBackend": "plus",
"enableLexicalBoosts": true,
"suggestedDefaultCommands": true,
"autonomousAgentMaxIterations": 4,
"autonomousAgentEnabledToolIds": [
"localSearch",
"webSearch",
@@ -550,18 +428,273 @@
"maxRecentConversations": 30,
"enableSavedMemory": false,
"quickCommandIncludeNoteContext": true,
"autoIncludeTextSelection": false,
"autoAddSelectionToContext": false,
"autoAcceptEdits": false,
"diffViewMode": "split",
"userSystemPromptsFolder": "copilot/system-prompts",
"defaultSystemPromptTitle": "",
"autoCompactThreshold": 128000,
"convertedDocOutputFolder": "",
"agentMode": {
"byok": {},
"activeBackend": "opencode",
"backends": {},
"debugFullFrames": true,
"notificationSound": true,
"notificationSoundId": "piano",
"welcomeDismissed": false,
"skills": {
"folder": "copilot/skills"
}
},
"providers": {
"de8c8aae-8b3e-4465-bbb3-ea379f80598f": {
"providerType": "openai-compatible",
"displayName": "Ollama",
"baseUrl": "http://himan.picp.net:11434",
"enableCors": false,
"requiresApiKey": false,
"origin": {
"kind": "byok"
},
"providerId": "de8c8aae-8b3e-4465-bbb3-ea379f80598f",
"addedAt": 1787535658736,
"apiKeyKeychainId": null
}
},
"configuredModels": [
{
"configuredModelId": "2aa7fe20-e1c7-4627-b579-c5743cd500c3",
"providerId": "de8c8aae-8b3e-4465-bbb3-ea379f80598f",
"info": {
"id": "Deepseek-r1:1.5b",
"displayName": "Deepseek-r1:1.5b"
},
"configuredAt": 1787535658737
}
],
"backends": {
"chat": {
"enabledModels": [
"2aa7fe20-e1c7-4627-b579-c5743cd500c3"
]
},
"opencode": {
"enabledModels": [
"2aa7fe20-e1c7-4627-b579-c5743cd500c3"
]
}
},
"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,
"projectListSortStrategy": "recent",
"selfHostModeValidatedAt": null,
"selfHostValidationCount": 0,
"selfHostUrl": "",
"selfHostApiKey": "",
"includeActiveNoteAsContext": true,
"enableAutocomplete": false,
"autocompleteAcceptKey": "Tab",
"allowAdditionalContext": true,
"enableWordCompletion": false,
"_keychainVaultId": "6608d338"
"_keychainVaultId": "6608d338",
"settingsVersion": 14,
"miyoConnectionMode": "local"
}
+3773 -2387
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -1,10 +1,10 @@
{
"id": "copilot",
"name": "Copilot",
"version": "3.3.3",
"version": "4.0.11",
"minAppVersion": "1.11.4",
"isDesktopOnly": false,
"description": "Your AI Copilot: Chat with Your Second Brain, Learn Faster, Work Smarter.",
"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.",
"author": "Logan Yang",
"authorUrl": "https://twitter.com/logancyang",
"fundingUrl": {
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -37,8 +37,8 @@
"contentTemplate": "# {{{title}}}\n\n{{{description}}}\n\n[Read in Cubox]({{{cubox_url}}}) \n[Read Original]({{{url}}}) \n\n---\n\n{{#highlights.length}}\n## Annotations \n\n{{#highlights}}\n> {{{text}}} \n\n{{#note}}\n{{{note}}}\n{{/note}}\n[Link️]({{{cubox_url}}}) \n\n{{/highlights}}\n{{/highlights.length}}\n\n\n{{{content}}} \n\n\n",
"highlightInContent": true,
"dateFormat": "yyyy-MM-dd",
"lastSyncTime": 1784774948617,
"lastSyncCardId": "7474739049253569064",
"lastCardUpdateTime": "2026-07-23T10:48:42.281+0800",
"lastSyncTime": 1786541057344,
"lastSyncCardId": "7485616983367487236",
"lastCardUpdateTime": "2026-08-08T12:02:54.506+0800",
"syncing": false
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -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",
+6043 -2045
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "digitalgarden",
"name": "Digital Garden",
"version": "2.80.3",
"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
View File
@@ -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;
}
+2 -1
View File
@@ -1,5 +1,5 @@
{
"lastVersion": "4.0.11",
"lastVersion": "4.1.4",
"aestheticStyle": "default",
"positionStyle": "top",
"menuCommands": [
@@ -484,6 +484,7 @@
"useCurrentLineForRegex": false,
"ai": {
"enabled": true,
"showAIContextMenu": true,
"consentAccepted": true,
"onboardingShown": true,
"providerMode": "pkmer-first",
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -1,10 +1,10 @@
{
"id": "editing-toolbar",
"name": "Editing Toolbar",
"version": "4.0.11",
"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
}
+185 -26
View File
@@ -199,6 +199,152 @@ editingToolbar SETTING ITEMS
border-bottom: 1px solid var(--background-modifier-border);
}
.editing-toolbar-native-command-list {
container-type: inline-size;
}
.editing-toolbar-command-page-navigation {
display: none;
}
.editing-toolbar-native-command-list .setting-item.editingToolbarCommandItem {
position: relative;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(132px, auto);
align-items: center;
gap: 8px;
min-width: 0;
padding: 8px 12px;
}
.editingToolbarSettingsTabsContainer.editing-toolbar-native-command-list
.editingToolbarCommandItem > .setting-item-info {
min-width: 0;
flex: none;
}
.editing-toolbar-native-command-list .editingToolbarCommandItem > .setting-item-info .setting-item-name {
overflow-wrap: anywhere;
}
.editingToolbarSettingsTabsContainer.editing-toolbar-native-command-list
.editingToolbarCommandItem > .setting-item-control {
display: flex;
flex: none;
flex-wrap: wrap;
justify-content: flex-end;
gap: 4px;
min-width: 0;
}
.editing-toolbar-native-command-list .setting-item-control > * {
margin-inline-start: 0;
}
.editing-toolbar-native-command-list .setting-item button.editingToolbarSettingsIcon,
.editing-toolbar-native-command-list .setting-item button.editingToolbarSettingsButton {
width: 30px;
min-width: 30px;
height: 30px;
padding: 4px;
transform: none;
-webkit-transform: none;
}
.editing-toolbar-native-command-list
.editingToolbarCommandItem > .setting-item-control > button {
flex: 0 0 30px;
width: 30px;
min-width: 30px;
height: 30px;
padding: 4px;
}
.editing-toolbar-native-command-list .editingToolbarMenuTypeDropdown {
max-width: 132px;
height: 30px;
}
.editingToolbarSettingsTabsContainer.editing-toolbar-native-command-list
.editingToolbarSettingsTabsContainer_sub {
grid-column: 1 / -1;
width: calc(100% - 16px);
min-width: 0;
margin: 6px 0 0 16px;
padding: 0 0 0 8px;
flex: none;
}
.editing-toolbar-native-command-list
.editingToolbarSettingsTabsContainer_sub
.setting-item.editingToolbarCommandItem {
width: 100%;
margin-left: 0;
}
.editing-toolbar-native-command-list .editingToolbarCommandItem.is-command-dragging {
opacity: 0.45;
cursor: grabbing;
}
.editing-toolbar-native-command-list .editingToolbarCommandItem.is-command-drop-before {
box-shadow: inset 0 2px 0 var(--interactive-accent);
}
.editing-toolbar-native-command-list .editingToolbarCommandItem.is-command-drop-after {
box-shadow: inset 0 -2px 0 var(--interactive-accent);
}
.editing-toolbar-native-command-list
.editing-toolbar-command-drop-list.is-command-drop-inside,
.editing-toolbar-native-command-list .editingToolbarSettingsTabsContainer_sub.is-command-drop-inside {
background: rgba(var(--interactive-accent-rgb), 0.08);
outline: 1px dashed var(--interactive-accent);
outline-offset: -1px;
}
@container (max-width: 420px) {
.editing-toolbar-native-command-list .setting-item.editingToolbarCommandItem {
grid-template-columns: minmax(0, 1fr) minmax(168px, 52%);
}
.editing-toolbar-native-command-list
.editingToolbarCommandItem > .setting-item-control {
grid-column: 2;
justify-content: flex-end;
align-content: center;
}
.editing-toolbar-native-command-list .editingToolbarMenuTypeDropdown {
max-width: 110px;
}
}
.commandSetting-container {
margin: 0;
padding: 0;
}
.commandSetting-container > .setting-item {
margin: 0;
padding: 8px 0;
}
.commandSetting-container .command-lists-container {
margin-top: 8px;
padding: 0;
border-radius: 0;
}
.commandSetting-container .command-buttons-container {
margin: 4px 0 8px;
padding: 8px 10px;
}
.commandSetting-container .command-buttons-container .setting-item {
padding: 4px 0;
}
/*----------------------------------------------------------------
editingToolbar CLASS CHANGES
----------------------------------------------------------------*/
@@ -1681,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
@@ -1824,49 +1969,51 @@ body.auto-hide-header .workspace-tab-header-container + .workspace-tab-container
height: 32px;
}
@media screen and (max-width: 1024px) {
.editing-toolbar-header {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
}
/* 头部容器样式 */
.editing-toolbar-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 1em;
padding: 0.5em 0;
gap: 12px;
margin-bottom: 24px;
padding: 0 8px;
}
/* 标题容器样式 */
.editing-toolbar-title-container {
flex-shrink: 0;
min-width: 0;
}
.editing-toolbar-title-container h1{
display:inline;
}
.editing-toolbar-title {
margin: 0;
overflow-wrap: anywhere;
}
/* 信息容器样式 */
.editing-toolbar-info {
display: flex;
align-items: center;
gap: 1em;
flex-wrap: nowrap;
flex: 0 0 auto;
}
/* 修复按钮容器样式 */
/* 标题栏修复按钮 */
.editing-toolbar-fix-button {
flex: 0 0 32px;
width: 32px;
min-width: 32px;
height: 32px;
margin: 0;
padding: 0;
padding: 6px;
border: 0;
}
.editing-toolbar-fix-button .setting-item-control {
padding: 0;
@media screen and (max-width: 1024px) {
.editing-toolbar-title {
font-size: 1.25rem;
}
}
/* 链接样式 */
@@ -1911,14 +2058,6 @@ body.auto-hide-header .workspace-tab-header-container + .workspace-tab-container
padding: 0 8px;
}
.editing-toolbar-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
padding: 0 8px;
}
/* 添加到你的 styles.css 文件中 */
@keyframes sortable-feedback {
0% {
@@ -2451,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;
}
@@ -2734,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;
}
+470 -268
View File
@@ -1051,7 +1051,7 @@ var require_react_development = __commonJS({
exports.useTransition = function() {
return resolveDispatcher().useTransition();
};
exports.version = "19.2.7";
exports.version = "19.2.8";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
})();
}
@@ -1578,7 +1578,7 @@ var require_react_dom_development = __commonJS({
exports.useFormStatus = function() {
return resolveDispatcher().useHostTransitionStatus();
};
exports.version = "19.2.7";
exports.version = "19.2.8";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
})();
}
@@ -21370,9 +21370,9 @@ var require_react_dom_client_development = __commonJS({
};
(function() {
var isomorphicReactPackageVersion = React58.version;
if ("19.2.7" !== isomorphicReactPackageVersion)
if ("19.2.8" !== isomorphicReactPackageVersion)
throw Error(
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' + (isomorphicReactPackageVersion + "\n - react-dom: 19.2.7\nLearn more: https://react.dev/warnings/version-mismatch")
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' + (isomorphicReactPackageVersion + "\n - react-dom: 19.2.8\nLearn more: https://react.dev/warnings/version-mismatch")
);
})();
"function" === typeof Map && null != Map.prototype && "function" === typeof Map.prototype.forEach && "function" === typeof Set && null != Set.prototype && "function" === typeof Set.prototype.clear && "function" === typeof Set.prototype.forEach || console.error(
@@ -21396,10 +21396,10 @@ var require_react_dom_client_development = __commonJS({
if (!(function() {
var internals = {
bundleType: 1,
version: "19.2.7",
version: "19.2.8",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.7"
reconcilerVersion: "19.2.8"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -21490,7 +21490,7 @@ var require_react_dom_client_development = __commonJS({
listenToAllSupportedEvents(container);
return new ReactDOMHydrationRoot(initialChildren);
};
exports.version = "19.2.7";
exports.version = "19.2.8";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
})();
}
@@ -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.1.2"
"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
*/
@@ -39147,6 +39213,27 @@ function validatePublishFrontmatter(frontMatter) {
}
return true;
}
function validateSettings(settings) {
if (!settings.flowershowToken) {
new import_obsidian3.Notice(
"Config error: You need to define a Flowershow PAT Token in the plugin settings"
);
return false;
}
if (!settings.siteName) {
new import_obsidian3.Notice(
"Config error: You need to define a Site Name in the plugin settings"
);
return false;
}
if (!settings.flowershowToken.startsWith("fs_pat_")) {
new import_obsidian3.Notice(
"Config error: Invalid token format. Token should start with 'fs_pat_'"
);
return false;
}
return true;
}
function normalizeRootDir(rootDir) {
return rootDir.replace(/\\/g, "/").replace(/^\/+|\/+$/g, "");
}
@@ -39220,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);
@@ -39250,9 +39360,9 @@ var Publisher = class {
this.settings = settings;
this.client = new FlowershowClient(API_URL, this.settings.flowershowToken);
}
/** Get site name, defaulting to vault name if not set */
/** Get the explicitly configured site name */
getSiteName() {
return this.settings.siteName || this.app.vault.getName();
return this.settings.siteName;
}
/** Get username */
getUsername() {
@@ -39283,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
@@ -39353,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
@@ -39380,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 {
@@ -39403,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 {
@@ -39420,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(
@@ -39479,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 {
@@ -39609,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;
@@ -39749,6 +39942,9 @@ var Flowershow = class extends import_obsidian6.Plugin {
);
return;
}
if (!validateSettings(this.settings)) {
return;
}
new import_obsidian6.Notice("\u231B Publishing note...");
const result = yield this.publisher.publishSingleNoteWithEmbeds(
currentFile
@@ -39773,6 +39969,9 @@ var Flowershow = class extends import_obsidian6.Plugin {
publishAllFiles() {
return __async(this, null, function* () {
try {
if (!validateSettings(this.settings)) {
return;
}
const { changedFiles, deletedFiles, newFiles } = yield this.publisher.getPublishStatus();
const filesToDelete = deletedFiles;
const filesToPublish = changedFiles.concat(newFiles);
@@ -39802,6 +40001,9 @@ var Flowershow = class extends import_obsidian6.Plugin {
});
}
openPublishStatusModal() {
if (!validateSettings(this.settings)) {
return;
}
if (!this.publishStatusModal) {
this.publishStatusModal = new PublishStatusModal({
app: this.app,
+9 -9
View File
@@ -1,10 +1,10 @@
{
"id": "flowershow",
"name": "Publish with Flowershow",
"version": "4.1.2",
"minAppVersion": "0.15.0",
"description": "Publish your vault as a website with Flowershow.",
"author": "Flowershow",
"authorUrl": "https://flowershow.app/",
"isDesktopOnly": false
}
"id": "flowershow",
"name": "Publish with Flowershow",
"version": "4.2.3",
"minAppVersion": "0.15.0",
"description": "Publish your vault as a website with Flowershow.",
"author": "Flowershow",
"authorUrl": "https://flowershow.app/",
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -5,5 +5,5 @@
"author": "lazyloong",
"minAppVersion": "1.0.0",
"version": "2.29.2"
"version": "2.29.4"
}
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -1,10 +1,10 @@
{
"id": "mp-publisher",
"name": "MP Publisher",
"version": "2.7.8",
"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
}
}
+23 -23
View File
@@ -6,29 +6,29 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0$1);
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+10 -10
View File
@@ -1,10 +1,10 @@
{
"id": "nldates-obsidian",
"name": "Natural Language Dates",
"description": "Create date-links based on natural language",
"version": "0.6.2",
"author": "Argentina Ortega Sainz",
"authorUrl": "https://argentinaos.com/",
"isDesktopOnly": false,
"minAppVersion": "1.0.0"
}
{
"id": "nldates-obsidian",
"name": "Natural Language Dates",
"description": "Create date-links based on natural language",
"version": "0.6.4",
"author": "Obsidian Community (Formerly Argentina Ortega Sainz)",
"authorUrl": "https://github.com/obsidian-community/nldates",
"isDesktopOnly": false,
"minAppVersion": "1.0.0"
}
+3021 -1958
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -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
View File
@@ -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;
}
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -1,8 +1,8 @@
{
"id": "nutstore-sync",
"name": "Nutstore Sync",
"version": "1.3.1",
"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",
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+10 -10
View File
@@ -1,11 +1,11 @@
{
"id": "obsidian-custom-frames",
"name": "Custom Frames",
"version": "2.5.0",
"minAppVersion": "1.2.0",
"description": "A plugin that turns web apps into panes using iframes with custom styling. Also comes with presets for Google Keep, Todoist and more.",
"author": "Ellpeck",
"authorUrl": "https://ellpeck.de",
"fundingUrl": "https://ellpeck.de/support",
"isDesktopOnly": false
}
"id": "obsidian-custom-frames",
"name": "Custom Frames",
"version": "2.6.0",
"minAppVersion": "1.11.0",
"description": "Turns web apps into panes using iframes with custom styling. Also comes with presets for Google Keep, Todoist and more.",
"author": "Ellpeck",
"authorUrl": "https://ellpeck.de",
"fundingUrl": "https://ellpeck.de/support",
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "obsidian-douban-plugin",
"name": "Douban",
"version": "2.3.3",
"version": "2.5.0",
"minAppVersion": "0.12.0",
"description": "This is a plugin that can import movies/books/musics/notes/games info data from Douban for Obsidian .",
"author": "Wanxp",
+614 -13
View File
@@ -40,42 +40,153 @@
}
.obsidian_douban_settings_button {
margin: auto;
vertical-align: bottom;
margin: auto;
vertical-align: bottom;
}
.obsidian_douban_qr_login {
text-align: center;
}
.obsidian_douban_qr_image_container {
min-height: 220px;
display: flex;
align-items: center;
justify-content: center;
}
.obsidian_douban_qr_image_container img {
width: min(300px, 70vw);
max-width: 100%;
padding: 10px;
background: white;
border-radius: 8px;
}
.obsidian_douban_qr_status {
min-height: 24px;
margin: 12px 0;
}
.obsidian_douban_qr_status.has_error {
color: var(--text-error);
}
.obsidian_douban_login_status {
display: inline-flex;
align-items: center;
margin-bottom: 8px;
padding: 3px 9px;
color: var(--text-success, #2f9e44);
background: rgba(74, 180, 105, 0.16);
border: 1px solid rgba(74, 180, 105, 0.3);
border-radius: 999px;
font-size: var(--font-ui-small);
font-weight: var(--font-semibold);
}
.obsidian_douban_login_detail {
display: flex;
gap: 6px;
align-items: baseline;
margin: 4px 0;
line-height: 1.5;
}
.obsidian_douban_login_label {
color: var(--text-muted);
}
.obsidian_douban_login_value {
color: var(--text-accent);
font-weight: var(--font-semibold);
overflow-wrap: anywhere;
}
a.obsidian_douban_login_value:hover {
color: var(--text-accent-hover);
text-decoration: underline;
}
.obsidian_douban_login_note {
margin-top: 8px;
color: var(--text-muted);
line-height: 1.5;
}
.obsidian_douban_qr_controls {
display: flex;
gap: 8px;
justify-content: center;
}
.obsidian_douban_search_input {
margin-left: 5px;
}
.obsidian_douban_search_fields {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.obsidian_douban_search_input_type {
margin-left: 5px;
float: right;
flex: 0 0 auto;
}
.obsidian_douban_search_input_content {
margin-left: 5px;
width: 80%;
float: left;
margin-left: 5px;
flex: 1 1 16rem;
min-width: 0;
}
.obsidian_douban_search_controls {
margin-top: 20px;
margin-right: 5px;
display: flex;
justify-content: flex-end;
gap: 8px;
}
.obsidian_douban_batch_urls {
box-sizing: border-box;
width: 100%;
resize: vertical;
}
.obsidian_douban_search_button {
margin-top: 20px;
margin-right: 5px;
float:right;
margin: 0;
}
.obsidian_douban_cancel_button {
margin-top: 20px;
margin-right: 5px;
float: right;
margin: 0;
}
.obsidian_douban_search_input_content + .obsidian_douban_search_input_type,
.obsidian_douban_search_input_content {
box-sizing: border-box;
}
.obsidian_douban_search_input_content .search-input-container,
.obsidian_douban_search_input_content input {
width: 100%;
}
.obsidian_douban_search_input_content,
.obsidian_douban_search_input_type {
align-self: center;
}
.obsidian_douban_search_input_content:first-child {
display: flex;
}
.obsidian_douban_search_input_content:first-child,
.obsidian_douban_search_input_type:first-child {
margin-top: 0;
}
.obsidian_douban_status_button {
@@ -93,6 +204,407 @@
border-color: #fb464c;
}
.obsidian_douban_section_card {
box-sizing: border-box;
padding: 16px 18px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
}
.obsidian_douban_section_overview {
margin-bottom: 14px;
}
.obsidian_douban_section_overview > p {
margin: 0;
color: var(--text-muted);
line-height: 1.6;
}
.obsidian_douban_card_list {
display: grid;
gap: 10px;
}
.obsidian_douban_section_card.setting-item {
border-top: 1px solid var(--background-modifier-border);
}
.obsidian_douban_embedded_setting.setting-item {
margin-top: 10px;
padding: 10px 0 0;
background: transparent;
border-top: 1px solid var(--background-modifier-border);
border-radius: 0;
}
.advanced-settings > .setting-item {
box-sizing: border-box;
padding: 16px 18px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
}
.obsidian_douban_array_section {
margin-bottom: 28px;
}
.obsidian_douban_array_section + .obsidian_douban_array_section {
padding-top: 0;
border-top: 0;
}
.obsidian_douban_array_section_title {
margin: 0 0 10px;
font-size: var(--font-ui-medium);
font-weight: var(--font-medium);
line-height: 1.4;
}
.obsidian_douban_array_help {
margin: 6px 0;
color: var(--text-muted);
font-size: var(--font-ui-small);
line-height: 1.6;
}
.obsidian_douban_array_hint {
font-size: var(--font-ui-small);
}
.obsidian_douban_array_section_header.setting-item {
margin-top: 10px;
padding: 12px 0 0;
background: transparent;
border-top: 1px solid var(--background-modifier-border);
border-radius: 0;
}
.obsidian_douban_array_display_card {
margin-top: 14px;
padding: 16px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
}
.obsidian_douban_array_card_header.setting-item {
padding: 0 0 14px;
background: transparent;
border-top: 0;
border-bottom: 1px solid var(--background-modifier-border);
border-radius: 0;
}
.obsidian_douban_array_fields {
display: grid;
grid-template-columns: repeat(5, minmax(90px, 1fr));
gap: 12px;
margin-top: 14px;
}
.obsidian_douban_array_field label,
.obsidian_douban_array_limit_field label {
display: block;
margin-bottom: 6px;
color: var(--text-muted);
font-size: var(--font-ui-small);
font-weight: var(--font-medium);
}
.obsidian_douban_array_field input,
.obsidian_douban_array_limit_field input,
.obsidian_douban_array_limit_field select {
box-sizing: border-box;
width: 100%;
margin: 0;
}
.array-show {
margin-top: 14px;
padding: 12px 14px;
background: var(--background-primary);
border-radius: 8px;
}
.array-show .setting-item {
padding: 0;
background: transparent;
border-top: 0;
border-radius: 0;
}
.array-show-title {
white-space: pre-wrap;
word-break: break-word;
}
.array-length-limit-list {
display: grid;
gap: 10px;
}
.obsidian_douban_array_limit_item {
display: grid;
grid-template-columns: minmax(120px, 0.8fr) minmax(180px, 1.5fr) minmax(100px, 0.6fr) auto;
gap: 12px;
align-items: end;
padding: 14px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
}
.obsidian_douban_array_limit_remove {
display: flex;
align-items: center;
height: var(--input-height);
}
@media (max-width: 800px) {
.obsidian_douban_array_fields {
grid-template-columns: repeat(2, minmax(120px, 1fr));
}
.obsidian_douban_array_limit_item {
grid-template-columns: repeat(2, minmax(140px, 1fr));
}
.obsidian_douban_array_limit_remove {
align-items: flex-end;
}
}
@media (max-width: 520px) {
.obsidian_douban_array_fields,
.obsidian_douban_array_limit_item {
grid-template-columns: 1fr;
}
}
.obsidian_douban_custom_property_intro {
margin: 0 0 12px;
color: var(--text-muted);
line-height: 1.6;
}
.obsidian_douban_custom_property_header.setting-item {
padding: 12px 0;
background: transparent;
border-top: 0;
border-radius: 0;
}
.custom-property-list {
display: grid;
gap: 10px;
margin-top: 12px;
}
.obsidian_douban_custom_property_item {
display: grid;
grid-template-columns: minmax(180px, 1fr) minmax(240px, 1.4fr) minmax(130px, 0.7fr) auto;
gap: 12px;
align-items: end;
padding: 14px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
}
.obsidian_douban_custom_property_field label {
display: block;
margin-bottom: 6px;
color: var(--text-muted);
font-size: var(--font-ui-small);
font-weight: var(--font-medium);
}
.obsidian_douban_custom_property_field input,
.obsidian_douban_custom_property_field select {
box-sizing: border-box;
width: 100%;
margin: 0;
}
.obsidian_douban_custom_property_remove {
display: flex;
align-items: center;
height: var(--input-height);
}
@media (max-width: 800px) {
.obsidian_douban_custom_property_item {
grid-template-columns: repeat(2, minmax(140px, 1fr));
}
}
@media (max-width: 520px) {
.obsidian_douban_custom_property_item {
grid-template-columns: 1fr;
}
}
.obsidian_douban_variable_summary {
margin: 0 0 8px;
color: var(--text-muted);
font-size: var(--font-ui-small);
line-height: 1.6;
}
.obsidian_douban_variable_card {
margin-bottom: 18px;
padding: 18px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
}
.obsidian_douban_variable_title {
margin: 0 0 6px;
font-size: var(--font-ui-medium);
}
.obsidian_douban_variable_help {
margin: 0 0 14px;
color: var(--text-muted);
font-size: var(--font-ui-small);
line-height: 1.6;
}
.obsidian_douban_variable_table_scroll {
max-height: min(60vh, 620px);
overflow: auto;
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
scrollbar-gutter: stable;
}
.obsidian_douban_variable_table {
width: 100%;
min-width: 780px;
margin: 0;
border: 0;
border-collapse: separate;
border-spacing: 0;
font-size: var(--font-ui-small);
line-height: 1.45;
}
.obsidian_douban_variable_table th,
.obsidian_douban_variable_table td {
min-width: 100px;
padding: 9px 12px;
text-align: left;
vertical-align: top;
border: 0;
border-right: 1px solid var(--background-modifier-border);
border-bottom: 1px solid var(--background-modifier-border);
}
.obsidian_douban_variable_table th:last-child,
.obsidian_douban_variable_table td:last-child {
border-right: 0;
}
.obsidian_douban_variable_table tbody tr:last-child th,
.obsidian_douban_variable_table tbody tr:last-child td {
border-bottom: 0;
}
.obsidian_douban_variable_table thead th {
position: sticky;
top: 0;
z-index: 2;
background: var(--background-modifier-form-field);
color: var(--text-normal);
font-weight: var(--font-semibold);
white-space: nowrap;
}
.obsidian_douban_variable_table tbody tr:nth-child(even) td,
.obsidian_douban_variable_table tbody tr:nth-child(even) th {
background: var(--background-primary-alt);
}
.obsidian_douban_variable_table tbody tr:hover td,
.obsidian_douban_variable_table tbody tr:hover th {
background: var(--background-modifier-hover);
}
.obsidian_douban_variable_table thead th:first-child,
.obsidian_douban_variable_table tbody th {
position: sticky;
left: 0;
z-index: 1;
min-width: 150px;
background: var(--background-secondary);
}
.obsidian_douban_variable_table thead th:first-child {
z-index: 3;
background: var(--background-modifier-form-field);
}
.obsidian_douban_variable_name {
color: var(--text-accent);
font-family: var(--font-monospace);
font-size: var(--font-ui-small);
font-weight: var(--font-medium);
white-space: nowrap;
}
.obsidian_douban_variable_copy_target {
cursor: pointer;
}
.obsidian_douban_variable_copy_target:hover .obsidian_douban_variable_name {
color: var(--text-accent-hover);
}
.obsidian_douban_variable_copy_target:focus-visible {
outline: 2px solid var(--interactive-accent);
outline-offset: -3px;
}
.obsidian_douban_user_variable_list {
display: grid;
grid-template-columns: repeat(2, minmax(240px, 1fr));
gap: 8px;
}
.obsidian_douban_user_variable_item {
display: grid;
grid-template-columns: minmax(130px, auto) 1fr;
gap: 12px;
align-items: start;
padding: 10px 12px;
background: var(--background-primary);
border-radius: 6px;
}
.obsidian_douban_user_variable_item > span:not(.obsidian_douban_variable_name) {
color: var(--text-muted);
font-size: var(--font-ui-small);
line-height: 1.45;
}
.obsidian_douban_user_variable_item > .obsidian_douban_variable_name {
color: var(--text-accent);
}
@media (max-width: 700px) {
.obsidian_douban_variable_card {
padding: 14px;
}
.obsidian_douban_user_variable_list {
grid-template-columns: 1fr;
}
}
.obsidian_douban_sync_config{
display: inline-block;
@@ -123,14 +635,21 @@
.obsidian_douban_settings_tab_container {
display: flex;
flex-direction: column;
min-width: 0;
}
.obsidian_douban_settings_tab_headers {
display: flex;
max-width: 100%;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
scrollbar-width: thin;
/*border-bottom: 1px solid #ccc;*/
}
.obsidian_douban_settings_tab_header {
flex: 0 0 auto;
padding: 10px;
cursor: pointer;
/*border: 1px solid #ccc;*/
@@ -143,11 +662,13 @@
.obsidian_douban_settings_tab_contents {
display: flex;
flex-direction: column;
min-width: 0;
}
.obsidian_douban_settings_tab_content {
display: none;
padding: 10px;
min-width: 0;
/*border: 1px solid #ccc;*/
}
@@ -172,9 +693,89 @@
.setting-item-control.obsidian_douban_template_file_select > div.search-input-container {
flex: 1 1 180px;
min-width: 0;
width: 100%;
}
@media (max-width: 800px) {
.obsidian_douban_template_list > .setting-item {
align-items: stretch;
flex-wrap: wrap;
gap: 10px;
}
.obsidian_douban_template_list > .setting-item > .setting-item-info,
.obsidian_douban_template_list > .setting-item > .setting-item-control {
flex: 1 1 100%;
width: 100%;
}
.obsidian_douban_template_list > .setting-item > .setting-item-control {
justify-content: flex-start;
}
}
@media (max-width: 600px) {
.obsidian_douban_settings_tab_header {
padding: 9px 10px;
}
.obsidian_douban_settings_tab_content,
.obsidian_douban_settings_tab_content.active {
padding: 8px;
border-radius: 0 0 8px 8px;
}
.obsidian_douban_section_card,
.advanced-settings > .setting-item,
.obsidian_douban_array_display_card,
.obsidian_douban_variable_card {
padding: 12px;
}
.obsidian_douban_settings_tab_content .setting-item {
align-items: stretch;
flex-wrap: wrap;
gap: 10px;
}
.obsidian_douban_settings_tab_content .setting-item-info,
.obsidian_douban_settings_tab_content .setting-item-control {
min-width: 0;
}
.obsidian_douban_settings_tab_content .setting-item-description {
overflow-wrap: anywhere;
}
.obsidian_douban_settings_tab_content .setting-item-control {
flex: 1 1 100%;
justify-content: flex-start;
width: 100%;
}
.obsidian_douban_settings_tab_content .setting-item-control input[type='text'],
.obsidian_douban_settings_tab_content .setting-item-control input[type='search'],
.obsidian_douban_settings_tab_content .setting-item-control .search-input-container {
min-width: 0;
max-width: 100%;
}
.obsidian_douban_qr_controls,
.obsidian_douban_search_controls {
flex-wrap: wrap;
}
}
@media (max-width: 420px) {
.obsidian_douban_settings_tab_content,
.obsidian_douban_settings_tab_content.active {
padding: 6px;
}
.obsidian_douban_custom_property_remove,
.obsidian_douban_array_limit_remove {
justify-content: flex-end;
}
}
+38 -3
View File
@@ -6,11 +6,18 @@
"phoneFooterSafeAreaPadding": false,
"tabletFooterSafeAreaPadding": false,
"folder": "08-Inbox/Excalidraw",
"libraryFolderPath": "Excalidraw/Libraries",
"libraryFileName": "local-library",
"libraryStorageMode": "vault",
"libraryMigrationStatus": "not-required",
"libraryMigrationSnoozeUntil": 0,
"cropFolder": "",
"annotateFolder": "",
"embedUseExcalidrawFolder": false,
"templateFilePath": "Excalidraw/Template.excalidraw",
"scriptFolderPath": "Excalidraw/Scripts",
"allowJavaScriptFiles": false,
"storeScriptFilesAsJavaScript": false,
"fontAssetsPath": "Excalidraw/CJK Fonts",
"loadChineseFonts": false,
"loadJapaneseFonts": false,
@@ -18,8 +25,6 @@
"compress": true,
"decompressForMDView": false,
"onceOffCompressFlagReset": true,
"onceOffGPTVersionReset": true,
"autosave": true,
"autosaveIntervalDesktop": 60000,
"autosaveIntervalMobile": 30000,
"drawingFilenamePrefix": "Drawing ",
@@ -131,9 +136,36 @@
"mdFontColor": "Black",
"mdBorderColor": "Black",
"mdCSS": "",
"markdownImageSettings": {
"defaults": {
"width": 500,
"paddingBottom": 10,
"fontFamily": "Virgil",
"fontColor": "Black",
"border": {
"enabled": false,
"color": "Black"
},
"css": "",
"transclusion": {
"enabled": false,
"fontFamily": "Cascadia",
"fontColor": "Black",
"border": {
"enabled": false,
"color": "Black"
},
"css": ""
}
}
},
"markdownImageDeletionPreference": "ask",
"scriptEngineSettings": {},
"previousRelease": "2.25.3",
"autostartScripts": {},
"autostartScriptFailures": {},
"previousRelease": "2.27.3",
"showReleaseNotes": true,
"useDeclarativeSettings": true,
"excalidrawMasteryPromoCollapsed": false,
"compareManifestToPluginVersion": true,
"showNewVersionNotification": true,
@@ -763,6 +795,7 @@
}
},
"aiDefaultTextModel": "gpt-3.5-turbo-1106",
"aiDefaultMultimodalModel": "gpt-5-mini",
"aiDefaultImageGenerationModel": "dall-e-3",
"aiDefaultMaxOutgoingTokens": 0,
"aiDefaultMaxResponseTokens": 4096,
@@ -1087,6 +1120,8 @@
"margin": "normal"
},
"disableContextMenu": false,
"onceOffGPTVersionReset": true,
"autosave": true,
"isDebugMode": false,
"defaultTrayMode": true,
"compactModeOnTablets": true
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "obsidian-excalidraw-plugin",
"name": "Excalidraw",
"version": "2.25.3",
"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",
File diff suppressed because one or more lines are too long
+166 -154
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -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.38.6"
"version": "2.40.0"
}
@@ -4,7 +4,7 @@
"uploadServer": "http://127.0.0.1:36677/upload",
"deleteServer": "http://127.0.0.1:36677/delete",
"imageSizeSuffix": "",
"picgoCorePath": "http://127.0.0.1:36677/",
"picgoCorePath": "http://127.0.0.1:36677/upload",
"workOnNetWork": false,
"fixPath": false,
"applyImage": true,
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -1,9 +1,9 @@
{
"id": "obsidian-importer",
"name": "Importer",
"version": "1.8.12",
"minAppVersion": "0.15.0",
"description": "Import data from Notion, Evernote, Apple Notes, Microsoft OneNote, Google Keep, Bear, Roam, Textbundle, CSV, and HTML files.",
"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, Logseq, Tomboy, Textbundle, CSV, and HTML files.",
"author": "Obsidian",
"authorUrl": "https://obsidian.md",
"isDesktopOnly": false
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "obsidian-livesync",
"name": "Self-hosted LiveSync",
"version": "0.25.83",
"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",
+301 -33
View File
@@ -12,13 +12,26 @@
background-color: var(--text-muted);
}
.vpk-action-dialog__message {
user-select: text;
-webkit-user-select: text;
}
.conflict-dev-name {
display: inline-block;
min-width: 5em;
}
.conflict-action-container {
display: flex;
flex-direction: column;
gap: var(--size-4-2);
margin-top: var(--size-4-2);
}
.conflict-action-button {
margin-right: 4px;
width: 100%;
margin: 0;
}
.op-scrollable {
@@ -138,8 +151,8 @@ div.sls-setting-menu-btn {
/* width: 100%; */
}
.sls-setting-tab:hover~div.sls-setting-menu-btn,
.sls-setting-label.selected .sls-setting-tab:checked~div.sls-setting-menu-btn {
.sls-setting-tab:hover ~ div.sls-setting-menu-btn,
.sls-setting-label.selected .sls-setting-tab:checked ~ div.sls-setting-menu-btn {
background-color: var(--interactive-accent);
color: var(--text-on-accent);
}
@@ -174,9 +187,16 @@ body {
/* padding: 2px; */
margin: 1px;
border-radius: 4px;
background-image: linear-gradient(-45deg,
var(--sls-col-warn-stripe1) 25%, var(--sls-col-warn-stripe2) 25%, var(--sls-col-warn-stripe2) 50%,
var(--sls-col-warn-stripe1) 50%, var(--sls-col-warn-stripe1) 75%, var(--sls-col-warn-stripe2) 75%, var(--sls-col-warn-stripe2));
background-image: linear-gradient(
-45deg,
var(--sls-col-warn-stripe1) 25%,
var(--sls-col-warn-stripe2) 25%,
var(--sls-col-warn-stripe2) 50%,
var(--sls-col-warn-stripe1) 50%,
var(--sls-col-warn-stripe1) 75%,
var(--sls-col-warn-stripe2) 75%,
var(--sls-col-warn-stripe2)
);
background-size: 30px 30px;
display: flex;
flex-direction: row;
@@ -196,7 +216,6 @@ body {
100% {
background-position: 30px 0;
}
}
.sls-setting-menu-buttons label {
@@ -280,14 +299,6 @@ body {
border-radius: 4px;
}
.isWizard .wizardHidden {
display: none;
}
.sls-setting:not(.isWizard) .wizardOnly {
display: none;
}
.sls-item-dirty::before {
content: "✏";
}
@@ -301,33 +312,101 @@ body {
background-color: rgba(var(--background-modifier-error-rgb), 0.3);
}
.sls-setting-disabled input[type=text],
.sls-setting-disabled input[type=number],
.sls-setting-disabled input[type=password] {
.sls-setting-disabled input[type="text"],
.sls-setting-disabled input[type="number"],
.sls-setting-disabled input[type="password"] {
filter: brightness(80%);
color: var(--text-muted);
}
.sls-setting-hidden {
display: none;
}
.sls-setting-obsolete {
/* background-image: linear-gradient(-45deg,
var(--sls-col-warn-stripe1) 25%, var(--sls-col-warn-stripe2) 25%, var(--sls-col-warn-stripe2) 50%,
var(--sls-col-warn-stripe1) 50%, var(--sls-col-warn-stripe1) 75%, var(--sls-col-warn-stripe2) 75%, var(--sls-col-warn-stripe2)); */
background-image: linear-gradient(-45deg,
transparent 25%, rgba(var(--background-secondary), 0.1) 25%, rgba(var(--background-secondary), 0.1) 50%, transparent 50%, transparent 75%, rgba(var(--background-secondary), 0.1) 75%, rgba(var(--background-secondary), 0.1));
background-image: linear-gradient(
-45deg,
transparent 25%,
rgba(var(--background-secondary), 0.1) 25%,
rgba(var(--background-secondary), 0.1) 50%,
transparent 50%,
transparent 75%,
rgba(var(--background-secondary), 0.1) 75%,
rgba(var(--background-secondary), 0.1)
);
background-size: 60px 60px;
}
.password-input>.setting-item-control>input {
.password-input > .setting-item-control > input {
-webkit-text-security: disc;
}
.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;
align-items: center;
justify-content: center;
}
.sls-review-harness {
box-sizing: border-box;
max-width: 100%;
overflow-x: clip;
padding-bottom: max(1rem, env(safe-area-inset-bottom));
}
.sls-review-harness .setting-item,
.sls-review-harness .setting-item-control {
flex-wrap: wrap;
max-width: 100%;
}
.sls-review-harness .setting-item-info {
min-width: min(16rem, 100%);
}
.sls-review-harness .setting-item-control {
gap: 0.5rem;
}
.sls-review-harness button {
min-height: 44px;
max-width: 100%;
white-space: normal;
}
.sls-review-harness__result,
.sls-review-harness__warning,
.sls-review-harness__privacy,
.sls-review-harness__error,
.sls-review-harness__resumed {
max-width: 100%;
overflow-wrap: anywhere;
}
.sls-review-harness__result {
margin: 0 0 1rem;
}
.sls-review-harness__warning,
.sls-review-harness__error {
color: var(--text-error);
}
.sls-review-harness__resumed {
color: var(--text-success);
}
span.ls-mark-cr::after {
user-select: none;
content: "↲";
@@ -378,7 +457,6 @@ span.ls-mark-cr::after {
}
}
.livesync-status {
user-select: none;
pointer-events: none;
@@ -401,18 +479,30 @@ span.ls-mark-cr::after {
font-size: 80%;
}
div.workspace-leaf-content[data-type=bases] .livesync-status {
.is-mobile.is-ios .livesync-status {
box-sizing: border-box;
top: calc(var(--header-height) + var(--view-header-height, var(--header-height)) + var(--size-4-2));
}
div.workspace-leaf-content[data-type="bases"] .livesync-status {
top: calc(var(--bases-header-height) + var(--header-height));
padding: 5px;
padding-right: 18px;
}
.is-mobile div.workspace-leaf-content[data-type=bases] .livesync-status {
.is-mobile div.workspace-leaf-content[data-type="bases"] .livesync-status {
top: calc(var(--bases-header-height) + var(--view-header-height));
padding: 6px;
padding-right: 18px;
}
.is-mobile.is-ios div.workspace-leaf-content[data-type="bases"] .livesync-status {
top: calc(
var(--bases-header-height) + var(--header-height) + var(--view-header-height, var(--header-height)) +
var(--size-4-2)
);
}
.livesync-status div {
opacity: 0.6;
-webkit-filter: grayscale(100%);
@@ -422,7 +512,6 @@ div.workspace-leaf-content[data-type=bases] .livesync-status {
.livesync-status .livesync-status-loghistory {
text-align: left;
opacity: 0.4;
}
.livesync-status div.livesync-status-messagearea:empty {
@@ -440,7 +529,6 @@ div.workspace-leaf-content[data-type=bases] .livesync-status {
margin-left: auto;
}
.menu-setting-poweruser-disabled .sls-setting-poweruser {
display: none;
}
@@ -454,12 +542,29 @@ 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 1.0em;
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 {
@@ -476,6 +581,34 @@ div.workspace-leaf-content[data-type=bases] .livesync-status {
font-size: 0.8em;
}
body.is-mobile .livesync-message-box-container {
box-sizing: border-box;
padding-top: var(--safe-area-inset-top, env(safe-area-inset-top, 0px));
padding-right: var(--safe-area-inset-right, env(safe-area-inset-right, 0px));
padding-bottom: var(--safe-area-inset-bottom, env(safe-area-inset-bottom, 0px));
padding-left: var(--safe-area-inset-left, env(safe-area-inset-left, 0px));
}
body.is-mobile .livesync-message-box-container .modal {
max-height: 100%;
}
body.is-mobile .livesync-message-box-container button {
height: auto;
min-height: var(--input-height);
white-space: normal;
}
body.is-mobile .livesync-compatibility-review-notice {
box-sizing: border-box;
margin-right: calc(64px + var(--safe-area-inset-right, env(safe-area-inset-right, 0px)));
min-width: 0;
width: calc(
100vw - 88px - var(--safe-area-inset-left, env(safe-area-inset-left, 0px)) -
var(--safe-area-inset-right, env(safe-area-inset-right, 0px))
);
}
.sls-qr {
display: flex;
justify-content: center;
@@ -488,7 +621,98 @@ div.workspace-leaf-content[data-type=bases] .livesync-status {
overflow-x: auto;
white-space: pre-wrap;
word-break: break-all;
}
.sls-repair-results {
display: grid;
gap: var(--size-4-3);
}
.sls-repair-result {
padding: var(--size-4-3);
border: 1px solid var(--background-modifier-border);
border-radius: var(--radius-m);
background: var(--background-secondary);
}
.sls-repair-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--size-4-2);
min-width: 0;
}
.sls-repair-header > :first-child {
flex: 1 1 auto;
min-width: 0;
}
.sls-repair-header h6 {
margin: 0;
overflow-wrap: anywhere;
}
.sls-repair-status {
display: flex;
flex-wrap: wrap;
gap: var(--size-4-2);
margin-top: var(--size-4-1);
font-size: var(--font-ui-smaller);
}
.sls-repair-status-ok {
color: var(--text-success);
}
.sls-repair-status-warning {
color: var(--text-warning);
}
.sls-repair-metric {
margin-top: var(--size-4-1);
font-size: var(--font-ui-smaller);
line-height: var(--line-height-tight);
overflow-wrap: anywhere;
}
.sls-repair-action-menu {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: var(--clickable-icon-size);
width: var(--clickable-icon-size);
height: var(--clickable-icon-size);
padding: 0;
}
.sls-repair-action-menu .svg-icon {
width: 18px;
height: 18px;
}
.sls-repair-revision {
margin-top: var(--size-4-2);
padding: var(--size-4-2);
border-left: 3px solid var(--background-modifier-border);
background: var(--background-primary-alt);
}
.sls-repair-revision-title {
font-weight: var(--font-semibold);
overflow-wrap: anywhere;
}
.sls-repair-revision code {
display: block;
margin-top: var(--size-4-1);
overflow-wrap: anywhere;
white-space: normal;
}
.sls-repair-ancestor-warning {
margin-top: var(--size-4-2);
color: var(--text-warning);
}
/* Diff navigation */
@@ -551,6 +775,51 @@ div.workspace-leaf-content[data-type=bases] .livesync-status {
color: var(--text-muted);
}
.history-search-row button:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.history-rev-nav-row {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 8px;
}
.history-rev-nav-row input[type="range"] {
flex-grow: 1;
margin-bottom: 0;
}
.history-rev-nav-btn {
flex-shrink: 0;
padding: 2px 10px;
font-size: 0.9em;
cursor: pointer;
border: 1px solid var(--background-modifier-border);
border-radius: 4px;
background-color: var(--background-secondary);
color: var(--text-normal);
}
.history-rev-nav-btn:hover:not(:disabled) {
background-color: var(--background-modifier-hover);
}
.history-rev-nav-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.history-rev-indicator {
flex-shrink: 0;
font-size: 0.85em;
color: var(--text-muted);
min-width: 4.5em;
text-align: right;
}
.history-diff-options-row {
justify-content: space-between;
}
@@ -570,4 +839,3 @@ div.workspace-leaf-content[data-type=bases] .livesync-status {
outline-offset: 1px;
border-radius: 2px;
}
+89 -89
View File
@@ -1000,55 +1000,55 @@
"id": 38835133,
"title": "硬/软件评测",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:30.927Z"
"lastSyncDate": "2026-08-17T09:58:15.380Z"
},
"38835134": {
"id": 38835134,
"title": "硬/软件评测/硬件评测",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:31.745Z",
"lastSyncDate": "2026-08-17T09:58:16.221Z",
"parentId": 38835133
},
"38835135": {
"id": 38835135,
"title": "硬/软件评测/20230709",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:32.786Z",
"lastSyncDate": "2026-08-17T09:58:17.059Z",
"parentId": 38835133
},
"38835136": {
"id": 38835136,
"title": "硬/软件评测/opencore",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:34.009Z",
"lastSyncDate": "2026-08-17T09:58:18.132Z",
"parentId": 38835133
},
"38835137": {
"id": 38835137,
"title": "硬/软件评测/20230826",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:34.791Z",
"lastSyncDate": "2026-08-17T09:58:19.013Z",
"parentId": 38835133
},
"38835138": {
"id": 38835138,
"title": "硬/软件评测/elasticsearch",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:35.547Z",
"lastSyncDate": "2026-08-17T09:58:20.110Z",
"parentId": 38835133
},
"38835140": {
"id": 38835140,
"title": "硬/软件评测/记账软件",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:36.340Z",
"lastSyncDate": "2026-08-17T09:58:20.982Z",
"parentId": 38835133
},
"38835141": {
"id": 38835141,
"title": "硬/软件评测/图片工具",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:37.354Z",
"lastSyncDate": "2026-08-17T09:58:22.005Z",
"parentId": 38835133
},
"38835142": {
@@ -1143,7 +1143,7 @@
"id": 38835159,
"title": "群晖NAS/docker",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:38.140Z",
"lastSyncDate": "2026-08-17T09:58:23.121Z",
"parentId": 38835158
},
"38835160": {
@@ -1162,21 +1162,21 @@
"id": 38835163,
"title": "群晖NAS/20230708",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:38.963Z",
"lastSyncDate": "2026-08-17T09:58:24.180Z",
"parentId": 38835158
},
"38835164": {
"id": 38835164,
"title": "群晖NAS/20230811",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:39.795Z",
"lastSyncDate": "2026-08-17T09:58:25.244Z",
"parentId": 38835158
},
"38835165": {
"id": 38835165,
"title": "破解网站",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:41.285Z"
"lastSyncDate": "2026-08-17T09:58:26.099Z"
},
"38835166": {
"id": 38835166,
@@ -1199,13 +1199,13 @@
"id": 38835169,
"title": "越狱",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:42.097Z"
"lastSyncDate": "2026-08-17T09:58:27.014Z"
},
"38835170": {
"id": 38835170,
"title": "越狱/安装ipa",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:42.874Z",
"lastSyncDate": "2026-08-17T09:58:28.194Z",
"parentId": 38835169
},
"38835171": {
@@ -1224,7 +1224,7 @@
"id": 38835174,
"title": "越狱/巨魔",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:43.710Z",
"lastSyncDate": "2026-08-17T09:58:29.271Z",
"parentId": 38835169
},
"38835175": {
@@ -1422,7 +1422,7 @@
"id": 38835212,
"title": "英语学习",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:44.968Z"
"lastSyncDate": "2026-08-17T09:58:30.321Z"
},
"38835213": {
"id": 38835213,
@@ -1493,7 +1493,7 @@
"id": 38835225,
"title": "幼儿教育",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:45.716Z"
"lastSyncDate": "2026-08-17T09:58:31.134Z"
},
"38835226": {
"id": 38835226,
@@ -1647,28 +1647,28 @@
"id": 38835253,
"title": "物联网解决方案/产品评估",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:46.462Z",
"lastSyncDate": "2026-08-17T09:58:32.238Z",
"parentId": 38835252
},
"38835254": {
"id": 38835254,
"title": "物联网解决方案/产品评估/语音机器人",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:47.463Z",
"lastSyncDate": "2026-08-17T09:58:33.603Z",
"parentId": 38835253
},
"38835255": {
"id": 38835255,
"title": "物联网解决方案/产品评估/语音机器人/智慧农业",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:48.895Z",
"lastSyncDate": "2026-08-17T09:58:34.374Z",
"parentId": 38835254
},
"38835256": {
"id": 38835256,
"title": "物联网解决方案/产品评估/语音机器人/智慧农业/智慧照明",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:49.617Z",
"lastSyncDate": "2026-08-17T09:58:35.417Z",
"parentId": 38835255
},
"38835257": {
@@ -1681,7 +1681,7 @@
"id": 38835258,
"title": "物联网解决方案/供应商",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:50.588Z",
"lastSyncDate": "2026-08-17T09:58:36.583Z",
"parentId": 38835252
},
"38835259": {
@@ -1706,7 +1706,7 @@
"id": 38835262,
"title": "物联网解决方案/安防网站",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:51.814Z",
"lastSyncDate": "2026-08-17T09:58:37.600Z",
"parentId": 38835252
},
"38835263": {
@@ -1736,62 +1736,62 @@
"id": 38835268,
"title": "学习网站/ChatGPT",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:53.026Z",
"lastSyncDate": "2026-08-17T09:58:38.361Z",
"parentId": 38835265
},
"38835269": {
"id": 38835269,
"title": "学习网站/ChatGPT/20230709",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:53.756Z",
"lastSyncDate": "2026-08-17T09:58:39.370Z",
"parentId": 38835268
},
"38835270": {
"id": 38835270,
"title": "学习网站/Comic",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:54.477Z",
"lastSyncDate": "2026-08-17T09:58:40.361Z",
"parentId": 38835265
},
"38835271": {
"id": 38835271,
"title": "开发网站",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:55.277Z"
"lastSyncDate": "2026-08-17T09:58:41.648Z"
},
"38835272": {
"id": 38835272,
"title": "开发网站/20230709",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:56.068Z",
"lastSyncDate": "2026-08-17T09:58:42.520Z",
"parentId": 38835271
},
"38835273": {
"id": 38835273,
"title": "开发网站/VSCode",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:56.901Z",
"lastSyncDate": "2026-08-17T09:58:43.830Z",
"parentId": 38835271
},
"38835274": {
"id": 38835274,
"title": "开发网站/Python",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:57.671Z",
"lastSyncDate": "2026-08-17T09:58:44.679Z",
"parentId": 38835271
},
"38835275": {
"id": 38835275,
"title": "开发网站/F^Q",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:58.413Z",
"lastSyncDate": "2026-08-17T09:58:45.849Z",
"parentId": 38835271
},
"38835276": {
"id": 38835276,
"title": "开发网站/F^Q/20230812",
"sync": true,
"lastSyncDate": "2026-07-29T08:21:59.292Z",
"lastSyncDate": "2026-08-17T09:58:46.942Z",
"parentId": 38835275
},
"38835285": {
@@ -2905,7 +2905,7 @@
"id": 38835489,
"title": "群晖NAS",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:00.556Z"
"lastSyncDate": "2026-08-17T09:58:48.418Z"
},
"38835490": {
"id": 38835490,
@@ -2917,14 +2917,14 @@
"id": 38835491,
"title": "群晖NAS/nginx",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:01.292Z",
"lastSyncDate": "2026-08-17T09:58:49.506Z",
"parentId": 38835489
},
"38835492": {
"id": 38835492,
"title": "群晖NAS/20230709",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:02.070Z",
"lastSyncDate": "2026-08-17T09:58:50.391Z",
"parentId": 38835489
},
"38835493": {
@@ -2976,14 +2976,14 @@
"id": 38835502,
"title": "越狱/IPA",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:02.864Z",
"lastSyncDate": "2026-08-17T09:58:51.193Z",
"parentId": 38835500
},
"38835503": {
"id": 38835503,
"title": "越狱/IPA提取",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:03.660Z",
"lastSyncDate": "2026-08-17T09:58:52.006Z",
"parentId": 38835500
},
"38835504": {
@@ -3434,7 +3434,7 @@
"id": 38835584,
"title": "物联网解决方案/行业资讯",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:04.345Z",
"lastSyncDate": "2026-08-17T09:58:53.072Z",
"parentId": 38835579
},
"38835585": {
@@ -3447,21 +3447,21 @@
"id": 38835586,
"title": "物联网解决方案/数字孪生",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:05.193Z",
"lastSyncDate": "2026-08-17T09:58:53.835Z",
"parentId": 38835579
},
"38835587": {
"id": 38835587,
"title": "物联网解决方案/智慧停车",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:05.910Z",
"lastSyncDate": "2026-08-17T09:58:54.657Z",
"parentId": 38835579
},
"38835588": {
"id": 38835588,
"title": "物联网解决方案/智能家居",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:06.650Z",
"lastSyncDate": "2026-08-17T09:58:55.911Z",
"parentId": 38835579
},
"38835589": {
@@ -3474,27 +3474,27 @@
"id": 38835590,
"title": "物联网解决方案/智慧酒店",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:07.487Z",
"lastSyncDate": "2026-08-17T09:58:56.673Z",
"parentId": 38835579
},
"38835591": {
"id": 38835591,
"title": "物联网解决方案/智慧园区",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:08.514Z",
"lastSyncDate": "2026-08-17T09:58:57.706Z",
"parentId": 38835579
},
"38835592": {
"id": 38835592,
"title": "学习网站",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:09.584Z"
"lastSyncDate": "2026-08-17T09:58:58.839Z"
},
"38835593": {
"id": 38835593,
"title": "学习网站/博客",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:10.535Z",
"lastSyncDate": "2026-08-17T09:58:59.900Z",
"parentId": 38835592
},
"38835595": {
@@ -3519,243 +3519,243 @@
"id": 38835599,
"title": "开发网站",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:11.543Z"
"lastSyncDate": "2026-08-17T09:59:00.736Z"
},
"38835600": {
"id": 38835600,
"title": "开发网站/20230709",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:12.599Z",
"lastSyncDate": "2026-08-17T09:59:01.524Z",
"parentId": 38835599
},
"38835601": {
"id": 38835601,
"title": "开发网站/VSCode",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:13.463Z",
"lastSyncDate": "2026-08-17T09:59:02.678Z",
"parentId": 38835599
},
"38835602": {
"id": 38835602,
"title": "开发网站/Python",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:14.256Z",
"lastSyncDate": "2026-08-17T09:59:03.761Z",
"parentId": 38835599
},
"38835603": {
"id": 38835603,
"title": "开发网站/F^Q",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:14.985Z",
"lastSyncDate": "2026-08-17T09:59:04.920Z",
"parentId": 38835599
},
"38835604": {
"id": 38835604,
"title": "开发网站/F^Q/20230812",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:15.703Z",
"lastSyncDate": "2026-08-17T09:59:05.703Z",
"parentId": 38835603
},
"38835605": {
"id": 38835605,
"title": "开发网站/SQL",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:16.427Z",
"lastSyncDate": "2026-08-17T09:59:06.462Z",
"parentId": 38835599
},
"38835606": {
"id": 38835606,
"title": "开发网站/App打包",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:17.152Z",
"lastSyncDate": "2026-08-17T09:59:07.561Z",
"parentId": 38835599
},
"38835607": {
"id": 38835607,
"title": "开发网站/抓包",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:17.864Z",
"lastSyncDate": "2026-08-17T09:59:08.617Z",
"parentId": 38835599
},
"38835608": {
"id": 38835608,
"title": "开发网站/抓包/抓音频",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:18.566Z",
"lastSyncDate": "2026-08-17T09:59:09.773Z",
"parentId": 38835607
},
"38835609": {
"id": 38835609,
"title": "开发网站/抓包/charles",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:19.335Z",
"lastSyncDate": "2026-08-17T09:59:10.829Z",
"parentId": 38835607
},
"38835610": {
"id": 38835610,
"title": "开发网站/pdf.js",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:20.120Z",
"lastSyncDate": "2026-08-17T09:59:11.884Z",
"parentId": 38835599
},
"38835611": {
"id": 38835611,
"title": "开发网站/webplayer",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:20.884Z",
"lastSyncDate": "2026-08-17T09:59:13.501Z",
"parentId": 38835599
},
"38835612": {
"id": 38835612,
"title": "开发网站/加解密",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:22.348Z",
"lastSyncDate": "2026-08-17T09:59:14.251Z",
"parentId": 38835599
},
"38835613": {
"id": 38835613,
"title": "开发网站/cors",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:23.039Z",
"lastSyncDate": "2026-08-17T09:59:15.086Z",
"parentId": 38835599
},
"38835614": {
"id": 38835614,
"title": "开发网站/Delphi",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:24.021Z",
"lastSyncDate": "2026-08-17T09:59:16.219Z",
"parentId": 38835599
},
"38835615": {
"id": 38835615,
"title": "开发网站/APK反编译",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:24.866Z",
"lastSyncDate": "2026-08-17T09:59:17.407Z",
"parentId": 38835599
},
"38835616": {
"id": 38835616,
"title": "开源项目",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:25.623Z"
"lastSyncDate": "2026-08-17T09:59:18.474Z"
},
"38835617": {
"id": 38835617,
"title": "开源项目/siyuan",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:26.324Z",
"lastSyncDate": "2026-08-17T09:59:19.241Z",
"parentId": 38835616
},
"38835618": {
"id": 38835618,
"title": "开源项目/rustdesk",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:27.028Z",
"lastSyncDate": "2026-08-17T09:59:20.354Z",
"parentId": 38835616
},
"38835619": {
"id": 38835619,
"title": "开源项目/SiP",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:28.190Z",
"lastSyncDate": "2026-08-17T09:59:21.835Z",
"parentId": 38835616
},
"38835620": {
"id": 38835620,
"title": "开源项目/GitHub",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:28.987Z",
"lastSyncDate": "2026-08-17T09:59:22.699Z",
"parentId": 38835616
},
"38835621": {
"id": 38835621,
"title": "开源项目/GitHub/20230709",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:29.728Z",
"lastSyncDate": "2026-08-17T09:59:24.137Z",
"parentId": 38835620
},
"38835622": {
"id": 38835622,
"title": "开源项目/GitHub/aria2",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:30.513Z",
"lastSyncDate": "2026-08-17T09:59:25.583Z",
"parentId": 38835620
},
"38835624": {
"id": 38835624,
"title": "开源项目/GitHub/小白羊",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:31.719Z",
"lastSyncDate": "2026-08-17T09:59:26.755Z",
"parentId": 38835620
},
"38835625": {
"id": 38835625,
"title": "开源项目/GitHub/alist",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:32.677Z",
"lastSyncDate": "2026-08-17T09:59:27.508Z",
"parentId": 38835620
},
"38835626": {
"id": 38835626,
"title": "开源项目/GitHub/RustDesk",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:33.380Z",
"lastSyncDate": "2026-08-17T09:59:28.420Z",
"parentId": 38835620
},
"38835627": {
"id": 38835627,
"title": "开源项目/GitHub/imagine",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:34.538Z",
"lastSyncDate": "2026-08-17T09:59:29.530Z",
"parentId": 38835620
},
"38835628": {
"id": 38835628,
"title": "开源项目/GitHub/Bridge",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:35.529Z",
"lastSyncDate": "2026-08-17T09:59:30.312Z",
"parentId": 38835620
},
"38835629": {
"id": 38835629,
"title": "开源项目/OnlyOffice",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:36.542Z",
"lastSyncDate": "2026-08-17T09:59:31.408Z",
"parentId": 38835616
},
"38835630": {
"id": 38835630,
"title": "开源项目/OnlyOffice/20230809",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:37.546Z",
"lastSyncDate": "2026-08-17T09:59:32.691Z",
"parentId": 38835629
},
"38835631": {
"id": 38835631,
"title": "开源项目/日历",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:38.531Z",
"lastSyncDate": "2026-08-17T09:59:33.474Z",
"parentId": 38835616
},
"38835632": {
"id": 38835632,
"title": "开源项目/OCR",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:39.302Z",
"lastSyncDate": "2026-08-17T09:59:34.651Z",
"parentId": 38835616
},
"38835633": {
"id": 38835633,
"title": "开源项目/Bridge",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:40.064Z",
"lastSyncDate": "2026-08-17T09:59:35.677Z",
"parentId": 38835616
},
"38835636": {
"id": 38835636,
"title": "游戏网站",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:41.289Z"
"lastSyncDate": "2026-08-17T09:59:36.501Z"
},
"38835638": {
"id": 38835638,
@@ -3879,27 +3879,27 @@
"id": 38835659,
"title": "电子书",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:42.308Z"
"lastSyncDate": "2026-08-17T09:59:37.562Z"
},
"38835660": {
"id": 38835660,
"title": "电子书/电子书制作",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:43.035Z",
"lastSyncDate": "2026-08-17T09:59:38.604Z",
"parentId": 38835659
},
"38835661": {
"id": 38835661,
"title": "电子书/calibre",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:44.030Z",
"lastSyncDate": "2026-08-17T09:59:39.595Z",
"parentId": 38835659
},
"38835662": {
"id": 38835662,
"title": "电子书/20230826",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:44.787Z",
"lastSyncDate": "2026-08-17T09:59:40.719Z",
"parentId": 38835659
},
"38835663": {
@@ -3916,7 +3916,7 @@
"id": 38835665,
"title": "Favorites",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:45.529Z"
"lastSyncDate": "2026-08-17T09:59:41.502Z"
},
"38835666": {
"id": 38835666,
@@ -3934,26 +3934,26 @@
"id": 38835668,
"title": "翻译",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:46.306Z"
"lastSyncDate": "2026-08-17T09:59:42.602Z"
},
"38835669": {
"id": 38835669,
"title": "智能家居",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:47.087Z"
"lastSyncDate": "2026-08-17T09:59:43.376Z"
},
"38835670": {
"id": 38835670,
"title": "智能家居/HomeAssist",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:48.534Z",
"lastSyncDate": "2026-08-17T09:59:44.477Z",
"parentId": 38835669
},
"58561271": {
"id": 58561271,
"title": "ClipperBox",
"sync": true,
"lastSyncDate": "2026-07-29T08:22:49.275Z"
"lastSyncDate": "2026-08-17T09:59:45.324Z"
},
"-1": {
"id": -1,
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "obsidian-reminder-plugin",
"name": "Reminder",
"version": "1.3.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",
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -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/",
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -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",
+4 -4
View File
@@ -10,13 +10,13 @@
"savePassword": true,
"isDefault": true,
"lastSelectedCategories": [
15
2
],
"username": "wpAdmin",
"encryptedPassword": {
"key": "{\"alg\":\"A256GCM\",\"ext\":true,\"k\":\"zMoleceJw_wSCoAdfOMHqtQJQ4pZITh_NEFqooLqw8Y\",\"key_ops\":[\"encrypt\",\"decrypt\"],\"kty\":\"oct\"}",
"vector": "hkIfpWbZ5ayi4/Mn",
"encrypted": "5241BmtV2IX5Xwz8norL6j4SP1Ha8WKl"
"key": "{\"alg\":\"A256GCM\",\"ext\":true,\"k\":\"3t_DH2-lUOtoGVBlIt54JAXf1eLUJ25w7LC8XcmbrBI\",\"key_ops\":[\"encrypt\",\"decrypt\"],\"kty\":\"oct\"}",
"vector": "cedYkKT/5TFrWa0g",
"encrypted": "tKHl5y1erpxRxj+ETaeJ1aNoqWL/EX5r"
}
}
],
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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",
+43 -42
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "podnotes",
"name": "PodNotes",
"version": "2.20.1",
"version": "2.20.2",
"minAppVersion": "1.11.5",
"description": "Helps you write notes on podcasts.",
"author": "Christian B. B. Houmann",
+67 -14
View File
@@ -3,13 +3,17 @@
"inputPrompt": "single-line",
"persistInputPromptDrafts": true,
"useSelectionAsCaptureValue": true,
"namePastedImagesAfterNoteTitle": false,
"searchNestedChoices": true,
"templateFolderLauncherRow": "bottom",
"devMode": false,
"templateFolderPath": "",
"templateFolderPaths": [],
"announceUpdates": "all",
"version": "2.12.3",
"version": "2.27.0",
"globalVariables": {},
"onePageInputEnabled": false,
"disableOnlineFeatures": true,
"enableUriCallbacks": false,
"enableRibbonIcon": false,
"showCaptureNotification": true,
"showInputCancellationNotification": false,
@@ -56,28 +60,74 @@
"name": "gpt-4",
"maxTokens": 8192
},
{
"name": "gpt-4-32k",
"maxTokens": 32768
},
{
"name": "gpt-4-1106-preview",
"maxTokens": 128000
},
{
"name": "gpt-4-turbo",
"maxTokens": 128000
},
{
"name": "gpt-4o",
"maxTokens": 128000
"maxTokens": 128000,
"maxOutputTokens": 16384,
"supportsTemperature": true
},
{
"name": "gpt-4o-mini",
"maxTokens": 128000
"maxTokens": 128000,
"maxOutputTokens": 16384,
"supportsTemperature": true
},
{
"name": "gpt-5.5",
"maxTokens": 1050000,
"maxOutputTokens": 128000,
"supportsTemperature": false
},
{
"name": "gpt-5.4",
"maxTokens": 1050000,
"maxOutputTokens": 128000,
"supportsTemperature": false
},
{
"name": "gpt-5.4-mini",
"maxTokens": 400000,
"maxOutputTokens": 128000,
"supportsTemperature": false
},
{
"name": "gpt-5.4-nano",
"maxTokens": 400000,
"maxOutputTokens": 128000,
"supportsTemperature": false
},
{
"name": "gpt-4.1",
"maxTokens": 1047576,
"maxOutputTokens": 32768,
"supportsTemperature": true
},
{
"name": "gpt-4.1-mini",
"maxTokens": 1047576,
"maxOutputTokens": 32768,
"supportsTemperature": true
},
{
"name": "o3",
"maxTokens": 200000,
"maxOutputTokens": 100000,
"supportsTemperature": false
},
{
"name": "o4-mini",
"maxTokens": 200000,
"maxOutputTokens": 100000,
"supportsTemperature": false
}
],
"modelSource": "auto"
"modelSource": "modelsDev",
"autoSyncModels": true,
"id": "openai"
}
]
},
@@ -94,7 +144,10 @@
"backfillFileOpeningDefaults": true,
"migrateProviderApiKeysToSecretStorage": true,
"consolidateFileExistsBehavior": true,
"repairTemplateFileExistsBehavior": true
"repairTemplateFileExistsBehavior": true,
"migrateToMultipleTemplateFolders": true,
"refreshStaleDefaultModelSeeds": true,
"pinAiModelRefs": true
},
"macros": []
}
+399 -82
View File
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -1,12 +1,12 @@
{
"id": "quickadd",
"name": "QuickAdd",
"version": "2.12.3",
"minAppVersion": "1.11.4",
"version": "2.27.0",
"minAppVersion": "1.13.0",
"description": "Quickly add new pages or content to your vault.",
"author": "Christian B. B. Houmann",
"authorUrl": "https://bagerbach.com",
"fundingUrl": "https://www.buymeacoffee.com/chhoumann",
"helpUrl": "https://quickadd.obsidian.guide/docs/",
"isDesktopOnly": false
}
}
File diff suppressed because one or more lines are too long
+45 -18
View File
@@ -1,22 +1,4 @@
{
"config": {
"version": "1.0.0",
"logger": {
"level": 1,
"showTimestamp": true,
"showLevel": true,
"console": true,
"showNotifications": true,
"noticeTimeout": 5000
},
"developer": {
"enabled": false,
"enableCount": 0
},
"menu": {
"useSubMenu": true
}
},
"toolkit": {
"quickPath": {
"config": {
@@ -47,6 +29,51 @@
"data": {
"lastModified": "2025-10-26T17:18:34Z"
}
},
"folder-templates": {
"enabled": false,
"config": {
"version": 1,
"templatesFolderPath": ""
},
"data": {
"rules": []
}
},
"folder-scaffolder": {
"enabled": false,
"config": {
"version": 1
},
"data": {
"templates": []
}
},
"plugin-order": {
"enabled": false,
"config": {
"priorityPlugins": []
},
"data": {
"installedPlugins": [],
"installedPluginsCachedAt": 0
}
},
"quick-path": {
"enabled": false,
"config": {
"addEditorMenu": true,
"addFileMenu": true,
"useAbsolutePath": false,
"pathSeparator": "\n"
}
},
"plugin-filter": {
"enabled": false,
"config": {
"groups": [],
"protectedIds": []
}
}
}
}
File diff suppressed because one or more lines are too long
+13 -1
View File
@@ -1 +1,13 @@
{"id":"ravenhogwarts-toolkit","name":"RavenHogwarts's Toolkit","version":"1.4.1","minAppVersion":"1.8.0","description":"A personal toolkit plugin (OTK) that integrates various utilities, designed to enhance personal note-taking experience.","author":"RavenHogWarts","authorUrl":"https://github.com/RavenHogWarts","fundingUrl":{"微信/支付宝":"https://s2.loli.net/2024/05/06/lWBj3ObszUXSV2f.png"},"isDesktopOnly":false}
{
"id": "ravenhogwarts-toolkit",
"name": "RavenHogwarts Toolkit",
"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",
"authorUrl": "https://github.com/RavenHogWarts",
"fundingUrl": {
"ko-fi": "https://ko-fi.com/ravenhogwarts"
},
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+170 -110
View File
@@ -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"
@@ -8,137 +20,185 @@
"basename": "本地服务器重新规划",
"path": "03-工作笔记/应用部署/本地服务器重新规划.canvas"
},
{
"basename": "JoyAIO部署和使用",
"path": "JoyAIO部署和使用.md"
},
{
"basename": "NAS(群晖+飞牛)MoviePilot_TMM TMDB刮削 终极稳定技术方案",
"path": "02-学习笔记/NAS(群晖+飞牛)MoviePilot_TMM TMDB刮削 终极稳定技术方案.md"
},
{
"basename": "2026-09-26",
"path": "01-工作日记/2026-09-26.md"
},
{
"basename": "2026-09-27",
"path": "01-工作日记/2026-09-27.md"
},
{
"basename": "网盘挂载规划0.2",
"path": "03-工作笔记/AioPloto/网盘挂载规划0.2.md"
},
{
"basename": "云平台部署",
"path": "03-工作笔记/应用部署/云平台部署.md"
},
{
"basename": "2026-09-25",
"path": "01-工作日记/2026-09-25.md"
},
{
"basename": "NAS媒体刮削TMDB接口访问问题完整排查+落地文档",
"path": "02-学习笔记/NAS媒体刮削TMDB接口访问问题完整排查+落地文档.md"
},
{
"basename": "冷门视频与音频刮削美化完全指南",
"path": "03-工作笔记/应用部署/冷门视频与音频刮削美化完全指南.md"
},
{
"basename": "2026-09-22",
"path": "01-工作日记/2026-09-22.md"
},
{
"basename": "云盘Token",
"path": "03-工作笔记/应用部署/云盘Token.md"
},
{
"basename": "方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行)",
"path": "03-工作笔记/应用部署/方案:yt-dlp 批量下载喜马拉雅 RSS 播客脚本(飞牛fnOS宿主机直接运行).md"
},
{
"basename": "日志关键信息提取",
"path": "03-工作笔记/应用部署/日志关键信息提取.md"
},
{
"basename": "✅ 核心思路",
"path": "03-工作笔记/应用部署/✅ 核心思路.md"
},
{
"basename": "2026-09-21",
"path": "01-工作日记/2026-09-21.md"
},
{
"basename": "关键数据同步备份流程-v0.3",
"path": "03-工作笔记/应用部署/关键数据同步备份流程-v0.3.md"
},
{
"basename": "未命名",
"path": "未命名.md"
},
{
"basename": "数据存储规划V2.1",
"path": "03-工作笔记/应用部署/数据存储规划V2.1.md"
},
{
"basename": "2026-07-28",
"path": "01-工作日记/2026-07-28.md"
"basename": "数据存储规划V1.5",
"path": "03-工作笔记/应用部署/数据存储规划V1.5.md"
},
{
"basename": "2026-07-27",
"path": "01-工作日记/2026-07-27.md"
"basename": "数据备份方案",
"path": "03-工作笔记/数据备份方案.md"
},
{
"basename": "2026-07-26",
"path": "01-工作日记/2026-07-26.md"
"basename": "端口映射对照表",
"path": "03-工作笔记/端口映射对照表.md"
},
{
"basename": "男性“器官衰老”顺序表公布,不妨自查一下,看看进行到哪一步了",
"path": "08-Inbox/男性“器官衰老”顺序表公布,不妨自查一下,看看进行到哪一步了.md"
"basename": "联通云服务器",
"path": "03-工作笔记/联通云服务器.md"
},
{
"basename": "[原创] NAS iscsi 开机启动自动挂载_绿联nas iscsi-CSDN博客",
"path": "10-WebClipper/[原创] NAS iscsi 开机启动自动挂载_绿联nas iscsi-CSDN博客.md"
"basename": "网盘挂载规划",
"path": "03-工作笔记/AioPloto/网盘挂载规划.md"
},
{
"basename": "2026-07-24",
"path": "01-工作日记/2026-07-24.md"
"basename": "JoyVault目录树V1.1",
"path": "03-工作笔记/AioPloto/JoyVault目录树V1.1.smm"
},
{
"basename": "JoyVault目录树 1",
"path": "03-工作笔记/AioPloto/JoyVault目录树 1.smm"
},
{
"basename": "Aio-fnT平台构建笔记",
"path": "03-工作笔记/AioPloto/Aio-fnT平台构建笔记.md"
},
{
"basename": "AioPloto架构图",
"path": "03-工作笔记/AioPloto/AioPloto架构图.smm"
},
{
"basename": "网盘文件自动同步图",
"path": "03-工作笔记/应用部署/网盘文件自动同步图.md"
},
{
"basename": "客户端安装步骤",
"path": "03-工作笔记/应用部署/客户端安装步骤.md"
},
{
"basename": "视频资源处理流程",
"path": "03-工作笔记/应用部署/视频资源处理流程.canvas"
},
{
"basename": "数据备份列表",
"path": "03-工作笔记/应用部署/数据备份列表.md"
},
{
"basename": "关键数据同步备份流程-v0.2",
"path": "03-工作笔记/应用部署/关键数据同步备份流程-v0.2.md"
},
{
"basename": "应用内网穿透设计V0.4",
"path": "03-工作笔记/应用部署/应用内网穿透设计V0.4.md"
},
{
"basename": "硬盘盒分布图变更后",
"path": "03-工作笔记/应用部署/硬盘盒分布图变更后.md"
},
{
"basename": "Ting Reader(听悦) vs Audiobookshelf",
"path": "03-工作笔记/应用部署/Ting Reader(听悦) vs Audiobookshelf.md"
},
{
"basename": "自建音乐库和有声书库",
"path": "03-工作笔记/应用部署/自建音乐库和有声书库.md"
},
{
"basename": "方案2:批量脚本下载喜马拉雅专辑封面",
"path": "03-工作笔记/应用部署/方案2:批量脚本下载喜马拉雅专辑封面.md"
},
{
"basename": "小雅帐号部署表0.2",
"path": "03-工作笔记/小雅部署/小雅帐号部署表0.2.md"
},
{
"basename": "小雅帐号部署表",
"path": "03-工作笔记/小雅部署/小雅帐号部署表.md"
},
{
"basename": "小雅专题",
"path": "03-工作笔记/小雅部署/小雅专题.md"
},
{
"basename": "天园节点",
"path": "03-工作笔记/小雅部署/天园节点.md"
},
{
"basename": "东玺门节点",
"path": "03-工作笔记/小雅部署/东玺门节点.md"
},
{
"basename": "80 条消息) 群晖NAS中@eaDir文件夹的删除 - 知乎",
"path": "10-WebClipper/(99+ 封私信 /80 条消息) 群晖NAS中@eaDir文件夹的删除 - 知乎.md"
},
{
"basename": "mac电脑禁止生成 .DS_Store 文件的解决方法 - 星云惊蛰 - 博客园",
"path": "10-WebClipper/mac电脑禁止生成 .DS_Store 文件的解决方法 - 星云惊蛰 - 博客园.md"
},
{
"basename": "Syncthing部署指南:从单机到集群的完整方案",
"path": "10-WebClipper/Syncthing部署指南:从单机到集群的完整方案.md"
},
{
"basename": "恼人的.DS_Store",
"path": "04-博客发布/040-系统技术/恼人的.DS_Store.md"
},
{
"basename": "Drawing 2026-07-25 19.31.10.excalidraw",
"path": "08-Inbox/Excalidraw/Drawing 2026-07-25 19.31.10.excalidraw.md"
},
{
"basename": "女人能彻底忘掉有过亲密关系的男人吗?",
"path": "08-Inbox/女人能彻底忘掉有过亲密关系的男人吗?.md"
},
{
"basename": "在 macOS 下使用 __iSCSI__",
"path": "02-学习笔记/在 macOS 下使用 __iSCSI__.md"
},
{
"basename": "2026-07-23",
"path": "01-工作日记/2026-07-23.md"
},
{
"basename": "解决 Docker 需要 sudo 权限的问题(无需重启)",
"path": "04-博客发布/040-系统技术/解决 Docker 需要 sudo 权限的问题(无需重启).md"
},
{
"basename": "80 条消息) 解决 Docker 需要 sudo 权限的问题(无需重启) - 知乎",
"path": "10-WebClipper/(99+ 封私信 /80 条消息) 解决 Docker 需要 sudo 权限的问题(无需重启) - 知乎.md"
},
{
"basename": "【运维】Ubuntu上WebDAV挂载与自动同步完整指南_mob64ca13f446df的技术博客_51CTO博客",
"path": "10-WebClipper/【运维】Ubuntu上WebDAV挂载与自动同步完整指南_mob64ca13f446df的技术博客_51CTO博客.md"
},
{
"basename": "一文解决群晖和飞牛docker文件夹的权限相关问题(限纯网页端)_网络存储_什么值得买",
"path": "10-WebClipper/一文解决群晖和飞牛docker文件夹的权限相关问题(限纯网页端)_网络存储_什么值得买.md"
},
{
"basename": "如何解决linux下docker文件夹的权限相关问题",
"path": "04-博客发布/040-系统技术/如何解决linux下docker文件夹的权限相关问题.md"
},
{
"basename": "如何在Rootless模式下运行Docker告别sudo!无需Root权限也能玩转Docker?本文教你如何在无Root - 掘金",
"path": "10-WebClipper/如何在Rootless模式下运行Docker告别sudo!无需Root权限也能玩转Docker?本文教你如何在无Root - 掘金.md"
},
{
"basename": "Linux系统非root用户使用docker命令 - 蓝莓薄荷 - 博客园",
"path": "10-WebClipper/Linux系统非root用户使用docker命令 - 蓝莓薄荷 - 博客园.md"
},
{
"basename": "十大硬盘数据恢复软件有哪些?数据恢复软件哪个好用推荐?_数据恢复软件recovery-CSDN博客",
"path": "10-WebClipper/十大硬盘数据恢复软件有哪些?数据恢复软件哪个好用推荐?_数据恢复软件recovery-CSDN博客.md"
},
{
"basename": "Windows使用命令行 查看定时计划任务_windows查看当前定时任务-CSDN博客",
"path": "10-WebClipper/Windows使用命令行 查看定时计划任务_windows查看当前定时任务-CSDN博客.md"
},
{
"basename": "windows定时计划任务的查看、取消、启动和创建方法_windows_Windows系列_操作系统_脚本之家",
"path": "10-WebClipper/windows定时计划任务的查看、取消、启动和创建方法_windows_Windows系列_操作系统_脚本之家.md"
},
{
"basename": "处理实践 - inotify watch 耗尽 - 《Kubernetes 实践指南(Kubernetes Practice Guide)》 - 书栈网 · BookStack",
"path": "10-WebClipper/处理实践 - inotify watch 耗尽 - 《Kubernetes 实践指南(Kubernetes Practice Guide)》 - 书栈网 · BookStack.md"
},
{
"basename": "Use MCP servers in VS Code(English)",
"path": "10-WebClipper/Use MCP servers in VS Code(English).md"
},
{
"basename": "最近热火朝天的 MCP 是什么鬼?如何使用 MCP?一文给你讲清楚!",
"path": "10-WebClipper/最近热火朝天的 MCP 是什么鬼?如何使用 MCP?一文给你讲清楚!.md"
},
{
"basename": "10M…200M下载速度峰值对照表(附计算公式) - 知乎",
"path": "10-WebClipper/10M…200M下载速度峰值对照表(附计算公式) - 知乎.md"
},
{
"basename": "OpenWrt旁路由",
"path": "10-WebClipper/OpenWrt旁路由.md"
},
{
"basename": "飞牛私有云论坛 fnOS 1",
"path": "10-WebClipper/飞牛私有云论坛 fnOS 1.md"
},
{
"basename": "飞牛私有云论坛 fnOS",
"path": "10-WebClipper/飞牛私有云论坛 fnOS.md"
},
{
"basename": "Linux软件包格式全解析-RPM、DEB、AppImage有何区别?如何选择? - 大神的开源笔记",
"path": "10-WebClipper/Linux软件包格式全解析-RPM、DEB、AppImage有何区别?如何选择? - 大神的开源笔记.md"
},
{
"basename": "fs.inotify.max_user_watches默认值太小,导致too many open files_user watch files-CSDN博客",
"path": "10-WebClipper/fs.inotify.max_user_watches默认值太小,导致too many open files_user watch files-CSDN博客.md"
"basename": "以下是为您量身定制的 __长沙→沈阳→锦州→山海关→北戴河_",
"path": "08-Inbox/以下是为您量身定制的 __长沙→沈阳→锦州→山海关→北戴河_.md"
}
],
"omittedPaths": [],
File diff suppressed because one or more lines are too long
+707 -12548
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -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
View File
@@ -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;
}
+1
View File
@@ -6,6 +6,7 @@
"excelFilenamePrefix": "Excel ",
"excelFilenameDateTime": "YYYY-MM-DD HH.mm.ss",
"sheetHeight": "300",
"sheetHeightMode": "auto",
"rowHeight": "25",
"colWidth": "100",
"authorizationCode": "3b03F9MYpN6yOMGsJWhZzNrag6wLLIPT",
+497 -866
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "sheet-plus",
"name": "Sheet Plus",
"version": "2.12.11",
"version": "2.13.2",
"minAppVersion": "1.5.11",
"description": "Create Excel-like spreadsheets and easily embed them in Markdown.",
"author": "ljcoder",
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -3,9 +3,9 @@
"name": "Tag Wrangler",
"author": "PJ Eby",
"authorUrl": "https://github.com/pjeby",
"version": "0.6.4",
"minAppVersion": "1.5.8",
"description": "Rename, merge, toggle, and search tags from the tags view",
"version": "0.6.5",
"minAppVersion": "1.12.7",
"description": "Rename, merge, toggle, and search tags from the tags view; create/open tag pages, and more.",
"fundingUrl": "https://dirtsimple.org/tips/tag-wrangler",
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -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
View File
@@ -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);
}
+10 -29
View File
@@ -1,38 +1,19 @@
{
"data_version": 2,
"command_timeout": 5,
"templates_folder": "09-Templates",
"templates_pairs": [
[
"",
""
]
],
"trigger_on_file_creation": false,
"templates_pairs": [],
"trigger_on_file_creation_mode": "folder",
"auto_jump_to_cursor": false,
"enable_system_commands": false,
"jump_to_cursor_after_file_name": false,
"shell_path": "",
"user_scripts_folder": "",
"enable_folder_templates": true,
"folder_templates": [
{
"folder": "",
"template": ""
}
],
"enable_file_templates": false,
"file_templates": [
{
"regex": ".*",
"template": ""
}
],
"folder_templates": [],
"file_templates": [],
"syntax_highlighting": true,
"syntax_highlighting_mobile": false,
"enabled_templates_hotkeys": [
""
],
"startup_templates": [
""
],
"intellisense_render": 1
"enabled_templates_hotkeys": [],
"startup_templates": [],
"intellisense_render": "1",
"ignore_folders_on_creation": []
}
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -1,9 +1,9 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.20.6",
"version": "2.25.1",
"description": "Advanced templating and automation using handlebars-like syntax.",
"minAppVersion": "1.12.2",
"minAppVersion": "1.13.0",
"author": "SilentVoid",
"authorUrl": "https://github.com/SilentVoid13",
"fundingUrl": {
+10 -61
View File
@@ -1,69 +1,8 @@
.templater_search {
width: calc(100% - 20px);
}
.templater_div {
border-top: 1px solid var(--background-modifier-border);
}
.templater_div > .setting-item {
border-top: none !important;
align-self: center;
}
.templater_div > .setting-item > .setting-item-control {
justify-content: space-around;
padding: 0;
width: 100%;
}
.templater_div
> .setting-item
> .setting-item-control
> .setting-editor-extra-setting-button {
align-self: center;
}
.templater_donating {
margin: 10px;
}
.templater_title {
margin: 0;
padding: 0;
margin-top: 5px;
text-align: center;
}
.templater_template {
align-self: center;
margin-left: 5px;
margin-right: 5px;
width: 70%;
}
.templater_cmd {
margin-left: 5px;
margin-right: 5px;
font-size: 14px;
width: 100%;
}
.templater_div2 > .setting-item {
align-content: center;
justify-content: center;
}
.templater-prompt-div,
.templater-multisuggester-div {
display: flex;
}
.templater-prompt-form {
display: flex;
flex-grow: 1;
}
.templater-prompt-input,
.templater-multisuggester-input {
flex-grow: 1;
@@ -80,12 +19,22 @@ textarea.templater-prompt-input {
height: 10rem;
}
.templater-ignore-folder-modal .modal-content input[type="text"],
.templater-startup-template-modal .modal-content input[type="text"] {
width: 100%;
}
textarea.templater-prompt-input:focus {
border-color: var(--interactive-accent);
}
.templater-multisuggester-list {
margin: 1.5em 0;
.templater-multisuggester-list-item {
display: flex;
justify-content: space-between;
}
}
.cm-s-obsidian .templater-command-bg {
+9 -26
View File
@@ -478694,7 +478694,7 @@ var DEFAULT_SETTINGS = {
stable: true,
errors: {},
debug_mode: false,
silence_errors: false,
silence_errors: true,
manifest_version: "",
compatibility_module: true,
safe_mode: true,
@@ -531886,7 +531886,8 @@ var UNITADE_PLUGIN = class _UNITADE_PLUGIN extends import_obsidian12.Plugin {
const filename = file.name.split(".").splice(1);
if (isTFolder(file)) return;
if (this.settings.is_ignore) {
for (const mask of this.settings.ignore_masks.split(">")) {
const ignore_masks = this.settings.ignore_masks ? this.settings.ignore_masks.split(">").map((s) => s.trim()).filter((s) => s.length > 0) : [];
for (const mask of ignore_masks) {
const _mask = mask.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
try {
const regex = new RegExp(_mask);
@@ -531894,11 +531895,7 @@ var UNITADE_PLUGIN = class _UNITADE_PLUGIN extends import_obsidian12.Plugin {
return;
}
} catch (error) {
if (!this.settings.silence_errors) {
console.error(error);
} else {
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${error}`);
}
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${error}`);
}
}
}
@@ -532106,12 +532103,7 @@ var UNITADE_PLUGIN = class _UNITADE_PLUGIN extends import_obsidian12.Plugin {
try {
this.registerExtensions([".md"], "markdown");
} catch (err) {
if (!this.settings.silence_errors) {
new Notification(this.locale.getLocaleItem("ERROR_COMMON_MESSAGE")[0], { body: err });
console.error(err);
} else {
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${err}`);
}
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${err}`);
this.settings.errors["markdown_override"] = formatString(this.locale.getLocaleItem("ERROR_REGISTRY_EXTENSION")[3], err);
}
for (const key in import_codemirror2.default.modes) {
@@ -532295,8 +532287,9 @@ var UNITADE_PLUGIN = class _UNITADE_PLUGIN extends import_obsidian12.Plugin {
if (!this.settings.code_editor_settings.enabled || !this.settings.code_editor_settings.use_default_extensions) {
this.__applyCfg(defaultExtensions, "markdown");
}
const forced_extensions = this.settings.forced_extensions.split(">").map((s) => s.trim());
const forced_extensions = this.settings.forced_extensions ? this.settings.forced_extensions.split(">").map((s) => s.trim()).filter((s) => s.length > 0) : [];
for (const extension of forced_extensions) {
if (!extension) continue;
try {
this.registerView(extension, (leaf) => {
return new UNITADE_VIEW(leaf, extension);
@@ -532338,12 +532331,7 @@ var UNITADE_PLUGIN = class _UNITADE_PLUGIN extends import_obsidian12.Plugin {
} else {
_msg = formatString(this.locale.getLocaleItem("ERROR_REGISTRY_EXTENSION")[1], filetype, view, err);
}
if (!this.settings.silence_errors) {
new Notification(this.locale.getLocaleItem("ERROR_COMMON_MESSAGE")[0], { body: _msg });
console.error(_msg);
} else {
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${_msg}`);
}
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${_msg}`);
this._settings.errors[filetype] = _msg;
}
}
@@ -532405,12 +532393,7 @@ var UNITADE_PLUGIN = class _UNITADE_PLUGIN extends import_obsidian12.Plugin {
} catch (err) {
const _msg = formatString(this.locale.getLocaleItem("ERROR_REGISTRY_EXTENSION")[2], extension);
this.settings.errors[extension] = _msg;
if (!this.settings.silence_errors) {
new Notification(this.locale.getLocaleItem("ERROR_COMMON_MESSAGE")[0], { body: _msg });
console.error(_msg);
} else {
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${_msg}`);
}
console.warn(`[UNITADE-ERROR]: ERROR IS SILENCED, ERROR: ${_msg}`);
}
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "unitade",
"name": "UNITADE.md",
"version": "3.2.7",
"version": "3.2.8",
"minAppVersion": "1.0.0",
"description": "Effortlessly treat any file extension as note, organize diverse file formats in your vault and take advancements in control of extension system even with custom modals.",
"author": "Falcion",
+12 -1
View File
@@ -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
View File
@@ -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",

Some files were not shown because too many files have changed in this diff Show More