diff --git a/.obsidian/app.json b/.obsidian/app.json index f6843da..d222747 100644 --- a/.obsidian/app.json +++ b/.obsidian/app.json @@ -1,3 +1,10 @@ { - "spellcheck": true + "spellcheck": true, + "attachmentFolderPath": "./PJ", + "newFileLocation": "folder", + "newFileFolderPath": "inbox", + "userIgnoreFilters": [ + "inbox/" + ], + "alwaysUpdateLinks": true } \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index 9e26dfe..ebcac17 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1 +1,15 @@ -{} \ No newline at end of file +{ + "enabledCssSnippets": [ + "case_coche", + "citations", + "code_inline", + "lien_extern", + "lien_intern", + "listes_puces", + "multi_line_code", + "picture", + "table_dark_mode", + "tags", + "title_colors" + ] +} \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json new file mode 100644 index 0000000..298c6d0 --- /dev/null +++ b/.obsidian/community-plugins.json @@ -0,0 +1,11 @@ +[ + "editing-toolbar", + "obsidian-auto-link-title", + "table-editor-obsidian", + "obsidian-table-generator", + "obsidian-tasks-plugin", + "obsidian-markdown-formatting-assistant-plugin", + "obsidian-shellcommands", + "templater-obsidian", + "buttons" +] \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json index b977c25..a48bea8 100644 --- a/.obsidian/core-plugins.json +++ b/.obsidian/core-plugins.json @@ -23,7 +23,7 @@ "word-count": true, "slides": false, "audio-recorder": false, - "workspaces": false, + "workspaces": true, "file-recovery": true, "publish": false, "sync": true, diff --git a/.obsidian/graph.json b/.obsidian/graph.json index 42a46ec..94e2be4 100644 --- a/.obsidian/graph.json +++ b/.obsidian/graph.json @@ -1,14 +1,50 @@ { - "collapse-filter": true, + "collapse-filter": false, "search": "", "showTags": false, "showAttachments": false, "hideUnresolved": false, "showOrphans": true, "collapse-color-groups": true, - "colorGroups": [], + "colorGroups": [ + { + "query": "path:Obsidian ", + "color": { + "a": 1, + "rgb": 14701138 + } + }, + { + "query": "path:Stage ", + "color": { + "a": 1, + "rgb": 14725458 + } + }, + { + "query": "path:ollama ", + "color": { + "a": 1, + "rgb": 11657298 + } + }, + { + "query": "path:\"Serveur perso\" ", + "color": { + "a": 1, + "rgb": 5399264 + } + }, + { + "query": "path:command_list ", + "color": { + "a": 1, + "rgb": 8091799 + } + } + ], "collapse-display": true, - "showArrow": false, + "showArrow": true, "textFadeMultiplier": 0, "nodeSizeMultiplier": 1, "lineSizeMultiplier": 1, @@ -17,6 +53,6 @@ "repelStrength": 10, "linkStrength": 1, "linkDistance": 250, - "scale": 1, + "scale": 1.0000000000000056, "close": true } \ No newline at end of file diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json new file mode 100644 index 0000000..328cc2e --- /dev/null +++ b/.obsidian/hotkeys.json @@ -0,0 +1,65 @@ +{ + "editor:toggle-spellcheck": [ + { + "modifiers": [ + "Mod" + ], + "key": "V" + } + ], + "editor:unfold-all": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "D" + } + ], + "editor:fold-all": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "P" + } + ], + "editor:fold-less": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "+" + } + ], + "editor:fold-more": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "-" + } + ], + "table-editor-obsidian:table-control-bar": [], + "editor:swap-line-down": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "ArrowDown" + } + ], + "editor:swap-line-up": [ + { + "modifiers": [ + "Mod", + "Shift" + ], + "key": "ArrowUp" + } + ] +} \ No newline at end of file diff --git a/.obsidian/plugins/buttons/main.js b/.obsidian/plugins/buttons/main.js new file mode 100644 index 0000000..23bd0f2 --- /dev/null +++ b/.obsidian/plugins/buttons/main.js @@ -0,0 +1,4385 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ROLLUP +if you want to view the source visit the plugins github repository +*/ + +'use strict'; + +var obsidian = require('obsidian'); + +let buttonStore; +const getStore = (isMobile) => isMobile ? buttonStore : JSON.parse(localStorage.getItem("buttons")); +const initializeButtonStore = (app, storeEvents) => { + const files = app.vault.getMarkdownFiles(); + const blocksArr = files + .map((file) => { + const cache = app.metadataCache.getFileCache(file); + return buildButtonArray(cache, file); + }) + .filter((arr) => arr !== undefined) + .flat(); + localStorage.setItem("buttons", JSON.stringify(blocksArr)); + buttonStore = blocksArr; + storeEvents.trigger('index-complete'); +}; +const addButtonToStore = (app, file) => { + const cache = app.metadataCache.getFileCache(file); + const buttons = buildButtonArray(cache, file); + const store = getStore(app.isMobile); + const newStore = buttons && store + ? removeDuplicates([...buttons, ...store]) + : store + ? removeDuplicates(store) + : buttons + ? removeDuplicates(buttons) + : []; + localStorage.setItem("buttons", JSON.stringify(newStore)); + buttonStore = newStore; +}; +const getButtonFromStore = async (app, args) => { + const store = getStore(app.isMobile); + args.id; + if (args.id) { + const storedButton = store && + store.filter((item) => `button-${args.id}` === item.id)[0]; + if (storedButton) { + const file = app.vault.getAbstractFileByPath(storedButton.path); + const content = await app.vault.cachedRead(file); + const contentArray = content.split("\n"); + const button = contentArray + .slice(storedButton.position.start.line + 1, storedButton.position.end.line) + .join("\n"); + const storedArgs = createArgumentObject(button); + return { + args: { ...storedArgs, ...args }, + id: storedButton.id.split("button-")[1], + }; + } + } +}; +const getButtonById = async (app, id) => { + const store = getStore(app.isMobile); + const storedButton = store.filter((item) => `button-${id}` === item.id)[0]; + if (storedButton) { + const file = app.vault.getAbstractFileByPath(storedButton.path); + const content = await app.vault.cachedRead(file); + const contentArray = content.split("\n"); + const button = contentArray + .slice(storedButton.position.start.line + 1, storedButton.position.end.line) + .join("\n"); + return createArgumentObject(button); + } +}; +const getButtonSwapById = async (app, id) => { + const store = getStore(app.isMobile); + const storedButton = store.filter((item) => `button-${id}` === item.id)[0]; + if (storedButton) { + return storedButton.swap; + } +}; +const setButtonSwapById = async (app, id, newSwap) => { + const store = getStore(app.isMobile); + const storedButton = store.filter((item) => `button-${id}` === item.id)[0]; + if (storedButton) { + storedButton.swap = newSwap; + const newStore = removeDuplicates([...store, storedButton]); + localStorage.setItem("buttons", JSON.stringify(newStore)); + buttonStore = newStore; + } +}; +const buildButtonArray = (cache, file) => { + const blocks = cache && cache.blocks; + if (blocks) { + const blockKeys = Array.from(Object.keys(blocks)); + const blockArray = blockKeys + .map((key) => blocks[key]) + .map((obj) => { + obj["path"] = file.path; + obj["swap"] = 0; + return obj; + }) + .filter((block) => block.id.includes("button")); + return blockArray; + } +}; +function removeDuplicates(arr) { + return arr && arr[0] + ? arr.filter((v, i, a) => a.findIndex((t) => t.id === v.id || + (t.path === v.path && + t.position.start.line === v.position.start.line && + t.position.end.line === v.position.end.line)) === i) + : arr; +} + +function nanoid(num) { + let result = ""; + const characters = "abcdefghijklmnopqrstuvwxyz0123456789"; + const charactersLength = characters.length; + for (let i = 0; i < num; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} +const insertButton = (app, outputObject) => { + const buttonArr = []; + buttonArr.push("```button"); + outputObject.name && buttonArr.push(`name ${outputObject.name}`); + outputObject.type && buttonArr.push(`type ${outputObject.type}`); + outputObject.action && buttonArr.push(`action ${outputObject.action}`); + outputObject.id && buttonArr.push(`id ${outputObject.id}`); + outputObject.swap && buttonArr.push(`swap ${outputObject.swap}`); + outputObject.remove && buttonArr.push(`remove ${outputObject.remove}`); + outputObject.replace && buttonArr.push(`replace ${outputObject.replace}`); + outputObject.templater === true && + buttonArr.push(`templater ${outputObject.templater}`); + outputObject.color && buttonArr.push(`color ${outputObject.color}`); + outputObject.customColor && buttonArr.push(`customColor ${outputObject.customColor}`); + outputObject.customTextColor && buttonArr.push(`customTextColor ${outputObject.customTextColor}`); + outputObject.class && buttonArr.push(`class ${outputObject.class}`); + outputObject.folder && buttonArr.push(`folder ${outputObject.folder}`); + outputObject.folder && buttonArr.push(`prompt ${outputObject.prompt}`); + buttonArr.push("```"); + outputObject.blockId + ? buttonArr.push(`^button-${outputObject.blockId}`) + : buttonArr.push(`^button-${nanoid(4)}`); + const page = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + const editor = page.editor; + editor.replaceSelection(buttonArr.join("\n")); + addButtonToStore(app, page.file); +}; +const insertInlineButton = (app, id) => { + const page = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + const editor = page.editor; + editor.replaceSelection(`\`button-${id}\``); +}; +const createArgumentObject = (source) => source.split("\n").reduce((acc, i) => { + const split = i.split(" "); + const key = split[0].toLowerCase(); + acc[key] = split + .filter((item) => item !== split[0]) + .join(" ") + .trim(); + return acc; +}, {}); +const createContentArray = async (app) => { + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + if (activeView) { + const file = activeView.file; + const content = await app.vault.read(file); + return { contentArray: content.split("\n"), file }; + } + new obsidian.Notice("Could not get Active View", 1000); + console.error("could not get active view"); +}; +const handleValueArray = (value, callback) => { + if (value.includes("[") && value.includes("]")) { + const args = value.match(/\[(.*)\]/); + if (args[1]) { + const argArray = args[1].split(/,\s?/); + if (argArray[0]) { + callback(argArray); + } + } + } +}; +async function getNewArgs(app, position) { + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + const newContent = await app.vault + .cachedRead(activeView.file) + .then((content) => content.split("\n")); + const newButton = newContent + .splice(position.lineStart, position.lineEnd - position.lineStart) + .join("\n") + .replace("```button", "") + .replace("```", ""); + return { args: createArgumentObject(newButton) }; +} +const wrapAround = (value, size) => { + return ((value % size) + size) % size; +}; + +const buttonEventListener = (app, callback) => { + return app.metadataCache.on("changed", (file) => { + callback(app, file); + }); +}; +const openFileListener = (app, storeEvents, callback) => { + return app.workspace.on("file-open", () => { + callback(app, storeEvents); + }); +}; + +var Mexp = function (parsed) { + this.value = parsed; +}; + +Mexp.math = { + isDegree: true, // mode of calculator + acos: function (x) { + return (Mexp.math.isDegree ? 180 / Math.PI * Math.acos(x) : Math.acos(x)) + }, + add: function (a, b) { + return a + b + }, + asin: function (x) { + return (Mexp.math.isDegree ? 180 / Math.PI * Math.asin(x) : Math.asin(x)) + }, + atan: function (x) { + return (Mexp.math.isDegree ? 180 / Math.PI * Math.atan(x) : Math.atan(x)) + }, + acosh: function (x) { + return Math.log(x + Math.sqrt(x * x - 1)) + }, + asinh: function (x) { + return Math.log(x + Math.sqrt(x * x + 1)) + }, + atanh: function (x) { + return Math.log((1 + x) / (1 - x)) + }, + C: function (n, r) { + var pro = 1; + var other = n - r; + var choice = r; + if (choice < other) { + choice = other; + other = r; + } + for (var i = choice + 1; i <= n; i++) { + pro *= i; + } + return pro / Mexp.math.fact(other) + }, + changeSign: function (x) { + return -x + }, + cos: function (x) { + if (Mexp.math.isDegree) x = Mexp.math.toRadian(x); + return Math.cos(x) + }, + cosh: function (x) { + return (Math.pow(Math.E, x) + Math.pow(Math.E, -1 * x)) / 2 + }, + div: function (a, b) { + return a / b + }, + fact: function (n) { + if (n % 1 !== 0) return 'NaN' + var pro = 1; + for (var i = 2; i <= n; i++) { + pro *= i; + } + return pro + }, + inverse: function (x) { + return 1 / x + }, + log: function (i) { + return Math.log(i) / Math.log(10) + }, + mod: function (a, b) { + return a % b + }, + mul: function (a, b) { + return a * b + }, + P: function (n, r) { + var pro = 1; + for (var i = Math.floor(n) - Math.floor(r) + 1; i <= Math.floor(n); i++) { + pro *= i; + } + return pro + }, + Pi: function (low, high, ex) { + var pro = 1; + for (var i = low; i <= high; i++) { + pro *= Number(ex.postfixEval({ + n: i + })); + } + return pro + }, + pow10x: function (e) { + var x = 1; + while (e--) { + x *= 10; + } + return x + }, + sigma: function (low, high, ex) { + var sum = 0; + for (var i = low; i <= high; i++) { + sum += Number(ex.postfixEval({ + n: i + })); + } + return sum + }, + sin: function (x) { + if (Mexp.math.isDegree) x = Mexp.math.toRadian(x); + return Math.sin(x) + }, + sinh: function (x) { + return (Math.pow(Math.E, x) - Math.pow(Math.E, -1 * x)) / 2 + }, + sub: function (a, b) { + return a - b + }, + tan: function (x) { + if (Mexp.math.isDegree) x = Mexp.math.toRadian(x); + return Math.tan(x) + }, + tanh: function (x) { + return Mexp.sinha(x) / Mexp.cosha(x) + }, + toRadian: function (x) { + return x * Math.PI / 180 + } +}; +Mexp.Exception = function (message) { + this.message = message; +}; +var math_function = Mexp; + +function inc(arr, val) { + for (var i = 0; i < arr.length; i++) { + arr[i] += val; + } + return arr +} +var token = ['sin', 'cos', 'tan', 'pi', '(', ')', 'P', 'C', ' ', + 'asin', 'acos', 'atan', '7', '8', '9', 'int', + 'cosh', 'acosh', 'ln', '^', 'root', '4', '5', '6', '/', '!', + 'tanh', 'atanh', 'Mod', '1', '2', '3', '*', + 'sinh', 'asinh', 'e', 'log', '0', '.', '+', '-', ',', 'Sigma', 'n', 'Pi', 'pow']; +var show = ['sin', 'cos', 'tan', 'π', '(', ')', 'P', 'C', ' ', + 'asin', 'acos', 'atan', '7', '8', '9', 'Int', + 'cosh', 'acosh', ' ln', '^', 'root', '4', '5', '6', '÷', '!', + 'tanh', 'atanh', ' Mod ', '1', '2', '3', '×', + 'sinh', 'asinh', 'e', ' log', '0', '.', '+', '-', ',', 'Σ', 'n', 'Π', 'pow']; +var eva = [math_function.math.sin, math_function.math.cos, math_function.math.tan, 'PI', '(', ')', math_function.math.P, math_function.math.C, ' '.anchor, +math_function.math.asin, math_function.math.acos, math_function.math.atan, '7', '8', '9', Math.floor, +math_function.math.cosh, math_function.math.acosh, Math.log, Math.pow, Math.sqrt, '4', '5', '6', math_function.math.div, math_function.math.fact, +math_function.math.tanh, math_function.math.atanh, math_function.math.mod, '1', '2', '3', math_function.math.mul, +math_function.math.sinh, math_function.math.asinh, 'E', math_function.math.log, '0', '.', math_function.math.add, math_function.math.sub, ',', math_function.math.sigma, 'n', math_function.math.Pi, Math.pow]; +var preced = { + 0: 11, + 1: 0, + 2: 3, + 3: 0, + 4: 0, + 5: 0, + 6: 0, + 7: 11, + 8: 11, + 9: 1, + 10: 10, + 11: 0, + 12: 11, + 13: 0, + 14: -1 // will be filtered after lexer +}; // stores precedence by types +var type = [0, 0, 0, 3, 4, 5, 10, 10, 14, + 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 10, 0, 1, 1, 1, 2, 7, + 0, 0, 2, 1, 1, 1, 2, + 0, 0, 3, 0, 1, 6, 9, 9, 11, 12, 13, 12, 8]; +/* +0 : function with syntax function_name(Maths_exp) +1 : numbers +2 : binary operators like * / Mod left associate and same precedence +3 : Math constant values like e,pi,Cruncher ans +4 : opening bracket +5 : closing bracket +6 : decimal +7 : function with syntax (Math_exp)function_name +8: function with syntax function_name(Math_exp1,Math_exp2) +9 : binary operator like +,- +10: binary operator like P C or ^ +11: , +12: function with , seperated three parameters and third parameter is a string that will be mexp string +13: variable of Sigma function +*/ +var type0 = { + 0: true, + 1: true, + 3: true, + 4: true, + 6: true, + 8: true, + 9: true, + 12: true, + 13: true, + 14: true +}; // type2:true,type4:true,type9:true,type11:true,type21:true,type22 +var type1 = { + 0: true, + 1: true, + 2: true, + 3: true, + 4: true, + 5: true, + 6: true, + 7: true, + 8: true, + 9: true, + 10: true, + 11: true, + 12: true, + 13: true +}; // type3:true,type5:true,type7:true,type23 +var type1Asterick = { + 0: true, + 3: true, + 4: true, + 8: true, + 12: true, + 13: true +}; +var empty = {}; +var type3Asterick = { + 0: true, + 1: true, + 3: true, + 4: true, + 6: true, + 8: true, + 12: true, + 13: true +}; // type_5:true,type_7:true,type_23 +var type6 = { + 1: true +}; +var newAr = [ + [], + ['1', '2', '3', '7', '8', '9', '4', '5', '6', '+', '-', '*', '/', '(', ')', '^', '!', 'P', 'C', 'e', '0', '.', ',', 'n', ' '], + ['pi', 'ln', 'Pi'], + ['sin', 'cos', 'tan', 'Del', 'int', 'Mod', 'log', 'pow'], + ['asin', 'acos', 'atan', 'cosh', 'root', 'tanh', 'sinh'], + ['acosh', 'atanh', 'asinh', 'Sigma'] +]; + +function match(str1, str2, i, x) { + for (var f = 0; f < x; f++) { + if (str1[i + f] !== str2[f]) { + return false + } + } + return true +} +math_function.addToken = function (tokens) { + for (var i = 0; i < tokens.length; i++) { + var x = tokens[i].token.length; + var temp = -1; + + // newAr is a specially designed data structure index of 1d array = length of tokens + newAr[x] = newAr[x] || []; + for (var y = 0; y < newAr[x].length; y++) { + if (tokens[i].token === newAr[x][y]) { + temp = token.indexOf(newAr[x][y]); + break + } + } + if (temp === -1) { + token.push(tokens[i].token); + type.push(tokens[i].type); + if (newAr.length <= tokens[i].token.length) { + newAr[tokens[i].token.length] = []; + } + newAr[tokens[i].token.length].push(tokens[i].token); + eva.push(tokens[i].value); + show.push(tokens[i].show); + } else { // overwrite + token[temp] = tokens[i].token; + type[temp] = tokens[i].type; + eva[temp] = tokens[i].value; + show[temp] = tokens[i].show; + } + } +}; + +function tokenize(string) { + var nodes = []; + var length = string.length; + var key, x, y; + for (var i = 0; i < length; i++) { + if (i < length - 1 && string[i] === ' ' && string[i + 1] === ' ') { + continue + } + key = ''; + for (x = (string.length - i > (newAr.length - 2) ? newAr.length - 1 : string.length - i); x > 0; x--) { + if (newAr[x] === undefined) continue; + for (y = 0; y < newAr[x].length; y++) { + if (match(string, newAr[x][y], i, x)) { + key = newAr[x][y]; + y = newAr[x].length; + x = 0; + } + } + } + i += key.length - 1; + if (key === '') { + throw (new math_function.Exception('Can\'t understand after ' + string.slice(i))) + } + var index = token.indexOf(key); + nodes.push({ + index: index, + token: key, + type: type[index], + eval: eva[index], + precedence: preced[type[index]], + show: show[index] + }); + } + return nodes; +} + +math_function.lex = function (inp, tokens) { + + + var changeSignObj = { + value: math_function.math.changeSign, + type: 0, + pre: 21, + show: '-' + }; + var closingParObj = { + value: ')', + show: ')', + type: 5, + pre: 0 + }; + var openingParObj = { + value: '(', + type: 4, + pre: 0, + show: '(' + }; + var str = [openingParObj]; + + var ptc = []; // Parenthesis to close at the beginning is after one token + var inpStr = inp; + var allowed = type0; + var bracToClose = 0; + var asterick = empty; + var prevKey = ''; + var i; + if (typeof tokens !== 'undefined') { + math_function.addToken(tokens); + } + var obj = {}; + var nodes = tokenize(inpStr); + for (i = 0; i < nodes.length; i++) { + var node = nodes[i]; + if (node.type === 14) { + if (i > 0 && + i < nodes.length - 1 && + nodes[i + 1].type === 1 && + (nodes[i - 1].type === 1 || nodes[i - 1].type === 6)) + throw new math_function.Exception('Unexpected Space') + continue + } + + node.index; + var cToken = node.token; + var cType = node.type; + var cEv = node.eval; + var cPre = node.precedence; + var cShow = node.show; + var pre = str[str.length - 1]; + var j; + for (j = ptc.length; j--;) { // loop over ptc + if (ptc[j] === 0) { + if ([0, 2, 3, 4, 5, 9, 11, 12, 13].indexOf(cType) !== -1) { + if (allowed[cType] !== true) { + console.log(inp, node, nodes, allowed); + throw (new math_function.Exception(cToken + ' is not allowed after ' + prevKey)) + } + str.push(closingParObj); + allowed = type1; + asterick = type3Asterick; + inc(ptc, -1).pop(); + } + } else break + } + if (allowed[cType] !== true) { + throw (new math_function.Exception(cToken + ' is not allowed after ' + prevKey)) + } + if (asterick[cType] === true) { + cType = 2; + cEv = math_function.math.mul; + cShow = '×'; + cPre = 3; + i = i - cToken.length; + } + obj = { + value: cEv, + type: cType, + pre: cPre, + show: cShow + }; + if (cType === 0) { + allowed = type0; + asterick = empty; + inc(ptc, 2).push(2); + str.push(obj); + str.push(openingParObj); + } else if (cType === 1) { + if (pre.type === 1) { + pre.value += cEv; + inc(ptc, 1); + } else { + str.push(obj); + } + allowed = type1; + asterick = type1Asterick; + } else if (cType === 2) { + allowed = type0; + asterick = empty; + inc(ptc, 2); + str.push(obj); + } else if (cType === 3) { // constant + str.push(obj); + allowed = type1; + asterick = type3Asterick; + } else if (cType === 4) { + inc(ptc, 1); + bracToClose++; + allowed = type0; + asterick = empty; + str.push(obj); + } else if (cType === 5) { + if (!bracToClose) { + throw (new math_function.Exception('Closing parenthesis are more than opening one, wait What!!!')) + } + bracToClose--; + allowed = type1; + asterick = type3Asterick; + str.push(obj); + inc(ptc, 1); + } else if (cType === 6) { + if (pre.hasDec) { + throw (new math_function.Exception('Two decimals are not allowed in one number')) + } + if (pre.type !== 1) { + pre = { + value: 0, + type: 1, + pre: 0 + }; // pre needs to be changed as it will the last value now to be safe in later code + str.push(pre); + inc(ptc, -1); + } + allowed = type6; + inc(ptc, 1); + asterick = empty; + pre.value += cEv; + pre.hasDec = true; + } else if (cType === 7) { + allowed = type1; + asterick = type3Asterick; + inc(ptc, 1); + str.push(obj); + } + if (cType === 8) { + allowed = type0; + asterick = empty; + inc(ptc, 4).push(4); + str.push(obj); + str.push(openingParObj); + } else if (cType === 9) { + if (pre.type === 9) { + if (pre.value === math_function.math.add) { + pre.value = cEv; + pre.show = cShow; + inc(ptc, 1); + } else if (pre.value === math_function.math.sub && cShow === '-') { + pre.value = math_function.math.add; + pre.show = '+'; + inc(ptc, 1); + } + } else if (pre.type !== 5 && pre.type !== 7 && pre.type !== 1 && pre.type !== 3 && pre.type !== 13) { // changesign only when negative is found + if (cToken === '-') { // do nothing for + token + // don't add with the above if statement as that will run the else statement of parent if on Ctoken + + allowed = type0; + asterick = empty; + inc(ptc, 2).push(2); + str.push(changeSignObj); + str.push(openingParObj); + } + } else { + str.push(obj); + inc(ptc, 2); + } + allowed = type0; + asterick = empty; + } else if (cType === 10) { + allowed = type0; + asterick = empty; + inc(ptc, 2); + str.push(obj); + } else if (cType === 11) { + allowed = type0; + asterick = empty; + str.push(obj); + } else if (cType === 12) { + allowed = type0; + asterick = empty; + inc(ptc, 6).push(6); + str.push(obj); + str.push(openingParObj); + } else if (cType === 13) { + allowed = type1; + asterick = type3Asterick; + str.push(obj); + } + inc(ptc, -1); + prevKey = cToken; + } + for (j = ptc.length; j--;) { // loop over ptc + if (ptc[j] === 0) { + str.push(closingParObj); + inc(ptc, -1).pop(); + } else break // if it is not zero so before ptc also cant be zero + } + if (allowed[5] !== true) { + throw (new math_function.Exception('complete the expression')) + } + while (bracToClose--) { + str.push(closingParObj); + } + + str.push(closingParObj); + // console.log(str); + return new math_function(str) +}; +var lexer = math_function; + +lexer.prototype.toPostfix = function () { + var post = [], elem, popped, prep, pre, ele; + var stack = [{ value: "(", type: 4, pre: 0 }]; + var arr = this.value; + for (var i = 1; i < arr.length; i++) { + if (arr[i].type === 1 || arr[i].type === 3 || arr[i].type === 13) { //if token is number,constant,or n(which is also a special constant in our case) + if (arr[i].type === 1) + arr[i].value = Number(arr[i].value); + post.push(arr[i]); + } + else if (arr[i].type === 4) { + stack.push(arr[i]); + } + else if (arr[i].type === 5) { + while ((popped = stack.pop()).type !== 4) { + post.push(popped); + } + } + else if (arr[i].type === 11) { + while ((popped = stack.pop()).type !== 4) { + post.push(popped); + } + stack.push(popped); + } + else { + elem = arr[i]; + pre = elem.pre; + ele = stack[stack.length - 1]; + prep = ele.pre; + var flag = ele.value == 'Math.pow' && elem.value == 'Math.pow'; + if (pre > prep) stack.push(elem); + else { + while (prep >= pre && !flag || flag && pre < prep) { + popped = stack.pop(); + ele = stack[stack.length - 1]; + post.push(popped); + prep = ele.pre; + flag = elem.value == 'Math.pow' && ele.value == 'Math.pow'; + } + stack.push(elem); + } + } + } + return new lexer(post); +}; +var postfix = lexer; + +postfix.prototype.postfixEval = function (UserDefined) { + UserDefined=UserDefined||{}; + UserDefined.PI=Math.PI; + UserDefined.E=Math.E; + var stack=[],pop1,pop2,pop3; + var arr=this.value; + var bool=(typeof UserDefined.n!=="undefined"); + for(var i=0;i1) { + throw(new postfix.Exception("Uncaught Syntax error")); + } + return stack[0].value>1000000000000000?"Infinity":parseFloat(stack[0].value.toFixed(15)); +}; +postfix.eval=function(str,tokens,obj){ + if (typeof tokens==="undefined") { + return this.lex(str).toPostfix().postfixEval(); + } + else if (typeof obj==="undefined") { + if (typeof tokens.length!=="undefined") + return this.lex(str,tokens).toPostfix().postfixEval(); + else + return this.lex(str).toPostfix().postfixEval(tokens); + } + else + return this.lex(str,tokens).toPostfix().postfixEval(obj); +}; +var postfix_evaluator=postfix; + +postfix_evaluator.prototype.formulaEval = function () { + var pop1,pop2,pop3; + var disp=[]; + var arr=this.value; + for(var i=0;i"+pop2.value+""+arr[i].show+""+pop1.value+"",type:10}); + else disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+""+pop1.value+"",type:1}); + } + else if(arr[i].type===2||arr[i].type===9){ + pop1=disp.pop(); + pop2=disp.pop(); + disp.push({value:(pop2.type!=1?"(":"")+pop2.value+(pop2.type!=1?")":"")+arr[i].show+(pop1.type!=1?"(":"")+pop1.value+(pop1.type!=1?")":""),type:arr[i].type}); + } + else if(arr[i].type===12){ + pop1=disp.pop(); + pop2=disp.pop(); + pop3=disp.pop(); + disp.push({value:arr[i].show+"("+pop3.value+","+pop2.value+","+pop1.value+")",type:12}); + } + } + return disp[0].value; +}; +var formula_evaluator=postfix_evaluator; + +class nameModal extends obsidian.Modal { + constructor(app, onSubmit, defaultName) { + super(app); + this.onSubmit = onSubmit; + this.defaultName = defaultName; + } + onOpen() { + const { contentEl } = this; + contentEl.createEl("h1", { text: "Name of new note" }); + new obsidian.Setting(contentEl).setName("Name").addText((text) => { + text.setPlaceholder(this.defaultName); + text.onChange((value) => { + this.result = value; + }); + }); + new obsidian.Setting(contentEl).addButton((btn) => btn + .setButtonText("Create Note") + .setCta() + .onClick(() => { + this.close(); + this.onSubmit(this.result); + })); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} + +async function templater$1(template, target) { + const config = { + template_file: template, + active_file: app.workspace.getActiveFile(), + target_file: target, + run_mode: "DynamicProcessor", + }; + const plugins = app.plugins.plugins; + const exists = plugins["templater-obsidian"]; + if (!exists) { + new obsidian.Notice("Templater is not installed. Please install it."); + return; + } + // eslint-disable-next-line + // @ts-ignore + const { templater } = plugins["templater-obsidian"]; + const functions = await templater.functions_generator.internal_functions.generate_object(config); + functions.user = {}; + const userScriptFunctions = await templater.functions_generator.user_functions + .user_script_functions.generate_user_script_functions(config); + userScriptFunctions.forEach((value, key) => { + functions.user[key] = value; + }); + if (template) { + const userSystemFunctions = await templater.functions_generator + .user_functions.user_system_functions.generate_system_functions(config); + userSystemFunctions.forEach((value, key) => { + functions.user[key] = value; + }); + } + return async (command) => { + return await templater.parser.parse_commands(command, functions); + }; +} +async function processTemplate(file) { + try { + const content = await app.vault.read(file); + const runTemplater = await templater$1(file, file); + if (runTemplater) { + const processed = await runTemplater(content); + return processed; + } + } + catch (e) { + new obsidian.Notice(`There was an error processing the template!`, 2000); + } +} + +const removeButton = async (app, remove, lineStart, lineEnd) => { + const { contentArray, file } = await createContentArray(app); + const store = getStore(app.isMobile); + if (remove === "true") { + const numberOfItems = lineEnd - lineStart; + contentArray.splice(lineStart, numberOfItems + 1); + if (contentArray[lineStart] && + contentArray[lineStart].includes("^button-")) { + contentArray.splice(lineStart, 1); + } + const content = contentArray.join("\n"); + await app.vault.modify(file, content); + } + if (lineStart === lineEnd) { + contentArray.splice(lineStart, 1); + const content = contentArray.join("\n"); + await app.vault.modify(file, content); + } + else { + handleValueArray(remove, async (argArray) => { + const buttons = store && + store.filter((item) => { + let exists; + argArray.forEach((arg) => { + if (item.id === `button-${arg}` && item.path === file.path) { + exists = true; + } + }); + return exists; + }); + if (buttons[0]) { + let offset = 0; + buttons.forEach((button) => { + const start = button.position.start.line - offset; + const numLines = button.position.end.line - + button.position.start.line; + contentArray.splice(start, numLines + 2); + offset += numLines + 2; + }); + const content = contentArray.join("\n"); + await app.vault.modify(file, content); + } + }); + } +}; +const removeSection = async (app, section) => { + const { contentArray, file } = await createContentArray(app); + if (section.includes("[") && section.includes("]")) { + const args = section.match(/\[(.*)\]/); + if (args[1]) { + const argArray = args[1].split(/,\s?/); + if (argArray[0]) { + const start = parseInt(argArray[0]) - 1; + const end = parseInt(argArray[1]); + const numLines = end - start; + contentArray.splice(start, numLines); + const content = contentArray.join("\n"); + await app.vault.modify(file, content); + } + } + } +}; +const prependContent = async (app, insert, lineStart, isTemplater) => { + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + if (activeView) { + const file = activeView.file; + let content = await app.vault.read(file); + const contentArray = content.split("\n"); + if (typeof insert === "string") { + contentArray.splice(lineStart, 0, `${insert}`); + } + else { + if (isTemplater) { + const runTemplater = await templater$1(insert, file); + const content = await app.vault.read(insert); + const processed = await runTemplater(content); + contentArray.splice(lineStart, 0, `${processed}`); + } + else { + activeView.editor.setCursor(lineStart); + await app.internalPlugins?.plugins["templates"].instance + .insertTemplate(insert); + } + } + content = contentArray.join("\n"); + await app.vault.modify(file, content); + } + else { + new obsidian.Notice("There was an issue prepending content, please try again", 2000); + } +}; +const appendContent = async (app, insert, lineEnd, isTemplater) => { + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + if (activeView) { + const file = activeView.file; + let content = await app.vault.read(file); + const contentArray = content.split("\n"); + let insertionPoint; + if (contentArray[lineEnd + 1] && + contentArray[lineEnd + 1].includes("^button")) { + insertionPoint = lineEnd + 2; + } + else { + insertionPoint = lineEnd + 1; + } + if (typeof insert === "string") { + contentArray.splice(insertionPoint, 0, `\n${insert}`); + } + else { + if (isTemplater) { + const runTemplater = await templater$1(insert, file); + const content = await app.vault.read(insert); + const processed = await runTemplater(content); + contentArray.splice(insertionPoint, 0, `${processed}`); + } + else { + activeView.editor.setCursor(insertionPoint); + await app.internalPlugins?.plugins["templates"].instance + .insertTemplate(insert); + } + } + content = contentArray.join("\n"); + await app.vault.modify(file, content); + } + else { + new obsidian.Notice("There was an issue appending content, please try again", 2000); + } +}; +const addContentAtLine = async (app, insert, type, isTemplater) => { + const lineNumber = type.match(/(\d+)/g); + if (lineNumber[0]) { + const insertionPoint = parseInt(lineNumber[0]) - 1; + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + if (activeView) { + const file = activeView.file; + let content = await app.vault.read(file); + const contentArray = content.split("\n"); + if (typeof insert === "string") { + contentArray.splice(insertionPoint, 0, `${insert}`); + } + else { + if (isTemplater) { + const runTemplater = await templater$1(insert, file); + const content = await app.vault.read(insert); + const processed = await runTemplater(content); + contentArray.splice(insertionPoint, 0, `${processed}`); + } + else { + activeView.editor.setCursor(insertionPoint); + await app.internalPlugins?.plugins["templates"].instance + .insertTemplate(insert); + } + } + content = contentArray.join("\n"); + await app.vault.modify(file, content); + } + } + else { + new obsidian.Notice("There was an issue adding content, please try again", 2000); + } +}; +const createNote = async (app, type, folder, prompt, filePath, isTemplater) => { + const path = type.match(/\(([\s\S]*?),?\s?(split|tab)?\)/); + if (path) { + let fullPath = `${path[1]}.md`; + const fileName = fullPath.substring(fullPath.lastIndexOf("/")); + // TODO: support folders with "folder" in the name + // If a folder is provided in the button args, add it to the path + fullPath = folder ? `${folder}/${fullPath}` : fullPath; + const directoryPath = fullPath.substring(0, fullPath.lastIndexOf("/")); + // Check if the directory exists, if not, create it + if (directoryPath && !app.vault.getAbstractFileByPath(directoryPath)) { + console.log("trying to create folder at: ", directoryPath); + await app.vault.createFolder(directoryPath); + } + try { + if (prompt === "true") { + const promptedName = await new Promise((res) => new nameModal(app, res, fileName).open()); + fullPath = promptedName + ? `${directoryPath}/${promptedName}.md` + : fullPath; + } + let file; + if (typeof filePath === "string") { + file = await app.vault.create(fullPath, filePath); + } + const templateContent = await app.vault.read(filePath); + if (isTemplater) { + file = await app.vault.create(fullPath, templateContent); + const runTemplater = await templater$1(filePath, file); + const content = await app.vault.read(filePath); + const processed = await runTemplater(content); + await app.vault.modify(file, processed); + } + if (!isTemplater && typeof filePath !== "string") { + file = await app.vault.create(fullPath, ""); + } + if (path[2] === "split") { + await app.workspace.splitActiveLeaf().openFile(file); + } + else if (path[2] === "tab") { + await app.workspace.getLeaf(!0).openFile(file); + } + else { + await app.workspace.getLeaf().openFile(file); + } + if (!isTemplater && typeof filePath !== "string") { + await app.internalPlugins?.plugins["templates"].instance + .insertTemplate(filePath); + } + } + catch (e) { + console.error("Error in Buttons: ", e); + new obsidian.Notice("There was an error! Maybe the file already exists?", 2000); + } + } + else { + new obsidian.Notice(`couldn't parse the path!`, 2000); + } +}; + +const getButtonPosition = (content, args) => { + let finalPosition; + const possiblePositions = []; + let possiblePosition = { lineStart: 0, lineEnd: 0 }; + const contentArray = content.split("\n"); + let open = false; + contentArray.forEach((item, index) => { + if (item.includes("```")) { + if (open === false) { + possiblePosition.lineStart = index; + open = true; + } + else { + possiblePosition.lineEnd = index; + possiblePositions.push(possiblePosition); + possiblePosition = { lineStart: 0, lineEnd: 0 }; + open = false; + } + } + }); + possiblePositions.forEach((position) => { + const codeblock = contentArray + .slice(position.lineStart, position.lineEnd + 1) + .join("\n"); + if (codeblock.includes("button") && codeblock.includes(args.name)) { + finalPosition = position; + } + }); + return finalPosition; +}; +const getInlineButtonPosition = async (app, id) => { + const content = await createContentArray(app); + const position = { lineStart: 0, lineEnd: 0 }; + content.contentArray + .map((line) => line.split(" ")) + .forEach((words, index) => { + words.forEach((word) => { + if (word.startsWith("`button")) { + if (word === `\`button-${id}\``) { + position.lineStart = index; + position.lineEnd = index; + } + } + }); + }); + return position; +}; +const findNumber = async (app, lineNumber) => { + const content = await createContentArray(app); + const value = []; + content.contentArray.forEach((line, index) => { + if (index === lineNumber - 1) { + value.push(line); + } + }); + const convertWords = value + .join("") + .replace("plus", "+") + .replace("minus", "-") + .replace("times", "*") + .replace(/divide(d)?(\sby)?/g, "/"); + const numbers = convertWords.replace(/\s/g, "").match(/[^\w:]*?\d+?/g); + return numbers; +}; + +const calculate = async (app, { action }, position) => { + let equation = action; + const variables = action.match(/\$[0-9]*/g); + if (variables) { + const output = variables.map(async (value) => { + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + if (activeView) { + const lineNumber = parseInt(value.substring(1)); + const numbers = await findNumber(app, lineNumber); + return { variable: value, numbers }; + } + else { + new obsidian.Notice(`couldn't read file`, 2000); + } + }); + const resolved = await Promise.all(output); + resolved.forEach((term) => { + if (term.numbers) { + equation = equation.replace(term.variable, term.numbers.join("")); + } + else { + new obsidian.Notice("Check the line number in your calculate button", 3000); + equation = undefined; + } + }); + } + const fun = equation && formula_evaluator.eval(equation); + fun && appendContent(app, `Result: ${fun}`, position.lineEnd); +}; +const remove = async (app, { remove }, { lineStart, lineEnd }) => { + await removeButton(app, remove, lineStart, lineEnd); +}; +const replace = async (app, { replace }) => { + await removeSection(app, replace); +}; +const text = async (app, args, position) => { + // prepend template above the button + if (args.type.includes("prepend")) { + await prependContent(app, args.action, position.lineStart, false); + } + // append template below the button + if (args.type.includes("append")) { + await appendContent(app, args.action, position.lineEnd, false); + } + if (args.type.includes("note")) { + createNote(app, args.type, args.folder, args.prompt, args.action, false); + } + if (args.type.includes("line")) { + await addContentAtLine(app, args.action, args.type, false); + } +}; +const template = async (app, args, position) => { + const templatesEnabled = app.internalPlugins.plugins.templates.enabled; + const templaterPluginEnabled = app.plugins.plugins["templater-obsidian"]; + let isTemplater = false; + const templateFile = args.action.toLowerCase(); + const allFiles = app.vault.getFiles(); + let file = null; + if (templatesEnabled || templaterPluginEnabled) { + if (templatesEnabled) { + const folder = templatesEnabled && + app.internalPlugins.plugins.templates.instance.options.folder?.toLowerCase(); + const isFound = allFiles.filter((file) => { + let found = false; + if (file.path.toLowerCase() === `${folder}/${templateFile}.md`) { + found = true; + } + return found; + }); + file = isFound[0]; + } + if (!file && templaterPluginEnabled) { + const folder = templaterPluginEnabled && + app.plugins?.plugins["templater-obsidian"]?.settings.templates_folder?.toLowerCase(); + const isFound = allFiles.filter((file) => { + let found = false; + if (file.path.toLowerCase() === `${folder}/${templateFile}.md`) { + found = true; + isTemplater = true; + } + return found; + }); + file = isFound[0]; + } + if (file) { + // prepend template above the button + if (args.type.includes("prepend")) { + await prependContent(app, file, position.lineStart, isTemplater); + } + // append template below the button + if (args.type.includes("append")) { + await appendContent(app, file, position.lineEnd, isTemplater); + } + if (args.type.includes("note")) { + createNote(app, args.type, args.folder, args.prompt, file, isTemplater); + } + if (args.type.includes("line")) { + await addContentAtLine(app, file, args.type, isTemplater); + } + } + else { + new obsidian.Notice(`Couldn't find the specified template, please check and try again`, 2000); + } + } + else { + new obsidian.Notice("You need to have the Templates or Templater plugin enabled and Template folder defined", 2000); + } +}; +const link = ({ action }) => { + const link = action.trim(); + window.open(link); +}; +// take the action and copy it to the clipboard +const copy = ({ action }) => { + navigator.clipboard.writeText(action); +}; +const command = (app, args, buttonStart) => { + const allCommands = app.commands.listCommands(); + const action = args.action; + const command = allCommands.filter((command) => command.name.toUpperCase() === action.toUpperCase().trim())[0]; + if (args.type.includes("prepend")) { + app.workspace.getActiveViewOfType(obsidian.MarkdownView).editor.setCursor(buttonStart.lineStart, 0); + app.commands.executeCommandById(command.id); + } + if (args.type.includes("append")) { + app.workspace.getActiveViewOfType(obsidian.MarkdownView).editor.setCursor(buttonStart.lineEnd + 2, 0); + app.commands.executeCommandById(command.id); + } + if (args.type === "command") { + app.commands.executeCommandById(command.id); + } +}; +const swap = async (app, swap, id, inline, file, buttonStart) => { + handleValueArray(swap, async (argArray) => { + const swap = await getButtonSwapById(app, id); + const newSwap = swap + 1 > argArray.length - 1 ? 0 : swap + 1; + setButtonSwapById(app, id, newSwap); + let args = await getButtonById(app, argArray[swap]); + let position; + let content; + if (args) { + if (args.templater) { + args = await templater(app, position); + if (inline) { + new obsidian.Notice("templater args don't work with inline buttons yet", 2000); + } + } + if (args.replace) { + await replace(app, args); + } + if (args.type === "command") { + command(app, args, buttonStart); + } + // handle link buttons + if (args.type === "link") { + link(args); + } + // handle template buttons + if (args.type && args.type.includes("template")) { + content = await app.vault.read(file); + position = inline + ? await getInlineButtonPosition(app, id) + : getButtonPosition(content, args); + await template(app, args, position); + } + if (args.type === "calculate") { + await calculate(app, args, position); + } + if (args.type && args.type.includes("text")) { + content = await app.vault.read(file); + position = inline + ? await getInlineButtonPosition(app, id) + : getButtonPosition(content, args); + await text(app, args, position); + } + // handle removing the button + if (args.remove) { + content = await app.vault.read(file); + position = inline + ? await getInlineButtonPosition(app, id) + : getButtonPosition(content, args); + await remove(app, args, position); + } + if (args.replace) { + await replace(app, args); + } + } + }); +}; +const templater = async (app, position) => { + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + if (activeView) { + await activeView.save(); + const file = activeView.file; + const content = await processTemplate(file); + const { args } = await getNewArgs(app, position); + const cachedData = []; + const cacheChange = app.vault.on("modify", (file) => { + cachedData.push(file.unsafeCachedData); + }); + setTimeout(async () => { + const button = content + .split("\n") + .splice(position.lineStart, position.lineEnd - position.lineStart + 2) + .join("\n"); + let finalContent; + if (cachedData[0]) { + const cachedContent = cachedData[cachedData.length - 1].split("\n"); + let addOne = false; + if (args.type.includes("prepend")) { + addOne = true; + } + else if (args.type.includes("line")) { + const lineNumber = args.type.match(/(\d+)/g); + if (lineNumber[0]) { + const line = parseInt(lineNumber[0]) - 1; + if (line < position.lineStart && !args.replace) { + addOne = true; + } + } + } + if (addOne) { + cachedContent.splice(position.lineStart + 1, position.lineEnd - position.lineStart + 2, button); + } + else { + cachedContent.splice(position.lineStart, position.lineEnd - position.lineStart + 2, button); + } + finalContent = cachedContent.join("\n"); + } + else { + finalContent = content; + } + await app.vault.modify(file, finalContent); + app.metadataCache.offref(cacheChange); + }, 200); + return args; + } +}; + +const createButton = ({ app, el, args, inline, id, clickOverride, }) => { + //create the button element + const button = el.createEl("button", { + cls: [ + args.class + ? `${args.class} ${args.color}` + : `button-default ${args.color ? args.color : ""}`, + inline ? "button-inline" : "", + ], + }); + if (args.customcolor) { + button.style.backgroundColor = args.customcolor; + } + if (args.customtextcolor) { + button.style.color = args.customtextcolor; + } + button.innerHTML = args.name; + args.id ? button.setAttribute("id", args.id) : ""; + button.on("click", "button", () => { + clickOverride + ? clickOverride.click(...clickOverride.params) + : clickHandler(app, args, inline, id); + }); + return button; +}; +const clickHandler = async (app, args, inline, id) => { + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + let content = await app.vault.read(activeView.file); + const buttonStart = getButtonPosition(content, args); + let position = inline + ? await getInlineButtonPosition(app, id) + : getButtonPosition(content, args); + // if (args.templater) { + // args = await templater(app, position); + // if (inline) { + // new Notice("templater args don't work with inline buttons yet", 2000); + // } + // } + if (args.replace) { + replace(app, args); + } + if (args.type && args.type.includes("command")) { + command(app, args, buttonStart); + } + if (args.type === "copy") { + copy(args); + } + // handle link buttons + if (args.type === "link") { + link(args); + } + // handle template buttons + if (args.type && args.type.includes("template")) { + content = await app.vault.read(activeView.file); + position = inline + ? await getInlineButtonPosition(app, id) + : getButtonPosition(content, args); + await template(app, args, position); + } + if (args.type === "calculate") { + await calculate(app, args, position); + } + if (args.type && args.type.includes("text")) { + content = await app.vault.read(activeView.file); + position = inline + ? await getInlineButtonPosition(app, id) + : getButtonPosition(content, args); + await text(app, args, position); + } + if (args.swap) { + if (!inline) { + new obsidian.Notice("swap args only work in inline buttons for now", 2000); + } + else { + await swap(app, args.swap, id, inline, activeView.file, buttonStart); + } + } + // handle removing the button + if (args.remove) { + content = await app.vault.read(activeView.file); + position = inline + ? await getInlineButtonPosition(app, id) + : getButtonPosition(content, args); + await remove(app, args, position); + } +}; + +var top = 'top'; +var bottom = 'bottom'; +var right = 'right'; +var left = 'left'; +var auto = 'auto'; +var basePlacements = [top, bottom, right, left]; +var start = 'start'; +var end = 'end'; +var clippingParents = 'clippingParents'; +var viewport = 'viewport'; +var popper = 'popper'; +var reference = 'reference'; +var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); // modifiers that need to read the DOM + +var beforeRead = 'beforeRead'; +var read = 'read'; +var afterRead = 'afterRead'; // pure-logic modifiers + +var beforeMain = 'beforeMain'; +var main = 'main'; +var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) + +var beforeWrite = 'beforeWrite'; +var write = 'write'; +var afterWrite = 'afterWrite'; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + +function getNodeName(element) { + return element ? (element.nodeName || '').toLowerCase() : null; +} + +function getWindow(node) { + if (node == null) { + return window; + } + + if (node.toString() !== '[object Window]') { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + + return node; +} + +function isElement(node) { + var OwnElement = getWindow(node).Element; + return node instanceof OwnElement || node instanceof Element; +} + +function isHTMLElement(node) { + var OwnElement = getWindow(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} + +function isShadowRoot(node) { + // IE 11 has no ShadowRoot + if (typeof ShadowRoot === 'undefined') { + return false; + } + + var OwnElement = getWindow(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} + +// and applies them to the HTMLElements such as popper and arrow + +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function (name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } // Flow doesn't support to extend this property, but it's the most + // effective way to apply styles to an HTMLElement + // $FlowFixMe[cannot-write] + + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (name) { + var value = attributes[name]; + + if (value === false) { + element.removeAttribute(name); + } else { + element.setAttribute(name, value === true ? '' : value); + } + }); + }); +} + +function effect$2(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: '0', + top: '0', + margin: '0' + }, + arrow: { + position: 'absolute' + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + + return function () { + Object.keys(state.elements).forEach(function (name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them + + var style = styleProperties.reduce(function (style, property) { + style[property] = ''; + return style; + }, {}); // arrow is optional + virtual elements + + if (!isHTMLElement(element) || !getNodeName(element)) { + return; + } + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (attribute) { + element.removeAttribute(attribute); + }); + }); + }; +} // eslint-disable-next-line import/no-unused-modules + + +var applyStyles$1 = { + name: 'applyStyles', + enabled: true, + phase: 'write', + fn: applyStyles, + effect: effect$2, + requires: ['computeStyles'] +}; + +function getBasePlacement(placement) { + return placement.split('-')[0]; +} + +function getBoundingClientRect(element) { + var rect = element.getBoundingClientRect(); + return { + width: rect.width, + height: rect.height, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + left: rect.left, + x: rect.left, + y: rect.top + }; +} + +// means it doesn't take into account transforms. + +function getLayoutRect(element) { + var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. + // Fixes https://github.com/popperjs/popper-core/issues/1223 + + var width = element.offsetWidth; + var height = element.offsetHeight; + + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + + return { + x: element.offsetLeft, + y: element.offsetTop, + width: width, + height: height + }; +} + +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method + + if (parent.contains(child)) { + return true; + } // then fallback to custom implementation with Shadow DOM support + else if (rootNode && isShadowRoot(rootNode)) { + var next = child; + + do { + if (next && parent.isSameNode(next)) { + return true; + } // $FlowFixMe[prop-missing]: need a better way to handle this... + + + next = next.parentNode || next.host; + } while (next); + } // Give up, the result is false + + + return false; +} + +function getComputedStyle(element) { + return getWindow(element).getComputedStyle(element); +} + +function isTableElement(element) { + return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; +} + +function getDocumentElement(element) { + // $FlowFixMe[incompatible-return]: assume body is always available + return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] + element.document) || window.document).documentElement; +} + +function getParentNode(element) { + if (getNodeName(element) === 'html') { + return element; + } + + return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || ( // DOM Element detected + isShadowRoot(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + getDocumentElement(element) // fallback + + ); +} + +function getTrueOffsetParent(element) { + if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 + getComputedStyle(element).position === 'fixed') { + return null; + } + + return element.offsetParent; +} // `.offsetParent` reports `null` for fixed elements, while absolute elements +// return the containing block + + +function getContainingBlock(element) { + var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1; + var isIE = navigator.userAgent.indexOf('Trident') !== -1; + + if (isIE && isHTMLElement(element)) { + // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport + var elementCss = getComputedStyle(element); + + if (elementCss.position === 'fixed') { + return null; + } + } + + var currentNode = getParentNode(element); + + while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { + var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that + // create a containing block. + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + + if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + + return null; +} // Gets the closest ancestor positioned element. Handles some edge cases, +// such as table ancestors and cross browser bugs. + + +function getOffsetParent(element) { + var window = getWindow(element); + var offsetParent = getTrueOffsetParent(element); + + while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') { + offsetParent = getTrueOffsetParent(offsetParent); + } + + if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) { + return window; + } + + return offsetParent || getContainingBlock(element) || window; +} + +function getMainAxisFromPlacement(placement) { + return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; +} + +var max = Math.max; +var min = Math.min; +var round = Math.round; + +function within(min$1, value, max$1) { + return max(min$1, min(value, max$1)); +} + +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} + +function mergePaddingObject(paddingObject) { + return Object.assign({}, getFreshSideObject(), paddingObject); +} + +function expandToHashMap(value, keys) { + return keys.reduce(function (hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} + +var toPaddingObject = function toPaddingObject(padding, state) { + padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); +}; + +function arrow(_ref) { + var _state$modifiersData$; + + var state = _ref.state, + name = _ref.name, + options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets = state.modifiersData.popperOffsets; + var basePlacement = getBasePlacement(state.placement); + var axis = getMainAxisFromPlacement(basePlacement); + var isVertical = [left, right].indexOf(basePlacement) >= 0; + var len = isVertical ? 'height' : 'width'; + + if (!arrowElement || !popperOffsets) { + return; + } + + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = getLayoutRect(arrowElement); + var minProp = axis === 'y' ? top : left; + var maxProp = axis === 'y' ? bottom : right; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; + var startDiff = popperOffsets[axis] - state.rects.reference[axis]; + var arrowOffsetParent = getOffsetParent(arrowElement); + var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is + // outside of the popper bounds + + var min = paddingObject[minProp]; + var max = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset = within(min, center, max); // Prevents breaking syntax highlighting... + + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); +} + +function effect$1(_ref2) { + var state = _ref2.state, + options = _ref2.options; + var _options$element = options.element, + arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; + + if (arrowElement == null) { + return; + } // CSS selector + + + if (typeof arrowElement === 'string') { + arrowElement = state.elements.popper.querySelector(arrowElement); + + if (!arrowElement) { + return; + } + } + + if (process.env.NODE_ENV !== "production") { + if (!isHTMLElement(arrowElement)) { + console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' ')); + } + } + + if (!contains(state.elements.popper, arrowElement)) { + if (process.env.NODE_ENV !== "production") { + console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' ')); + } + + return; + } + + state.elements.arrow = arrowElement; +} // eslint-disable-next-line import/no-unused-modules + + +var arrow$1 = { + name: 'arrow', + enabled: true, + phase: 'main', + fn: arrow, + effect: effect$1, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'] +}; + +var unsetSides = { + top: 'auto', + right: 'auto', + bottom: 'auto', + left: 'auto' +}; // Round the offsets to the nearest suitable subpixel based on the DPR. +// Zooming can change the DPR, but it seems to report a value that will +// cleanly divide the values into the appropriate subpixels. + +function roundOffsetsByDPR(_ref) { + var x = _ref.x, + y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: round(round(x * dpr) / dpr) || 0, + y: round(round(y * dpr) / dpr) || 0 + }; +} + +function mapToStyles(_ref2) { + var _Object$assign2; + + var popper = _ref2.popper, + popperRect = _ref2.popperRect, + placement = _ref2.placement, + offsets = _ref2.offsets, + position = _ref2.position, + gpuAcceleration = _ref2.gpuAcceleration, + adaptive = _ref2.adaptive, + roundOffsets = _ref2.roundOffsets; + + var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets, + _ref3$x = _ref3.x, + x = _ref3$x === void 0 ? 0 : _ref3$x, + _ref3$y = _ref3.y, + y = _ref3$y === void 0 ? 0 : _ref3$y; + + var hasX = offsets.hasOwnProperty('x'); + var hasY = offsets.hasOwnProperty('y'); + var sideX = left; + var sideY = top; + var win = window; + + if (adaptive) { + var offsetParent = getOffsetParent(popper); + var heightProp = 'clientHeight'; + var widthProp = 'clientWidth'; + + if (offsetParent === getWindow(popper)) { + offsetParent = getDocumentElement(popper); + + if (getComputedStyle(offsetParent).position !== 'static') { + heightProp = 'scrollHeight'; + widthProp = 'scrollWidth'; + } + } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it + + + offsetParent = offsetParent; + + if (placement === top) { + sideY = bottom; // $FlowFixMe[prop-missing] + + y -= offsetParent[heightProp] - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + + if (placement === left) { + sideX = right; // $FlowFixMe[prop-missing] + + x -= offsetParent[widthProp] - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + + var commonStyles = Object.assign({ + position: position + }, adaptive && unsetSides); + + if (gpuAcceleration) { + var _Object$assign; + + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); +} + +function computeStyles(_ref4) { + var state = _ref4.state, + options = _ref4.options; + var _options$gpuAccelerat = options.gpuAcceleration, + gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, + _options$adaptive = options.adaptive, + adaptive = _options$adaptive === void 0 ? true : _options$adaptive, + _options$roundOffsets = options.roundOffsets, + roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + + if (process.env.NODE_ENV !== "production") { + var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || ''; + + if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) { + return transitionProperty.indexOf(property) >= 0; + })) { + console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' ')); + } + } + + var commonStyles = { + placement: getBasePlacement(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration: gpuAcceleration + }; + + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive: adaptive, + roundOffsets: roundOffsets + }))); + } + + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: 'absolute', + adaptive: false, + roundOffsets: roundOffsets + }))); + } + + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-placement': state.placement + }); +} // eslint-disable-next-line import/no-unused-modules + + +var computeStyles$1 = { + name: 'computeStyles', + enabled: true, + phase: 'beforeWrite', + fn: computeStyles, + data: {} +}; + +var passive = { + passive: true +}; + +function effect(_ref) { + var state = _ref.state, + instance = _ref.instance, + options = _ref.options; + var _options$scroll = options.scroll, + scroll = _options$scroll === void 0 ? true : _options$scroll, + _options$resize = options.resize, + resize = _options$resize === void 0 ? true : _options$resize; + var window = getWindow(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.addEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.addEventListener('resize', instance.update, passive); + } + + return function () { + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.removeEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.removeEventListener('resize', instance.update, passive); + } + }; +} // eslint-disable-next-line import/no-unused-modules + + +var eventListeners = { + name: 'eventListeners', + enabled: true, + phase: 'write', + fn: function fn() {}, + effect: effect, + data: {} +}; + +var hash$1 = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash$1[matched]; + }); +} + +var hash = { + start: 'end', + end: 'start' +}; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function (matched) { + return hash[matched]; + }); +} + +function getWindowScroll(node) { + var win = getWindow(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft: scrollLeft, + scrollTop: scrollTop + }; +} + +function getWindowScrollBarX(element) { + // If has a CSS width greater than the viewport, then this will be + // incorrect for RTL. + // Popper 1 is broken in this case and never had a bug report so let's assume + // it's not an issue. I don't think anyone ever specifies width on + // anyway. + // Browsers where the left scrollbar doesn't cause an issue report `0` for + // this (e.g. Edge 2019, IE11, Safari) + return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; +} + +function getViewportRect(element) { + var win = getWindow(element); + var html = getDocumentElement(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper + // can be obscured underneath it. + // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even + // if it isn't open, so if this isn't available, the popper will be detected + // to overflow the bottom of the screen too early. + + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) + // In Chrome, it returns a value very close to 0 (+/-) but contains rounding + // errors due to floating point numbers, so we need to check precision. + // Safari returns a number <= 0, usually < -1 when pinch-zoomed + // Feature detection fails in mobile emulation mode in Chrome. + // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < + // 0.001 + // Fallback here: "Not Safari" userAgent + + if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + + return { + width: width, + height: height, + x: x + getWindowScrollBarX(element), + y: y + }; +} + +// of the `` and `` rect bounds if horizontally scrollable + +function getDocumentRect(element) { + var _element$ownerDocumen; + + var html = getDocumentElement(element); + var winScroll = getWindowScroll(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + getWindowScrollBarX(element); + var y = -winScroll.scrollTop; + + if (getComputedStyle(body || html).direction === 'rtl') { + x += max(html.clientWidth, body ? body.clientWidth : 0) - width; + } + + return { + width: width, + height: height, + x: x, + y: y + }; +} + +function isScrollParent(element) { + // Firefox wants us to check `-x` and `-y` variations as well + var _getComputedStyle = getComputedStyle(element), + overflow = _getComputedStyle.overflow, + overflowX = _getComputedStyle.overflowX, + overflowY = _getComputedStyle.overflowY; + + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} + +function getScrollParent(node) { + if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { + // $FlowFixMe[incompatible-return]: assume body is always available + return node.ownerDocument.body; + } + + if (isHTMLElement(node) && isScrollParent(node)) { + return node; + } + + return getScrollParent(getParentNode(node)); +} + +/* +given a DOM element, return the list of all scroll parents, up the list of ancesors +until we get to the top window object. This list is what we attach scroll listeners +to, because if any of these parent elements scroll, we'll need to re-calculate the +reference element's position. +*/ + +function listScrollParents(element, list) { + var _element$ownerDocumen; + + if (list === void 0) { + list = []; + } + + var scrollParent = getScrollParent(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = getWindow(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(getParentNode(target))); +} + +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} + +function getInnerBoundingClientRect(element) { + var rect = getBoundingClientRect(element); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} + +function getClientRectFromMixedType(element, clippingParent) { + return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); +} // A "clipping parent" is an overflowable container with the characteristic of +// clipping (or hiding) overflowing elements with a position different from +// `initial` + + +function getClippingParents(element) { + var clippingParents = listScrollParents(getParentNode(element)); + var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0; + var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; + + if (!isElement(clipperElement)) { + return []; + } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 + + + return clippingParents.filter(function (clippingParent) { + return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; + }); +} // Gets the maximum area that the element is visible in due to any number of +// clipping parents + + +function getClippingRect(element, boundary, rootBoundary) { + var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); + var clippingParents = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents[0]; + var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent); + accRect.top = max(rect.top, accRect.top); + accRect.right = min(rect.right, accRect.right); + accRect.bottom = min(rect.bottom, accRect.bottom); + accRect.left = max(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} + +function getVariation(placement) { + return placement.split('-')[1]; +} + +function computeOffsets(_ref) { + var reference = _ref.reference, + element = _ref.element, + placement = _ref.placement; + var basePlacement = placement ? getBasePlacement(placement) : null; + var variation = placement ? getVariation(placement) : null; + var commonX = reference.x + reference.width / 2 - element.width / 2; + var commonY = reference.y + reference.height / 2 - element.height / 2; + var offsets; + + switch (basePlacement) { + case top: + offsets = { + x: commonX, + y: reference.y - element.height + }; + break; + + case bottom: + offsets = { + x: commonX, + y: reference.y + reference.height + }; + break; + + case right: + offsets = { + x: reference.x + reference.width, + y: commonY + }; + break; + + case left: + offsets = { + x: reference.x - element.width, + y: commonY + }; + break; + + default: + offsets = { + x: reference.x, + y: reference.y + }; + } + + var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; + + if (mainAxis != null) { + var len = mainAxis === 'y' ? 'height' : 'width'; + + switch (variation) { + case start: + offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); + break; + + case end: + offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); + break; + } + } + + return offsets; +} + +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$placement = _options.placement, + placement = _options$placement === void 0 ? state.placement : _options$placement, + _options$boundary = _options.boundary, + boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, + _options$rootBoundary = _options.rootBoundary, + rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, + _options$elementConte = _options.elementContext, + elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, + _options$altBoundary = _options.altBoundary, + altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, + _options$padding = _options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); + var altContext = elementContext === popper ? reference : popper; + var referenceElement = state.elements.reference; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); + var referenceClientRect = getBoundingClientRect(referenceElement); + var popperOffsets = computeOffsets({ + reference: referenceClientRect, + element: popperRect, + strategy: 'absolute', + placement: placement + }); + var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); + var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect + // 0 or negative = within the clipping rect + + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element + + if (elementContext === popper && offsetData) { + var offset = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function (key) { + var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; + var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; + overflowOffsets[key] += offset[axis] * multiply; + }); + } + + return overflowOffsets; +} + +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + placement = _options.placement, + boundary = _options.boundary, + rootBoundary = _options.rootBoundary, + padding = _options.padding, + flipVariations = _options.flipVariations, + _options$allowedAutoP = _options.allowedAutoPlacements, + allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; + var variation = getVariation(placement); + var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { + return getVariation(placement) === variation; + }) : basePlacements; + var allowedPlacements = placements$1.filter(function (placement) { + return allowedAutoPlacements.indexOf(placement) >= 0; + }); + + if (allowedPlacements.length === 0) { + allowedPlacements = placements$1; + + if (process.env.NODE_ENV !== "production") { + console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' ')); + } + } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... + + + var overflows = allowedPlacements.reduce(function (acc, placement) { + acc[placement] = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding + })[getBasePlacement(placement)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function (a, b) { + return overflows[a] - overflows[b]; + }); +} + +function getExpandedFallbackPlacements(placement) { + if (getBasePlacement(placement) === auto) { + return []; + } + + var oppositePlacement = getOppositePlacement(placement); + return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; +} + +function flip(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + + if (state.modifiersData[name]._skip) { + return; + } + + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, + specifiedFallbackPlacements = options.fallbackPlacements, + padding = options.padding, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + _options$flipVariatio = options.flipVariations, + flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, + allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = getBasePlacement(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { + return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + flipVariations: flipVariations, + allowedAutoPlacements: allowedAutoPlacements + }) : placement); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements[0]; + + for (var i = 0; i < placements.length; i++) { + var placement = placements[i]; + + var _basePlacement = getBasePlacement(placement); + + var isStartVariation = getVariation(placement) === start; + var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; + var len = isVertical ? 'width' : 'height'; + var overflow = detectOverflow(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + altBoundary: altBoundary, + padding: padding + }); + var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; + + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = getOppositePlacement(mainVariationSide); + } + + var altVariationSide = getOppositePlacement(mainVariationSide); + var checks = []; + + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + + if (checks.every(function (check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + + checksMap.set(placement, checks); + } + + if (makeFallbackChecks) { + // `2` may be desired in some cases – research later + var numberOfChecks = flipVariations ? 3 : 1; + + var _loop = function _loop(_i) { + var fittingPlacement = placements.find(function (placement) { + var checks = checksMap.get(placement); + + if (checks) { + return checks.slice(0, _i).every(function (check) { + return check; + }); + } + }); + + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + + if (_ret === "break") break; + } + } + + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} // eslint-disable-next-line import/no-unused-modules + + +var flip$1 = { + name: 'flip', + enabled: true, + phase: 'main', + fn: flip, + requiresIfExists: ['offset'], + data: { + _skip: false + } +}; + +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} + +function isAnySideFullyClipped(overflow) { + return [top, right, bottom, left].some(function (side) { + return overflow[side] >= 0; + }); +} + +function hide(_ref) { + var state = _ref.state, + name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = detectOverflow(state, { + elementContext: 'reference' + }); + var popperAltOverflow = detectOverflow(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets: referenceClippingOffsets, + popperEscapeOffsets: popperEscapeOffsets, + isReferenceHidden: isReferenceHidden, + hasPopperEscaped: hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped + }); +} // eslint-disable-next-line import/no-unused-modules + + +var hide$1 = { + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide +}; + +function distanceAndSkiddingToXY(placement, rects, offset) { + var basePlacement = getBasePlacement(placement); + var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; + + var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { + placement: placement + })) : offset, + skidding = _ref[0], + distance = _ref[1]; + + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [left, right].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} + +function offset(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$offset = options.offset, + offset = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = placements.reduce(function (acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); + return acc; + }, {}); + var _data$state$placement = data[state.placement], + x = _data$state$placement.x, + y = _data$state$placement.y; + + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +var offset$1 = { + name: 'offset', + enabled: true, + phase: 'main', + requires: ['popperOffsets'], + fn: offset +}; + +function popperOffsets(_ref) { + var state = _ref.state, + name = _ref.name; + // Offsets are the actual position the popper needs to have to be + // properly positioned near its reference element + // This is the most basic placement, and will be adjusted by + // the modifiers in the next step + state.modifiersData[name] = computeOffsets({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: 'absolute', + placement: state.placement + }); +} // eslint-disable-next-line import/no-unused-modules + + +var popperOffsets$1 = { + name: 'popperOffsets', + enabled: true, + phase: 'read', + fn: popperOffsets, + data: {} +}; + +function getAltAxis(axis) { + return axis === 'x' ? 'y' : 'x'; +} + +function preventOverflow(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + padding = options.padding, + _options$tether = options.tether, + tether = _options$tether === void 0 ? true : _options$tether, + _options$tetherOffset = options.tetherOffset, + tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = detectOverflow(state, { + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + altBoundary: altBoundary + }); + var basePlacement = getBasePlacement(state.placement); + var variation = getVariation(state.placement); + var isBasePlacement = !variation; + var mainAxis = getMainAxisFromPlacement(basePlacement); + var altAxis = getAltAxis(mainAxis); + var popperOffsets = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var data = { + x: 0, + y: 0 + }; + + if (!popperOffsets) { + return; + } + + if (checkMainAxis || checkAltAxis) { + var mainSide = mainAxis === 'y' ? top : left; + var altSide = mainAxis === 'y' ? bottom : right; + var len = mainAxis === 'y' ? 'height' : 'width'; + var offset = popperOffsets[mainAxis]; + var min$1 = popperOffsets[mainAxis] + overflow[mainSide]; + var max$1 = popperOffsets[mainAxis] - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === start ? referenceRect[len] : popperRect[len]; + var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go + // outside the reference bounds + + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want + // to include its full size in the calculation. If the reference is small + // and near the edge of a boundary, the popper can overflow even if the + // reference is not overflowing as well (e.g. virtual elements with no + // width or height) + + var arrowLen = within(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue; + var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0; + var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset; + var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue; + + if (checkMainAxis) { + var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1); + popperOffsets[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset; + } + + if (checkAltAxis) { + var _mainSide = mainAxis === 'x' ? top : left; + + var _altSide = mainAxis === 'x' ? bottom : right; + + var _offset = popperOffsets[altAxis]; + + var _min = _offset + overflow[_mainSide]; + + var _max = _offset - overflow[_altSide]; + + var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max); + + popperOffsets[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +var preventOverflow$1 = { + name: 'preventOverflow', + enabled: true, + phase: 'main', + fn: preventOverflow, + requiresIfExists: ['offset'] +}; + +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} + +function getNodeScroll(node) { + if (node === getWindow(node) || !isHTMLElement(node)) { + return getWindowScroll(node); + } else { + return getHTMLElementScroll(node); + } +} + +// Composite means it takes into account transforms as well as layout. + +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + + var documentElement = getDocumentElement(offsetParent); + var rect = getBoundingClientRect(elementOrVirtualElement); + var isOffsetParentAnElement = isHTMLElement(offsetParent); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 + isScrollParent(documentElement)) { + scroll = getNodeScroll(offsetParent); + } + + if (isHTMLElement(offsetParent)) { + offsets = getBoundingClientRect(offsetParent); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = getWindowScrollBarX(documentElement); + } + } + + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} + +function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function (modifier) { + map.set(modifier.name, modifier); + }); // On visiting object, check for its dependencies and visit them recursively + + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function (dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + + modifiers.forEach(function (modifier) { + if (!visited.has(modifier.name)) { + // check for visited object + sort(modifier); + } + }); + return result; +} + +function orderModifiers(modifiers) { + // order based on dependencies + var orderedModifiers = order(modifiers); // order based on phase + + return modifierPhases.reduce(function (acc, phase) { + return acc.concat(orderedModifiers.filter(function (modifier) { + return modifier.phase === phase; + })); + }, []); +} + +function debounce(fn) { + var pending; + return function () { + if (!pending) { + pending = new Promise(function (resolve) { + Promise.resolve().then(function () { + pending = undefined; + resolve(fn()); + }); + }); + } + + return pending; + }; +} + +function format(str) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return [].concat(args).reduce(function (p, c) { + return p.replace(/%s/, c); + }, str); +} + +var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; +var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; +var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options']; +function validateModifiers(modifiers) { + modifiers.forEach(function (modifier) { + Object.keys(modifier).forEach(function (key) { + switch (key) { + case 'name': + if (typeof modifier.name !== 'string') { + console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\"")); + } + + break; + + case 'enabled': + if (typeof modifier.enabled !== 'boolean') { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\"")); + } + + case 'phase': + if (modifierPhases.indexOf(modifier.phase) < 0) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\"")); + } + + break; + + case 'fn': + if (typeof modifier.fn !== 'function') { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\"")); + } + + break; + + case 'effect': + if (typeof modifier.effect !== 'function') { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\"")); + } + + break; + + case 'requires': + if (!Array.isArray(modifier.requires)) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\"")); + } + + break; + + case 'requiresIfExists': + if (!Array.isArray(modifier.requiresIfExists)) { + console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\"")); + } + + break; + + case 'options': + case 'data': + break; + + default: + console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) { + return "\"" + s + "\""; + }).join(', ') + "; but \"" + key + "\" was provided."); + } + + modifier.requires && modifier.requires.forEach(function (requirement) { + if (modifiers.find(function (mod) { + return mod.name === requirement; + }) == null) { + console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); + } + }); + }); + }); +} + +function uniqueBy(arr, fn) { + var identifiers = new Set(); + return arr.filter(function (item) { + var identifier = fn(item); + + if (!identifiers.has(identifier)) { + identifiers.add(identifier); + return true; + } + }); +} + +function mergeByName(modifiers) { + var merged = modifiers.reduce(function (merged, current) { + var existing = merged[current.name]; + merged[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged; + }, {}); // IE11 does not support Object.values + + return Object.keys(merged).map(function (key) { + return merged[key]; + }); +} + +var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; +var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; +var DEFAULT_OPTIONS = { + placement: 'bottom', + modifiers: [], + strategy: 'absolute' +}; + +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return !args.some(function (element) { + return !(element && typeof element.getBoundingClientRect === 'function'); + }); +} + +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + + var _generatorOptions = generatorOptions, + _generatorOptions$def = _generatorOptions.defaultModifiers, + defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, + _generatorOptions$def2 = _generatorOptions.defaultOptions, + defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper(reference, popper, options) { + if (options === void 0) { + options = defaultOptions; + } + + var state = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference, + popper: popper + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state: state, + setOptions: function setOptions(options) { + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options); + state.scrollParents = { + reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], + popper: listScrollParents(popper) + }; // Orders the modifiers based on their dependencies and `phase` + // properties + + var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers + + state.orderedModifiers = orderedModifiers.filter(function (m) { + return m.enabled; + }); // Validate the provided modifiers so that the consumer will get warned + // if one of the modifiers is invalid for any reason + + if (process.env.NODE_ENV !== "production") { + var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) { + var name = _ref.name; + return name; + }); + validateModifiers(modifiers); + + if (getBasePlacement(state.options.placement) === auto) { + var flipModifier = state.orderedModifiers.find(function (_ref2) { + var name = _ref2.name; + return name === 'flip'; + }); + + if (!flipModifier) { + console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' ')); + } + } + + var _getComputedStyle = getComputedStyle(popper), + marginTop = _getComputedStyle.marginTop, + marginRight = _getComputedStyle.marginRight, + marginBottom = _getComputedStyle.marginBottom, + marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can + // cause bugs with positioning, so we'll warn the consumer + + + if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) { + return parseFloat(margin); + })) { + console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' ')); + } + } + + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + + var _state$elements = state.elements, + reference = _state$elements.reference, + popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements + // anymore + + if (!areValidElements(reference, popper)) { + if (process.env.NODE_ENV !== "production") { + console.error(INVALID_ELEMENT_ERROR); + } + + return; + } // Store the reference and popper rects to be read by modifiers + + + state.rects = { + reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), + popper: getLayoutRect(popper) + }; // Modifiers have the ability to reset the current update cycle. The + // most common use case for this is the `flip` modifier changing the + // placement, which then needs to re-run all the modifiers, because the + // logic was previously ran for the previous placement and is therefore + // stale/incorrect + + state.reset = false; + state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier + // is filled with the initial data specified by the modifier. This means + // it doesn't persist and is fresh on each update. + // To ensure persistent data, use `${name}#persistent` + + state.orderedModifiers.forEach(function (modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + var __debug_loops__ = 0; + + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (process.env.NODE_ENV !== "production") { + __debug_loops__ += 1; + + if (__debug_loops__ > 100) { + console.error(INFINITE_LOOP_ERROR); + break; + } + } + + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + + var _state$orderedModifie = state.orderedModifiers[index], + fn = _state$orderedModifie.fn, + _state$orderedModifie2 = _state$orderedModifie.options, + _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, + name = _state$orderedModifie.name; + + if (typeof fn === 'function') { + state = fn({ + state: state, + options: _options, + name: name, + instance: instance + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: debounce(function () { + return new Promise(function (resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + + if (!areValidElements(reference, popper)) { + if (process.env.NODE_ENV !== "production") { + console.error(INVALID_ELEMENT_ERROR); + } + + return instance; + } + + instance.setOptions(options).then(function (state) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state); + } + }); // Modifiers have the ability to execute arbitrary code before the first + // update cycle runs. They will be executed in the same order as the update + // cycle. This is useful when a modifier adds some persistent data that + // other modifiers need to use, but the modifier is run after the dependent + // one. + + function runModifierEffects() { + state.orderedModifiers.forEach(function (_ref3) { + var name = _ref3.name, + _ref3$options = _ref3.options, + options = _ref3$options === void 0 ? {} : _ref3$options, + effect = _ref3.effect; + + if (typeof effect === 'function') { + var cleanupFn = effect({ + state: state, + name: name, + instance: instance, + options: options + }); + + var noopFn = function noopFn() {}; + + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + + function cleanupModifierEffects() { + effectCleanupFns.forEach(function (fn) { + return fn(); + }); + effectCleanupFns = []; + } + + return instance; + }; +} + +var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; +var createPopper = /*#__PURE__*/popperGenerator({ + defaultModifiers: defaultModifiers +}); // eslint-disable-next-line import/no-unused-modules + +// Stole All this from Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes +class Suggest { + constructor(owner, containerEl, scope) { + this.owner = owner; + this.containerEl = containerEl; + containerEl.on("click", ".suggestion-item", this.onSuggestionClick.bind(this)); + containerEl.on("mousemove", ".suggestion-item", this.onSuggestionMouseover.bind(this)); + scope.register([], "ArrowUp", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem - 1, true); + return false; + } + }); + scope.register([], "ArrowDown", (event) => { + if (!event.isComposing) { + this.setSelectedItem(this.selectedItem + 1, true); + return false; + } + }); + scope.register([], "Enter", (event) => { + if (!event.isComposing) { + this.useSelectedItem(event); + return false; + } + }); + } + onSuggestionClick(event, el) { + event.preventDefault(); + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + this.useSelectedItem(event); + } + onSuggestionMouseover(_event, el) { + const item = this.suggestions.indexOf(el); + this.setSelectedItem(item, false); + } + setSuggestions(values) { + this.containerEl.empty(); + const suggestionEls = []; + values.forEach((value) => { + const suggestionEl = this.containerEl.createDiv("suggestion-item"); + this.owner.renderSuggestion(value, suggestionEl); + suggestionEls.push(suggestionEl); + }); + this.values = values; + this.suggestions = suggestionEls; + this.setSelectedItem(0, false); + } + useSelectedItem(event) { + const currentValue = this.values[this.selectedItem]; + if (currentValue) { + this.owner.selectSuggestion(currentValue, event); + } + } + setSelectedItem(selectedIndex, scrollIntoView) { + const normalizedIndex = wrapAround(selectedIndex, this.suggestions.length); + const prevSelectedSuggestion = this.suggestions[this.selectedItem]; + const selectedSuggestion = this.suggestions[normalizedIndex]; + prevSelectedSuggestion?.removeClass("is-selected"); + selectedSuggestion?.addClass("is-selected"); + this.selectedItem = normalizedIndex; + if (scrollIntoView) { + selectedSuggestion.scrollIntoView(false); + } + } +} +class TextInputSuggest { + constructor(app, inputEl) { + this.app = app; + this.inputEl = inputEl; + this.scope = new obsidian.Scope(); + this.suggestEl = createDiv("suggestion-container"); + const suggestion = this.suggestEl.createDiv("suggestion"); + this.suggest = new Suggest(this, suggestion, this.scope); + this.scope.register([], "Escape", this.close.bind(this)); + this.inputEl.addEventListener("input", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("focus", this.onInputChanged.bind(this)); + this.inputEl.addEventListener("blur", this.close.bind(this)); + this.suggestEl.on("mousedown", ".suggestion-container", (event) => { + event.preventDefault(); + }); + } + onInputChanged() { + const inputStr = this.inputEl.value; + const suggestions = this.getSuggestions(inputStr); + if (suggestions.length > 0) { + this.suggest.setSuggestions(suggestions); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.open(this.app.dom.appContainerEl, this.inputEl); + } + } + open(container, inputEl) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.app.keymap.pushScope(this.scope); + container.appendChild(this.suggestEl); + this.popper = createPopper(inputEl, this.suggestEl, { + placement: "bottom-start", + modifiers: [ + { + name: "sameWidth", + enabled: true, + fn: ({ state, instance }) => { + // Note: positioning needs to be calculated twice - + // first pass - positioning it according to the width of the popper + // second pass - position it with the width bound to the reference element + // we need to early exit to avoid an infinite loop + const targetWidth = `${state.rects.reference.width}px`; + if (state.styles.popper.width === targetWidth) { + return; + } + state.styles.popper.width = targetWidth; + instance.update(); + }, + phase: "beforeWrite", + requires: ["computeStyles"], + }, + ], + }); + } + close() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.app.keymap.popScope(this.scope); + this.suggest.setSuggestions([]); + this.popper && this.popper.destroy(); + this.suggestEl.detach(); + } +} +class CommandSuggest extends TextInputSuggest { + getSuggestions(inputStr) { + const commands = this.app.commands.commands; + const commandNames = []; + const inputLowerCase = inputStr.toLowerCase(); + for (const command in commands) { + const commandObj = commands[command]; + if (commandObj.name.toLowerCase().contains(inputLowerCase)) { + commandNames.push(commandObj); + } + } + return commandNames; + } + renderSuggestion(command, el) { + el.setText(command.name); + } + selectSuggestion(command) { + this.inputEl.value = command.name; + this.inputEl.trigger("input"); + this.close(); + } +} +class TemplateSuggest extends TextInputSuggest { + constructor() { + super(...arguments); + this.templatesEnabled = this.app.internalPlugins.plugins.templates.enabled; + this.templaterPlugin = this.app.plugins.plugins["templater-obsidian"]; + // only run if templates plugin is enabled + this.folder = () => { + const folders = []; + if (this.templatesEnabled) { + const folder = this.app.internalPlugins.plugins.templates.instance.options + .folder; + if (folder) { + folders.push(folder.toLowerCase()); + } + if (this.templaterPlugin) { + const folder = this.templaterPlugin.settings.templates_folder; + if (folder) { + folders.push(folder.toLowerCase()); + } + } + } + return folders[0] ? folders : undefined; + }; + } + getSuggestions(inputStr) { + const abstractFiles = this.app.vault.getAllLoadedFiles(); + const files = []; + const lowerCaseInputStr = inputStr.toLowerCase(); + const folders = this.folder(); + abstractFiles.forEach((file) => { + let exists = false; + folders && + folders.forEach((folder) => { + if (file.path.toLowerCase().contains(`${folder}/`)) { + exists = true; + } + }); + if (file instanceof obsidian.TFile && + file.extension === "md" && + exists && + file.path.toLowerCase().contains(lowerCaseInputStr)) { + files.push(file); + } + }); + return files; + } + renderSuggestion(file, el) { + el.setText(file.name.split(".")[0]); + } + selectSuggestion(file) { + this.inputEl.value = file.name.split(".")[0]; + this.inputEl.trigger("input"); + this.close(); + } +} +class ButtonSuggest extends TextInputSuggest { + getSuggestions() { + const buttonStore = getStore(this.app.isMobile); + const buttons = []; + buttonStore.forEach((button) => { + const trimmed = button.id.split("-")[1]; + buttons.push(trimmed); + }); + return buttons; + } + renderSuggestion(button, el) { + el.setText(button); + } + selectSuggestion(button) { + this.inputEl.value = this.inputEl.value + button; + this.inputEl.trigger("input"); + this.close(); + } +} + +class ButtonModal extends obsidian.Modal { + constructor(app) { + super(app); + // actionInterval: Timeout; + this.buttonPreviewEl = createEl("p"); + this.commandSuggestEl = createEl("input", { type: "text" }); + this.fileSuggestEl = createEl("input", { type: "text" }); + this.removeSuggestEl = createEl("input", { type: "text" }); + this.swapSuggestEl = createEl("input", { type: "text" }); + this.idSuggestEl = createEl("input", { type: "text" }); + this.outputObject = { + name: "", + type: "", + action: "", + swap: "", + remove: "", + replace: "", + id: "", + templater: false, + class: "", + color: "", + customColor: "", + customTextColor: "", + blockId: "", + folder: "", + prompt: false, + }; + this.commandSuggest = new CommandSuggest(this.app, this.commandSuggestEl); + this.commandSuggestEl.placeholder = "Toggle Pin"; + this.commandSuggestEl.addEventListener("change", (e) => { + this.outputObject.action = e.target.value; + }); + this.commandSuggestEl.addEventListener("blur", (e) => { + this.outputObject.action = e.target.value; + }); + this.fileSuggest = new TemplateSuggest(this.app, this.fileSuggestEl); + this.fileSuggestEl.placeholder = "My Template"; + this.fileSuggestEl.addEventListener("change", (e) => { + this.outputObject.action = e.target.value; + }); + this.fileSuggestEl.addEventListener("blur", (e) => { + this.outputObject.action = e.target.value; + }); + this.removeSuggest = new ButtonSuggest(this.app, this.removeSuggestEl); + this.removeSuggestEl.value = "true"; + this.removeSuggestEl.addEventListener("change", (e) => { + this.outputObject.remove = e.target.value; + }); + this.removeSuggestEl.addEventListener("blur", (e) => { + this.outputObject.remove = e.target.value; + }); + this.swapSuggest = new ButtonSuggest(this.app, this.swapSuggestEl); + this.swapSuggestEl.addEventListener("change", (e) => { + this.outputObject.swap = e.target.value; + }); + this.swapSuggestEl.addEventListener("blur", (e) => { + this.outputObject.swap = e.target.value; + }); + this.idSuggest = new ButtonSuggest(this.app, this.idSuggestEl); + this.idSuggestEl.addEventListener("change", (e) => { + this.outputObject.id = e.target.value; + }); + this.idSuggestEl.addEventListener("blur", (e) => { + this.outputObject.id = e.target.value; + }); + this.swapSuggestEl.placeholder = "[idOne, idTwo]"; + } + onOpen() { + const { titleEl, contentEl } = this; + titleEl.setText("Button Maker"); + contentEl.addClass("button-maker"); + contentEl.createEl("form", {}, (formEl) => { + new obsidian.Setting(formEl) + .setName("Button Name") + .setDesc("What would you like to call this button?") + .addText((textEl) => { + textEl.setPlaceholder("My Awesome Button"); + textEl.onChange((value) => { + this.buttonPreviewEl.setText(value); + this.outputObject.name = value; + }); + window.setTimeout(() => textEl.inputEl.focus(), 10); + }); + const typeContainer = createEl("div"); + const typeTitle = createEl("span", { cls: "setting-item-title" }); + typeTitle.setText("Button Type"); + const typeDesc = createEl("div", { cls: "setting-item-description" }); + typeDesc.setText("What type of button are you making?"); + formEl.appendChild(typeContainer); + typeContainer.appendChild(typeTitle); + typeContainer.appendChild(typeDesc); + new obsidian.Setting(typeDesc).addDropdown((drop) => { + drop.addOption("pre", "Select a Button Type"); + drop.addOption("command", "Command - run a command prompt command"); + drop.addOption("link", "Link - open a url or uri"); + drop.addOption("template", "Template - insert or create notes from templates"); + drop.addOption("text", "Text - insert or create notes with text"); + drop.addOption("calculate", "Calculate - run a mathematical calculation"); + drop.addOption("swap", "Swap - Create a multi-purpose Inline Button from other Buttons"); + drop.addOption("copy", "Text - Copy text to clipboard"); + const action = formEl.createEl("div"); + drop.onChange((value) => { + this.outputObject.type = value; + if (value === "link") { + action.empty(); + new obsidian.Setting(action) + .setName("Link") + .setDesc("Enter a link to open") + .addText((textEl) => { + textEl.setPlaceholder("https://obsidian.md"); + textEl.onChange((value) => (this.outputObject.action = value)); + }); + } + if (value === "command") { + action.empty(); + new obsidian.Setting(action) + .setName("Command") + .setDesc("Enter a command to run") + .addDropdown((drop) => { + drop.addOption("command", "Default"); + drop.addOption("prepend command", "Prepend"); + drop.addOption("append command", "Append"); + drop.onChange((value) => { + this.outputObject.type = value; + }); + }) + .addText((textEl) => { + textEl.inputEl.replaceWith(this.commandSuggestEl); + }); + } + if (value.includes("template")) { + action.empty(); + new obsidian.Setting(action) + .setName("Template") + .setDesc("Select a template note and what should happen") + .addDropdown((drop) => { + drop.addOption("pre", "Do this..."); + drop.addOption("prepend template", "Prepend"); + drop.addOption("append template", "Append"); + drop.addOption("line template", "Line"); + drop.addOption("note template", "Note"); + drop.onChange((value) => { + this.outputObject.type = value; + if (value == "line template") { + new obsidian.Setting(action) + .setName("Line Number") + .setDesc("At which line should the template be inserted?") + .addText((textEl) => { + textEl.setPlaceholder("69"); + textEl.onChange((value) => { + this.outputObject.type = `line(${value}) template`; + }); + }); + } + if (value == "note template") { + new obsidian.Setting(action) + .setName("Prompt") + .setDesc("Should you be prompted to enter a name for the file on creation?") + .addToggle((toggleEl) => { + this.outputObject.prompt = false; + toggleEl.onChange((bool) => (this.outputObject.prompt = bool)); + }); + new obsidian.Setting(action) + .setName("Note Name") + .setDesc("What should the new note be named? Note: if prompt is on, this will be the default name") + .addText((textEl) => { + textEl.setPlaceholder("My New Note"); + new obsidian.Setting(action) + .setName("Default Folder") + .setDesc("Enter a folder path to place the note in. Defaults to root") + .addText((textEl) => { + this.outputObject.folder = ""; + textEl.onChange((textVal) => { + this.outputObject.folder = textVal; + }); + }); + new obsidian.Setting(action) + .setName("Split") + .setDesc("Should the new note open in a split pane?") + .addToggle((toggleEl) => { + this.outputObject.type = `note(${textEl.getValue}) template`; + textEl.onChange((textVal) => { + const toggleVal = toggleEl.getValue(); + if (toggleVal) { + this.outputObject.type = `note(${textVal}, split) template`; + } + if (!toggleVal) { + this.outputObject.type = `note(${textVal}) template`; + } + }); + toggleEl.onChange((toggleVal) => { + const textVal = textEl.getValue(); + if (toggleVal) { + this.outputObject.type = `note(${textVal}, split) template`; + } + if (!toggleVal) { + this.outputObject.type = `note(${textVal}) template`; + } + }); + }); + }); + } + }); + }) + .addText((textEl) => { + textEl.inputEl.replaceWith(this.fileSuggestEl); + }); + } + if (value.includes("text")) { + action.empty(); + new obsidian.Setting(action) + .setName("Text") + .setDesc("What text and where should it go?") + .addDropdown((drop) => { + drop.addOption("pre", "Do this..."); + drop.addOption("prepend text", "Prepend"); + drop.addOption("append text", "Append"); + drop.addOption("line text", "Line"); + drop.addOption("note text", "Note"); + drop.onChange((value) => { + this.outputObject.type = value; + if (value == "line text") { + new obsidian.Setting(action) + .setName("Line Number") + .setDesc("At which line should the template be inserted?") + .addText((textEl) => { + textEl.setPlaceholder("69"); + textEl.onChange((value) => { + this.outputObject.type = `line(${value}) text`; + }); + }); + } + if (value == "note text") { + new obsidian.Setting(action) + .setName("Note Name") + .setDesc("What should the new note be named?") + .addText((textEl) => { + textEl.setPlaceholder("My New Note"); + new obsidian.Setting(action) + .setName("Split") + .setDesc("Should the new note open in a split pane?") + .addToggle((toggleEl) => { + this.outputObject.type = `note(${textEl.getValue}) text`; + textEl.onChange((textVal) => { + const toggleVal = toggleEl.getValue(); + if (toggleVal) { + this.outputObject.type = `note(${textVal}, split) text`; + } + if (!toggleVal) { + this.outputObject.type = `note(${textVal}) text`; + } + }); + toggleEl.onChange((toggleVal) => { + const textVal = textEl.getValue(); + if (toggleVal) { + this.outputObject.type = `note(${textVal}, split) text`; + } + if (!toggleVal) { + this.outputObject.type = `note(${textVal}) text`; + } + }); + }); + }); + } + }); + }) + .addText((textEl) => { + textEl.setPlaceholder("My Text to Insert"); + textEl.onChange((value) => { + this.outputObject.action = value; + }); + }); + } + if (value === "calculate") { + action.empty(); + new obsidian.Setting(action) + .setName("Calculate") + .setDesc("Enter a calculation, you can reference a line number with $LineNumber") + .addText((textEl) => { + textEl.setPlaceholder("2+$10"); + textEl.onChange((value) => (this.outputObject.action = value)); + }); + } + if (value === "swap") { + this.outputObject.type = ""; + action.empty(); + new obsidian.Setting(action) + .setName("Swap") + .setDesc("choose buttons to be included in the Inline Swap Button") + .addText((textEl) => { + textEl.inputEl.replaceWith(this.swapSuggestEl); + }); + } + if (value === "copy") { + action.empty(); + new obsidian.Setting(action) + .setName("Text") + .setDesc("Text to copy for clipboard") + .addText((textEl) => { + textEl.setPlaceholder("Text to copy"); + textEl.onChange((value) => (this.outputObject.action = value)); + }); + } + }); + }); + new obsidian.Setting(formEl) + .setName("Button Block ID") + .setDesc("Provide a custom button-block-id") + .addText((textEl) => { + textEl.setPlaceholder("buttonId"); + textEl.onChange((value) => { + this.outputObject.blockId = value; + }); + }); + new obsidian.Setting(formEl) + .setName("Remove") + .setDesc("Would you like to remove this button (or other buttons) after clicking?") + .addToggle((toggleEl) => { + toggleEl.onChange((value) => { + if (value) { + new obsidian.Setting(remove) + .setName("Select Remove") + .setDesc("Use true to remove this button, or supply an [array] of button block-ids") + .addText((textEl) => { + textEl.inputEl.replaceWith(this.removeSuggestEl); + }); + this.outputObject.remove = value; + } + if (!value) { + this.outputObject.remove = ""; + remove.empty(); + } + }); + }); + const remove = formEl.createEl("div"); + new obsidian.Setting(formEl) + .setName("Replace") + .setDesc("Would you like to replace lines in the note after clicking?") + .addToggle((toggleEl) => { + toggleEl.onChange((value) => { + if (value) { + new obsidian.Setting(replace) + .setName("Select Lines") + .setDesc("Supply an array of [startingLine, endingLine] to be replaced") + .addText((textEl) => { + textEl.setValue("[]"); + textEl.onChange((value) => (this.outputObject.replace = value)); + }); + } + if (!value) { + replace.empty(); + } + }); + }); + const replace = formEl.createEl("div"); + new obsidian.Setting(formEl) + .setName("Inherit") + .setDesc("Would you like to inherit args by adding an existing button block-id?") + .addToggle((toggleEl) => { + toggleEl.onChange((value) => { + if (value) { + new obsidian.Setting(id) + .setName("id") + .setDesc("inherit from other Buttons by adding their button block-id") + .addText((textEl) => { + textEl.inputEl.replaceWith(this.idSuggestEl); + }); + } + if (!value) { + this.outputObject.replace = ""; + id.empty(); + } + }); + }); + const id = formEl.createEl("div"); + new obsidian.Setting(formEl) + .setName("Templater") + .setDesc("Do you want to convert a templater command inside your Button on each click?") + .addToggle((toggleEl) => { + toggleEl.setTooltip("Do not use for inline Button"); + toggleEl.onChange((value) => { + this.outputObject.templater = value; + }); + }); + new obsidian.Setting(formEl) + .setName("Custom Class") + .setDesc("Add a custom class for button styling") + .addText((textEl) => { + textEl.onChange((value) => { + this.buttonPreviewEl.setAttribute("class", value); + this.outputObject.class = value; + if (value === "") { + this.buttonPreviewEl.setAttribute("class", "button-default"); + } + }); + }); + new obsidian.Setting(formEl) + .setName("Color") + .setDesc("What color would you like your button to be?") + .addDropdown((drop) => { + drop.addOption("default", "Default Color"); + drop.addOption("blue", "Blue"); + drop.addOption("red", "Red"); + drop.addOption("green", "Green"); + drop.addOption("yellow", "Yellow"); + drop.addOption("purple", "Purple"); + drop.addOption("custom", "Custom"); + drop.onChange((value) => { + customBackgroundColor.empty(); + customTextColor.empty(); + if (value === 'custom') { + this.outputObject.color = ""; + new obsidian.Setting(customBackgroundColor) + .setName("Background: ") + .addText((el) => { + el.setPlaceholder("#FFFFFF"); + el.onChange((value) => { + this.buttonPreviewEl.className = ""; + this.buttonPreviewEl.style.background = value; + this.outputObject.customColor = value; + }); + }); + new obsidian.Setting(customTextColor) + .setName("Text Color: ") + .addText((el) => { + el.setPlaceholder("#000000"); + el.onChange((value) => { + this.buttonPreviewEl.className = ""; + this.buttonPreviewEl.style.color = value; + this.outputObject.customTextColor = value; + }); + }); + return; + } + this.outputObject.color = value; + const buttonClass = this.buttonPreviewEl + .getAttribute("class") + .replace(" blue", "") + .replace(" red", "") + .replace(" green", "") + .replace(" yellow", "") + .replace(" purple", ""); + if (value !== "default") { + this.buttonPreviewEl.setAttribute("class", `${buttonClass} ${value}`); + if (value === "blue") { + value = "#76b3fa"; + } + if (value === "purple") { + value = "#725585"; + } + this.buttonPreviewEl.setAttribute("style", `background: ${value}`); + } + else { + this.buttonPreviewEl.setAttribute("class", `${buttonClass}`); + this.buttonPreviewEl.removeAttribute("style"); + } + }); + }); + const customBackgroundColor = formEl.createEl("div"); + const customTextColor = formEl.createEl("div"); + formEl.createDiv("modal-button-container", (buttonContainerEl) => { + buttonContainerEl + .createEl("button", { + attr: { type: "button" }, + cls: "button-default", + text: "Cancel", + }) + .addEventListener("click", () => this.close()); + buttonContainerEl.createEl("button", { + attr: { type: "submit" }, + cls: "button-default mod-cta", + text: "Insert Button", + }); + }); + formEl.addEventListener("submit", (e) => { + e.preventDefault(); + insertButton(this.app, this.outputObject); + this.close(); + }); + }); + contentEl.createEl("p").setText("Button Preview"); + this.buttonPreviewEl = createButton({ + app: this.app, + el: contentEl, + args: { name: "My Awesome Button" }, + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} +class InlineButtonModal extends obsidian.Modal { + constructor(app) { + super(app); + this.buttonSuggestEl = createEl("input", { type: "text" }); + this.buttonSuggest = new ButtonSuggest(this.app, this.buttonSuggestEl); + this.buttonSuggestEl.setAttribute("style", "width: 100%; height: 40px"); + } + onOpen() { + const { titleEl, contentEl } = this; + titleEl.setText("Insert Inline Button"); + contentEl.createEl("form", {}, (formEl) => { + formEl.appendChild(this.buttonSuggestEl); + formEl.addEventListener("submit", (e) => { + e.preventDefault(); + insertInlineButton(this.app, this.buttonSuggestEl.value); + this.close(); + }); + }); + } + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} + +class ButtonsPlugin extends obsidian.Plugin { + constructor() { + super(...arguments); + this.storeEvents = new obsidian.Events(); + this.indexCount = 0; + } + async addButtonInEdit(app) { + let widget; + if (widget) { + widget.clear(); + } + const activeView = app.workspace.getActiveViewOfType(obsidian.MarkdownView); + if (activeView) { + const store = getStore(app.isMobile); + const buttonsInFile = store.filter((button) => button.path === activeView.file.path); + this.registerCodeMirror((cm) => { + buttonsInFile.forEach(async (button) => { + const widgetEl = document.createElement("div"); + const storeButton = await getButtonFromStore(app, { + id: button.id.split("-")[1], + }); + if (!app.isMobile && + storeButton && + storeButton?.args.editview === "true") { + widget = cm.addLineWidget(button.position.end.line + 1, createButton({ + app, + el: widgetEl, + args: storeButton.args, + inline: false, + id: button.id, + })); + } + }); + }); + } + } + async onload() { + this.app.workspace.onLayoutReady(async () => { + // await updateWarning(); + }); + this.buttonEvents = buttonEventListener(this.app, addButtonToStore); + this.closedFile = openFileListener(this.app, this.storeEvents, initializeButtonStore); + this.createButton = createButton; + this.storeEventsRef = this.storeEvents.on("index-complete", () => { + this.indexCount++; + }); + initializeButtonStore(this.app, this.storeEvents); + this.buttonEdit = openFileListener(this.app, this.storeEvents, this.addButtonInEdit.bind(this)); + this.addCommand({ + id: "button-maker", + name: "Button Maker", + callback: () => new ButtonModal(this.app).open(), + }); + this.addCommand({ + id: "inline-button", + name: "Insert Inline Button", + callback: () => new InlineButtonModal(this.app).open(), + }); + this.registerMarkdownCodeBlockProcessor("button", async (source, el, ctx) => { + if (source.includes("<%")) { + const runTemplater = await templater$1(); + if (runTemplater) { + source = await runTemplater(source); + } + } + // create an object out of the arguments + const file = this.app.vault + .getFiles() + .find((f) => f.path === ctx.sourcePath); + addButtonToStore(this.app, file); + let args = createArgumentObject(source); + const storeArgs = await getButtonFromStore(this.app, args); + args = storeArgs ? storeArgs.args : args; + const id = storeArgs && storeArgs.id; + if (Boolean(args['hidden']) !== true) + createButton({ app: this.app, el, args, inline: false, id }); + }); + this.registerMarkdownPostProcessor(async (el, ctx) => { + // Search for blocks inside this element; for each one, look for things of the form ` + const codeblocks = el.querySelectorAll("code"); + for (let index = 0; index < codeblocks.length; index++) { + const codeblock = codeblocks.item(index); + const text = codeblock.innerText.trim(); + if (text.startsWith("button")) { + const id = text.split("button-")[1].trim(); + if (this.indexCount < 2) { + this.storeEventsRef = this.storeEvents.on("index-complete", async () => { + this.indexCount++; + const args = await getButtonById(this.app, id); + if (args) { + ctx.addChild(new InlineButton(codeblock, this.app, args, id)); + } + }); + } + else { + const args = await getButtonById(this.app, id); + if (args) { + ctx.addChild(new InlineButton(codeblock, this.app, args, id)); + } + } + } + } + }); + } + onunload() { + this.app.metadataCache.offref(this.buttonEvents); + this.app.workspace.offref(this.closedFile); + this.app.workspace.offref(this.buttonEdit); + this.storeEvents.offref(this.storeEventsRef); + } +} +class InlineButton extends obsidian.MarkdownRenderChild { + constructor(el, app, args, id) { + super(el); + this.el = el; + this.app = app; + this.args = args; + this.id = id; + } + async onload() { + const button = createButton({ + app: this.app, + el: this.el, + args: this.args, + inline: true, + id: this.id, + }); + this.el.replaceWith(button); + } +} + +module.exports = ButtonsPlugin; + + +/* nosourcemap */ \ No newline at end of file diff --git a/.obsidian/plugins/buttons/manifest.json b/.obsidian/plugins/buttons/manifest.json new file mode 100644 index 0000000..25fd03b --- /dev/null +++ b/.obsidian/plugins/buttons/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "buttons", + "name": "Buttons", + "description": "Create Buttons in your Obsidian notes to run commands, open links, and insert templates", + "version": "0.5.1", + "author": "shabegom", + "authorUrl": "https://shbgm.ca", + "isDesktopOnly": false, + "minAppVersion": "0.12.8" +} diff --git a/.obsidian/plugins/buttons/styles.css b/.obsidian/plugins/buttons/styles.css new file mode 100644 index 0000000..90278eb --- /dev/null +++ b/.obsidian/plugins/buttons/styles.css @@ -0,0 +1,148 @@ +/* @settings + +name: Buttons +id: buttons-styles +settings: + - + id: button-background + title: Background + type: variable-themed-color + format: hex + opacity: false + default-light: '#f5f6f8' + default-dark: '#1b1b1b' + - + id: button-text + title: Text + type: variable-themed-color + format: hex + opacity: false + default-light: '#1b1b1b' + default-dark: '#f5f6f8' + - + id: button-border + title: Border + type: variable-themed-color + format: hex + opacity: false + default-light: '#7a9486' + default-dark: '#84a83a' + - + id: button-box-shadow + title: Box Shadow + type: variable-themed-color + format: rgb + opacity: true + default-light: '#1b1b1b' + default-dark: '#f5f6f8' + - + id: button-border-radius + title: Border Radius + type: variable-number + format: px + default: 5 + - + id: button-size + title: Font Size + type: variable-number + format: em + default: 1 + +*/ + +.block-language-button { + padding: 5px; +} + +button.button-default { + border: 0.5px solid var(--button-border, #7a9486); + border-radius: var(--button-border-radius, 5px); + background-color: var(--button-background); + padding: 10px 30px; + color: var(--button-text); + text-decoration: none; + font-size: var(--button-size); + margin: 0 5px; + box-shadow: 0 1px 3px var(--button-box-shadow, rgba(0, 0, 0, 0.12)), + 0 1px 2px var(--button-box-shadow, rgba(0, 0, 0, 0.24)); + transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); +} + +button.button-default:hover { + z-index: 100; + box-shadow: 0 4px 4px var(--button-box-shadow, rgba(0, 0, 0, 0.25)), + 0 10px 10px var(--button-box-shadow, rgba(0, 0, 0, 0.22)); + transform: translate3d(0px, -1.5px, 0px); + background-color: var(--button-background); +} + +.theme-dark button.button-default { + border: 0.5px solid var(--button-border, #84a83a); +} + +.theme-dark button.button-default:hover { + z-index: 100; + box-shadow: 0 4px 4px var(--button-box-shadow, rgba(210, 210, 210, 0.25)), + 0 10px 10px var(--button-box-shadow, rgba(210, 210, 210, 0.22)); + transform: translate3d(0px, -1.5px, 0px); +} + +button.button-inline { + width: unset; + height: unset; + padding: 0 8px; +} + +button.blue { + background: #76b3fa; + color: black; +} + +button.red { + background-color: red; +} + +button.green { + background: green; +} + +button.yellow { + background: yellow; + color: black; +} + +button.purple { + background: #725585; +} + +button.blue:hover { + background: #76b3fa; + color: black; +} + +button.red:hover { + background: red; +} + +button.green:hover { + background: green; +} + +button.yellow:hover { + background: yellow; + color: black; +} + +button.purple:hover { + background: #725585; +} + +.button-maker { + max-width: 35rem; + width: 35rem; + overflow-y: auto; + max-height: 30rem; + padding-left: 0.5rem; + padding-right: 0.5rem; + overflow-x: hidden; +} diff --git a/.obsidian/plugins/editing-toolbar/data.json b/.obsidian/plugins/editing-toolbar/data.json new file mode 100644 index 0000000..14ea20a --- /dev/null +++ b/.obsidian/plugins/editing-toolbar/data.json @@ -0,0 +1,319 @@ +{ + "lastVersion": "3.1.3", + "aestheticStyle": "default", + "positionStyle": "top", + "menuCommands": [ + { + "id": "editing-toolbar:editor-undo", + "name": "Undo editor", + "icon": "undo-glyph" + }, + { + "id": "editing-toolbar:editor-redo", + "name": "Redo editor", + "icon": "redo-glyph" + }, + { + "id": "editing-toolbar:toggle-format-brush", + "name": "Format Brush", + "icon": "paintbrush" + }, + { + "id": "editing-toolbar:format-eraser", + "name": "Clear text formatting", + "icon": "eraser" + }, + { + "id": "editing-toolbar:header2-text", + "name": "Header 2", + "icon": "header-2" + }, + { + "id": "editing-toolbar:header3-text", + "name": "Header 3", + "icon": "header-3" + }, + { + "id": "SubmenuCommands-header", + "name": "submenu", + "icon": "header-n", + "SubmenuCommands": [ + { + "id": "editing-toolbar:header1-text", + "name": "Header 1", + "icon": "header-1" + }, + { + "id": "editing-toolbar:header4-text", + "name": "Header 4", + "icon": "header-4" + }, + { + "id": "editing-toolbar:header5-text", + "name": "Header 5", + "icon": "header-5" + }, + { + "id": "editing-toolbar:header6-text", + "name": "Header 6", + "icon": "header-6" + } + ] + }, + { + "id": "editing-toolbar:toggle-bold", + "name": "Bold", + "icon": "bold-glyph" + }, + { + "id": "editing-toolbar:toggle-italics", + "name": "Italics", + "icon": "italic-glyph" + }, + { + "id": "editing-toolbar:toggle-strikethrough", + "name": "Strikethrough", + "icon": "strikethrough-glyph" + }, + { + "id": "editing-toolbar:underline", + "name": "Underline", + "icon": "underline-glyph" + }, + { + "id": "editing-toolbar:toggle-highlight", + "name": "==Highlight==", + "icon": "highlight-glyph" + }, + { + "id": "SubmenuCommands-lucdf3en5", + "name": "submenu", + "icon": "edit", + "SubmenuCommands": [ + { + "id": "editing-toolbar:editor-copy", + "name": "Copy", + "icon": "lucide-copy" + }, + { + "id": "editing-toolbar:editor-cut", + "name": "Cut", + "icon": "lucide-scissors" + }, + { + "id": "editing-toolbar:editor-paste", + "name": "Paste", + "icon": "lucide-clipboard-type" + }, + { + "id": "editing-toolbar:editor:swap-line-down", + "name": "Swap line down", + "icon": "lucide-corner-right-down" + }, + { + "id": "editing-toolbar:editor:swap-line-up", + "name": "Swap line up", + "icon": "lucide-corner-right-up" + } + ] + }, + { + "id": "editing-toolbar:editor:attach-file", + "name": "Attach file", + "icon": "lucide-paperclip" + }, + { + "id": "editing-toolbar:editor:insert-table", + "name": "Insert Table", + "icon": "lucide-table" + }, + { + "id": "editing-toolbar:editor:cycle-list-checklist", + "name": "Cycle list checklist", + "icon": "check-circle" + }, + { + "id": "SubmenuCommands-luc8efull", + "name": "submenu", + "icon": "message-square", + "SubmenuCommands": [ + { + "id": "editing-toolbar:editor:toggle-blockquote", + "name": "Blockquote", + "icon": "lucide-text-quote" + }, + { + "id": "editing-toolbar:insert-callout", + "name": "Insert Callout ", + "icon": "lucide-quote" + } + ] + }, + { + "id": "SubmenuCommands-mdcmder", + "name": "submenu", + "icon": "", + "SubmenuCommands": [ + { + "id": "editing-toolbar:superscript", + "name": "Superscript", + "icon": "superscript-glyph" + }, + { + "id": "editing-toolbar:subscript", + "name": "Subscript", + "icon": "subscript-glyph" + }, + { + "id": "editing-toolbar:editor:toggle-code", + "name": "Inline code", + "icon": "code-glyph" + }, + { + "id": "editing-toolbar:codeblock", + "name": "Code block", + "icon": "codeblock-glyph" + }, + { + "id": "editing-toolbar:editor:insert-wikilink", + "name": "Insert wikilink [[]]", + "icon": "" + }, + { + "id": "editing-toolbar:editor:insert-embed", + "name": "Insert embed ![[]]", + "icon": "note-glyph" + }, + { + "id": "editing-toolbar:insert-link", + "name": "Insert link []()", + "icon": "link-glyph" + }, + { + "id": "editing-toolbar:hrline", + "name": "Horizontal divider", + "icon": "" + }, + { + "id": "editing-toolbar:toggle-inline-math", + "name": "Inline math", + "icon": "lucide-sigma" + }, + { + "id": "editing-toolbar:editor:insert-mathblock", + "name": "MathBlock", + "icon": "lucide-sigma-square" + } + ] + }, + { + "id": "SubmenuCommands-list", + "name": "submenu-list", + "icon": "bullet-list-glyph", + "SubmenuCommands": [ + { + "id": "editing-toolbar:editor:toggle-checklist-status", + "name": "Checklist", + "icon": "checkbox-glyph" + }, + { + "id": "editing-toolbar:toggle-numbered-list", + "name": "Numbered list", + "icon": "" + }, + { + "id": "editing-toolbar:toggle-bullet-list", + "name": "Bullet list", + "icon": "" + }, + { + "id": "editing-toolbar:undent-list", + "name": "Unindent-list", + "icon": "" + }, + { + "id": "editing-toolbar:indent-list", + "name": "Indent list", + "icon": "" + } + ] + }, + { + "id": "SubmenuCommands-aligin", + "name": "submenu-aligin", + "icon": "", + "SubmenuCommands": [ + { + "id": "editing-toolbar:justify", + "name": "

", + "icon": "" + }, + { + "id": "editing-toolbar:left", + "name": "

", + "icon": "" + }, + { + "id": "editing-toolbar:center", + "name": "
", + "icon": "" + }, + { + "id": "editing-toolbar:right", + "name": "

", + "icon": "" + } + ] + }, + { + "id": "editing-toolbar:change-font-color", + "name": "Change font color[html]", + "icon": "" + }, + { + "id": "editing-toolbar:change-background-color", + "name": "Change Backgroundcolor[html]", + "icon": "" + }, + { + "id": "editing-toolbar:fullscreen-focus", + "name": "Fullscreen focus mode", + "icon": "fullscreen" + }, + { + "id": "editing-toolbar:workplace-fullscreen-focus", + "name": "Workplace-Fullscreen ", + "icon": "exit-fullscreen" + } + ], + "followingCommands": [], + "topCommands": [], + "fixedCommands": [], + "mobileCommands": [], + "enableMultipleConfig": false, + "appendMethod": "workspace", + "shouldShowMenuOnSelect": false, + "cMenuVisibility": true, + "cMenuBottomValue": 4.25, + "cMenuNumRows": 12, + "cMenuWidth": 610, + "cMenuFontColor": "#245bdb", + "cMenuBackgroundColor": "#d3f8b6", + "autohide": false, + "custom_bg1": "#FFB78B8C", + "custom_bg2": "#CDF4698C", + "custom_bg3": "#A0CCF68C", + "custom_bg4": "#F0A7D88C", + "custom_bg5": "#ADEFEF8C", + "custom_fc1": "#D83931", + "custom_fc2": "#DE7802", + "custom_fc3": "#245BDB", + "custom_fc4": "#6425D0", + "custom_fc5": "#646A73", + "isLoadOnMobile": false, + "horizontalPosition": 0, + "verticalPosition": 0, + "formatBrushes": {}, + "customCommands": [], + "viewTypeSettings": {} +} \ No newline at end of file diff --git a/.obsidian/plugins/editing-toolbar/main.js b/.obsidian/plugins/editing-toolbar/main.js new file mode 100644 index 0000000..8dce003 --- /dev/null +++ b/.obsidian/plugins/editing-toolbar/main.js @@ -0,0 +1,12 @@ +"use strict";var e=require("obsidian");function t(e,t,o,i){return new(o||(o=Promise))((function(n,s){function a(e){try{l(i.next(e))}catch(e){s(e)}}function r(e){try{l(i.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(a,r)}l((i=i.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const o=["Custom","editingToolbar","editingToolbarSub","editingToolbarAdd","editingToolbarDelete","editingToolbarReload","codeblock-glyph","underline-glyph","superscript-glyph","subscript-glyph","bot-glyph","header-1","header-2","header-3","header-4","header-5","header-6","header-n","obsidian","obsidian-new","accessibility","activity","air-vent","airplay","alarm-check","alarm-clock-off","alarm-clock","alarm-minus","alarm-plus","album","alert-circle","alert-octagon","alert-triangle","align-center-horizontal","align-center-vertical","align-center","align-end-horizontal","align-end-vertical","align-horizontal-distribute-center","align-horizontal-distribute-end","align-horizontal-distribute-start","align-horizontal-justify-center","align-horizontal-justify-end","align-horizontal-justify-start","align-horizontal-space-around","align-horizontal-space-between","align-justify","align-left","align-right","align-start-horizontal","align-start-vertical","align-vertical-distribute-center","align-vertical-distribute-end","align-vertical-distribute-start","align-vertical-justify-center","align-vertical-justify-end","align-vertical-justify-start","align-vertical-space-around","align-vertical-space-between","anchor","angry","annoyed","aperture","apple","archive-restore","archive","armchair","arrow-big-down","arrow-big-left","arrow-big-right","arrow-big-up","arrow-down-circle","arrow-down-left","arrow-down-right","arrow-down","arrow-left-circle","arrow-left-right","arrow-left","arrow-right-circle","arrow-right","arrow-up-circle","arrow-up-left","arrow-up-right","arrow-up","asterisk","at-sign","award","axe","axis-3d","baby","backpack","baggage-claim","banana","banknote","bar-chart-2","bar-chart-3","bar-chart-4","bar-chart-horizontal","bar-chart","baseline","bath","battery-charging","battery-full","battery-low","battery-medium","battery","beaker","bed-double","bed-single","bed","beer","bell-minus","bell-off","bell-plus","bell-ring","bell","bike","binary","bitcoin","bluetooth-connected","bluetooth-off","bluetooth-searching","bluetooth","bold","bomb","bone","book-open","book","bookmark-minus","bookmark-plus","bookmark","bot","box-select","box","boxes","briefcase","brush","bug","building-2","building","bus","cake","calculator","calendar-check-2","calendar-check","calendar-clock","calendar-days","calendar-heart","calendar-minus","calendar-off","calendar-plus","calendar-range","calendar-search","calendar-x2","calendar-x","calendar","camera-off","camera","car","carrot","cast","check-circle-2","check-circle","check-square","check","chef-hat","cherry","chevron-down","chevron-first","chevron-last","chevron-left","chevron-right","chevron-up","chevrons-down-up","chevrons-down","chevrons-left-right","chevrons-left","chevrons-right-left","chevrons-right","chevrons-up-down","chevrons-up","chrome","cigarette-off","cigarette","circle-dot","circle-ellipsis","circle-slashed","circle","citrus","clapperboard","clipboard-check","clipboard-copy","clipboard-edit","clipboard-list","clipboard-signature","clipboard-type","clipboard-x","clipboard","clock-1","clock-10","clock-11","clock-12","clock-2","clock-3","clock-4","clock-5","clock-6","clock-7","clock-8","clock-9","clock","cloud-cog","cloud-drizzle","cloud-fog","cloud-hail","cloud-lightning","cloud-moon-rain","cloud-moon","cloud-off","cloud-rain-wind","cloud-rain","cloud-snow","cloud-sun-rain","cloud-sun","cloud","cloudy","clover","code-2","code","codepen","codesandbox","coffee","cog","coins","columns","command","compass","component","contact","contrast","cookie","copy","copyleft","copyright","corner-down-left","corner-down-right","corner-left-down","corner-left-up","corner-right-down","corner-right-up","corner-up-left","corner-up-right","cpu","credit-card","croissant","crop","cross","crosshair","crown","cup-soda","curly-braces","currency","database","delete","diamond","dice-1","dice-2","dice-3","dice-4","dice-5","dice-6","dices","diff","disc","divide-circle","divide-square","divide","dollar-sign","download-cloud","download","dribbble","droplet","droplets","drumstick","edit-2","edit-3","edit","egg-fried","egg","equal-not","equal","eraser","euro","expand","external-link","eye-off","eye","facebook","factory","fast-forward","feather","figma","file-archive","file-audio-2","file-audio","file-axis-3d","file-badge-2","file-badge","file-bar-chart-2","file-bar-chart","file-box","file-check-2","file-check","file-clock","file-code","file-cog-2","file-cog","file-diff","file-digit","file-down","file-edit","file-heart","file-image","file-input","file-json-2","file-json","file-key-2","file-key","file-line-chart","file-lock-2","file-lock","file-minus-2","file-minus","file-output","file-pie-chart","file-plus-2","file-plus","file-question","file-scan","file-search-2","file-search","file-signature","file-spreadsheet","file-symlink","file-terminal","file-text","file-type-2","file-type","file-up","file-video-2","file-video","file-volume-2","file-volume","file-warning","file-x2","file-x","file","files","film","filter","fingerprint","flag-off","flag-triangle-left","flag-triangle-right","flag","flame","flashlight-off","flashlight","flask-conical","flask-round","flip-horizontal-2","flip-horizontal","flip-vertical-2","flip-vertical","flower-2","flower","focus","folder-archive","folder-check","folder-clock","folder-closed","folder-cog-2","folder-cog","folder-down","folder-edit","folder-heart","folder-input","folder-key","folder-lock","folder-minus","folder-open","folder-output","folder-plus","folder-search-2","folder-search","folder-symlink","folder-tree","folder-up","folder-x","folder","folders","form-input","forward","frame","framer","frown","fuel","function-square","gamepad-2","gamepad","gauge","gavel","gem","ghost","gift","git-branch-plus","git-branch","git-commit","git-compare","git-fork","git-merge","git-pull-request-closed","git-pull-request-draft","git-pull-request","github","gitlab","glass-water","glasses","globe-2","globe","grab","graduation-cap","grape","grid","grip-horizontal","grip-vertical","hammer","hand-metal","hand","hard-drive","hard-hat","hash","haze","headphones","heart-crack","heart-handshake","heart-off","heart-pulse","heart","help-circle","hexagon","highlighter","history","home","hourglass","ice-cream","image-minus","image-off","image-plus","image","import","inbox","indent","indian-rupee","infinity","info","inspect","instagram","italic","japanese-yen","joystick","key","keyboard","lamp-ceiling","lamp-desk","lamp-floor","lamp-wall-down","lamp-wall-up","lamp","landmark","languages","laptop-2","laptop","lasso-select","lasso","laugh","layers","layout-dashboard","layout-grid","layout-list","layout-template","layout","leaf","library","life-buoy","lightbulb-off","lightbulb","line-chart","link-2off","link-2","link","linkedin","list-checks","list-end","list-minus","list-music","list-ordered","list-plus","list-start","list-video","list-x","list","loader-2","loader","locate-fixed","locate-off","locate","lock","log-in","log-out","luggage","magnet","mail-check","mail-minus","mail-open","mail-plus","mail-question","mail-search","mail-warning","mail-x","mail","mails","map-pin-off","map-pin","map","martini","maximize-2","maximize","medal","megaphone-off","megaphone","meh","menu","message-circle","message-square","mic-2","mic-off","mic","microscope","milestone","minimize-2","minimize","minus-circle","minus-square","minus","monitor-off","monitor-speaker","monitor","moon","more-horizontal","more-vertical","mountain-snow","mountain","mouse-pointer-2","mouse-pointer-click","mouse-pointer","mouse","move-3d","move-diagonal-2","move-diagonal","move-horizontal","move-vertical","move","music-2","music-3","music-4","music","navigation-2off","navigation-2","navigation-off","navigation","network","newspaper","octagon","option","outdent","package-2","package-check","package-minus","package-open","package-plus","package-search","package-x","package","paint-bucket","paintbrush-2","paintbrush","palette","palmtree","paperclip","party-popper","pause-circle","pause-octagon","pause","pen-tool","pencil","percent","person-standing","phone-call","phone-forwarded","phone-incoming","phone-missed","phone-off","phone-outgoing","phone","pie-chart","piggy-bank","pin-off","pin","pipette","pizza","plane","play-circle","play","plug-zap","plus-circle","plus-square","plus","pocket","podcast","pointer","pound-sterling","power-off","power","printer","puzzle","qr-code","quote","radio-receiver","radio","recycle","redo-2","redo","refresh-ccw","refresh-cw","regex","repeat-1","repeat","reply-all","reply","rewind","rocket","rocking-chair","rotate-3d","rotate-ccw","rotate-cw","rss","ruler","russian-ruble","save","scale-3d","scale","scaling","scan-face","scan-line","scan","scissors","screen-share-off","screen-share","scroll","search","send","separator-horizontal","separator-vertical","server-cog","server-crash","server-off","server","settings-2","settings","share-2","share","sheet","shield-alert","shield-check","shield-close","shield-off","shield","shirt","shopping-bag","shopping-cart","shovel","shrink","shrub","shuffle","sidebar-close","sidebar-open","sidebar","sigma","signal-high","signal-low","signal-medium","signal-zero","signal","siren","skip-back","skip-forward","skull","slack","slash","slice","sliders-horizontal","sliders","smartphone-charging","smartphone","smile-plus","smile","snowflake","sofa","sort-asc","sort-desc","speaker","sprout","square","star-half","star-off","star","stethoscope","sticker","sticky-note","stop-circle","stretch-horizontal","stretch-vertical","strikethrough","subscript","sun-dim","sun-medium","sun-moon","sun-snow","sun","sunrise","sunset","superscript","swiss-franc","switch-camera","sword","swords","syringe","table-2","table","tablet","tag","tags","target","tent","terminal-square","terminal","text-cursor-input","text-cursor","thermometer-snowflake","thermometer-sun","thermometer","thumbs-down","thumbs-up","ticket","timer-off","timer-reset","timer","toggle-left","toggle-right","tornado","toy-brick","train","trash-2","trash","tree-deciduous","tree-pine","trees","trello","trending-down","trending-up","triangle","trophy","truck","tv-2","tv","twitch","twitter","type","umbrella","underline","undo-2","undo","unlink-2","unlink","unlock","upload-cloud","upload","usb","user-check","user-cog","user-minus","user-plus","user-x","user","users","utensils-crossed","utensils","venetian-mask","verified","vibrate-off","vibrate","video-off","video","view","voicemail","volume-1","volume-2","volume-x","volume","wallet","wand-2","wand","watch","waves","webcam","webhook","wifi-off","wifi","wind","wine","wrap-text","wrench","x-circle","x-octagon","x-square","x","youtube","zap-off","zap","zoom-in","zoom-out","create-new","trash","search","right-triangle","document","folder","pencil","left-arrow","right-arrow","three-horizontal-bars","dot-network","audio-file","image-file","pdf-file","gear","documents","blocks","go-to-file","presentation","cross-in-box","microphone","microphone-filled","two-columns","link","popup-open","checkmark","hashtag","left-arrow-with-tail","right-arrow-with-tail","up-arrow-with-tail","down-arrow-with-tail","lines-of-text","vertical-three-dots","pin","magnifying-glass","info","horizontal-split","vertical-split","calendar-with-checkmark","folder-minus","sheets-in-box","up-and-down-arrows","broken-link","cross","any-key","reset","star","crossed-star","dice","filled-pin","enter","help","vault","open-vault","paper-plane","bullet-list","uppercase-lowercase-a","star-list","expand-vertically","languages","switch","pane-layout","install","sync","check-in-circle","sync-small","check-small","paused","forward-arrow","stacked-levels","bracket-glyph","note-glyph","tag-glyph","price-tag-glyph","heading-glyph","bold-glyph","italic-glyph","strikethrough-glyph","highlight-glyph","code-glyph","quote-glyph","link-glyph","bullet-list-glyph","number-list-glyph","checkbox-glyph","undo-glyph","redo-glyph","up-chevron-glyph","down-chevron-glyph","left-chevron-glyph","right-chevron-glyph","percent-sign-glyph","keyboard-glyph","double-up-arrow-glyph","double-down-arrow-glyph","image-glyph","wrench-screwdriver-glyph","clock","plus-with-circle","minus-with-circle","indent-glyph","unindent-glyph","fullscreen","exit-fullscreen","cloud","run-command","compress-glyph","enlarge-glyph","scissors-glyph","up-curly-arrow-glyph","down-curly-arrow-glyph","plus-minus-glyph","links-going-out","links-coming-in","add-note-glyph","duplicate-glyph","clock-glyph","calendar-glyph","command-glyph","dice-glyph","file-explorer-glyph","graph-glyph","import-glyph","navigate-glyph","open-elsewhere-glyph","presentation-glyph","paper-plane-glyph","question-mark-glyph","restore-file-glyph","search-glyph","star-glyph","play-audio-glyph","stop-audio-glyph","tomorrow-glyph","wand-glyph","workspace-glyph","yesterday-glyph","box-glyph","merge-files-glyph","merge-files","two-blank-pages","scissors","paste","paste-text","split","select-all-text","wand","github-glyph","reading-glasses","user-manual-filled","discord-filled","chat-bubbles-filled","experiment-filled","bracket-glyph","box-glyph","check-small","dice-glyph","dice","discord","right-triangle","heading-glyph","help","keyboard-toggle","broken-link","experiment","left-arrow","link","link-glyph","links-coming-in","links-going-out","open-vault","paused","question-mark-glyph","right-arrow","sidebar-left","sidebar-right","sheets-in-box","star-list","sync-small","tabs","uppercase-lowercase-a","vault","stack-horizontal","stack-vertical","stretch-horizontal","stretch-vertical","distribute-space-horizontal","distribute-space-vertical"];function i(e){let t=Date.now().toString(36);return t+=Math.random().toString(36).substr(3,e),t}function n(e,t,o,i){let n,s={index:-1,subindex:-1},a=i;return o?a.forEach(((e,o)=>{if("SubmenuCommands"in e&&(n=e.SubmenuCommands.findIndex((e=>e.id==t.id)),n>=0))return s={index:o,subindex:n},s})):(n=a.findIndex((e=>e.id==t.id)),s={index:n,subindex:-1}),s}function s(e,t){let o,i=t.getLine(t.getCursor().line),n="";const s=/^(\>*(\[[!\w]+\])?\s*)#+\s/;let a;const r=i.match(s);r&&(a=r[0].trim()),e==a||""==e?o=i.replace(s,"$1"):(o=i.replace(/^\s*(#*|\>|\-|\d+\.)\s*/m,""),o=e+" "+o),n=""!=o?t.getRange(t.getCursor(),{line:t.getCursor().line,ch:i.length}):t.getRange(t.getCursor(),{line:t.getCursor().line,ch:0}),t.setLine(t.getCursor().line,o),t.setCursor({line:t.getCursor().line,ch:Number(o.length-n.length)})}function a(e,t){if(!t)return;const o=t.getSelection();if(!o||""===o.trim())return;const i=/]+["']?>(.*?)<\/font>/gms,n=i.test(o);if(s=o,new RegExp(`^(.+)<\\/font>$`,"ms").test(s.trim()))return;var s;const a=o.replace(i,((t,o)=>o.split("\n").map((t=>t.trim()?`${t}`:t)).join("\n"))),r=a===o?o.split("\n").map((t=>t.trim()?`${t}`:t)).join("\n"):a,l=t.listSelections().map((t=>{const o=n?0:``.length;return t.anchor.line([\s\S]*?)<\/span>/g.test(o);if(((e,t)=>{const o=t.replace(/([()[{*+.$^\\|?])/g,"\\$1");return new RegExp(`^([sS]+)<\\/span>$`).test(e.trim())})(o,e))return;let n;n=i?o.replace(/(background:)(?:#[0-9a-fA-F]{3,6}|rgba?\([^)]+\))/gi,`$1${e}`):o.split("\n").map((t=>t.trim()?`${t}`:t)).join("\n");const s=t.listSelections().map((t=>{const o=i?0:``.length;return t.anchor.line{l=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;let o=l.getElementById("editingToolbarModalBar");o&&(o.style.visibility=0==t?"hidden":"visible")},d=t=>{l=e.requireApiVersion("0.15.0")?activeWindow.document:window.document,l.documentElement.style.setProperty("--toolbar-vertical-offset",`${t.verticalPosition}px`);let o=l.getElementById("editingToolbarModalBar");o&&"fixed"==t.positionStyle&&o.setAttribute("style",`left: calc(50% - calc(${28*t.cMenuNumRows}px / 2)); bottom: 4.25em; grid-template-columns: repeat(${t.cMenuNumRows}, 28px)`)},u=t=>{l=e.requireApiVersion("0.15.0")?activeWindow.document:window.document,l.documentElement.style.setProperty("--toolbar-horizontal-offset",`${t.horizontalPosition}px`)};var p={"Editing Toolbar append method":"Editing Toolbar append method","Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.":"Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.","Editing Toolbar aesthetic":"Editing Toolbar aesthetic","Choose between a glass morphism ,tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.":"Choose between a glass morphism ,tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.","Editing Toolbar position":"Editing Toolbar position","Choose between fixed position or cursor following mode.":"Choose between fixed position , cursor following or Top mode .","Editing Toolbar columns":"Editing Toolbar columns","Choose the number of columns per row to display on Editing Toolbar.":"Choose the number of columns per row to display on Editing Toolbar.","Editing Toolbar refresh":"Editing Toolbar refresh","Editing Toolbar commands":"Editing Toolbar commands","Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.":"Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.","Format Brush Off!":"Format Brush Off!","Hide & Show":"Hide & Show","Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.":"Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.","Font-Color formatting brush ON!":"Font-Color formatting brush ON!",More:"More","Font Colors":"Font Colors","Format Brush":"Format Brush","Background color":"Background color",Refresh:"Refresh",Add:"Add",Delete:"Delete","Change Command name":"Change Command name","Add submenu":"Add submenu","add hr":"add hr","Enter the icon code, it looks like .... format":"Enter the icon code, it looks like .... format","Please enter a new name:":"Please enter a new name:","Drag the slider to move the position":"Drag the slider to move the position","Plugin Settings":"Plugin Settings","Background-color formatting brush ON!":"Background-color formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush","Clear formatting brush ON!":"Clear formatting brush ON!","Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush":"Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush","The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden":"The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden","Editing Toolbar Auto-hide":"Editing Toolbar Auto-hide","Custom Backgroud Color":"Custom Backgroud Color","Custom Font Color":"Custom Font Color","🎨 Set custom background":"🎨 Set custom background","🖌️ Set custom font color":"🖌️ Set custom font color","Click on the picker to adjust the colour":"Click on the picker to adjust the colour","Mobile enabled or not":"Mobile enabled or not","Whether to enable the plugin for the mobile client, the default is enabled.":"Whether to enable the plugin for the mobile client, the default is enabled.","Whether to enable on mobile devices with device width less than 768px, the default is disable.":"Whether to enable on mobile devices with device width less than 768px, the default is disable.",Reset:"Reset",Fix:"Fix","Fix Editing Toolbar":"Fix Editing Toolbar",General:"General",Appearance:"Appearance",Commands:"Commands","Choose between fixed position or cursor following mode":"Choose between fixed position , cursor following or Top mode .","Add and manage commands":"Add and manage commands","Choose where Editing Toolbar will append upon regeneration.":"Choose where Editing Toolbar will append upon regeneration.","Whether to enable on mobile devices with device width less than 768px":"Whether to enable on mobile devices with device width less than 768px","Choose between a glass morphism, tiny and default style":"Choose between a glass morphism, tiny and default style","Refresh Toolbar":"Refresh Toolbar","Add Command":"Add Command",Settings:"Settings","Position Style":"Position Style",Columns:"Columns","Drag to Adjust Position":"Drag to Adjust Position","Vertical Position":"Vertical Position","Horizontal Position":"Horizontal Position","Toolbar Position":"Toolbar Position","Choose an icon":"Choose an icon","Search for an icon...":"Search for an icon...",All:"All",Obsidian:"Obsidian",Glyph:"Glyph",Custom:"Custom","Choose a command":"Choose a command","The command":"The command","already exists":"already exists","Enter the icon code, format as .... ":"Enter the icon code, format as .... ","No matching icons found":"No matching icons found","Custom Commands":"Custom Commands","Toolbar Commands":"Toolbar Commands",ID:"ID",Prefix:"Prefix",Suffix:"Suffix",Pattern:"Pattern","Custom Format Commands":"Custom Format Commands","Add, edit or delete custom format commands":"Add, edit or delete custom format commands",Edit:"Edit","Command ID":"Command ID",'Unique identifier, no spaces, e.g.: "my-custom-format"':'Unique identifier, no spaces, e.g.: "my-custom-format"',"Displayed name in toolbar and menu":"Displayed name in toolbar and menu","Add content before selected text":"Add content before selected text","Add content after selected text":"Add content after selected text","Character offset of cursor after formatting":"Character offset of cursor after formatting","Line offset of cursor after formatting":"Line offset of cursor after formatting","Whether to insert at the beginning of the next line":"Whether to insert at the beginning of the next line","Command icon (click to select)":"Command icon (click to select)","Choose Icon":"Choose Icon",Save:"Save",Cancel:"Cancel","Edit Custom Command":"Edit Custom Command","Add Custom Command":"Add Custom Command","Command ID and command name cannot be empty":"Command ID and command name cannot be empty","Command ID cannot contain spaces":"Command ID cannot contain spaces",'Command ID "${this.commandId}" already exists':'Command ID "${this.commandId}" already exists',"Cursor Position Offset":"Cursor Position Offset","Line Offset":"Line Offset","Line Head Format":"Line Head Format",Icon:"Icon","Command Name":"Command Name","Are you sure you want to restore all settings to default? This will lose all your custom configurations.":"Are you sure you want to restore all settings to default? This will lose all your custom configurations.","Restore default":"Restore default","Restore default settings":"Restore default settings","🔄Restore default settings":"🔄Restore default settings","🔧Data repair":"🔧Data repair","Command IDs have been successfully repaired!":"Command IDs have been successfully repaired!","No command IDs need to be repaired":"No command IDs need to be repaired","Error repairing command IDs, please check the console for details":"Error repairing command IDs, please check the console for details","Error restoring default settings, please check the console for details":"Error restoring default settings, please check the console for details","Successfully restored default settings!":"Successfully restored default settings!",Close:"Close",Tips:"Tips","This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly":"This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly","Repair command ID":"Repair command ID","This will reset all your custom configurations":"This will reset all your custom configurations","Notice:":"Notice:","This update rebuilds the entire code, reducing resource consumption":"This update rebuilds the entire code, reducing resource consumption","Optimized mobile usage, added canvas support, and added custom commands":"Optimized mobile usage, added canvas support, and added custom commands","⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible":"⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible","⚠️If you want to restore the default settings, please click [Restore default settings]":"⚠️If you want to restore the default settings, please click [Restore default settings]","Please execute a editingToolbar format command first, then enable the format brush":"Please execute a editingToolbar format command first, then enable the format brush","Format brush ON! Select text to apply【":"Format brush ON! Select text to apply【","】format":"】format\nClick the mouse middle or right key to close the formatting-brush","Add to Toolbar":"Add to Toolbar","This command is already in the toolbar":"This command is already in the toolbar","Command added to toolbar":"Command added to toolbar","Add this command to the toolbar":"Add this command to the toolbar","Callout Type":"Callout Type",Title:"Title","Optional, leave blank for default title":"Optional, leave blank for default title","Input title":"Input title","Collapse State":"Collapse State",Open:"Open",Closed:"Closed",Content:"Content",Insert:"Insert",Default:"Default","Input content":"Input content","Link Text":"Link Text","Link Alias":"Link Alias","Link URL":"Link URL","Embed Content":"Embed Content","Image Size":"Image Size","Insert New Line":"Insert New Line","Paste and Parse":"Paste and Parse","URL Format Error":"URL Format Error","Image Width":"Image Width","Image Height":"Image Height","If it is an image, turn on":"If it is an image, turn on","Insert a link on the next line":"Insert a link on the next line","Link Alias(optional)":"Link Alias(optional)",Alias:"Alias",Optional:"Optional","Default 0, format will keep the text selected":"Default 0, format will keep the text selected","to insert":"to insert","Latest Changes":"Latest Changes","📋View full changelog":"📋View full changelog","Open changelog":"Open changelog","Loading changelog...":"Loading changelog...","Open the complete changelog in your browser":"Open the complete changelog in your browser","Enable multiple configurations":"Enable multiple configurations","Enable different command configurations for each position style (following, top, fixed)":"Enable different command configurations for each position style (following, top, fixed)","Currently editing commands for":"Currently editing commands for","position style":"position style","Current Configuration":"Current Configuration","Switch between different command configurations":"Switch between different command configurations","Following Style":"Following Style","Top Style":"Top Style","Fixed Style":"Fixed Style","Mobile Style":"Mobile Style",configuration:"configuration","Deploy command to configurations":"Deploy command to configurations","All Configurations":"All Configurations",Deploy:"Deploy","Command deployed to selected configurations":"Command deployed to selected configurations","No configuration selected for deployment":"No configuration selected for deployment","Command already exists in selected configurations":"Command already exists in selected configurations","Command deployed to: ":"Command deployed to: ","Command deleted":"Command deleted","Confirm delete?":"Confirm delete?","Are you sure you want to restore all settings to default? But custom commands will be preserved.":"Are you sure you want to restore all settings to default? But custom commands will be preserved.","Successfully restored default settings! (Custom commands preserved)":"Successfully restored default settings! (Custom commands preserved)","This will reset all your custom configurations, but custom commands will be preserved":"This will reset all your custom configurations, but custom commands will be preserved","Import/Export":"Import/Export","Export Configuration":"Export Configuration","Export your toolbar configuration to share with others":"Export your toolbar configuration to share with others",Export:"Export","Import Configuration":"Import Configuration","Import toolbar configuration from JSON":"Import toolbar configuration from JSON",Import:"Import","Usage Instructions":"Usage Instructions","Export: Generate a JSON configuration that you can save or share":"Export: Generate a JSON configuration that you can save or share","Import: Paste a previously exported JSON configuration":"Import: Paste a previously exported JSON configuration","You can choose to export all settings, only toolbar commands, or only custom commands":"You can choose to export all settings, only toolbar commands, or only custom commands","When importing, the plugin will only update the settings included in the import data":"When importing, the plugin will only update the settings included in the import data","Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.":"Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.","Export Type":"Export Type","Choose what to export":"Choose what to export","All Settings":"All Settings","Toolbar Commands Only":"Toolbar Commands Only","Custom Commands Only":"Custom Commands Only","Export Content":"Export Content","Copy this content to share with others":"Copy this content to share with others","Loading...":"Loading...","Copy to Clipboard":"Copy to Clipboard","Configuration copied to clipboard":"Configuration copied to clipboard","Failed to copy configuration":"Failed to copy configuration","Paste the configuration JSON here":"Paste the configuration JSON here","Paste configuration here...":"Paste configuration here...","Invalid import data":"Invalid import data","Configuration imported successfully":"Configuration imported successfully","No valid configuration found in import data":"No valid configuration found in import data","Failed to import configuration. Invalid format.":"Failed to import configuration. Invalid format.","Import Mode":"Import Mode","Choose how to import the configuration":"Choose how to import the configuration","Update Mode (Add new items and update existing ones)":"Update Mode (Add new items and update existing ones)","Overwrite Mode (Replace all settings with imported ones)":"Overwrite Mode (Replace all settings with imported ones)","Configuration imported successfully (Overwrite mode)":"Configuration imported successfully (Overwrite mode)","Configuration imported successfully (Update mode)":"Configuration imported successfully (Update mode)","Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.":"Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.","Warning: Update mode will add new items and update existing ones based on the imported configuration.":"Warning: Update mode will add new items and update existing ones based on the imported configuration.","Add Format Command":"Add Format Command",Regex:"Regex","Prefix/Suffix":"Prefix/Suffix","Add Regex Command":"Add Regex Command","Please select text first":"Please select text first","The selected text does not meet the condition requirements":"The selected text does not meet the condition requirements","Regex command execution error:":"Regex command execution error:","Copy code":"Copy code","Copied!":"Copied!","Explain the syntax of JavaScript regular expressions":"Explain the syntax of JavaScript regular expressions","Apply regular expression replacement":"Apply regular expression replacement","Conditional matching":"Conditional matching","Complete regular expression code (copy to AI for explanation)":"Complete regular expression code (copy to AI for explanation)","Error:":"Error:","Regex pattern cannot be empty":"Regex pattern cannot be empty","Command already exists":"Command already exists","Choose icon":"Choose icon","URL to Markdown link":"URL to Markdown link","Convert MM/DD/YYYY to YYYY-MM-DD":"Convert MM/DD/YYYY to YYYY-MM-DD","Add bold to keywords":"Add bold to keywords","Format phone number":"Format phone number","Remove extra spaces":"Remove extra spaces","Convert HTML bold tags to Markdown format":"Convert HTML bold tags to Markdown format","Convert quoted text to quote block":"Convert quoted text to quote block","Convert CSV to Markdown table row":"Convert CSV to Markdown table row","Add uniform alias to Markdown links":"Add uniform alias to Markdown links","Delete empty lines (multiline mode)":"Delete empty lines (multiline mode)","Add list symbol to each line (multiline mode)":"Add list symbol to each line (multiline mode)","If the text contains important, set the text highlight (conditional format)":"If the text contains important, set the text highlight (conditional format)","Matching pattern":"Matching pattern","Regex pattern to match":"Regex pattern to match","Replacement pattern (use $1, $2, etc. to reference capture groups)":"Replacement pattern (use $1, $2, etc. to reference capture groups)","Ignore case":"Ignore case","Global replace":"Global replace","Multiline mode":"Multiline mode","Use condition":"Use condition","Condition pattern":"Condition pattern","Only apply custom command when text matches the condition":"Only apply custom command when text matches the condition","Must exist regular expression or text":"Must exist regular expression or text","Replacement pattern":"Replacement pattern","Match case-insensitive":"Match case-insensitive","^ and $ match the start and end of each line":"^ and $ match the start and end of each line","Replace all matches":"Replace all matches",Command:"Command","Error: ":"Error:","Input example text to view the formatting effect of the command...":"Input example text to view the formatting effect of the command...",Description:"Description","[Example]":"[Example]","[Requirements]":"[Requirements]","[Output]":"[Output]","AI question template:":"AI question template:","I need to convert the url to a markdown format link":"I need to convert the url to a markdown format link","For example, convert https://example.com to [https://example.com](https://example.com)":"For example, convert https://example.com to [https://example.com](https://example.com)","Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)":"Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)","[Description]":"[Description]","How to use AI to get regular expressions?":"How to use AI to get regular expressions?","Regular expression examples":"Regular expression examples","Edit regular expression command":"Edit regular expression command","Add regular expression command":"Add regular expression command","Result:":"Result:","Example text:":"Example text:",Preview:"Preview",Result:"Result","Please select text or copy text to clipboard first":"Please select text or copy text to clipboard first","Overwrite Import":"Overwrite Import","Update Import":"Update Import","Importing configuration...":"Importing configuration...","Following Style Only":"Following Style Only","Top Style Only":"Top Style Only","Fixed Style Only":"Fixed Style Only","Mobile Style Only":"Mobile Style Only","Unknown import type":"Unknown import type","All Toolbar Commands":"All Toolbar Commands","Initialize Commands":"Initialize Commands","Copy commands from the main menu configuration":"Copy commands from the main menu configuration","Initialize commands to default settings":"Initialize commands to default settings","Reset Commands":"Reset Commands","Commands reset successfully":"Commands reset successfully","Following style commands initialized from current menu commands":"Following style commands initialized from current menu commands","Commands initialized successfully":"Commands initialized successfully","Reset to Menu Commands":"Reset to Menu Commands","Are you sure you want to reset the current configuration?":"Are you sure you want to reset the current configuration?","Following style commands successfully initialized":"Following style commands successfully initialized","Top style commands successfully initialized":"Top style commands successfully initialized","Fixed style commands successfully initialized":"Fixed style commands successfully initialized","Mobile style commands successfully initialized":"Mobile style commands successfully initialized","Reset commands to default settings":"Reset commands to default settings",Clear:"Clear","Remove all commands from this configuration":"Remove all commands from this configuration","Are you sure you want to clear all commands under the current style?":"Are you sure you want to clear all commands under the current style?","Current style commands have been cleared":"Current style commands have been cleared","Manage Commands":"Manage Commands","Reset or clear all commands in this configuration":"Reset or clear all commands in this configuration","One-click clear":"One-click clear","Import Commands from Other Styles":"Import Commands from Other Styles","Copy commands from another style configuration":"Copy commands from another style configuration","Main menu only":"Main menu only","This import will update:":"This import will update:","Custom commands":"Custom commands","Toolbar commands":"Toolbar commands","General settings":"General settings","Please paste configuration data first":"Please paste configuration data first","Invalid import data format":"Invalid import data format","Import From":"Import From","This import will:":"This import will:","Update general settings":"Update general settings","Update Main Menu Commands":"Update Main Menu Commands","Update Custom Commands":"Update Custom Commands","Update Following Style Commands":"Update Following Style Commands","Update Top Style Commands":"Update Top Style Commands","Update Fixed Style Commands":"Update Fixed Style Commands","Update Mobile Style Commands":"Update Mobile Style Commands","Clear all Main Menu Commands":"Clear all Main Menu Commands","Clear all Custom Commands":"Clear all Custom Commands","Clear all Following Style Commands":"Clear all Following Style Commands","Clear all Top Style Commands":"Clear all Top Style Commands","Clear all Fixed Style Commands":"Clear all Fixed Style Commands","Clear all Mobile Style Commands":"Clear all Mobile Style Commands","Overwrite Mode (Replace settings with imported ones)":"Overwrite Mode (Replace settings with imported ones)","Warning: Overwrite mode will replace existing settings with imported ones.":"Warning: Overwrite mode will replace existing settings with imported ones.","Warning: Update mode will add new items and update existing ones.":"Warning: Update mode will add new items and update existing ones.","Enable Multiple Config":"Enable Multiple Config","Set Multiple Config to:":"Set Multiple Config to:",Enable:"Enable",Disable:"Disable","Set Position Style to:":"Set Position Style to:",Following:"Following",Top:"Top",Fixed:"Fixed",Mobile:"Mobile","All commands":"All commands","⚠️ Overwrite mode will replace existing settings with imported ones.":"⚠️ Overwrite mode will replace existing settings with imported ones.","ℹ️ Update mode will merge imported settings with existing ones.":"ℹ️ Update mode will merge imported settings with existing ones.","Do you want to continue?":"Do you want to continue?","Imported settings:":"Imported settings:","Imported commands:":"Imported commands:","Disable toolbar for this view":"Disable toolbar for this view","Enable toolbar for this view":"Enable toolbar for this view","Manage all view types":"Manage all view types","Current View: ":"Current View: ","Appearance Style":"Appearance Style","Position Settings":"Position Settings"},m={"Editing Toolbar append method":"工具栏的附加方法。","Choose where Editing Toolbar will append upon regeneration. To see the change, hit the refresh button below, or in the status bar menu.":"工具栏在Obsidian中的追加的位置,只对固定和跟随模式有效。如果你遇到工具栏显示问题,可以选择body试试。请点击下面或者状态栏菜单中的刷新按钮生效。","Editing Toolbar aesthetic":"工具栏样式","Choose between a glass morphism ,tiny and default style for Editing Toolbar. To see the change, hit the refresh button below, or in the status bar menu.":"样式有毛玻璃,简约和默认风格选择。请点击下面或者状态栏菜单中的刷新按钮生效。","Editing Toolbar position":"工具栏位置","Choose between fixed position or cursor following mode.":"在固定位置,光标跟随模式或者置顶模式之间进行选择。","Editing Toolbar columns":"工具栏栏目数","Choose the number of columns per row to display on Editing Toolbar.":"选择在Editing Toolbar上显示的每行的列数。","Editing Toolbar refresh":"刷新工具栏","Editing Toolbar commands":"在工具栏中添加命令","Add a command onto Editing Toolbar from Obsidian's commands library. To reorder the commands, drag and drop the command items. To delete them, use the delete buttom to the right of the command item. Editing Toolbar will not automaticaly refresh after reordering commands. Use the refresh button above.":"从Obsidian的命令库中添加一个命令到工具栏。要重新排列命令,可以拖放命令项。要删除它们,请使用命令项右边的删除按钮。图标选择Custom可以自定义图标","Format Brush Off!":"关闭格式刷!","Hide & Show":"隐藏 & 显示","Editing Toolbar will only refresh automatically after you have either added or deleted a command from it. To see UI changes to editingToolbar (above settings changes) use the refresh button. If you forget to refresh in settings, no worries. There is also a refresh button in the editingToolbar status bar menu.":"对外观的更改生效需要使用刷新按钮。如果你忘记在设置中刷新,在状态栏菜单中也有一个刷新按钮。","Font-Color formatting brush ON!":"字体颜色格式刷开启\n点击鼠标中键或者右键关闭格式刷",More:"更多","Font Colors":"字体颜色","Format Brush":"格式刷","Background color":"背景颜色",Refresh:"刷新",Add:"添加",Delete:"删除","Change Command name":"更改命令名称","Add submenu":"添加子菜单","add hr":"添加分割线","Enter the icon code, it looks like .... format":"输入图标代码,类似.... 格式","Please enter a new name:":"请输入新名称:","Drag the slider to move the position":"拖动滑块来移动位置","Plugin Settings":"插件设置","Background-color formatting brush ON!":"开启背景色格式刷","Clear formatting brush ON!":"清除格式刷已开启","Clear formatting brush ON!\nClick the mouse middle or right key to close the formatting-brush":"清除格式刷已开启\n点击鼠标中键或者右键关闭格式刷","The toolbar is displayed when the mouse moves over it, otherwise it is automatically hidden":"当鼠标移到工具栏上方时,工具栏显示,否则自动隐藏","Editing Toolbar Auto-hide":"工具栏是否自动隐藏","Custom Backgroud Color":"设置自定义背景色","Custom Font Color":"设置自定义字体颜色","🎨 Set custom background":"🎨 设置自定义背景","🖌️ Set custom font color":"🖌️ 设置自定义字体颜色","Click on the picker to adjust the colour":"点击选取器来调整颜色","Mobile enabled or not":"是否在移动端启用","Whether to enable on mobile devices with device width less than 768px, the default is disable.":"是否在设备宽度小于768的移动设备启用。默认不启用",Reset:"重置",Fix:"修复","Fix Editing Toolbar":"修复工具栏",General:"常规",Appearance:"外观",Commands:"命令","Choose between fixed position or cursor following mode":"选择固定位置或者光标跟随模式","Add and manage commands":"添加和管理命令","Choose where Editing Toolbar will append upon regeneration.":"选择工具栏在Obsidian中的追加的位置。","Whether to enable on mobile devices with device width less than 768px":"是否在移动设备中启用。默认不启用","Choose between a glass morphism, tiny and default style":"选择毛玻璃,简约和默认风格","Refresh Toolbar":"刷新工具栏","Add Command":"添加命令",Settings:"设置","Adjust Toolbar Position[Fixed mode]":"调整工具栏位置[固定模式]","Position Style":"位置样式",Columns:"列数","Drag to Adjust Position":"拖动调整位置","Vertical Position":"垂直位置","Horizontal Position":"水平位置","Toolbar Position":"工具栏位置","Choose an icon":"选择一个图标","Search for an icon...":"搜索图标...",All:"全部",Obsidian:"Obsidian",Glyph:"Glyph",Custom:"自定义","Choose a command":"选择一个命令","The command":"命令","already exists":"已存在","Enter the icon code, format as .... ":"输入图标代码,格式为 .... ","No matching icons found":"没有找到匹配的图标","Custom Commands":"自定义命令","Toolbar Commands":"工具栏命令",ID:"ID",Prefix:"前缀",Suffix:"后缀","Custom Format Commands":"自定义格式命令","Add, edit or delete custom format commands":"添加、编辑或删除自定义格式命令",Edit:"编辑","Command ID":"命令ID",'Unique identifier, no spaces, e.g.: "my-custom-format"':'唯一标识符,不包含空格,例如:"my-custom-format"',"Displayed name in toolbar and menu":"在工具栏和菜单中显示的名称","Add content before selected text":"在选中的文本前添加内容","Add content after selected text":"在选中的文本后添加内容","Character offset of cursor after formatting":"格式化后光标的字符偏移量","Line offset of cursor after formatting":"格式化后光标的行偏移量","Whether to insert at the beginning of the next line":"是否在下一行首插入","Command icon (click to select)":"命令图标(点击选择)","Choose Icon":"选择图标",Save:"保存",Cancel:"取消","Edit Custom Command":"编辑自定义命令","Add Custom Command":"添加自定义命令","Command ID and command name cannot be empty":"命令ID和命令名称不能为空","Command ID cannot contain spaces":"命令ID不能包含空格",'Command ID "${this.commandId}" already exists':'命令ID "${this.commandId}" 已存在',"Command Name":"命令名称","Cursor Position Offset":"光标位置偏移量","Line Offset":"行偏移量","Line Head Format":"行首格式",Icon:"图标","Are you sure you want to restore all settings to default? This will lose all your custom configurations.":"确定要恢复所有设置为默认值吗?这将丢失您的所有自定义配置。","Restore default":"恢复默认值","Restore default settings":"恢复默认设置","🔄Restore default settings":"🔄恢复默认设置","🔧Data repair":"🔧数据修复","Command IDs have been successfully repaired!":"命令ID已成功修复!","No command IDs need to be repaired":"没有命令ID需要修复","Error repairing command IDs, please check the console for details":"修复命令ID时出错,请查看控制台了解详情","Error restoring default settings, please check the console for details":"恢复默认设置时出错,请查看控制台了解详情","Successfully restored default settings!":"已成功恢复默认设置!",Close:"关闭",Tips:"提示","This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly":"此次更新更改了部分命令的ID,请点击此按钮修复命令以确保工具栏正常工作","Repair command ID":"修复命令ID","This will reset all your custom configurations":"这将重置您的所有自定义配置","Notice:":"注意","This update rebuilds the entire code, reducing resource consumption":"此次更新重构了全部代码,降低了资源占用","Optimized mobile usage, added canvas support, and added custom commands":"优化了移动端,增加了对canvas支持,增加了自定义命令","⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible":"⚠️此次更新不兼容2.x旧版本命令id,请点击【修复命令】进行兼容","⚠️If you want to restore the default settings, please click [Restore default settings]":"⚠️如果想恢复默认设置,请点击【恢复默认设置】","Please execute a editingToolbar format command first, then enable the format brush":"请先执行一个格式命令,然后再启用格式刷","Format brush ON! Select text to apply【":"格式刷已开启\n选中文本应用【","】format":"】格式\n点击鼠标中键或者右键关闭格式刷","Add to Toolbar":"添加到工具栏","This command is already in the toolbar":"该命令已存在于工具栏中","Command added to toolbar":"命令已添加到工具栏","Add this command to the toolbar":"添加该命令到工具栏","Callout Type":"Callout 类型",Title:"标题","Optional, leave blank for default title":"可选,留空则使用默认标题","Input title":"输入标题","Collapse State":"折叠状态",Open:"展开",Closed:"折叠",Content:"内容",Insert:"插入",Default:"默认","Input content":"输入内容","Link Text":"链接文本","Link Alias":"链接别名","Link URL":"链接地址","Embed Content":"嵌入内容","Image Size":"图片尺寸","Insert New Line":"插入新行","Paste and Parse":"粘贴并解析","URL Format Error":"URL格式错误","Image Width":"图片宽度","Image Height":"图片高度","Insert a link on the next line":"在下一行插入链接","If it is an image, turn on":"如果是图片,请开启","Link Alias(optional)":"链接别名(可选)",Alias:"别名",Optional:"可选","Default 0, format will keep the text selected":"默认0,格式化将保持文本选中","to insert":"插入","Latest Changes":"最新更新","📋View full changelog":"📋查看完整更新日志","Open changelog":"打开更新日志","Loading changelog...":"加载更新日志...","Open the complete changelog in your browser":"在浏览器中打开完整更新日志","Enable multiple configurations":"启用多配置","Enable different command configurations for each position style (following, top, fixed)":"启用每个位置样式的不同命令配置(following,top,fixed)","Currently editing commands for":"当前编辑的命令配置为:","position style":"样式","Current Configuration":"当前配置","Switch between different command configurations":"切换不同的命令配置","Following Style":"跟随样式","Top Style":"顶部样式","Fixed Style":"固定样式","Mobile Style":"移动端样式",configuration:"配置","Deploy command to configurations":"部署命令到配置","All Configurations":"所有配置",Deploy:"部署","Command deployed to selected configurations":"命令已部署到选中的配置","No configuration selected for deployment":"没有选中的配置","Command already exists in selected configurations":"命令已存在于选中的配置","Command deployed to: ":"命令已部署到:","Command deleted":"命令已删除","Confirm delete?":"确认删除?","Are you sure you want to restore all settings to default? But custom commands will be preserved.":"您确定要将所有设置恢复为默认值吗?但自定义命令将被保留。","Successfully restored default settings! (Custom commands preserved)":"成功恢复默认设置!(自定义命令已保留)","This will reset all your custom configurations, but custom commands will be preserved":"这将重置您的所有自定义配置,但自定义命令将被保留","Import/Export":"导入/导出","Export Configuration":"导出配置","Export your toolbar configuration to share with others":"导出您的工具栏配置以与他人共享",Export:"导出","Import Configuration":"导入配置","Import toolbar configuration from JSON":"从JSON导入工具栏配置",Import:"导入","Usage Instructions":"使用说明","Export: Generate a JSON configuration that you can save or share":"导出:生成可保存或共享的JSON配置","Import: Paste a previously exported JSON configuration":"导入:粘贴先前导出的JSON配置","You can choose to export all settings, only toolbar commands, or only custom commands":"您可以选择导出所有设置、仅工具栏命令或仅自定义命令","When importing, the plugin will only update the settings included in the import data":"导入时,插件将仅更新导入数据中包含的设置","Warning: Importing configuration will overwrite your current settings. Consider exporting your current configuration first as a backup.":"警告:导入配置将覆盖您当前的设置。建议先导出当前配置作为备份。","Export Type":"导出类型","Choose what to export":"选择要导出的内容","All Settings":"所有设置","Toolbar Commands Only":"仅工具栏命令","Custom Commands Only":"仅自定义命令","Export Content":"导出内容","Copy this content to share with others":"复制此内容以与他人共享","Loading...":"加载中...","Copy to Clipboard":"复制到剪贴板","Configuration copied to clipboard":"配置已复制到剪贴板","Failed to copy configuration":"复制配置失败","Paste the configuration JSON here":"在此处粘贴配置JSON","Paste configuration here...":"在此处粘贴配置...","Invalid import data":"无效的导入数据","Configuration imported successfully":"配置导入成功","No valid configuration found in import data":"导入数据中未找到有效配置","Failed to import configuration. Invalid format.":"导入配置失败。格式无效。","Import Mode":"导入模式","Choose how to import the configuration":"选择如何导入配置","Update Mode (Add new items and update existing ones)":"更新模式(添加新项目并更新现有项目)","Overwrite Mode (Replace all settings with imported ones)":"覆盖模式(用导入的配置替换所有设置)","Configuration imported successfully (Overwrite mode)":"配置导入成功(覆盖模式)","Configuration imported successfully (Update mode)":"配置导入成功(更新模式)","Warning: Overwrite mode will completely replace your current settings with the imported ones. Consider exporting your current configuration first as a backup.":"警告:覆盖模式将完全替换您当前的设置与导入的设置。建议先导出当前配置作为备份。","Warning: Update mode will add new items and update existing ones based on the imported configuration.":"警告:更新模式将根据导入的配置添加新项目并更新现有项目。","Add Format Command":"添加格式命令",Regex:"正则","Prefix/Suffix":"前缀/后缀","Add Regex Command":"添加正则表达式命令","Please select text first":"请先选中文本","The selected text does not meet the condition requirements":"选中的文本不满足条件要求","Regex command execution error:":"正则表达式命令执行错误:","Copy code":"复制代码","Copied!":"已复制!","Explain the syntax of JavaScript regular expressions":"解释JavaScript正则表达式的语法","Apply regular expression replacement":"应用正则表达式替换","Conditional matching":"条件匹配","Complete regular expression code (copy to AI for explanation)":"完整正则表达式代码(复制到AI解释)","Error:":"错误:","Regex pattern cannot be empty":"正则表达式不能为空","Command already exists":"命令已存在","Choose icon":"选择图标","URL to Markdown link":"URL转Markdown链接","Convert MM/DD/YYYY to YYYY-MM-DD":"将MM/DD/YYYY日期格式转换为YYYY-MM-DD","Add bold to keywords":"添加粗体到关键词","Format phone number":"格式化电话号码","Remove extra spaces":"删除多余空格","Convert HTML bold tags to Markdown format":"将HTML粗体标签转换为Markdown格式","Convert quoted text to quote block":"将引用的文本转换为引用块","Convert CSV to Markdown table row":"将CSV转换为Markdown表格行","Add uniform alias to Markdown links":"添加统一别名到Markdown链接","Delete empty lines (multiline mode)":"删除空行(多行模式)","Add list symbol to each line (multiline mode)":"添加列表符号到每行(多行模式)","If the text contains important, set the text highlight (conditional format)":"如果文本包含重要内容,设置文本高亮(条件格式)","Matching pattern":"匹配模式","Regex pattern to match":"正则表达式匹配","Replacement pattern (use $1, $2, etc. to reference capture groups)":"替换模式(使用$1, $2等引用捕获组)","Ignore case":"忽略大小写","Global replace":"全局替换","Multiline mode":"多行模式","Use condition":"使用条件","Condition pattern":"条件模式","Only apply custom command when text matches the condition":"仅在文本匹配条件时应用自定义命令","Must exist regular expression or text":"必须存在正则表达式或文本","Replacement pattern":"替换模式","Match case-insensitive":"匹配不区分大小写","^ and $ match the start and end of each line":"^ 和 $ 匹配每行的开始和结束","Replace all matches":"替换所有匹配",Command:"命令","Error: ":"错误:","Input example text to view the formatting effect of the command...":"输入示例文本以查看命令的格式化效果...",Description:"描述","[Example]":"[示例]","[Requirements]":"[要求]","[Output]":"[输出]","AI question template:":"AI问题模板:","I need to convert the url to a markdown format link":"我需要将URL转换为Markdown格式链接","For example, convert https://example.com to [https://example.com](https://example.com)":"例如,将https://example.com转换为[https://example.com](https://example.com)","Use js regular expression to implement, and output the parameters in the following format (the result does not need to be escaped with json)":"使用js正则表达式实现,并输出以下格式的参数(结果不需要用json转义)","[Description]":"[描述]","How to use AI to get regular expressions?":"如何使用AI获取正则表达式?","Regular expression examples":"正则表达式示例","Edit regular expression command":"编辑正则表达式命令","Add regular expression command":"添加正则表达式命令","Result:":"结果:","Example text:":"示例文本:",Preview:"预览",Result:"结果","Update Import":"增量导入","Overwrite Import":"覆盖导入","Importing configuration...":"正在导入配置...","Following Style Only":"仅Following样式","Top Style Only":"仅Top样式","Fixed Style Only":"仅Fixed样式","Mobile Style Only":"仅Mobile样式","Unknown import type":"未知导入类型","All Toolbar Commands":"所有工具栏命令","Following style commands successfully initialized":"Following样式初始化成功","Top style commands successfully initialized":"Top样式初始化成功","Fixed style commands successfully initialized":"Fixed样式初始化成功","Mobile style commands successfully initialized":"Mobile样式初始化成功","Commands initialized successfully":"命令初始化成功","Reset Commands":"重置命令","Are you sure you want to reset the current configuration?":"您确定要将当前配置进行重置吗?","Commands reset successfully":"命令重置成功","Initialize Commands":"初始化命令","Initialize commands to default settings":"初始化命令到默认设置","Reset commands to default settings":"重置命令到默认设置",Clear:"清除","Remove all commands from this configuration":"清除当前样式下的所有命令","Are you sure you want to clear all commands under the current style?":"您确定要清除当前样式下的所有命令吗?","Current style commands have been cleared":"当前样式下的命令已清除","Manage Commands":"管理命令","Reset or clear all commands in this configuration":"重置或清除当前样式下的所有命令","Import Commands from Other Styles":"从其他样式导入命令","Copy commands from another style configuration":"从另一个样式配置复制命令","Main menu only":"Main menu only","This import will update:":"此次导入将更新:","Custom commands":"自定义命令","Toolbar commands":"工具栏命令","All settings":"所有设置","Following style only":"跟随样式","Top style only":"顶部样式","Fixed style only":"固定样式","Mobile style only":"移动端样式","Main Menu Commands":"主菜单命令","Following Style Commands":"跟随样式命令","Top Style Commands":"顶部样式命令","Fixed Style Commands":"固定样式命令","Mobile Style Commands":"移动端样式命令","General settings":"常规设置","Please paste configuration data first":"请先粘贴配置数据","Invalid import data format":"无效的导入数据格式","Do you want to continue?":"您确定要继续吗?","Warning: Update mode will add new items and update existing ones.":"警告:更新模式将添加新项目并更新现有项目。","Warning: Overwrite mode will completely replace your current settings with the imported ones.":"警告:覆盖模式将完全替换您当前的设置与导入的设置。","Overwrite Mode (Replace settings with imported ones)":"覆盖模式(用导入的配置替换所有设置)","Warning: Overwrite mode will replace existing settings with imported ones.":"警告:覆盖模式将用导入的配置替换所有设置。","Enable Multiple Config":"启用多配置","One-click clear":"一键清除","This import will:":"此次导入将:","Update general settings":"更新常规设置","Update Main Menu Commands":"更新主菜单命令","Update Custom Commands":"更新自定义命令","Update Following Style Commands":"更新跟随样式命令","Update Top Style Commands":"更新顶部样式命令","Update Fixed Style Commands":"更新固定样式命令","Clear all Main Menu Commands":"清除所有主菜单命令","Clear all Custom Commands":"清除所有自定义命令","Clear all Following Style Commands":"清除所有跟随样式命令","Clear all Top Style Commands":"清除所有顶部样式命令","Clear all Fixed Style Commands":"清除所有固定样式命令","Clear all Mobile Style Commands":"清除所有移动端样式命令","Set Multiple Config to:":"设置多配置为:",Enable:"启用",Disable:"禁用","Set Position Style to:":"设置位置样式为:",Following:"跟随",Top:"顶部",Fixed:"固定",Mobile:"移动端","All commands":"所有命令","⚠️ Overwrite mode will replace existing settings with imported ones.":"⚠️ 覆盖模式将用导入的配置替换所有设置。","ℹ️ Update mode will merge imported settings with existing ones.":"ℹ️ 更新模式将合并导入的设置与现有的设置。","Imported settings:":"导入的设置:","Imported commands:":"导入的命令:","Disable toolbar for this view":"禁用此视图的工具栏","Enable toolbar for this view":"启用此视图的工具栏","Manage all view types":"管理所有视图类型","Current View: ":"当前视图:","Appearance Style":"外观样式","Position Settings":"位置设置"},h=Object.assign({},m);const g={ar:{},cs:{},da:{},de:{},en:p,"en-gb":{},es:{},fr:{},hi:{},id:{},it:{},ja:{},ko:{},nl:{},nn:{},pl:{},pt:{},"pt-br":{},ro:{},ru:{},tr:{},"zh-cn":m,"zh-tw":h}[e.moment.locale()];function f(e){return g&&g[e]||p[e]}class b extends e.FuzzySuggestModal{constructor(e,t,o=!1,i,n){super(e.app),this.customCallback=null,this.plugin=e,this.command=t,this.issub=o,this.customCallback=i||null,this.setPlaceholder(f("Choose an icon")),this.currentEditingConfig=n||""}capitalJoin(e){return e.split(" ").map((e=>e[0].toUpperCase()+e.substring(1))).join(" ")}getItems(){return o}getItemText(e){return this.capitalJoin(e.replace("feather-","").replace("remix-","").replace("bx-","").replace(/([A-Z])/g," $1").trim().replace(/-/gi," "))}renderSuggestion(t,o){const i=createSpan({cls:"editingToolbarIconPick"});o.appendChild(i),e.setIcon(i,t.item),super.renderSuggestion(t,o)}onChooseItem(e){return t(this,void 0,void 0,(function*(){if("Custom"===e)return this.customCallback?void new v(this.app,this.plugin,{id:this.command.id,name:this.command.name,icon:""},this.issub,(e=>{this.customCallback(e)})).open():void new v(this.app,this.plugin,this.command,this.issub,null,this.currentEditingConfig).open();if(this.customCallback)return void this.customCallback(e);const t=this.plugin.getCurrentCommands(this.currentEditingConfig);if(this.command.icon){let o=n(this.plugin,this.command,this.issub,t);this.issub?t[o.index].SubmenuCommands[o.subindex].icon=e:t[o.index].icon=e,this.plugin.updateCurrentCommands(t)}else this.command.icon=e,t.push(this.command),this.plugin.updateCurrentCommands(t);yield this.plugin.saveSettings(),setTimeout((()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))}),100),console.log(`%c命令 '${this.command.name}' 已添加到编辑工具栏`,"color: Violet")}))}}class v extends e.Modal{constructor(e,t,o,i,n,s){super(e),this.customCallback=null,this.plugin=t,this.item=o,this.issub=i,this.customCallback=n||null,this.currentEditingConfig=s||"",this.containerEl.addClass("editingToolbar-Modal"),this.containerEl.addClass("customicon")}onOpen(){const{contentEl:e}=this;e.createEl("b",{text:f("Enter the icon code, format as .... ")});const o=document.createElement("textarea");o.className="wideInputPromptInputEl",o.placeholder="",o.value=this.item.icon||"",o.style.width="100%",o.style.height="200px",e.appendChild(o),o.addEventListener("input",(()=>t(this,void 0,void 0,(function*(){const e=o.value;if(this.customCallback)return void(this.item.icon=e);this.item.icon=e;const t=this.plugin.getCurrentCommands(this.currentEditingConfig),i=n(this.plugin,this.item,this.issub,t);if(this.issub){let t=i.subindex;-1===t?this.plugin.settings.menuCommands[i.index].SubmenuCommands.push(this.item):this.plugin.settings.menuCommands[i.index].SubmenuCommands[t].icon=e}else{let e=i.index;-1===e?this.plugin.settings.menuCommands.push(this.item):this.plugin.settings.menuCommands[e].icon=this.item.icon}yield this.plugin.saveSettings()})))),this.submitEnterCallback&&o.addEventListener("keydown",this.submitEnterCallback)}onClose(){const{contentEl:e}=this;e.empty(),this.customCallback?this.customCallback(this.item.icon||""):setTimeout((()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))}),100)}}class y extends e.FuzzySuggestModal{constructor(e,t){super(e.app),this.plugin=e,this.app,this.setPlaceholder(f("Choose a command")),this.currentEditingConfig=t||""}getItems(){return app.commands.listCommands()}getItemText(e){return e.name}onChooseItem(o){return t(this,void 0,void 0,(function*(){const t=this.plugin.getCurrentCommands(this.currentEditingConfig);t.findIndex((e=>e.id==o.id))>-1?new e.Notice(f("The command")+o.name+f("already exists"),3e3):o.icon?(t.push(o),this.plugin.updateCurrentCommands(t),yield this.plugin.saveSettings(),setTimeout((()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))}),100),console.log(`%c命令 '${o.name}' 已添加到编辑工具栏`,"color: Violet")):new b(this.plugin,o,!1).open()}))}}class C extends e.Modal{constructor(e,t,o,i,n){super(t.app),this.plugin=t,this.item=o,this.issub=i,this.currentEditingConfig=n||"",this.containerEl.addClass("editingToolbar-Modal"),this.containerEl.addClass("changename")}onOpen(){var o;const{contentEl:i}=this;i.createEl("b",{text:f("Please enter a new name:")});const s=new e.TextComponent(i);s.inputEl.classList.add("InputPromptInputEl"),s.setPlaceholder("").setValue(null!==(o=this.item.name)&&void 0!==o?o:"").onChange(e.debounce((e=>t(this,void 0,void 0,(function*(){const t=this.plugin.getCurrentCommands(this.currentEditingConfig);let o=n(this.plugin,this.item,this.issub,t);if(this.item.name=e,this.issub){let i=o.subindex;-1===i?t[o.index].SubmenuCommands.push(this.item):t[o.index].SubmenuCommands[i].name=e}else{let e=o.index;-1===e?t.push(this.item):t[e].name=this.item.name}this.plugin.updateCurrentCommands(t),yield this.plugin.saveSettings()}))),100,!0)).inputEl.addEventListener("keydown",this.submitEnterCallback)}onClose(){const{contentEl:e}=this;e.empty(),setTimeout((()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))}),100)}}class w extends e.Modal{constructor(e,t){super(t.app),this.needSave=!1,this.plugin=t,this.containerEl.addClass("editingToolbar-Modal")}onOpen(){const{contentEl:o}=this;o.createEl("p",{text:f("Drag the slider to move the position")});const i=o.createDiv({cls:"slider-container"}),n=i.createDiv({cls:"vertical-slider-container"});n.createEl("p",{text:f("Vertical Position")});const s=i.createDiv({cls:"horizontal-slider-container"});s.createEl("p",{text:f("Horizontal Position")});const a=i.createDiv({cls:"columns-slider-container"});a.createEl("p",{text:f("Editing Toolbar columns")});const r=document.body.clientHeight,l=document.body.clientWidth,c=Math.floor(r/3),p=-Math.floor(r),m=Math.floor(l/2),h=-Math.floor(l/2),g=new e.SliderComponent(n).setLimits(p,c,5).setValue(this.plugin.settings.verticalPosition||0).onChange(e.debounce((e=>{this.needSave=!0,this.plugin.settings.verticalPosition=e,d(this.plugin.settings)}),100,!0)).setDynamicTooltip(),b=new e.SliderComponent(s).setLimits(h,m,10).setValue(this.plugin.settings.horizontalPosition||0).onChange(e.debounce((e=>{this.needSave=!0,this.plugin.settings.horizontalPosition=e,u(this.plugin.settings)}),100,!0)).setDynamicTooltip(),v=new e.SliderComponent(a).setLimits(1,32,1).setValue(this.plugin.settings.cMenuNumRows||12).onChange(e.debounce((e=>t(this,void 0,void 0,(function*(){this.needSave=!0,this.plugin.settings.cMenuNumRows=e,yield this.plugin.saveSettings(),setTimeout((()=>{dispatchEvent(new Event("editingToolbar-NewCommand"))}),100)}))),100,!0)).setDynamicTooltip();i.createDiv({cls:"reset-container"}).createEl("button",{text:f("Reset"),cls:"reset-button"}).addEventListener("click",(()=>{this.needSave=!0,g.setValue(0),b.setValue(0),v.setValue(12),this.plugin.settings.verticalPosition=0,this.plugin.settings.horizontalPosition=0,this.plugin.settings.cMenuNumRows=12,d(this.plugin.settings),u(this.plugin.settings)}))}onClose(){return t(this,void 0,void 0,(function*(){const{contentEl:e}=this;e.empty(),this.needSave&&(yield this.plugin.saveSettings())}))}}const x=["body","workspace"],k=["glass","default","tiny"],S=["fixed","following","top"],E={lastVersion:"0.0.0",aestheticStyle:"default",positionStyle:"top",menuCommands:[{id:"editing-toolbar:editor-undo",name:"Undo editor",icon:"undo-glyph"},{id:"editing-toolbar:editor-redo",name:"Redo editor",icon:"redo-glyph"},{id:"editing-toolbar:toggle-format-brush",name:"Format Brush",icon:"paintbrush"},{id:"editing-toolbar:format-eraser",name:"Clear text formatting",icon:"eraser"},{id:"editing-toolbar:header2-text",name:"Header 2",icon:"header-2"},{id:"editing-toolbar:header3-text",name:"Header 3",icon:"header-3"},{id:"SubmenuCommands-header",name:"submenu",icon:"header-n",SubmenuCommands:[{id:"editing-toolbar:header1-text",name:"Header 1",icon:"header-1"},{id:"editing-toolbar:header4-text",name:"Header 4",icon:"header-4"},{id:"editing-toolbar:header5-text",name:"Header 5",icon:"header-5"},{id:"editing-toolbar:header6-text",name:"Header 6",icon:"header-6"}]},{id:"editing-toolbar:toggle-bold",name:"Bold",icon:"bold-glyph"},{id:"editing-toolbar:toggle-italics",name:"Italics",icon:"italic-glyph"},{id:"editing-toolbar:toggle-strikethrough",name:"Strikethrough",icon:"strikethrough-glyph"},{id:"editing-toolbar:underline",name:"Underline",icon:"underline-glyph"},{id:"editing-toolbar:toggle-highlight",name:"==Highlight==",icon:"highlight-glyph"},{id:"SubmenuCommands-lucdf3en5",name:"submenu",icon:"edit",SubmenuCommands:[{id:"editing-toolbar:editor-copy",name:"Copy",icon:"lucide-copy"},{id:"editing-toolbar:editor-cut",name:"Cut",icon:"lucide-scissors"},{id:"editing-toolbar:editor-paste",name:"Paste",icon:"lucide-clipboard-type"},{id:"editing-toolbar:editor:swap-line-down",name:"Swap line down",icon:"lucide-corner-right-down"},{id:"editing-toolbar:editor:swap-line-up",name:"Swap line up",icon:"lucide-corner-right-up"}]},{id:"editing-toolbar:editor:attach-file",name:"Attach file",icon:"lucide-paperclip"},{id:"editing-toolbar:editor:insert-table",name:"Insert Table",icon:"lucide-table"},{id:"editing-toolbar:editor:cycle-list-checklist",name:"Cycle list checklist",icon:"check-circle"},{id:"SubmenuCommands-luc8efull",name:"submenu",icon:"message-square",SubmenuCommands:[{id:"editing-toolbar:editor:toggle-blockquote",name:"Blockquote",icon:"lucide-text-quote"},{id:"editing-toolbar:insert-callout",name:"Insert Callout ",icon:"lucide-quote"}]},{id:"SubmenuCommands-mdcmder",name:"submenu",icon:'',SubmenuCommands:[{id:"editing-toolbar:superscript",name:"Superscript",icon:"superscript-glyph"},{id:"editing-toolbar:subscript",name:"Subscript",icon:"subscript-glyph"},{id:"editing-toolbar:editor:toggle-code",name:"Inline code",icon:"code-glyph"},{id:"editing-toolbar:codeblock",name:"Code block",icon:"codeblock-glyph"},{id:"editing-toolbar:editor:insert-wikilink",name:"Insert wikilink [[]]",icon:''},{id:"editing-toolbar:editor:insert-embed",name:"Insert embed ![[]]",icon:"note-glyph"},{id:"editing-toolbar:insert-link",name:"Insert link []()",icon:"link-glyph"},{id:"editing-toolbar:hrline",name:"Horizontal divider",icon:''},{id:"editing-toolbar:toggle-inline-math",name:"Inline math",icon:"lucide-sigma"},{id:"editing-toolbar:editor:insert-mathblock",name:"MathBlock",icon:"lucide-sigma-square"}]},{id:"SubmenuCommands-list",name:"submenu-list",icon:"bullet-list-glyph",SubmenuCommands:[{id:"editing-toolbar:editor:toggle-checklist-status",name:"Checklist",icon:"checkbox-glyph"},{id:"editing-toolbar:toggle-numbered-list",name:"Numbered list",icon:''},{id:"editing-toolbar:toggle-bullet-list",name:"Bullet list",icon:''},{id:"editing-toolbar:undent-list",name:"Unindent-list",icon:''},{id:"editing-toolbar:indent-list",name:"Indent list",icon:''}]},{id:"SubmenuCommands-aligin",name:"submenu-aligin",icon:'',SubmenuCommands:[{id:"editing-toolbar:justify",name:'

',icon:''},{id:"editing-toolbar:left",name:'

',icon:''},{id:"editing-toolbar:center",name:"
",icon:''},{id:"editing-toolbar:right",name:'

',icon:''}]},{id:"editing-toolbar:change-font-color",name:"Change font color[html]",icon:''},{id:"editing-toolbar:change-background-color",name:"Change Backgroundcolor[html]",icon:''},{id:"editing-toolbar:fullscreen-focus",name:"Fullscreen focus mode",icon:"fullscreen"},{id:"editing-toolbar:workplace-fullscreen-focus",name:"Workplace-Fullscreen ",icon:"exit-fullscreen"}],followingCommands:[],topCommands:[],fixedCommands:[],mobileCommands:[],enableMultipleConfig:!1,appendMethod:"workspace",shouldShowMenuOnSelect:!1,cMenuVisibility:!0,cMenuBottomValue:4.25,cMenuNumRows:12,cMenuWidth:610,cMenuFontColor:"#2DC26B",cMenuBackgroundColor:"#d3f8b6",autohide:!1,custom_bg1:"#FFB78B8C",custom_bg2:"#CDF4698C",custom_bg3:"#A0CCF68C",custom_bg4:"#F0A7D88C",custom_bg5:"#ADEFEF8C",custom_fc1:"#D83931",custom_fc2:"#DE7802",custom_fc3:"#245BDB",custom_fc4:"#6425D0",custom_fc5:"#646A73",isLoadOnMobile:!1,horizontalPosition:0,verticalPosition:0,formatBrushes:{},customCommands:[],viewTypeSettings:{}};class T{static isAllowedViewType(e,t){var o,i,n,s;if(!e)return!1;const a=e.getViewType(),r=null===(n=null===(i=null===(o=window.app)||void 0===o?void 0:o.plugins)||void 0===i?void 0:i.plugins)||void 0===n?void 0:n["editing-toolbar"];if((null===(s=null==r?void 0:r.settings)||void 0===s?void 0:s.viewTypeSettings)&&void 0!==r.settings.viewTypeSettings[a])return r.settings.viewTypeSettings[a];return(t||["markdown","canvas","thino_view","meld-encrypted-view","excalidraw","image"]).includes(a)}static isSourceMode(e){var t;return!!e&&"source"===(null===(t=e.getMode)||void 0===t?void 0:t.call(e))}}let M;const q={markdown:".markdown-source-view",thino_view:".markdown-source-view",canvas:".canvas-wrapper",excalidraw:".excalidraw-wrapper",image:".image-container",pdf:".view-content"};function I(){M=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;const t=M.getElementById("editingToolbarModalBar");t&&t.remove();const o=function(){const t=[];t.push(app.workspace.rootSplit);const o=app.workspace.floatingSplit;return null==o||o.children.forEach((o=>{o instanceof e.WorkspaceWindow&&t.push(o)})),t}();o&&o.forEach((e=>{(null==e?void 0:e.containerEl)&&(e=>{let t=e.querySelectorAll("#editingToolbarModalBar"),o=e.querySelectorAll("#editingToolbarPopoverBar");t.forEach((e=>{e&&(e.firstChild&&e.removeChild(e.firstChild),e.remove())})),o.forEach((e=>{e&&(e.firstChild&&e.removeChild(e.firstChild),e.remove())}))})(null==e?void 0:e.containerEl)}))}function A(t,o){var i,n;M=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;let s="top"==o.positionStyle?null===(n=null===(i=t.workspace.activeLeaf)||void 0===i?void 0:i.view.containerEl)||void 0===n?void 0:n.querySelector("#editingToolbarModalBar"):M.getElementById("editingToolbarModalBar");return s||null}const D=(e,t)=>t.reduce(((e,t)=>e&&"undefined"!==e[t]?e[t]:void 0),e);function _(e,t){return e&&void 0!==e[1][0]?t+e.flat(2).join("+").replace("Mod","Ctrl")+t:t+"–"+t}function B(e,t,o=!0){let i=e.commands.findCommand(t),n=o?"*":"";if(i){let t=i.hotkeys?[[D(i.hotkeys,[0,"modifiers"])],[D(i.hotkeys,[0,"key"])]]:void 0,o=e.hotkeyManager.customKeys[i.id];var s=o?[[D(o,[0,"modifiers"])],[D(o,[0,"key"])]]:void 0;return s?_(s,n):_(t,"")}return"–"}function O(e){return/<[^>]+>/g.test(e)}function N(t,o,i){M=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;const n=o.commandsManager.getActiveEditor();let s=A(t,o.settings),l=null==s?void 0:s.querySelector("#"+i);if(l){let e=l.rows,t=e.length;for(let s=1;s{t.style.fill=e}))}else if("x-backgroundcolor-picker-table"==i){o.settings.cMenuBackgroundColor=e,r(e,n),M.querySelectorAll("#change-background-color-icon").forEach((t=>{t.style.fill=e}))}o.saveSettings()}}}}}const L=function(e){let t=e;if(/^(rgb|RGB)/.test(t)){let e=t.replace(/(?:\(|\)|rgb|RGB)*/g,"").split(","),o="#";for(let t=0;t\s*\[\![\w\s]*\]/m)){let e=o.split("\n"),i=[],n=!1,s=0,a=!1;for(let t=0;t+)\s*\[\!([\w\s]*)\]\s*(.*?)$/);if(!r||a)if(n){let e=o.match(/^(>+)\s*/);if(e&&e[1].length>=s){let e=o.replace(new RegExp(`^>{${s}}\\s*`),"");i.push(e)}else n=!1,i.push(o)}else i.push(o);else s=r[1].length,a=!0,r[3].trim()&&i.push(r[3].trim()),n=!0}return void t.replaceSelection(i.join("\n"))}o=o.replace(/(^#+\s|^#(?=\s)|^\>|^\- \[( |x)\]|^\+ |\<[^\<\>]+?\>|^1\. |^\s*\- |^\-+$|^\*+$)/gm,""),o=o.replace(/^[ ]+|[ ]+$/gm,""),o=o.replace(/\!?\[\[([^\[\]\|]*\|)*([^\(\)\[\]]+)\]\]/g,"$2"),o=o.replace(/\!?\[+([^\[\]\(\)]+)\]+\(([^\(\)]+)\)/g,"$1"),o=o.replace(/`([^`]+)`/g,"$1"),o=o.replace(/_([^_]+)_/g,"$1"),o=o.replace(/==([^=]+)==/g,"$1"),o=o.replace(/\*\*\*([^\*]+)\*\*\*/g,"$1"),o=o.replace(/\*\*?([^\*]+)\*\*?/g,"$1"),o=o.replace(/~~([^~]+)~~/g,"$1"),t.replaceSelection(o)}function P(t,o,i){var n,s,a,r;let l=A(t,o);const c=t.workspace.getActiveViewOfType(e.ItemView);if(T.isAllowedViewType(c)){if("following"===o.positionStyle){if("markdown"===(null==c?void 0:c.getViewType()))if(T.isSourceMode(c)){if(l&&(l.style.visibility=i.somethingSelected()?"visible":"hidden",l.style.height="tiny"===o.aestheticStyle?"30px":"40px",l.addClass("editingToolbarFlex"),l.removeClass("editingToolbarGrid"),"visible"===l.style.visibility)){const e=i.containerEl.getBoundingClientRect(),t=l.offsetWidth,o=l.offsetHeight,c=(e=>{var t,o,i;let n,s=e.getCursor("head");if(e.getCursor("head").ch!==e.getCursor("from").ch&&(s.ch=Math.max(0,s.ch-1)),e.cursorCoords)n=e.cursorCoords(!0,"window");else{if(!e.coordsAtPos)return;{const a=e.posToOffset(s);n=null!==(i=null===(o=(t=e.cm).coordsAtPos)||void 0===o?void 0:o.call(t,a))&&void 0!==i?i:e.coordsAtPos(a)}}return n})(i),d=i.getCursor("head").ch==i.getCursor("from").ch,u=12,p=(null!==(s=null===(n=M.getElementsByClassName("mod-left-split")[0])||void 0===n?void 0:n.clientWidth)&&void 0!==s?s:0)+(null!==(r=null===(a=M.getElementsByClassName("side-dock-ribbon mod-left")[0])||void 0===a?void 0:a.clientWidth)&&void 0!==r?r:0);let m=c.left-p;m+t+u>=e.right&&(m=Math.max(0,e.right-t-p-u));let h=0;d?(h=c.top-o-10,h<=e.top&&(h=e.top+o)):(h=c.top+25,h>=e.bottom-o&&(h=e.bottom-2*o)),l.style.left=m+"px",l.style.top=h+"px"}}else l&&(l.style.visibility="hidden");else l&&(l.style.visibility="visible",l.style.height="tiny"===o.aestheticStyle?"30px":"40px",l.addClass("editingToolbarFlex"),l.removeClass("editingToolbarGrid"))}}else l&&(l.style.visibility="hidden")}function V(t,o){let i=o.settings;M=e.requireApiVersion("0.15.0")?activeWindow.document:window.document,function(){const n=()=>{var n,s;let a=0,r=0,l=createEl("div");l&&("top"==i.positionStyle?(l.setAttribute("style","position: relative; grid-template-columns: repeat(auto-fit, minmax(28px, 1fr));"),l.className+=" top",i.autohide&&(l.className+=" autohide")):"following"==i.positionStyle&&(l.style.visibility="hidden")),l.setAttribute("id","editingToolbarModalBar");let c=createEl("div");if(c.addClass("editingToolbarpopover"),c.addClass("editingToolbarTinyAesthetic"),c.setAttribute("id","editingToolbarPopoverBar"),c.style.visibility="hidden",c.style.height="0","default"==i.aestheticStyle?(l.addClass("editingToolbarDefaultAesthetic"),l.removeClass("editingToolbarTinyAesthetic"),l.removeClass("editingToolbarGlassAesthetic")):"tiny"==i.aestheticStyle?(l.addClass("editingToolbarTinyAesthetic"),l.removeClass("editingToolbarDefaultAesthetic"),l.removeClass("editingToolbarGlassAesthetic")):(l.addClass("editingToolbarGlassAesthetic"),l.removeClass("editingToolbarTinyAesthetic"),l.removeClass("editingToolbarDefaultAesthetic")),"top"==i.positionStyle){let e=t.workspace.activeLeaf.view.containerEl,o=null;const i=t.workspace.activeLeaf.view.getViewType(),n=q[i];if(n&&(o=null==e?void 0:e.querySelector(n)),!o){const t=null==e?void 0:e.querySelector(".view-content");if(t){const e=t.querySelectorAll(":scope > div");o=e.length>0?e[0]:t}}if(!o)return void console.log("Editing Toolbar: Failed to find target DOM element for toolbar insertion");(null==e?void 0:e.querySelector("#editingToolbarPopoverBar"))||o.insertAdjacentElement("afterbegin",c),o.insertAdjacentElement("afterbegin",l),r=null==o?void 0:o.offsetWidth}else"body"==i.appendMethod?M.body.appendChild(l):"workspace"==i.appendMethod&&(null===(n=M.body)||void 0===n||n.querySelector(".mod-vertical.mod-root").insertAdjacentElement("afterbegin",l));let d=null===(s=t.workspace.activeLeaf.view.containerEl)||void 0===s?void 0:s.querySelector("#editingToolbarPopoverBar");o.getCurrentCommands().forEach(((n,s)=>{let c;if("SubmenuCommands"in n){let u;a>=r-104&&r>100?(o.setIS_MORE_Button(!0),u=new e.ButtonComponent(d)):u=new e.ButtonComponent(l),u.setClass("editingToolbarCommandsubItem"+s),s>=i.cMenuNumRows?u.setClass("editingToolbarSecond"):"top"!=i.positionStyle&&u.buttonEl.setAttribute("aria-label-position","top"),O(n.icon)?u.buttonEl.innerHTML=n.icon:u.setIcon(n.icon),a+=28;let p=function(e){let t=createEl("div");return t.addClass(e),t}("subitem");p&&n.SubmenuCommands.forEach((o=>{let n=B(t,o.id);c="–"==n?o.name:o.name+"("+n+")";let a=new e.ButtonComponent(p).setTooltip(c).setClass("menu-item").onClick((()=>{t.commands.executeCommandById(o.id),0==i.cMenuVisibility||"following"==i.positionStyle?l.style.visibility="hidden":l.style.visibility="visible"}));s{t.commands.executeCommandById(n.id),0==i.cMenuVisibility||"following"==i.positionStyle?l.style.visibility="hidden":l.style.visibility="visible"})),O(n.icon)?s.buttonEl.innerHTML=n.icon:s.setIcon(n.icon),a+=26;let r=createEl("div");if(r.addClass("subitem"),r){r.innerHTML=function(e){return`
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Theme Colors
Standard Colors
Custom Font Colors
\n
\n
`}(o),s.buttonEl.insertAdjacentElement("afterbegin",r),N(t,o,"x-color-picker-table");let i=r.querySelector(".x-color-picker-wrapper");new e.ButtonComponent(i).setIcon("paintbrush").setTooltip(f("Format Brush")).onClick((()=>{F(o),o.setEN_FontColor_Format_Brush(!0),o.Temp_Notice=new e.Notice(f("Font-Color formatting brush ON!"),0)})),new e.ButtonComponent(i).setIcon("palette").setTooltip(f("Custom Font Color")).onClick((()=>{t.setting.open(),t.setting.openTabById("editing-toolbar"),setTimeout((()=>{const e=t.setting.activeTab.containerEl.querySelector(".editing-toolbar-tabs");if(e){const o=e.children[1];null==o||o.click(),setTimeout((()=>{var e;let o=t.setting.activeTab.containerEl.querySelector(".custom_font");o&&(null===(e=o.addClass)||void 0===e||e.call(o,"toolbar-cta"))}),100)}}),200)}))}}else if("editing-toolbar:change-background-color"==n.id){let s=new e.ButtonComponent(l);s.setClass("editingToolbarCommandsubItem-font-color").setTooltip(f("Background color")).onClick((()=>{t.commands.executeCommandById(n.id),0==i.cMenuVisibility||"following"==i.positionStyle?l.style.visibility="hidden":l.style.visibility="visible"})),O(n.icon)?s.buttonEl.innerHTML=n.icon:s.setIcon(n.icon),a+=26;let r=createEl("div");if(r.addClass("subitem"),r){r.innerHTML=function(e){return`
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Translucent Colors
Highlighter Colors
Custom Colors
\n
\n
`}(o),s.buttonEl.insertAdjacentElement("afterbegin",r),N(t,o,"x-backgroundcolor-picker-table");let i=r.querySelector(".x-color-picker-wrapper");new e.ButtonComponent(i).setIcon("paintbrush").setTooltip(f("Format Brush")).onClick((()=>{F(o),o.setEN_BG_Format_Brush(!0),o.Temp_Notice=new e.Notice(f("Font-Color formatting brush ON!"),0)})),new e.ButtonComponent(i).setIcon("palette").setTooltip(f("Custom Backgroud Color")).onClick((()=>{t.setting.open(),t.setting.openTabById("editing-toolbar"),setTimeout((()=>{const e=t.setting.activeTab.containerEl.querySelector(".editing-toolbar-tabs");if(e){const o=e.children[1];null==o||o.click(),setTimeout((()=>{var e;let o=t.setting.activeTab.containerEl.querySelector(".custom_bg");o&&(null===(e=o.addClass)||void 0===e||e.call(o,"toolbar-cta"))}),100)}}),200)}))}}else{let u;a>=r-104&&r>100?(o.setIS_MORE_Button(!0),u=new e.ButtonComponent(d)):u=new e.ButtonComponent(l);let p=B(t,n.id);c="–"==p?n.name:n.name+"("+p+")",u.setTooltip(c).onClick((()=>{t.commands.executeCommandById(n.id),0==i.cMenuVisibility||"following"==i.positionStyle?l.style.visibility="hidden":l.style.visibility="visible"})),u.setClass("editingToolbarCommandItem"),s>=i.cMenuNumRows?u.setClass("editingToolbarSecond"):"top"!=i.positionStyle&&u.buttonEl.setAttribute("aria-label-position","top"),"editingToolbar-Divider-Line"==n.id&&u.setClass("editingToolbar-Divider-Line"),O(n.icon)?u.buttonEl.innerHTML=n.icon:u.setIcon(n.icon),a+=26}})),function(t,o,i){const n=t.workspace.getActiveViewOfType(e.ItemView);if(!T.isAllowedViewType(n))return;let s=n.containerEl.querySelector("#editingToolbarPopoverBar");if(!o.IS_MORE_Button)return;let a=i.createEl("span");a.addClass("more-menu");let r=new e.ButtonComponent(a);r.setClass("editingToolbarCommandItem").setTooltip(f("More")).onClick((()=>{"hidden"==s.style.visibility?(s.style.visibility="visible",s.style.height="32px"):(s.style.visibility="hidden",s.style.height="0")})),r.buttonEl.innerHTML='',o.setIS_MORE_Button(!1)}(t,o,l),Math.abs(o.settings.cMenuWidth-Number(a))>30&&(o.settings.cMenuWidth=Number(a),setTimeout((()=>{o.saveSettings()}),100))};if(!o.isLoadMobile())return;const s=t.workspace.getActiveViewOfType(e.ItemView);T.isAllowedViewType(s)&&(A(t,o.settings)||(n(),u(o.settings),d(o.settings),function(t,o){M=e.requireApiVersion("0.15.0")?activeWindow.document:window.document;let i=M.querySelectorAll("#change-font-color-icon");i&&i.forEach((e=>{e.style.fill=t}));let n=M.querySelectorAll("#change-background-color-icon");n&&n.forEach((e=>{e.style.fill=o}))} +/**! + * Sortable 1.15.6 + * @author RubaXa + * @author owenm + * @license MIT + */(i.cMenuFontColor,i.cMenuBackgroundColor)))}()}function $(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,i)}return o}function z(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}function Z(e){if("undefined"!=typeof window&&window.navigator)return!!navigator.userAgent.match(e)}var Y=Z(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),G=Z(/Edge/i),X=Z(/firefox/i),J=Z(/safari/i)&&!Z(/chrome/i)&&!Z(/android/i),K=Z(/iP(ad|od|hone)/i),Q=Z(/chrome/i)&&Z(/android/i),ee={capture:!1,passive:!1};function te(e,t,o){e.addEventListener(t,o,!Y&&ee)}function oe(e,t,o){e.removeEventListener(t,o,!Y&&ee)}function ie(e,t){if(t){if(">"===t[0]&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch(e){return!1}return!1}}function ne(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function se(e,t,o,i){if(e){o=o||document;do{if(null!=t&&(">"===t[0]?e.parentNode===o&&ie(e,t):ie(e,t))||i&&e===o)return e;if(e===o)break}while(e=ne(e))}return null}var ae,re=/\s+/g;function le(e,t,o){if(e&&t)if(e.classList)e.classList[o?"add":"remove"](t);else{var i=(" "+e.className+" ").replace(re," ").replace(" "+t+" "," ");e.className=(i+(o?" "+t:"")).replace(re," ")}}function ce(e,t,o){var i=e&&e.style;if(i){if(void 0===o)return document.defaultView&&document.defaultView.getComputedStyle?o=document.defaultView.getComputedStyle(e,""):e.currentStyle&&(o=e.currentStyle),void 0===t?o:o[t];t in i||-1!==t.indexOf("webkit")||(t="-webkit-"+t),i[t]=o+("string"==typeof o?"":"px")}}function de(e,t){var o="";if("string"==typeof e)o=e;else do{var i=ce(e,"transform");i&&"none"!==i&&(o=i+" "+o)}while(!t&&(e=e.parentNode));var n=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return n&&new n(o)}function ue(e,t,o){if(e){var i=e.getElementsByTagName(t),n=0,s=i.length;if(o)for(;n=s:n<=s))return i;if(i===pe())break;i=ye(i,!1)}return!1}function ge(e,t,o,i){for(var n=0,s=0,a=e.children;s2&&void 0!==arguments[2]?arguments[2]:{},i=o.evt,n=j(o,Ae);Ie.pluginEvent.bind(kt)(e,t,z({dragEl:Be,parentEl:Oe,ghostEl:Ne,rootEl:Le,nextEl:Fe,lastDownEl:Re,cloneEl:Pe,cloneHidden:Ve,dragStarted:Qe,putSortable:je,activeSortable:kt.active,originalEvent:i,oldIndex:$e,oldDraggableIndex:He,newIndex:ze,newDraggableIndex:Ue,hideGhostForTarget:yt,unhideGhostForTarget:Ct,cloneNowHidden:function(){Ve=!0},cloneNowShown:function(){Ve=!1},dispatchSortableEvent:function(e){_e({sortable:t,name:e,originalEvent:i})}},n))};function _e(e){!function(e){var t=e.sortable,o=e.rootEl,i=e.name,n=e.targetEl,s=e.cloneEl,a=e.toEl,r=e.fromEl,l=e.oldIndex,c=e.newIndex,d=e.oldDraggableIndex,u=e.newDraggableIndex,p=e.originalEvent,m=e.putSortable,h=e.extraEventProperties;if(t=t||o&&o[Ee]){var g,f=t.options,b="on"+i.charAt(0).toUpperCase()+i.substr(1);!window.CustomEvent||Y||G?(g=document.createEvent("Event")).initEvent(i,!0,!0):g=new CustomEvent(i,{bubbles:!0,cancelable:!0}),g.to=a||o,g.from=r||o,g.item=n||o,g.clone=s,g.oldIndex=l,g.newIndex=c,g.oldDraggableIndex=d,g.newDraggableIndex=u,g.originalEvent=p,g.pullMode=m?m.lastPutMode:void 0;var v=z(z({},h),Ie.getEventProperties(i,t));for(var y in v)g[y]=v[y];o&&o.dispatchEvent(g),f[b]&&f[b].call(t,g)}}(z({putSortable:je,cloneEl:Pe,targetEl:Be,rootEl:Le,oldIndex:$e,oldDraggableIndex:He,newIndex:ze,newDraggableIndex:Ue},e))}var Be,Oe,Ne,Le,Fe,Re,Pe,Ve,$e,ze,He,Ue,We,je,Ze,Ye,Ge,Xe,Je,Ke,Qe,et,tt,ot,it,nt=!1,st=!1,at=[],rt=!1,lt=!1,ct=[],dt=!1,ut=[],pt="undefined"!=typeof document,mt=K,ht=G||Y?"cssFloat":"float",gt=pt&&!Q&&!K&&"draggable"in document.createElement("div"),ft=function(){if(pt){if(Y)return!1;var e=document.createElement("x");return e.style.cssText="pointer-events:auto","auto"===e.style.pointerEvents}}(),bt=function(e,t){var o=ce(e),i=parseInt(o.width)-parseInt(o.paddingLeft)-parseInt(o.paddingRight)-parseInt(o.borderLeftWidth)-parseInt(o.borderRightWidth),n=ge(e,0,t),s=ge(e,1,t),a=n&&ce(n),r=s&&ce(s),l=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+me(n).width,c=r&&parseInt(r.marginLeft)+parseInt(r.marginRight)+me(s).width;if("flex"===o.display)return"column"===o.flexDirection||"column-reverse"===o.flexDirection?"vertical":"horizontal";if("grid"===o.display)return o.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(n&&a.float&&"none"!==a.float){var d="left"===a.float?"left":"right";return!s||"both"!==r.clear&&r.clear!==d?"horizontal":"vertical"}return n&&("block"===a.display||"flex"===a.display||"table"===a.display||"grid"===a.display||l>=i&&"none"===o[ht]||s&&"none"===o[ht]&&l+c>i)?"vertical":"horizontal"},vt=function(e){function t(e,o){return function(i,n,s,a){var r=i.options.group.name&&n.options.group.name&&i.options.group.name===n.options.group.name;if(null==e&&(o||r))return!0;if(null==e||!1===e)return!1;if(o&&"clone"===e)return e;if("function"==typeof e)return t(e(i,n,s,a),o)(i,n,s,a);var l=(o?i:n).options.group.name;return!0===e||"string"==typeof e&&e===l||e.join&&e.indexOf(l)>-1}}var o={},i=e.group;i&&"object"==H(i)||(i={name:i}),o.name=i.name,o.checkPull=t(i.pull,!0),o.checkPut=t(i.put),o.revertClone=i.revertClone,e.group=o},yt=function(){!ft&&Ne&&ce(Ne,"display","none")},Ct=function(){!ft&&Ne&&ce(Ne,"display","")};pt&&!Q&&document.addEventListener("click",(function(e){if(st)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),st=!1,!1}),!0);var wt=function(e){if(Be){e=e.touches?e.touches[0]:e;var t=(n=e.clientX,s=e.clientY,at.some((function(e){var t=e[Ee].options.emptyInsertThreshold;if(t&&!fe(e)){var o=me(e),i=n>=o.left-t&&n<=o.right+t,r=s>=o.top-t&&s<=o.bottom+t;return i&&r?a=e:void 0}})),a);if(t){var o={};for(var i in e)e.hasOwnProperty(i)&&(o[i]=e[i]);o.target=o.rootEl=t,o.preventDefault=void 0,o.stopPropagation=void 0,t[Ee]._onDragOver(o)}}var n,s,a},xt=function(e){Be&&Be.parentNode[Ee]._isOutsideThisEl(e.target)};function kt(e,t){if(!e||!e.nodeType||1!==e.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(e));this.el=e,this.options=t=W({},t),e[Ee]=this;var o={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return bt(e,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(e,t){e.setData("Text",t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==kt.supportPointer&&"PointerEvent"in window&&(!J||K),emptyInsertThreshold:5};for(var i in Ie.initializePlugins(this,e,o),o)!(i in t)&&(t[i]=o[i]);for(var n in vt(t),this)"_"===n.charAt(0)&&"function"==typeof this[n]&&(this[n]=this[n].bind(this));this.nativeDraggable=!t.forceFallback&>,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?te(e,"pointerdown",this._onTapStart):(te(e,"mousedown",this._onTapStart),te(e,"touchstart",this._onTapStart)),this.nativeDraggable&&(te(e,"dragover",this),te(e,"dragenter",this)),at.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),W(this,Te())}function St(e,t,o,i,n,s,a,r){var l,c,d=e[Ee],u=d.options.onMove;return!window.CustomEvent||Y||G?(l=document.createEvent("Event")).initEvent("move",!0,!0):l=new CustomEvent("move",{bubbles:!0,cancelable:!0}),l.to=t,l.from=e,l.dragged=o,l.draggedRect=i,l.related=n||t,l.relatedRect=s||me(t),l.willInsertAfter=r,l.originalEvent=a,e.dispatchEvent(l),u&&(c=u.call(d,l,a)),c}function Et(e){e.draggable=!1}function Tt(){dt=!1}function Mt(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,o=t.length,i=0;o--;)i+=t.charCodeAt(o);return i.toString(36)}function qt(e){return setTimeout(e,0)}function It(e){return clearTimeout(e)}kt.prototype={constructor:kt,_isOutsideThisEl:function(e){this.el.contains(e)||e===this.el||(et=null)},_getDirection:function(e,t){return"function"==typeof this.options.direction?this.options.direction.call(this,e,t,Be):this.options.direction},_onTapStart:function(e){if(e.cancelable){var t=this,o=this.el,i=this.options,n=i.preventOnFilter,s=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,r=(a||e).target,l=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||r,c=i.filter;if(function(e){ut.length=0;var t=e.getElementsByTagName("input"),o=t.length;for(;o--;){var i=t[o];i.checked&&ut.push(i)}}(o),!Be&&!(/mousedown|pointerdown/.test(s)&&0!==e.button||i.disabled)&&!l.isContentEditable&&(this.nativeDraggable||!J||!r||"SELECT"!==r.tagName.toUpperCase())&&!((r=se(r,i.draggable,o,!1))&&r.animated||Re===r)){if($e=be(r),He=be(r,i.draggable),"function"==typeof c){if(c.call(this,e,r,this))return _e({sortable:t,rootEl:l,name:"filter",targetEl:r,toEl:o,fromEl:o}),De("filter",t,{evt:e}),void(n&&e.preventDefault())}else if(c&&(c=c.split(",").some((function(i){if(i=se(l,i.trim(),o,!1))return _e({sortable:t,rootEl:i,name:"filter",targetEl:r,fromEl:o,toEl:o}),De("filter",t,{evt:e}),!0}))))return void(n&&e.preventDefault());i.handle&&!se(l,i.handle,o,!1)||this._prepareDragStart(e,a,r)}}},_prepareDragStart:function(e,t,o){var i,n=this,s=n.el,a=n.options,r=s.ownerDocument;if(o&&!Be&&o.parentNode===s){var l=me(o);if(Le=s,Oe=(Be=o).parentNode,Fe=Be.nextSibling,Re=o,We=a.group,kt.dragged=Be,Ze={target:Be,clientX:(t||e).clientX,clientY:(t||e).clientY},Je=Ze.clientX-l.left,Ke=Ze.clientY-l.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,Be.style["will-change"]="all",i=function(){De("delayEnded",n,{evt:e}),kt.eventCanceled?n._onDrop():(n._disableDelayedDragEvents(),!X&&n.nativeDraggable&&(Be.draggable=!0),n._triggerDragStart(e,t),_e({sortable:n,name:"choose",originalEvent:e}),le(Be,a.chosenClass,!0))},a.ignore.split(",").forEach((function(e){ue(Be,e.trim(),Et)})),te(r,"dragover",wt),te(r,"mousemove",wt),te(r,"touchmove",wt),a.supportPointer?(te(r,"pointerup",n._onDrop),!this.nativeDraggable&&te(r,"pointercancel",n._onDrop)):(te(r,"mouseup",n._onDrop),te(r,"touchend",n._onDrop),te(r,"touchcancel",n._onDrop)),X&&this.nativeDraggable&&(this.options.touchStartThreshold=4,Be.draggable=!0),De("delayStart",this,{evt:e}),!a.delay||a.delayOnTouchOnly&&!t||this.nativeDraggable&&(G||Y))i();else{if(kt.eventCanceled)return void this._onDrop();a.supportPointer?(te(r,"pointerup",n._disableDelayedDrag),te(r,"pointercancel",n._disableDelayedDrag)):(te(r,"mouseup",n._disableDelayedDrag),te(r,"touchend",n._disableDelayedDrag),te(r,"touchcancel",n._disableDelayedDrag)),te(r,"mousemove",n._delayedDragTouchMoveHandler),te(r,"touchmove",n._delayedDragTouchMoveHandler),a.supportPointer&&te(r,"pointermove",n._delayedDragTouchMoveHandler),n._dragStartTimer=setTimeout(i,a.delay)}}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){Be&&Et(Be),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;oe(e,"mouseup",this._disableDelayedDrag),oe(e,"touchend",this._disableDelayedDrag),oe(e,"touchcancel",this._disableDelayedDrag),oe(e,"pointerup",this._disableDelayedDrag),oe(e,"pointercancel",this._disableDelayedDrag),oe(e,"mousemove",this._delayedDragTouchMoveHandler),oe(e,"touchmove",this._delayedDragTouchMoveHandler),oe(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||"touch"==e.pointerType&&e,!this.nativeDraggable||t?this.options.supportPointer?te(document,"pointermove",this._onTouchMove):te(document,t?"touchmove":"mousemove",this._onTouchMove):(te(Be,"dragend",this),te(Le,"dragstart",this._onDragStart));try{document.selection?qt((function(){document.selection.empty()})):window.getSelection().removeAllRanges()}catch(e){}},_dragStarted:function(e,t){if(nt=!1,Le&&Be){De("dragStarted",this,{evt:t}),this.nativeDraggable&&te(document,"dragover",xt);var o=this.options;!e&&le(Be,o.dragClass,!1),le(Be,o.ghostClass,!0),kt.active=this,e&&this._appendGhost(),_e({sortable:this,name:"start",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(Ye){this._lastX=Ye.clientX,this._lastY=Ye.clientY,yt();for(var e=document.elementFromPoint(Ye.clientX,Ye.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(Ye.clientX,Ye.clientY))!==t;)t=e;if(Be.parentNode[Ee]._isOutsideThisEl(e),t)do{if(t[Ee]){if(t[Ee]._onDragOver({clientX:Ye.clientX,clientY:Ye.clientY,target:e,rootEl:t})&&!this.options.dragoverBubble)break}e=t}while(t=ne(t));Ct()}},_onTouchMove:function(e){if(Ze){var t=this.options,o=t.fallbackTolerance,i=t.fallbackOffset,n=e.touches?e.touches[0]:e,s=Ne&&de(Ne,!0),a=Ne&&s&&s.a,r=Ne&&s&&s.d,l=mt&&it&&ve(it),c=(n.clientX-Ze.clientX+i.x)/(a||1)+(l?l[0]-ct[0]:0)/(a||1),d=(n.clientY-Ze.clientY+i.y)/(r||1)+(l?l[1]-ct[1]:0)/(r||1);if(!kt.active&&!nt){if(o&&Math.max(Math.abs(n.clientX-this._lastX),Math.abs(n.clientY-this._lastY))n.right+s||e.clientY>i.bottom&&e.clientX>i.left:e.clientY>n.bottom+s||e.clientX>i.right&&e.clientY>i.top}(e,n,this)&&!g.animated){if(g===Be)return D(!1);if(g&&s===e.target&&(a=g),a&&(o=me(a)),!1!==St(Le,s,Be,t,a,o,e,!!a))return A(),g&&g.nextSibling?s.insertBefore(Be,g.nextSibling):s.appendChild(Be),Oe=s,_(),D(!0)}else if(g&&function(e,t,o){var i=me(ge(o.el,0,o.options,!0)),n=Se(o.el,o.options,Ne),s=10;return t?e.clientXd+c*s/2:lu-ot)return-tt}else if(l>d+c*(1-n)/2&&lu-c*s/2))return l>d+c/2?1:-1;return 0}(e,a,o,n,w?1:r.swapThreshold,null==r.invertedSwapThreshold?r.swapThreshold:r.invertedSwapThreshold,lt,et===a),0!==b){var E=be(Be);do{E-=b,y=Oe.children[E]}while(y&&("none"===ce(y,"display")||y===Ne))}if(0===b||y===a)return D(!1);et=a,tt=b;var T=a.nextElementSibling,M=!1,q=St(Le,s,Be,t,a,o,e,M=1===b);if(!1!==q)return 1!==q&&-1!==q||(M=1===q),dt=!0,setTimeout(Tt,30),A(),M&&!T?s.appendChild(Be):a.parentNode.insertBefore(Be,M?T:a),k&&xe(k,0,S-k.scrollTop),Oe=Be.parentNode,void 0===v||lt||(ot=Math.abs(v-me(a)[x])),_(),D(!0)}if(s.contains(Be))return D(!1)}return!1}function I(r,l){De(r,m,z({evt:e,isOwner:d,axis:n?"vertical":"horizontal",revert:i,dragRect:t,targetRect:o,canSort:u,fromSortable:p,target:a,completed:D,onMove:function(o,i){return St(Le,s,Be,t,o,me(o),e,i)},changed:_},l))}function A(){I("dragOverAnimationCapture"),m.captureAnimationState(),m!==p&&p.captureAnimationState()}function D(t){return I("dragOverCompleted",{insertion:t}),t&&(d?c._hideClone():c._showClone(m),m!==p&&(le(Be,je?je.options.ghostClass:c.options.ghostClass,!1),le(Be,r.ghostClass,!0)),je!==m&&m!==kt.active?je=m:m===kt.active&&je&&(je=null),p===m&&(m._ignoreWhileAnimating=a),m.animateAll((function(){I("dragOverAnimationComplete"),m._ignoreWhileAnimating=null})),m!==p&&(p.animateAll(),p._ignoreWhileAnimating=null)),(a===Be&&!Be.animated||a===s&&!a.animated)&&(et=null),r.dragoverBubble||e.rootEl||a===document||(Be.parentNode[Ee]._isOutsideThisEl(e.target),!t&&wt(e)),!r.dragoverBubble&&e.stopPropagation&&e.stopPropagation(),h=!0}function _(){ze=be(Be),Ue=be(Be,r.draggable),_e({sortable:m,name:"change",toEl:s,newIndex:ze,newDraggableIndex:Ue,originalEvent:e})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){oe(document,"mousemove",this._onTouchMove),oe(document,"touchmove",this._onTouchMove),oe(document,"pointermove",this._onTouchMove),oe(document,"dragover",wt),oe(document,"mousemove",wt),oe(document,"touchmove",wt)},_offUpEvents:function(){var e=this.el.ownerDocument;oe(e,"mouseup",this._onDrop),oe(e,"touchend",this._onDrop),oe(e,"pointerup",this._onDrop),oe(e,"pointercancel",this._onDrop),oe(e,"touchcancel",this._onDrop),oe(document,"selectstart",this)},_onDrop:function(e){var t=this.el,o=this.options;ze=be(Be),Ue=be(Be,o.draggable),De("drop",this,{evt:e}),Oe=Be&&Be.parentNode,ze=be(Be),Ue=be(Be,o.draggable),kt.eventCanceled||(nt=!1,lt=!1,rt=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),It(this.cloneId),It(this._dragStartId),this.nativeDraggable&&(oe(document,"drop",this),oe(t,"dragstart",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),J&&ce(document.body,"user-select",""),ce(Be,"transform",""),e&&(Qe&&(e.cancelable&&e.preventDefault(),!o.dropBubble&&e.stopPropagation()),Ne&&Ne.parentNode&&Ne.parentNode.removeChild(Ne),(Le===Oe||je&&"clone"!==je.lastPutMode)&&Pe&&Pe.parentNode&&Pe.parentNode.removeChild(Pe),Be&&(this.nativeDraggable&&oe(Be,"dragend",this),Et(Be),Be.style["will-change"]="",Qe&&!nt&&le(Be,je?je.options.ghostClass:this.options.ghostClass,!1),le(Be,this.options.chosenClass,!1),_e({sortable:this,name:"unchoose",toEl:Oe,newIndex:null,newDraggableIndex:null,originalEvent:e}),Le!==Oe?(ze>=0&&(_e({rootEl:Oe,name:"add",toEl:Oe,fromEl:Le,originalEvent:e}),_e({sortable:this,name:"remove",toEl:Oe,originalEvent:e}),_e({rootEl:Oe,name:"sort",toEl:Oe,fromEl:Le,originalEvent:e}),_e({sortable:this,name:"sort",toEl:Oe,originalEvent:e})),je&&je.save()):ze!==$e&&ze>=0&&(_e({sortable:this,name:"update",toEl:Oe,originalEvent:e}),_e({sortable:this,name:"sort",toEl:Oe,originalEvent:e})),kt.active&&(null!=ze&&-1!==ze||(ze=$e,Ue=He),_e({sortable:this,name:"end",toEl:Oe,originalEvent:e}),this.save())))),this._nulling()},_nulling:function(){De("nulling",this),Le=Be=Oe=Ne=Fe=Pe=Re=Ve=Ze=Ye=Qe=ze=Ue=$e=He=et=tt=je=We=kt.dragged=kt.ghost=kt.clone=kt.active=null,ut.forEach((function(e){e.checked=!0})),ut.length=Ge=Xe=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":Be&&(this._onDragOver(e),function(e){e.dataTransfer&&(e.dataTransfer.dropEffect="move");e.cancelable&&e.preventDefault()}(e));break;case"selectstart":e.preventDefault()}},toArray:function(){for(var e,t=[],o=this.el.children,i=0,n=o.length,s=this.options;i{e&&Array.isArray(e)&&e.forEach((e=>{e.id&&t[e.id]&&(e.id=t[e.id],o=!0),"editing-toolbar:format-eraser"===e.id&&(e.icon="eraser",o=!0),e.SubmenuCommands&&n(e.SubmenuCommands)}))},s=e=>{if(!e||!Array.isArray(e))return!1;for(const t of e){if("editing-toolbar:toggle-format-brush"===t.id)return!0;if(t.SubmenuCommands){if(s(t.SubmenuCommands))return!0}}return!1},a=e=>{if(!e||!Array.isArray(e))return!1;if(!s(e)&&e.length>=2){const t={id:"editing-toolbar:toggle-format-brush",name:"Format Brush",icon:"paintbrush"};return e.splice(2,0,t),!0}return!1};i.menuCommands&&(n(i.menuCommands),a(i.menuCommands)&&(o=!0)),i.enableMultipleConfig&&(i.followingCommands&&(n(i.followingCommands),a(i.followingCommands)&&(o=!0)),i.topCommands&&(n(i.topCommands),a(i.topCommands)&&(o=!0)),i.fixedCommands&&(n(i.fixedCommands),a(i.fixedCommands)&&(o=!0)),i.mobileCommands&&(n(i.mobileCommands),a(i.mobileCommands)&&(o=!0))),o?(yield this.plugin.saveSettings(),new e.Notice(f("Command IDs have been successfully repaired!")),dispatchEvent(new Event("editingToolbar-NewCommand"))):new e.Notice(f("No command IDs need to be repaired"))}catch(t){console.error("修复命令ID时出错:",t),new e.Notice(f("Error repairing command IDs, please check the console for details"))}}))}reloadPlugin(e){return t(this,void 0,void 0,(function*(){const{plugins:t}=this.app;try{yield t.disablePlugin(e),yield t.enablePlugin(e)}catch(e){console.error(e)}}))}restoreDefaultSettings(){return t(this,void 0,void 0,(function*(){try{const t=this.plugin.settings.lastVersion,o=this.plugin.settings.customCommands;this.plugin.settings=Object.assign(Object.assign({},E),{lastVersion:t,customCommands:o}),yield this.plugin.saveSettings(),new e.Notice(f("Successfully restored default settings! (Custom commands preserved)")),this.reloadPlugin(this.plugin.manifest.id),this.close()}catch(t){console.error("恢复默认设置时出错:",t),new e.Notice(f("Error restoring default settings, please check the console for details"))}}))}onOpen(){const{contentEl:o}=this;o.createEl("h2",{text:this.plugin.manifest.version+"⚡Tips"}),o.createEl("p",{text:f("Notice:")});const i=o.createEl("ul");i.createEl("li",{text:f("⚠️This update is not compatible with 2.x version command ids, please click [Repair command] to be compatible")}),i.createEl("li",{text:f("⚠️If you want to restore the default settings, please click [Restore default settings]")}),this.changelogContainer=o.createDiv({cls:"changelog-container"}),this.changelogContainer.createEl("h3",{text:f("Latest Changes")}),this.changelogContentEl=this.changelogContainer.createDiv({cls:"changelog-content"}),this.changelogContentEl.setText(f("Loading changelog...")),setTimeout((()=>{this.loadChangelog()}),100),new e.Setting(o).setName(f("🔧Data repair")).setDesc(f("This update changed the ID of some commands, please click this button to repair the commands to ensure the toolbar works properly")).addButton((e=>e.setButtonText(f("Repair command ID")).onClick((()=>t(this,void 0,void 0,(function*(){yield this.fixCommandIds()})))))),new e.Setting(o).setName(f("🔄Restore default settings")).setDesc(f("This will reset all your custom configurations, but custom commands will be preserved")).addButton((e=>e.setButtonText(f("Restore default")).onClick((()=>t(this,void 0,void 0,(function*(){confirm(f("Are you sure you want to restore all settings to default? But custom commands will be preserved."))&&(yield this.restoreDefaultSettings())})))))),new e.Setting(o).setName(f("📋View full changelog")).setDesc(f("Open the complete changelog in your browser")).addButton((e=>e.setButtonText(f("Open changelog")).onClick((()=>{window.open("https://github.com/PKM-er/obsidian-editing-toolbar/blob/master/CHANGELOG.md","_blank")})))),new e.Setting(o).addButton((e=>e.setButtonText(f("Close")).onClick((()=>{this.close()})))),o.createEl("style",{text:"\n .changelog-container {\n margin-top: 20px;\n margin-bottom: 20px;\n padding: 10px;\n border: 1px solid var(--background-modifier-border);\n border-radius: 5px;\n max-height: 200px;\n overflow-y: auto;\n }\n .changelog-content {\n padding: 0 10px;\n }\n .changelog-content a {\n text-decoration: underline;\n }\n "})}onClose(){const{contentEl:e}=this;e.empty()}}function Wt(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e} +/*! Pickr 1.8.4 MIT | https://github.com/Simonwep/pickr */ +var jt=function(e){var t={exports:{}};return e(t,t.exports),t.exports}((function(e,t){self,e.exports=(()=>{var e={d:(t,o)=>{for(var i in o)e.o(o,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:o[i]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.d(t,{default:()=>D});var o={};function i(e,t,o,i){let n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};t instanceof HTMLCollection||t instanceof NodeList?t=Array.from(t):Array.isArray(t)||(t=[t]),Array.isArray(o)||(o=[o]);for(const s of t)for(const t of o)s[e](t,i,{capture:!1,...n});return Array.prototype.slice.call(arguments,1)}e.r(o),e.d(o,{adjustableInputNumbers:()=>d,createElementFromString:()=>a,createFromTemplate:()=>r,eventPath:()=>l,off:()=>s,on:()=>n,resolveElement:()=>c});const n=i.bind(null,"addEventListener"),s=i.bind(null,"removeEventListener");function a(e){const t=document.createElement("div");return t.innerHTML=e.trim(),t.firstElementChild}function r(e){const t=(e,t)=>{const o=e.getAttribute(t);return e.removeAttribute(t),o},o=function(e){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=t(e,":obj"),s=t(e,":ref"),a=n?i[n]={}:i;s&&(i[s]=e);for(const i of Array.from(e.children)){const e=t(i,":arr"),n=o(i,e?{}:a);e&&(a[e]||(a[e]=[])).push(Object.keys(n).length?n:i)}return i};return o(a(e))}function l(e){let t=e.path||e.composedPath&&e.composedPath();if(t)return t;let o=e.target.parentElement;for(t=[e.target,o];o=o.parentElement;)t.push(o);return t.push(document,window),t}function c(e){return e instanceof Element?e:"string"==typeof e?e.split(/>>/g).reduce(((e,t,o,i)=>(e=e.querySelector(t),o1&&void 0!==arguments[1]?arguments[1]:e=>e;function o(o){const i=[.001,.01,.1][Number(o.shiftKey||2*o.ctrlKey)]*(o.deltaY<0?1:-1);let n=0,s=e.selectionStart;e.value=e.value.replace(/[\d.]+/g,((e,o)=>o<=s&&o+e.length>=s?(s=o,t(Number(e),i,n)):(n++,e))),e.focus(),e.setSelectionRange(s,s),o.preventDefault(),e.dispatchEvent(new Event("input"))}n(e,"focus",(()=>n(window,"wheel",o,{passive:!1}))),n(e,"blur",(()=>s(window,"wheel",o)))}const{min:u,max:p,floor:m,round:h}=Math;function g(e,t,o){t/=100,o/=100;const i=m(e=e/360*6),n=e-i,s=o*(1-t),a=o*(1-n*t),r=o*(1-(1-n)*t),l=i%6;return[255*[o,a,s,s,r,o][l],255*[r,o,o,a,s,s][l],255*[s,s,r,o,o,a][l]]}function f(e,t,o){return g(e,t,o).map((e=>h(e).toString(16).padStart(2,"0")))}function b(e,t,o){const i=g(e,t,o),n=i[0]/255,s=i[1]/255,a=i[2]/255,r=u(1-n,1-s,1-a);return[100*(1===r?0:(1-n-r)/(1-r)),100*(1===r?0:(1-s-r)/(1-r)),100*(1===r?0:(1-a-r)/(1-r)),100*r]}function v(e,t,o){const i=(2-(t/=100))*(o/=100)/2;return 0!==i&&(t=1===i?0:i<.5?t*o/(2*i):t*o/(2-2*i)),[e,100*t,100*i]}function y(e,t,o){const i=u(e/=255,t/=255,o/=255),n=p(e,t,o),s=n-i;let a,r;if(0===s)a=r=0;else{r=s/n;const i=((n-e)/6+s/2)/s,l=((n-t)/6+s/2)/s,c=((n-o)/6+s/2)/s;e===n?a=c-l:t===n?a=1/3+i-c:o===n&&(a=2/3+l-i),a<0?a+=1:a>1&&(a-=1)}return[360*a,100*r,100*n]}function C(e,t,o,i){return t/=100,o/=100,[...y(255*(1-u(1,(e/=100)*(1-(i/=100))+i)),255*(1-u(1,t*(1-i)+i)),255*(1-u(1,o*(1-i)+i)))]}function w(e,t,o){t/=100;const i=2*(t*=(o/=100)<.5?o:1-o)/(o+t)*100,n=100*(o+t);return[e,isNaN(i)?0:i,n]}function x(e){return y(...e.match(/.{2}/g).map((e=>parseInt(e,16))))}function k(e){e=e.match(/^[a-zA-Z]+$/)?function(e){if("black"===e.toLowerCase())return"#000";const t=document.createElement("canvas").getContext("2d");return t.fillStyle=e,"#000"===t.fillStyle?null:t.fillStyle}(e):e;const t={cmyk:/^cmyk[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)/i,rgba:/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsla:/^((hsla)|hsl)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsva:/^((hsva)|hsv)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hexa:/^#?(([\dA-Fa-f]{3,4})|([\dA-Fa-f]{6})|([\dA-Fa-f]{8}))$/i},o=e=>e.map((e=>/^(|\d+)\.\d+|\d+$/.test(e)?Number(e):void 0));let i;e:for(const n in t){if(!(i=t[n].exec(e)))continue;const s=e=>!!i[2]==("number"==typeof e);switch(n){case"cmyk":{const[,e,t,s,a]=o(i);if(e>100||t>100||s>100||a>100)break e;return{values:C(e,t,s,a),type:n}}case"rgba":{const[,,,e,t,a,r]=o(i);if(e>255||t>255||a>255||r<0||r>1||!s(r))break e;return{values:[...y(e,t,a),r],a:r,type:n}}case"hexa":{let[,e]=i;4!==e.length&&3!==e.length||(e=e.split("").map((e=>e+e)).join(""));const t=e.substring(0,6);let o=e.substring(6);return o=o?parseInt(o,16)/255:void 0,{values:[...x(t),o],a:o,type:n}}case"hsla":{const[,,,e,t,a,r]=o(i);if(e>360||t>100||a>100||r<0||r>1||!s(r))break e;return{values:[...w(e,t,a),r],a:r,type:n}}case"hsva":{const[,,,e,t,a,r]=o(i);if(e>360||t>100||a>100||r<0||r>1||!s(r))break e;return{values:[e,t,a,r],a:r,type:n}}}}return{values:null,type:null}}function S(){const e=(e,t)=>function(){let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;return t(~o?e.map((e=>Number(e.toFixed(o)))):e)},t={h:arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,s:arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,v:arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a:arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,toHSVA(){const o=[t.h,t.s,t.v,t.a];return o.toString=e(o,(e=>`hsva(${e[0]}, ${e[1]}%, ${e[2]}%, ${t.a})`)),o},toHSLA(){const o=[...v(t.h,t.s,t.v),t.a];return o.toString=e(o,(e=>`hsla(${e[0]}, ${e[1]}%, ${e[2]}%, ${t.a})`)),o},toRGBA(){const o=[...g(t.h,t.s,t.v),t.a];return o.toString=e(o,(e=>`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${t.a})`)),o},toCMYK(){const o=b(t.h,t.s,t.v);return o.toString=e(o,(e=>`cmyk(${e[0]}%, ${e[1]}%, ${e[2]}%, ${e[3]}%)`)),o},toHEXA(){const e=f(t.h,t.s,t.v),o=t.a>=1?"":Number((255*t.a).toFixed(0)).toString(16).toUpperCase().padStart(2,"0");return o&&e.push(o),e.toString=()=>`#${e.join("").toUpperCase()}`,e},clone:()=>S(t.h,t.s,t.v,t.a)};return t}const E=e=>Math.max(Math.min(e,1),0);function T(e){const t={options:Object.assign({lock:null,onchange:()=>0,onstop:()=>0},e),_keyboard(e){const{options:o}=t,{type:i,key:n}=e;if(document.activeElement===o.wrapper){const{lock:o}=t.options,s="ArrowUp"===n,a="ArrowRight"===n,r="ArrowDown"===n,l="ArrowLeft"===n;if("keydown"===i&&(s||a||r||l)){let i=0,n=0;"v"===o?i=s||a?1:-1:"h"===o?i=s||a?-1:1:(n=s?-1:r?1:0,i=l?-1:a?1:0),t.update(E(t.cache.x+.01*i),E(t.cache.y+.01*n)),e.preventDefault()}else n.startsWith("Arrow")&&(t.options.onstop(),e.preventDefault())}},_tapstart(e){n(document,["mouseup","touchend","touchcancel"],t._tapstop),n(document,["mousemove","touchmove"],t._tapmove),e.cancelable&&e.preventDefault(),t._tapmove(e)},_tapmove(e){const{options:o,cache:i}=t,{lock:n,element:s,wrapper:a}=o,r=a.getBoundingClientRect();let l=0,c=0;if(e){const t=e&&e.touches&&e.touches[0];l=e?(t||e).clientX:0,c=e?(t||e).clientY:0,lr.left+r.width&&(l=r.left+r.width),cr.top+r.height&&(c=r.top+r.height),l-=r.left,c-=r.top}else i&&(l=i.x*r.width,c=i.y*r.height);"h"!==n&&(s.style.left=`calc(${l/r.width*100}% - ${s.offsetWidth/2}px)`),"v"!==n&&(s.style.top=`calc(${c/r.height*100}% - ${s.offsetHeight/2}px)`),t.cache={x:l/r.width,y:c/r.height};const d=E(l/r.width),u=E(c/r.height);switch(n){case"v":return o.onchange(d);case"h":return o.onchange(u);default:return o.onchange(d,u)}},_tapstop(){t.options.onstop(),s(document,["mouseup","touchend","touchcancel"],t._tapstop),s(document,["mousemove","touchmove"],t._tapmove)},trigger(){t._tapmove()},update(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const{left:i,top:n,width:s,height:a}=t.options.wrapper.getBoundingClientRect();"h"===t.options.lock&&(o=e),t._tapmove({clientX:i+s*e,clientY:n+a*o})},destroy(){const{options:e,_tapstart:o,_keyboard:i}=t;s(document,["keydown","keyup"],i),s([e.wrapper,e.element],"mousedown",o),s([e.wrapper,e.element],"touchstart",o,{passive:!1})}},{options:o,_tapstart:i,_keyboard:a}=t;return n([o.wrapper,o.element],"mousedown",i),n([o.wrapper,o.element],"touchstart",i,{passive:!1}),n(document,["keydown","keyup"],a),t}function M(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};e=Object.assign({onchange:()=>0,className:"",elements:[]},e);const t=n(e.elements,"click",(t=>{e.elements.forEach((o=>o.classList[t.target===o?"add":"remove"](e.className))),e.onchange(t),t.stopPropagation()}));return{destroy:()=>s(...t)}}const q={variantFlipOrder:{start:"sme",middle:"mse",end:"ems"},positionFlipOrder:{top:"tbrl",right:"rltb",bottom:"btrl",left:"lrbt"},position:"bottom",margin:8},I=(e,t,o)=>{const{container:i,margin:n,position:s,variantFlipOrder:a,positionFlipOrder:r}={container:document.documentElement.getBoundingClientRect(),...q,...o},{left:l,top:c}=t.style;t.style.left="0",t.style.top="0";const d=e.getBoundingClientRect(),u=t.getBoundingClientRect(),p={t:d.top-u.height-n,b:d.bottom+n,r:d.right+n,l:d.left-u.width-n},m={vs:d.left,vm:d.left+d.width/2+-u.width/2,ve:d.left+d.width-u.width,hs:d.top,hm:d.bottom-d.height/2-u.height/2,he:d.bottom-u.height},[h,g="middle"]=s.split("-"),f=r[h],b=a[g],{top:v,left:y,bottom:C,right:w}=i;for(const e of f){const o="t"===e||"b"===e,i=p[e],[n,s]=o?["top","left"]:["left","top"],[a,r]=o?[u.height,u.width]:[u.width,u.height],[l,c]=o?[C,w]:[w,C],[d,h]=o?[v,y]:[y,v];if(!(il))for(const a of b){const l=m[(o?"v":"h")+a];if(!(lc))return t.style[s]=l-u[s]+"px",t.style[n]=i-u[n]+"px",e+a}}return t.style.left=l,t.style.top=c,null};function A(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}class D{constructor(e){A(this,"_initializingActive",!0),A(this,"_recalc",!0),A(this,"_nanopop",null),A(this,"_root",null),A(this,"_color",S()),A(this,"_lastColor",S()),A(this,"_swatchColors",[]),A(this,"_setupAnimationFrame",null),A(this,"_eventListener",{init:[],save:[],hide:[],show:[],clear:[],change:[],changestop:[],cancel:[],swatchselect:[]}),this.options=e=Object.assign({...D.DEFAULT_OPTIONS},e);const{swatches:t,components:o,theme:i,sliders:n,lockOpacity:s,padding:a}=e;["nano","monolith"].includes(i)&&!n&&(e.sliders="h"),o.interaction||(o.interaction={});const{preview:r,opacity:l,hue:c,palette:d}=o;o.opacity=!s&&l,o.palette=d||r||l||c,this._preBuild(),this._buildComponents(),this._bindEvents(),this._finalBuild(),t&&t.length&&t.forEach((e=>this.addSwatch(e)));const{button:u,app:p}=this._root;this._nanopop=((e,t,o)=>{const i="object"!=typeof e||e instanceof HTMLElement?{reference:e,popper:t,...o}:e;return{update(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i;const{reference:t,popper:o}=Object.assign(i,e);if(!o||!t)throw new Error("Popper- or reference-element missing.");return I(t,o,i)}}})(u,p,{margin:a}),u.setAttribute("role","button"),u.setAttribute("aria-label",this._t("btn:toggle"));const m=this;this._setupAnimationFrame=requestAnimationFrame((function t(){if(!p.offsetWidth)return m._setupAnimationFrame=requestAnimationFrame(t);m.setColor(e.default),m._rePositioningPicker(),e.defaultRepresentation&&(m._representation=e.defaultRepresentation,m.setColorRepresentation(m._representation)),e.showAlways&&m.show(),m._initializingActive=!1,m._emit("init")}))}_preBuild(){const{options:e}=this;for(const t of["el","container"])e[t]=c(e[t]);this._root=(e=>{const{components:t,useAsButton:o,inline:i,appClass:n,theme:s,lockOpacity:a}=e.options,l=e=>e?"":'style="display:none" hidden',c=t=>e._t(t),d=r(`\n
\n\n ${o?"":''}\n\n
\n
\n
\n \n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n\n
\n\n
\n \n\n \n \n \n \n \n\n \n \n \n
\n
\n
\n `),u=d.interaction;return u.options.find((e=>!e.hidden&&!e.classList.add("active"))),u.type=()=>u.options.find((e=>e.classList.contains("active"))),d})(this),e.useAsButton&&(this._root.button=e.el),e.container.appendChild(this._root.root)}_finalBuild(){const e=this.options,t=this._root;if(e.container.removeChild(t.root),e.inline){const o=e.el.parentElement;e.el.nextSibling?o.insertBefore(t.app,e.el.nextSibling):o.appendChild(t.app)}else e.container.appendChild(t.app);e.useAsButton?e.inline&&e.el.remove():e.el.parentNode.replaceChild(t.root,e.el),e.disabled&&this.disable(),e.comparison||(t.button.style.transition="none",e.useAsButton||(t.preview.lastColor.style.transition="none")),this.hide()}_buildComponents(){const e=this,t=this.options.components,o=(e.options.sliders||"v").repeat(2),[i,n]=o.match(/^[vh]+$/g)?o:[],s=()=>this._color||(this._color=this._lastColor.clone()),a={palette:T({element:e._root.palette.picker,wrapper:e._root.palette.palette,onstop:()=>e._emit("changestop","slider",e),onchange(o,i){if(!t.palette)return;const n=s(),{_root:a,options:r}=e,{lastColor:l,currentColor:c}=a.preview;e._recalc&&(n.s=100*o,n.v=100-100*i,n.v<0&&(n.v=0),e._updateOutput("slider"));const d=n.toRGBA().toString(0);this.element.style.background=d,this.wrapper.style.background=`\n linear-gradient(to top, rgba(0, 0, 0, ${n.a}), transparent),\n linear-gradient(to left, hsla(${n.h}, 100%, 50%, ${n.a}), rgba(255, 255, 255, ${n.a}))\n `,r.comparison?r.useAsButton||e._lastColor||l.style.setProperty("--pcr-color",d):(a.button.style.setProperty("--pcr-color",d),a.button.classList.remove("clear"));const u=n.toHEXA().toString();for(const{el:t,color:o}of e._swatchColors)t.classList[u===o.toHEXA().toString()?"add":"remove"]("pcr-active");c.style.setProperty("--pcr-color",d)}}),hue:T({lock:"v"===n?"h":"v",element:e._root.hue.picker,wrapper:e._root.hue.slider,onstop:()=>e._emit("changestop","slider",e),onchange(o){if(!t.hue||!t.palette)return;const i=s();e._recalc&&(i.h=360*o),this.element.style.backgroundColor=`hsl(${i.h}, 100%, 50%)`,a.palette.trigger()}}),opacity:T({lock:"v"===i?"h":"v",element:e._root.opacity.picker,wrapper:e._root.opacity.slider,onstop:()=>e._emit("changestop","slider",e),onchange(o){if(!t.opacity||!t.palette)return;const i=s();e._recalc&&(i.a=Math.round(100*o)/100),this.element.style.background=`rgba(0, 0, 0, ${i.a})`,a.palette.trigger()}}),selectable:M({elements:e._root.interaction.options,className:"active",onchange(t){e._representation=t.target.getAttribute("data-type").toUpperCase(),e._recalc&&e._updateOutput("swatch")}})};this._components=a}_bindEvents(){const{_root:e,options:t}=this,o=[n(e.interaction.clear,"click",(()=>this._clearColor())),n([e.interaction.cancel,e.preview.lastColor],"click",(()=>{this.setHSVA(...(this._lastColor||this._color).toHSVA(),!0),this._emit("cancel")})),n(e.interaction.save,"click",(()=>{!this.applyColor()&&!t.showAlways&&this.hide()})),n(e.interaction.result,["keyup","input"],(e=>{this.setColor(e.target.value,!0)&&!this._initializingActive&&(this._emit("change",this._color,"input",this),this._emit("changestop","input",this)),e.stopImmediatePropagation()})),n(e.interaction.result,["focus","blur"],(e=>{this._recalc="blur"===e.type,this._recalc&&this._updateOutput(null)})),n([e.palette.palette,e.palette.picker,e.hue.slider,e.hue.picker,e.opacity.slider,e.opacity.picker],["mousedown","touchstart"],(()=>this._recalc=!0),{passive:!0})];if(!t.showAlways){const i=t.closeWithKey;o.push(n(e.button,"click",(()=>this.isOpen()?this.hide():this.show())),n(document,"keyup",(e=>this.isOpen()&&(e.key===i||e.code===i)&&this.hide())),n(document,["touchstart","mousedown"],(t=>{this.isOpen()&&!l(t).some((t=>t===e.app||t===e.button))&&this.hide()}),{capture:!0}))}if(t.adjustableNumbers){const t={rgba:[255,255,255,1],hsva:[360,100,100,1],hsla:[360,100,100,1],cmyk:[100,100,100,100]};d(e.interaction.result,((e,o,i)=>{const n=t[this.getColorRepresentation().toLowerCase()];if(n){const t=n[i],s=e+(t>=100?1e3*o:o);return s<=0?0:Number((s{i.isOpen()&&(t.closeOnScroll&&i.hide(),null===e?(e=setTimeout((()=>e=null),100),requestAnimationFrame((function t(){i._rePositioningPicker(),null!==e&&requestAnimationFrame(t)}))):(clearTimeout(e),e=setTimeout((()=>e=null),100)))}),{capture:!0}))}this._eventBindings=o}_rePositioningPicker(){const{options:e}=this;if(!e.inline&&!this._nanopop.update({container:document.body.getBoundingClientRect(),position:e.position})){const e=this._root.app,t=e.getBoundingClientRect();e.style.top=(window.innerHeight-t.height)/2+"px",e.style.left=(window.innerWidth-t.width)/2+"px"}}_updateOutput(e){const{_root:t,_color:o,options:i}=this;if(t.interaction.type()){const e=`to${t.interaction.type().getAttribute("data-type")}`;t.interaction.result.value="function"==typeof o[e]?o[e]().toString(i.outputPrecision):""}!this._initializingActive&&this._recalc&&this._emit("change",o,e,this)}_clearColor(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const{_root:t,options:o}=this;o.useAsButton||t.button.style.setProperty("--pcr-color","rgba(0, 0, 0, 0.15)"),t.button.classList.add("clear"),o.showAlways||this.hide(),this._lastColor=null,this._initializingActive||e||(this._emit("save",null),this._emit("clear"))}_parseLocalColor(e){const{values:t,type:o,a:i}=k(e),{lockOpacity:n}=this.options,s=void 0!==i&&1!==i;return t&&3===t.length&&(t[3]=void 0),{values:!t||n&&s?null:t,type:o}}_t(e){return this.options.i18n[e]||D.I18N_DEFAULTS[e]}_emit(e){for(var t=arguments.length,o=new Array(t>1?t-1:0),i=1;ie(...o,this)))}on(e,t){return this._eventListener[e].push(t),this}off(e,t){const o=this._eventListener[e]||[],i=o.indexOf(t);return~i&&o.splice(i,1),this}addSwatch(e){const{values:t}=this._parseLocalColor(e);if(t){const{_swatchColors:e,_root:o}=this,i=S(...t),s=a(`