├── .obsidian ├── app.json ├── appearance.json ├── bookmarks.json ├── community-plugins.json ├── core-plugins-migration.json ├── core-plugins.json ├── graph.json ├── hotkeys.json ├── page-preview.json ├── plugins │ ├── customizable-page-header-buttons │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── dataview │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── homepage │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── obsidian-banners │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── obsidian-emoji-toolbar │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ └── reveal-active-file-button │ │ ├── main.js │ │ └── manifest.json ├── snippets │ ├── dashboard-ReadLineLength.css │ ├── dashboard.css │ ├── dim-support-files.css │ └── vault-logo.css ├── workspace └── workspace.json ├── 0-Vault-Logo └── .placeholder ├── Dashboard++.md ├── Family ├── Guests │ └── Guest list.md ├── Objectives │ ├── Education Plan.md │ ├── Family Calendar.md │ ├── Family Recipes.md │ └── Yearly Budget.md ├── Recipes │ ├── Almond Peanut Butter.md │ ├── Smores.md │ └── Spicy-Sweet Buffalo Popcorn.md └── Vacations │ ├── Austria.md │ ├── Peru.md │ └── Texas.md ├── LICENSE.md ├── Personal Projects ├── Learning │ ├── Early American History.md │ └── Spanish - Entry Level.md ├── Remodeling │ ├── Bathroom Remodel.md │ ├── Paint entryway.md │ ├── Project X Definition and Specifications.md │ └── Research building Garage.md └── Writing │ └── 5 ways to love PKM more.md ├── README.md ├── Research └── What is Spaced Repetition and How to use it.md ├── Work ├── Budget │ ├── Q1 2022.md │ ├── Q2 2022.md │ ├── Q3 2022.md │ └── Q4 2022.md ├── Personnel │ ├── Bill Hansen.md │ ├── Brad Jefferson.md │ ├── Olga Olson.md │ └── Sally Smith.md └── Projects │ ├── Cloud backup.md │ ├── Firewall upgrades.md │ └── IT Cybersecurity training.md ├── images ├── Kitchen.jpeg ├── Smores.jpeg ├── Spicy popcorn.jpeg ├── YouTubeFromSergio.png ├── dashboard-snapshot.png └── home.jpg └── Ω CHANGELOG.md /.obsidian/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "readableLineLength": false, 3 | "foldHeading": true, 4 | "foldIndent": true, 5 | "defaultViewMode": "preview", 6 | "promptDelete": false, 7 | "legacyEditor": false, 8 | "livePreview": true, 9 | "smartIndentList": true, 10 | "showIndentGuide": true, 11 | "propertiesInDocument": "hidden" 12 | } -------------------------------------------------------------------------------- /.obsidian/appearance.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseFontSize": 16, 3 | "cssTheme": "", 4 | "enabledCssSnippets": [ 5 | "dashboard", 6 | "dashboard-ReadLineLength", 7 | "dim-support-files", 8 | "vault-logo" 9 | ], 10 | "theme": "obsidian", 11 | "accentColor": "#b86123" 12 | } -------------------------------------------------------------------------------- /.obsidian/bookmarks.json: -------------------------------------------------------------------------------- 1 | { 2 | "items": [ 3 | { 4 | "type": "group", 5 | "ctime": 1680806405503, 6 | "items": [ 7 | { 8 | "type": "file", 9 | "ctime": 1680806509533, 10 | "path": "Work/Projects/Cloud backup.md" 11 | }, 12 | { 13 | "type": "search", 14 | "ctime": 1680806639617, 15 | "query": "#project", 16 | "title": "#project list" 17 | }, 18 | { 19 | "type": "search", 20 | "ctime": 1680806664383, 21 | "query": "#personnelReview", 22 | "title": "#personnelReview List" 23 | } 24 | ], 25 | "title": "✅ Priority" 26 | }, 27 | { 28 | "type": "group", 29 | "ctime": 1680805179317, 30 | "items": [ 31 | { 32 | "type": "search", 33 | "ctime": 1680805503056, 34 | "query": "recipes", 35 | "title": "Recipe search" 36 | }, 37 | { 38 | "type": "file", 39 | "ctime": 1680805204590, 40 | "path": "Family/Recipes/Smores.md" 41 | }, 42 | { 43 | "type": "file", 44 | "ctime": 1680805233238, 45 | "path": "Family/Recipes/Spicy-Sweet Buffalo Popcorn.md" 46 | }, 47 | { 48 | "type": "folder", 49 | "ctime": 1680811034213, 50 | "path": "images" 51 | } 52 | ], 53 | "title": "Recipes" 54 | }, 55 | { 56 | "type": "group", 57 | "ctime": 1680805279304, 58 | "items": [ 59 | { 60 | "type": "group", 61 | "ctime": 1680805318824, 62 | "items": [ 63 | { 64 | "type": "file", 65 | "ctime": 1680805379607, 66 | "path": "Personal Projects/Learning/Early American History.md" 67 | }, 68 | { 69 | "type": "file", 70 | "ctime": 1680805401140, 71 | "path": "Personal Projects/Learning/Spanish - Entry Level.md" 72 | } 73 | ], 74 | "title": "Learning" 75 | }, 76 | { 77 | "type": "group", 78 | "ctime": 1680805314540, 79 | "items": [ 80 | { 81 | "type": "file", 82 | "ctime": 1680805419957, 83 | "path": "Personal Projects/Writing/5 ways to love PKM more.md" 84 | } 85 | ], 86 | "title": "Writing" 87 | }, 88 | { 89 | "type": "group", 90 | "ctime": 1680805295304, 91 | "items": [ 92 | { 93 | "type": "search", 94 | "ctime": 1680811863950, 95 | "query": "#shopping", 96 | "title": "Shopping list" 97 | }, 98 | { 99 | "type": "file", 100 | "ctime": 1680805437991, 101 | "path": "Personal Projects/Remodeling/Research building Garage.md" 102 | }, 103 | { 104 | "type": "file", 105 | "ctime": 1680805432990, 106 | "path": "Personal Projects/Remodeling/Paint entryway.md" 107 | }, 108 | { 109 | "type": "file", 110 | "ctime": 1680805428774, 111 | "path": "Personal Projects/Remodeling/Bathroom Remodel.md" 112 | } 113 | ], 114 | "title": "Remodeling" 115 | } 116 | ], 117 | "title": "Projects - Life" 118 | }, 119 | { 120 | "type": "group", 121 | "ctime": 1680806125403, 122 | "items": [ 123 | { 124 | "type": "file", 125 | "ctime": 1680806197868, 126 | "path": "Work/Projects/Cloud backup.md" 127 | }, 128 | { 129 | "type": "file", 130 | "ctime": 1680806188721, 131 | "path": "Work/Projects/IT Cybersecurity training.md" 132 | }, 133 | { 134 | "type": "file", 135 | "ctime": 1680806192537, 136 | "path": "Work/Projects/Firewall upgrades.md" 137 | } 138 | ], 139 | "title": "Projects - Work" 140 | } 141 | ] 142 | } -------------------------------------------------------------------------------- /.obsidian/community-plugins.json: -------------------------------------------------------------------------------- 1 | [ 2 | "homepage", 3 | "obsidian-emoji-toolbar", 4 | "dataview", 5 | "customizable-page-header-buttons", 6 | "reveal-active-file-button", 7 | "obsidian-banners" 8 | ] -------------------------------------------------------------------------------- /.obsidian/core-plugins-migration.json: -------------------------------------------------------------------------------- 1 | { 2 | "file-explorer": true, 3 | "global-search": true, 4 | "switcher": true, 5 | "graph": true, 6 | "backlink": true, 7 | "outgoing-link": false, 8 | "tag-pane": false, 9 | "page-preview": true, 10 | "daily-notes": false, 11 | "templates": false, 12 | "note-composer": false, 13 | "command-palette": true, 14 | "slash-command": true, 15 | "editor-status": true, 16 | "starred": true, 17 | "markdown-importer": false, 18 | "zk-prefixer": false, 19 | "random-note": false, 20 | "outline": true, 21 | "word-count": true, 22 | "slides": false, 23 | "audio-recorder": false, 24 | "workspaces": false, 25 | "file-recovery": false, 26 | "publish": false, 27 | "sync": false, 28 | "canvas": true, 29 | "bookmarks": true, 30 | "properties": false 31 | } -------------------------------------------------------------------------------- /.obsidian/core-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "file-explorer": true, 3 | "global-search": true, 4 | "switcher": true, 5 | "graph": true, 6 | "backlink": true, 7 | "outgoing-link": false, 8 | "tag-pane": false, 9 | "page-preview": true, 10 | "daily-notes": false, 11 | "templates": false, 12 | "note-composer": false, 13 | "command-palette": true, 14 | "slash-command": true, 15 | "editor-status": true, 16 | "starred": true, 17 | "markdown-importer": false, 18 | "zk-prefixer": false, 19 | "random-note": false, 20 | "outline": true, 21 | "word-count": true, 22 | "slides": false, 23 | "audio-recorder": false, 24 | "workspaces": false, 25 | "file-recovery": false, 26 | "publish": false, 27 | "sync": false, 28 | "canvas": true, 29 | "bookmarks": true, 30 | "properties": true 31 | } -------------------------------------------------------------------------------- /.obsidian/graph.json: -------------------------------------------------------------------------------- 1 | { 2 | "collapse-filter": true, 3 | "search": "", 4 | "showTags": false, 5 | "showAttachments": false, 6 | "hideUnresolved": false, 7 | "showOrphans": true, 8 | "collapse-color-groups": true, 9 | "colorGroups": [], 10 | "collapse-display": true, 11 | "showArrow": false, 12 | "textFadeMultiplier": 0, 13 | "nodeSizeMultiplier": 1, 14 | "lineSizeMultiplier": 1, 15 | "collapse-forces": true, 16 | "centerStrength": 0.518713248970312, 17 | "repelStrength": 10, 18 | "linkStrength": 1, 19 | "linkDistance": 250, 20 | "scale": 1, 21 | "close": false 22 | } -------------------------------------------------------------------------------- /.obsidian/hotkeys.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor:toggle-checklist-status": [], 3 | "editor:toggle-bullet-list": [ 4 | { 5 | "modifiers": [ 6 | "Mod" 7 | ], 8 | "key": "Enter" 9 | } 10 | ], 11 | "app:toggle-left-sidebar": [ 12 | { 13 | "modifiers": [ 14 | "Mod" 15 | ], 16 | "key": "/" 17 | } 18 | ], 19 | "app:toggle-right-sidebar": [ 20 | { 21 | "modifiers": [ 22 | "Mod" 23 | ], 24 | "key": "\\" 25 | } 26 | ], 27 | "editor:toggle-comments": [], 28 | "homepage:open-homepage": [ 29 | { 30 | "modifiers": [ 31 | "Alt" 32 | ], 33 | "key": "H" 34 | } 35 | ] 36 | } -------------------------------------------------------------------------------- /.obsidian/page-preview.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": false, 3 | "editor": false, 4 | "file-explorer": false, 5 | "graph": false, 6 | "starred": false 7 | } -------------------------------------------------------------------------------- /.obsidian/plugins/customizable-page-header-buttons/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "enabledButtons": [ 3 | { 4 | "id": "app:go-back", 5 | "icon": "left-arrow-with-tail", 6 | "name": "Navigate back", 7 | "showButtons": "both" 8 | }, 9 | { 10 | "id": "app:go-forward", 11 | "icon": "right-arrow-with-tail", 12 | "name": "Navigate forward", 13 | "showButtons": "both" 14 | }, 15 | { 16 | "id": "homepage:open-homepage", 17 | "icon": "feather-home", 18 | "name": "Homepage: Open homepage", 19 | "showButtons": "both" 20 | } 21 | ], 22 | "desktop": true 23 | } -------------------------------------------------------------------------------- /.obsidian/plugins/customizable-page-header-buttons/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 3 | If you want to view the source, visit the plugin's github repository: 4 | https://github.com/kometenstaub/customizable-page-header-buttons 5 | 6 | This plugin is MIT-licensed: 7 | 8 | MIT License 9 | 10 | Copyright (c) 2021-2022 kometenstaub and contributors 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining a copy 13 | of this software and associated documentation files (the "Software"), to deal 14 | in the Software without restriction, including without limitation the rights 15 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 16 | copies of the Software, and to permit persons to whom the Software is 17 | furnished to do so, subject to the following conditions: 18 | 19 | The above copyright notice and this permission notice shall be included in all 20 | copies or substantial portions of the Software. 21 | 22 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 23 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 25 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 27 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 28 | SOFTWARE. 29 | 30 | 31 | The commandSuggester, iconPicker, Obsidian icon names and the biggest part of the settings tab have been adapted from the Obsidian Customizable Sidebar Plugin (https://github.com/phibr0/obsidian-customizable-sidebar). 32 | It is MIT-licensed: 33 | MIT License 34 | 35 | Copyright (c) 2021 Phillip 36 | 37 | Permission is hereby granted, free of charge, to any person obtaining a copy 38 | of this software and associated documentation files (the "Software"), to deal 39 | in the Software without restriction, including without limitation the rights 40 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 41 | copies of the Software, and to permit persons to whom the Software is 42 | furnished to do so, subject to the following conditions: 43 | 44 | The above copyright notice and this permission notice shall be included in all 45 | copies or substantial portions of the Software. 46 | 47 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 48 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 49 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 50 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 51 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 52 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 53 | SOFTWARE. 54 | 55 | The workspace monkey-patching uses code from monkey-around, which is ISC-licensed. 56 | https://github.com/pjeby/monkey-around 57 | 58 | */ 59 | 60 | var J=Object.create;var L=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var j=n=>L(n,"__esModule",{value:!0});var ee=(n,t)=>{j(n);for(var e in t)L(n,e,{get:t[e],enumerable:!0})},te=(n,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of X(t))!Z.call(n,i)&&i!=="default"&&L(n,i,{get:()=>t[i],enumerable:!(e=Q(t,i))||e.enumerable});return n},C=n=>te(j(L(n!=null?J(Y(n)):{},"default",n&&n.__esModule&&"default"in n?{get:()=>n.default,enumerable:!0}:{value:n,enumerable:!0})),n);ee(exports,{default:()=>O});var r=C(require("obsidian"));function q(n,t){let e=Object.keys(t).map(i=>ie(n,i,t[i]));return e.length===1?e[0]:function(){e.forEach(i=>i())}}function ie(n,t,e){let i=n[t],l=n.hasOwnProperty(t),s=e(i);return i&&Object.setPrototypeOf(s,i),Object.setPrototypeOf(o,s),n[t]=o,u;function o(...c){return s===i&&n[t]===o&&u(),s.apply(this,c)}function u(){n[t]===o&&(l?n[t]=i:delete n[t]),s!==i&&(s=i,Object.setPrototypeOf(o,i||Function))}}var d=C(require("obsidian"));var V=C(require("obsidian"));var k=C(require("obsidian"));var x=C(require("obsidian"));var H=["add-note-glyph","any-key","audio-file","blocks","bold-glyph","box-glyph","bracket-glyph","broken-link","bullet-list-glyph","bullet-list","calendar-glyph","calendar-with-checkmark","check-in-circle","check-small","checkbox-glyph","checkmark","clock-glyph","clock","cloud","code-glyph","command-glyph","compress-glyph","create-new","cross-in-box","cross","crossed-star","dice-glyph","dice","document","documents","dot-network","double-down-arrow-glyph","double-up-arrow-glyph","down-arrow-with-tail","down-chevron-glyph","down-curly-arrow-glyph","duplicate-glyph","enlarge-glyph","enter","exit-fullscreen","expand-vertically","file-explorer-glyph","filled-pin","folder","forward-arrow","fullscreen","gear","github-glyph","go-to-file","graph-glyph","hashtag","heading-glyph","help","highlight-glyph","horizontal-split","image-file","image-glyph","import-glyph","indent-glyph","info","install","italic-glyph","keyboard-glyph","languages","left-arrow-with-tail","left-arrow","left-chevron-glyph","lines-of-text","link-glyph","link","links-coming-in","links-going-out","logo-crystal","magnifying-glass","merge-files-glyph","merge-files","microphone-filled","microphone","minus-with-circle","navigate-glyph","note-glyph","number-list-glyph","open-elsewhere-glyph","open-vault","pane-layout","paper-plane-glyph","paper-plane","paste-text","paste","paused","pdf-file","pencil","percent-sign-glyph","pin","play-audio-glyph","plus-minus-glyph","plus-with-circle","popup-open","presentation-glyph","presentation","price-tag-glyph","question-mark-glyph","quote-glyph","reading-glasses","redo-glyph","reset","restore-file-glyph","right-arrow-with-tail","right-arrow","right-chevron-glyph","right-triangle","run-command","scissors-glyph","scissors","search-glyph","search","select-all-text","sheets-in-box","split","stacked-levels","star-glyph","star-list","star","stop-audio-glyph","strikethrough-glyph","switch","sync-small","sync","tag-glyph","three-horizontal-bars","tomorrow-glyph","trash","two-blank-pages","undo-glyph","unindent-glyph","up-and-down-arrows","up-arrow-with-tail","up-chevron-glyph","up-curly-arrow-glyph","uppercase-lowercase-a","vault","vertical-split","vertical-three-dots","wand-glyph","wand","workspace-glyph","wrench-screwdriver-glyph","yesterday-glyph"],h="page-header-button",B="titlebar-button",M="titlebar-center",S=[B,h];function le(n){return n.includes(":")?n.split(":")[1].trim():n}function _(){let n=24;return x.Platform.isMobile?n=24:x.Platform.isDesktop&&(n=18),n}function E(n,t,e,i,l,s="a"){let o=le(n),u=l.concat([t]),c=createEl(s,{cls:u,attr:{"aria-label-position":"bottom","aria-label":o}});return(0,x.setIcon)(c,e,i),c}function I(n){for(let t=n.length;t>=0;t--)n[t]&&n[t].remove()}function R(n,t,e){let i=n.getElementsByClassName(`${e} ${h} ${t}`);i[0]&&i[0].remove()}function y(n){return n.getElementsByClassName("titlebar-text")[0]}function v(n){let t=n.getElementsByClassName("titlebar-text")[0];t&&t.detach()}function m(n,t){if(t.body.classList.contains("is-hidden-frameless"))return;let e=t.getElementsByClassName(`${h} ${M}`)[0];if(e){let i=e.parentElement;e.detach(),i&&i.insertBefore(n,i.children[0])}}function w(n){if(n.body.classList.contains("is-hidden-frameless"))return;let t=P(n);if(!t)return;let e=t.getElementsByClassName(`${h} ${B}`);I(e)}function T(n){if(n.body.classList.contains("is-hidden-frameless"))return;let t=createDiv({cls:[h,"titlebar-center"]}),e=n.getElementsByClassName("titlebar-inner")[0];return e&&e.insertBefore(t,e.children[0]),t}function $(){let n=[];app.workspace.iterateAllLeaves(t=>{n.push(t.view.containerEl)});for(let t=0;t0&&I(i)}}function D(n){let t=[];app.workspace.iterateAllLeaves(e=>{t.push(e.view.containerEl)});for(let e=0;e0&&I(e)}function p(n){if(n.body.classList.contains("is-hidden-frameless"))return;let t=A(n);if(!t)return;let e=t.getElementsByClassName(h);e.length>0&&I(e)}function F(n,t){if(t.body.classList.contains("is-hidden-frameless"))return;let e=z(t);!e||R(e,n,B)}function U(n,t){if(t.body.classList.contains("is-hidden-frameless"))return;let e=A(t);!e||R(e,n,B)}function G(n,t){if(t.body.classList.contains("is-hidden-frameless"))return;let e=P(t);!e||R(e,n,B)}function z(n){return n.getElementsByClassName("titlebar-button-container mod-left")[0]}function A(n){return n.getElementsByClassName("titlebar-button-container mod-right")[0]}function P(n){return n.getElementsByClassName(`${h} ${M}`)[0]}var f=class extends k.FuzzySuggestModal{constructor(t,e,i,l=-1){super(t.app);this.plugin=t,this.command=e,this.type=i,this.index=l,this.setPlaceholder("Please pick an icon")}cap(t){return t.split(" ").map(i=>i[0].toUpperCase()+i.substring(1)).join(" ")}getItems(){return this.plugin.iconList}getItemText(t){return this.cap(t.replace("lucide-","").replace(/-/gi," "))}renderSuggestion(t,e){e.addClass("CS-icon-container");let i=e.createDiv({cls:"CS-icon"});(0,k.setIcon)(i,t.item),super.renderSuggestion(t,e)}async onChooseItem(t){let{id:e,name:i}=this.command,{settings:l}=this.plugin,s=0;if(this.type==="page"){let o="both";this.index===-1?o="both":o=l.enabledButtons[this.index].showButtons;let u={id:e,icon:t,name:i,showButtons:o};this.index===-1?l.enabledButtons.push(u):(l.enabledButtons[this.index]=u,new k.Notice("This change will take effect for new panes only."))}else{let o={id:e,icon:t,name:i};if(this.index===-1)if(this.type==="title-left")l.titleLeft.push(o);else if(this.type==="title-right")l.titleRight.push(o);else{let u=l.titleCenter.length;u!==0&&(s=u),l.titleCenter.push(o)}else if(this.type==="title-left")l.titleLeft[this.index]=o;else if(this.type==="title-right")l.titleRight[this.index]=o;else{let u=l.titleCenter.length;u!==0&&(s=u),l.titleCenter[this.index]=o}}if(await this.plugin.saveSettings(),this.type==="title-left")for(let o=0;o{dispatchEvent(new Event("TopBar-addedCommand"))},100)}};var b=class extends V.FuzzySuggestModal{constructor(t,e){super(t.app);this.plugin=t,this.type=e}pushToSettings(t,e,i){i==="titleRight"||i==="titleLeft"||i==="titleCenter"?t[i].push({id:e.id,icon:e.icon,name:e.name}):t.enabledButtons.push({id:e.id,icon:e.icon,name:e.name,showButtons:"both"})}getItems(){return this.app.commands.listCommands()}getItemText(t){return t.name}async onChooseItem(t,e){let{settings:i}=this.plugin,l=0;if(t.icon!==void 0){if(this.type==="page")this.pushToSettings(i,t,"enabledSettings");else if(this.type==="title-left")this.pushToSettings(i,t,"titleLeft");else if(this.type==="title-right")this.pushToSettings(i,t,"titleRight");else{let s=this.plugin.settings.titleCenter.length;s!==0&&(l=s),this.pushToSettings(i,t,"titleCenter")}if(await this.plugin.saveSettings(),this.type==="title-left")for(let s=0;s{dispatchEvent(new Event("TopBar-addedCommand"))},100)}else new f(this.plugin,t,this.type).open()}};var N=class extends d.PluginSettingTab{constructor(t,e){super(t,e);this.plugin=e,this.plugin.listener=()=>{this.display()},this.containerEl.addClass("page-header-button"),addEventListener("TopBar-addedCommand",this.plugin.listener)}display(){let{containerEl:t}=this,{settings:e}=this.plugin;t.empty(),t.createEl("h3",{text:"Page Header Buttons"}),t.createEl("p",{text:"The buttons are added in the order in which they are shown here."}),new d.Setting(t).setName("Show buttons on desktop").setDesc("By default, the buttons will only be shown in Obsidian Mobile.").addToggle(i=>{i.setValue(e.desktop).onChange(async l=>{if(e.desktop=l,await this.plugin.saveSettings(),this.display(),!l){for(let s of e.enabledButtons)s.showButtons="mobile";await this.plugin.saveSettings()}})}),new d.Setting(t).setName("Add Button").setDesc("Add a new button left to the switch edit/preview mode toggle.").addButton(i=>{i.setButtonText("Add Command").onClick(()=>{new b(this.plugin,"page").open()})}),this.app.plugins.plugins["pane-relief"]&&new d.Setting(t).setName("Pane Relief count").setDesc("Enable to show the pane relief history count next to back/forward buttons.").addToggle(i=>{i.setValue(e.paneRelief).onChange(async l=>{e.paneRelief=l,await this.plugin.saveSettings()})}),new d.Setting(t).setName("Button spacing").setDesc("Set the spacing for Page Header buttons.").addButton(i=>{i.setButtonText("Click to go to the Style settings. Requires the Style settings plugin."),i.onClick(l=>this.app.setting.openTabById("obsidian-style-settings"))});for(let i=0;i{u.addOption("both","Add button for both mobile and desktop.").addOption("mobile","Add button only for mobile.").addOption("desktop","Add button only for desktop.").setValue(l.showButtons).onChange(async c=>{l.showButtons=c,e.enabledButtons[i]=l,await this.plugin.saveSettings(),c==="desktop"&&d.Platform.isMobile?D(l.id):c==="mobile"&&d.Platform.isDesktop&&D(l.id)})}),i>0&&o.addExtraButton(u=>{u.setIcon("up-arrow-with-tail").setTooltip("Move button to the left").onClick(async()=>{e.enabledButtons[i]=e.enabledButtons[i-1],e.enabledButtons[i-1]=l,await this.plugin.saveSettings(),this.display()})}),i{u.setIcon("down-arrow-with-tail").setTooltip("Move button to the right").onClick(async()=>{e.enabledButtons[i]=e.enabledButtons[i+1],e.enabledButtons[i+1]=l,await this.plugin.saveSettings(),this.display()})}),o.addExtraButton(u=>{u.setIcon("trash").setTooltip("Remove Command").onClick(async()=>{e.enabledButtons.remove(l),D(l.id),await this.plugin.saveSettings(),this.display()})}).addExtraButton(u=>{u.setIcon("gear").setTooltip("Edit Icon").onClick(()=>{let c=e.enabledButtons.findIndex(a=>a===l);new f(this.plugin,l,"page",c).open()})}),o.nameEl.prepend(s),o.nameEl.addClass("CS-flex")}if(d.Platform.isDesktopApp){t.createEl("br"),t.createEl("h3",{text:"Titlebar buttons"}),t.createEl("h4",{text:"Left titlebar"}),new d.Setting(t).setName("Add Button").setDesc("Add a new button right to the back/forward buttons.").addButton(i=>{i.setButtonText("Add Command").onClick(()=>{new b(this.plugin,"title-left").open()})});for(let i=0;i0&&o.addExtraButton(u=>{u.setIcon("up-arrow-with-tail").setTooltip("Move button to the left").onClick(async()=>{e.titleLeft[i]=e.titleLeft[i-1],e.titleLeft[i-1]=l,await this.plugin.saveSettings();for(let c=0;c{u.setIcon("down-arrow-with-tail").setTooltip("Move button to the right").onClick(async()=>{e.titleLeft[i]=e.titleLeft[i+1],e.titleLeft[i+1]=l,await this.plugin.saveSettings();for(let c=0;c{u.setIcon("trash").setTooltip("Remove Command").onClick(async()=>{e.titleLeft.remove(l),await this.plugin.saveSettings();for(let c=0;c{u.setIcon("gear").setTooltip("Edit Icon").onClick(()=>{let c=e.titleLeft.findIndex(a=>a===l);new f(this.plugin,l,"title-left",c).open();for(let a=0;a{i.setButtonText("Add Command").onClick(()=>{new b(this.plugin,"title-right").open()})});for(let i=0;i0&&o.addExtraButton(u=>{u.setIcon("up-arrow-with-tail").setTooltip("Move button to the left").onClick(async()=>{e.titleRight[i]=e.titleRight[i-1],e.titleRight[i-1]=l,await this.plugin.saveSettings();for(let c=0;c{u.setIcon("down-arrow-with-tail").setTooltip("Move button to the right").onClick(async()=>{e.titleRight[i]=e.titleRight[i+1],e.titleRight[i+1]=l,await this.plugin.saveSettings();for(let c=0;c{u.setIcon("trash").setTooltip("Remove Command").onClick(async()=>{e.titleRight.remove(l),await this.plugin.saveSettings();for(let c=0;c{u.setIcon("gear").setTooltip("Edit Icon").onClick(()=>{let c=e.titleRight.findIndex(a=>a===l);new f(this.plugin,l,"title-right",c).open();for(let a=0;a{i.setButtonText("Add Command").onClick(()=>{new b(this.plugin,"title-center").open()})});for(let i=0;i0&&o.addExtraButton(u=>{u.setIcon("up-arrow-with-tail").setTooltip("Move button to the left").onClick(async()=>{e.titleCenter[i]=e.titleCenter[i-1],e.titleCenter[i-1]=l,await this.plugin.saveSettings();for(let c=0;c{u.setIcon("down-arrow-with-tail").setTooltip("Move button to the right").onClick(async()=>{e.titleCenter[i]=e.titleCenter[i+1],e.titleCenter[i+1]=l,await this.plugin.saveSettings();for(let c=0;c{u.setIcon("trash").setTooltip("Remove Command").onClick(async()=>{if(e.titleCenter.remove(l),await this.plugin.saveSettings(),this.plugin.settings.titleCenter.length===0)for(let c=0;c{u.setIcon("gear").setTooltip("Edit Icon").onClick(()=>{let c=e.titleCenter.findIndex(a=>a===l);new f(this.plugin,l,"title-center",c).open()})}),o.nameEl.prepend(s),o.nameEl.addClass("CS-flex")}}}};var K=["lucide-activity","lucide-airplay","lucide-alarm-check","lucide-alarm-clock-off","lucide-alarm-clock","lucide-alarm-minus","lucide-alarm-plus","lucide-album","lucide-alert-circle","lucide-alert-octagon","lucide-alert-triangle","lucide-align-center-horizontal","lucide-align-center","lucide-align-center-vertical","lucide-align-end-horizontal","lucide-align-end-vertical","lucide-align-horizontal-distribute-center","lucide-align-horizontal-distribute-end","lucide-align-horizontal-distribute-start","lucide-align-horizontal-justify-center","lucide-align-horizontal-justify-end","lucide-align-horizontal-justify-start","lucide-align-horizontal-space-around","lucide-align-horizontal-space-between","lucide-align-justify","lucide-align-left","lucide-align-right","lucide-align-start-horizontal","lucide-align-start-vertical","lucide-align-vertical-distribute-center","lucide-align-vertical-distribute-end","lucide-align-vertical-distribute-start","lucide-align-vertical-justify-center","lucide-align-vertical-justify-end","lucide-align-vertical-justify-start","lucide-align-vertical-space-around","lucide-align-vertical-space-between","lucide-anchor","lucide-aperture","lucide-archive","lucide-arrow-big-down","lucide-arrow-big-left","lucide-arrow-big-right","lucide-arrow-big-up","lucide-arrow-down-circle","lucide-arrow-down-left","lucide-arrow-down-right","lucide-arrow-down","lucide-arrow-left-circle","lucide-arrow-left-right","lucide-arrow-left","lucide-arrow-right-circle","lucide-arrow-right","lucide-arrow-up-circle","lucide-arrow-up-left","lucide-arrow-up-right","lucide-arrow-up","lucide-asterisk","lucide-at-sign","lucide-award","lucide-axe","lucide-banknote","lucide-bar-chart-2","lucide-bar-chart","lucide-baseline","lucide-battery-charging","lucide-battery-full","lucide-battery-low","lucide-battery-medium","lucide-battery","lucide-beaker","lucide-bell-minus","lucide-bell-off","lucide-bell-plus","lucide-bell-ring","lucide-bell","lucide-bike","lucide-binary","lucide-bitcoin","lucide-bluetooth-connected","lucide-bluetooth-off","lucide-bluetooth-searching","lucide-bluetooth","lucide-bold","lucide-bookmark-minus","lucide-bookmark-plus","lucide-bookmark","lucide-book-open","lucide-book","lucide-bot","lucide-box-select","lucide-box","lucide-briefcase","lucide-brush","lucide-bug","lucide-building","lucide-bus","lucide-calculator","lucide-calendar","lucide-camera-off","lucide-camera","lucide-carrot","lucide-car","lucide-cast","lucide-check-circle-2","lucide-check-circle","lucide-check-square","lucide-check","lucide-chevron-down","lucide-chevron-first","lucide-chevron-last","lucide-chevron-left","lucide-chevron-right","lucide-chevrons-down","lucide-chevrons-down-up","lucide-chevrons-left","lucide-chevrons-right","lucide-chevrons-up-down","lucide-chevrons-up","lucide-chevron-up","lucide-chrome","lucide-circle-slashed","lucide-circle","lucide-clipboard-check","lucide-clipboard-copy","lucide-clipboard-list","lucide-clipboard","lucide-clipboard-x","lucide-clock-1","lucide-clock-2","lucide-clock-3","lucide-clock-4","lucide-clock-5","lucide-clock-6","lucide-clock-7","lucide-clock-8","lucide-clock-9","lucide-clock-10","lucide-clock-11","lucide-clock-12","lucide-clock","lucide-cloud-drizzle","lucide-cloud-fog","lucide-cloud-hail","lucide-cloud-lightning","lucide-cloud-moon","lucide-cloud-off","lucide-cloud-rain","lucide-cloud-rain-wind","lucide-cloud-snow","lucide-cloud-sun","lucide-cloud","lucide-cloudy","lucide-clover","lucide-code-2","lucide-codepen","lucide-codesandbox","lucide-code","lucide-coffee","lucide-coins","lucide-columns","lucide-command","lucide-compass","lucide-contact","lucide-contrast","lucide-cookie","lucide-copyleft","lucide-copyright","lucide-copy","lucide-corner-down-left","lucide-corner-down-right","lucide-corner-left-down","lucide-corner-left-up","lucide-corner-right-down","lucide-corner-right-up","lucide-corner-up-left","lucide-corner-up-right","lucide-cpu","lucide-credit-card","lucide-crop","lucide-crosshair","lucide-cross","lucide-crown","lucide-currency","lucide-database","lucide-delete","lucide-disc","lucide-divide-circle","lucide-divide-square","lucide-divide","lucide-dollar-sign","lucide-download-cloud","lucide-download","lucide-dribbble","lucide-droplets","lucide-droplet","lucide-drumstick","lucide-edit-2","lucide-edit-3","lucide-edit","lucide-egg","lucide-equal-not","lucide-equal","lucide-euro","lucide-expand","lucide-external-link","lucide-eye-off","lucide-eye","lucide-facebook","lucide-fast-forward","lucide-feather","lucide-figma","lucide-file-check-2","lucide-file-check","lucide-file-code","lucide-file-digit","lucide-file-input","lucide-file-minus-2","lucide-file-minus","lucide-file-output","lucide-file-plus-2","lucide-file-plus","lucide-file-search","lucide-files","lucide-file","lucide-file-text","lucide-file-x-2","lucide-file-x","lucide-film","lucide-filter","lucide-flag","lucide-flag-triangle-left","lucide-flag-triangle-right","lucide-flame","lucide-flashlight-off","lucide-flashlight","lucide-flask-conical","lucide-flask-round","lucide-folder-minus","lucide-folder-open","lucide-folder-plus","lucide-folder","lucide-form-input","lucide-forward","lucide-framer","lucide-frown","lucide-function-square","lucide-gamepad-2","lucide-gamepad","lucide-gauge","lucide-gavel","lucide-gem","lucide-ghost","lucide-gift","lucide-git-branch-plus","lucide-git-branch","lucide-git-commit","lucide-github","lucide-gitlab","lucide-git-merge","lucide-git-pull-request","lucide-glasses","lucide-globe-2","lucide-globe","lucide-grab","lucide-graduation-cap","lucide-grid","lucide-grip-horizontal","lucide-grip-vertical","lucide-hammer","lucide-hand-metal","lucide-hand","lucide-hard-drive","lucide-hard-hat","lucide-hash","lucide-haze","lucide-headphones","lucide-heart","lucide-help-circle","lucide-hexagon","lucide-highlighter","lucide-history","lucide-home","lucide-image-minus","lucide-image-off","lucide-image-plus","lucide-image","lucide-import","lucide-inbox","lucide-indent","lucide-indian-rupee","lucide-infinity","lucide-info","lucide-inspect","lucide-instagram","lucide-italic","lucide-japanese-yen","lucide-keyboard","lucide-key","lucide-landmark","lucide-languages","lucide-laptop-2","lucide-laptop","lucide-lasso-select","lucide-lasso","lucide-layers","lucide-layout-dashboard","lucide-layout-grid","lucide-layout-list","lucide-layout","lucide-layout-template","lucide-library","lucide-life-buoy","lucide-lightbulb-off","lucide-lightbulb","lucide-link-2-off","lucide-link-2","lucide-linkedin","lucide-link","lucide-list-checks","lucide-list-minus","lucide-list-ordered","lucide-list-plus","lucide-list","lucide-list-x","lucide-loader-2","lucide-loader","lucide-locate-fixed","lucide-locate-off","lucide-locate","lucide-lock","lucide-log-in","lucide-log-out","lucide-mail","lucide-map-pin","lucide-map","lucide-maximize-2","lucide-maximize","lucide-megaphone","lucide-meh","lucide-menu","lucide-message-circle","lucide-message-square","lucide-mic-off","lucide-mic","lucide-minimize-2","lucide-minimize","lucide-minus-circle","lucide-minus-square","lucide-minus","lucide-monitor-off","lucide-monitor-speaker","lucide-monitor","lucide-moon","lucide-more-horizontal","lucide-more-vertical","lucide-mountain-snow","lucide-mountain","lucide-mouse-pointer-2","lucide-mouse-pointer-click","lucide-mouse-pointer","lucide-move-diagonal-2","lucide-move-diagonal","lucide-move-horizontal","lucide-move","lucide-move-vertical","lucide-music","lucide-navigation-2","lucide-navigation","lucide-network","lucide-octagon","lucide-option","lucide-outdent","lucide-package-check","lucide-package-minus","lucide-package-plus","lucide-package-search","lucide-package","lucide-package-x","lucide-palette","lucide-palmtree","lucide-paperclip","lucide-pause-circle","lucide-pause-octagon","lucide-pause","lucide-pencil","lucide-pen-tool","lucide-percent","lucide-person-standing","lucide-phone-call","lucide-phone-forwarded","lucide-phone-incoming","lucide-phone-missed","lucide-phone-off","lucide-phone-outgoing","lucide-phone","lucide-pie-chart","lucide-piggy-bank","lucide-pin","lucide-pipette","lucide-plane","lucide-play-circle","lucide-play","lucide-plug-zap","lucide-plus-circle","lucide-plus-square","lucide-plus","lucide-pocket","lucide-podcast","lucide-pointer","lucide-pound-sterling","lucide-power-off","lucide-power","lucide-printer","lucide-qr-code","lucide-quote","lucide-radio-receiver","lucide-radio","lucide-redo","lucide-refresh-ccw","lucide-refresh-cw","lucide-regex","lucide-repeat-1","lucide-repeat","lucide-reply-all","lucide-reply","lucide-rewind","lucide-rocking-chair","lucide-rotate-ccw","lucide-rotate-cw","lucide-rss","lucide-ruler","lucide-russian-ruble","lucide-save","lucide-scale","lucide-scan-line","lucide-scan","lucide-scissors","lucide-screen-share-off","lucide-screen-share","lucide-search","lucide-send","lucide-separator-horizontal","lucide-separator-vertical","lucide-server-crash","lucide-server-off","lucide-server","lucide-settings-2","lucide-settings","lucide-share-2","lucide-share","lucide-sheet","lucide-shield-alert","lucide-shield-check","lucide-shield-close","lucide-shield-off","lucide-shield","lucide-shirt","lucide-shopping-bag","lucide-shopping-cart","lucide-shovel","lucide-shrink","lucide-shuffle","lucide-sidebar-close","lucide-sidebar-open","lucide-sidebar","lucide-sigma","lucide-signal-high","lucide-signal-low","lucide-signal-medium","lucide-signal","lucide-signal-zero","lucide-skip-back","lucide-skip-forward","lucide-skull","lucide-slack","lucide-slash","lucide-sliders","lucide-smartphone-charging","lucide-smartphone","lucide-smile","lucide-snowflake","lucide-sort-asc","lucide-sort-desc","lucide-speaker","lucide-sprout","lucide-square","lucide-star-half","lucide-star","lucide-stop-circle","lucide-stretch-horizontal","lucide-stretch-vertical","lucide-strikethrough","lucide-subscript","lucide-sunrise","lucide-sunset","lucide-sun","lucide-superscript","lucide-swiss-franc","lucide-switch-camera","lucide-table","lucide-tablet","lucide-tag","lucide-target","lucide-tent","lucide-terminal-square","lucide-terminal","lucide-text-cursor-input","lucide-text-cursor","lucide-thermometer-snowflake","lucide-thermometer-sun","lucide-thermometer","lucide-thumbs-down","lucide-thumbs-up","lucide-ticket","lucide-timer-off","lucide-timer-reset","lucide-timer","lucide-toggle-left","lucide-toggle-right","lucide-tornado","lucide-trash-2","lucide-trash","lucide-trello","lucide-trending-down","lucide-trending-up","lucide-triangle","lucide-truck","lucide-tv-2","lucide-tv","lucide-twitch","lucide-twitter","lucide-type","lucide-umbrella","lucide-underline","lucide-undo","lucide-unlink-2","lucide-unlink","lucide-unlock","lucide-upload-cloud","lucide-upload","lucide-user-check","lucide-user-minus","lucide-user-plus","lucide-users","lucide-user","lucide-user-x","lucide-verified","lucide-vibrate","lucide-video-off","lucide-video","lucide-view","lucide-voicemail","lucide-volume-1","lucide-volume-2","lucide-volume","lucide-volume-x","lucide-wallet","lucide-wand","lucide-watch","lucide-waves","lucide-webcam","lucide-wifi-off","lucide-wifi","lucide-wind","lucide-wrap-text","lucide-wrench","lucide-x-circle","lucide-x-octagon","lucide-x-square","lucide-x","lucide-youtube","lucide-zap-off","lucide-zap","lucide-zoom-in","lucide-zoom-out"];var ne={enabledButtons:[],desktop:!1,titleLeft:[],titleRight:[],titleCenter:[],paneRelief:!1},O=class extends r.Plugin{constructor(){super(...arguments);this.iconList=H.concat(K);this.titlebarText=[];this.windows=[]}addPageHeaderButton(t,e){let{id:i,icon:l,name:s}=e,o=_(),c=E(s,i,l,o,["view-action","clickable-icon",h]);this.settings.paneRelief&&(i==="app:go-forward"||i==="app:go-back")&&c.addClass("pane-relief"),t.prepend(c),this.registerDomEvent(c,"mousedown",a=>{a.button===0&&setTimeout(()=>{this.app.commands.executeCommandById(i)},5)})}addLeftTitleBarButton(t,e){if(activeDocument.body.classList.contains("is-hidden-frameless"))return;let{id:i,icon:l,name:s}=e,u=E(s,i,l,15,S,"div");t.append(u),this.registerDomEvent(u,"click",()=>{this.app.commands.executeCommandById(i)})}addRightTitleBarButton(t,e){if(activeDocument.body.classList.contains("is-hidden-frameless"))return;let{id:i,icon:l,name:s}=e,u=E(s,i,l,15,S,"div");t.insertBefore(u,t.children[0]),this.registerDomEvent(u,"click",()=>{this.app.commands.executeCommandById(i)})}addCenterTitleBarButton(t,e){if(activeDocument.body.classList.contains("is-hidden-frameless"))return;let{id:i,icon:l,name:s}=e,u=E(s,i,l,15,S,"div");t.append(u),this.registerDomEvent(u,"click",()=>{this.app.commands.executeCommandById(i)})}addLeftTitleBarButtons(t){if(!activeDocument.body.classList.contains("is-hidden-frameless")&&this.settings.titleLeft.length>0){let e=z(t);if(!e)return;for(let i of this.settings.titleLeft)this.addLeftTitleBarButton(e,i)}}addRightTitleBarButtons(t){if(!activeDocument.body.classList.contains("is-hidden-frameless")&&this.settings.titleRight.length>0){let e=A(t);if(!e)return;for(let i=this.settings.titleRight.length-1;i>=0;i--)this.addRightTitleBarButton(e,this.settings.titleRight[i])}}addCenterTitleBarButtons(t){if(!activeDocument.body.classList.contains("is-hidden-frameless")&&this.settings.titleCenter.length>0){let e=P(t);if(!e)return;for(let i of this.settings.titleCenter)this.addCenterTitleBarButton(e,i)}}initTitleBar(t){if(!activeDocument.body.classList.contains("is-hidden-frameless")&&(this.addLeftTitleBarButtons(t),this.addRightTitleBarButtons(t),this.settings.titleCenter.length>0)){let e=y(t);if(!e)return;if(!this.titlebarText.contains(e)){this.titlebarText.push(e),v(t);let i=T(t);this.addCenterTitleBarButtons(t)}}}async onload(){if(console.log("loading Customizable Page Header Plugin"),await this.loadSettings(),this.addSettingTab(new N(this.app,this)),this.app.workspace.onLayoutReady(()=>{var t;if(r.Platform.isDesktopApp){this.windows.push(document),this.initTitleBar(document);let{children:e}=this.app.workspace.floatingSplit;if(e.length+1!==this.windows.length){for(let i of e)if(i instanceof r.WorkspaceWindow){let l=(t=i.getContainer())==null?void 0:t.doc;l&&(this.windows.push(l),this.initTitleBar(l))}}}(r.Platform.isMobile||this.settings.desktop)&&this.addButtonsToAllLeaves()}),r.Platform.isMobile||this.settings.desktop){let t=this;this.register(q(r.Workspace.prototype,{changeLayout(e){return async function(l){await e.call(this,l),t.addButtonsToAllLeaves()}}})),this.registerEvent(this.app.workspace.on("layout-change",()=>{let e=app.workspace.getActiveViewOfType(r.View);!e||this.addButtonsToLeaf(e.leaf)})),this.registerEvent(this.app.workspace.on("window-open",(e,i)=>{var s;let l=(s=e.getContainer())==null?void 0:s.doc;l&&(this.windows.push(l),this.initTitleBar(l))}))}}addButtonsToAllLeaves(){app.workspace.iterateAllLeaves(t=>this.addButtonsToLeaf(t)),app.workspace.onLayoutChange()}addButtonsToLeaf(t){var l;let e=t==null?void 0:t.view.containerEl,i=e==null?void 0:e.getElementsByClassName("view-actions")[0];if(!!i)for(let s=this.settings.enabledButtons.length-1;s>=0;s--)(l=i.getElementsByClassName(`view-action page-header-button ${this.settings.enabledButtons[s].id}`)[0])==null||l.detach(),(this.settings.enabledButtons[s].showButtons==="both"||this.settings.enabledButtons[s].showButtons==="mobile"&&r.Platform.isMobile||this.settings.enabledButtons[s].showButtons==="desktop"&&r.Platform.isDesktop)&&this.addPageHeaderButton(i,this.settings.enabledButtons[s])}onunload(){console.log("unloading Customizable Page Header Plugin"),$();for(let t=0;tthis.addButtonsToAllLeaves())}}; 61 | -------------------------------------------------------------------------------- /.obsidian/plugins/customizable-page-header-buttons/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "customizable-page-header-buttons", 3 | "name": "Customizable Page Header and Title Bar", 4 | "version": "4.7.2", 5 | "minAppVersion": "0.16.0", 6 | "description": "This plugin lets you add buttons for executing commands to the page header and on desktop to the title bar.", 7 | "author": "kometenstaub", 8 | "authorUrl": "https://github.com/kometenstaub", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/plugins/customizable-page-header-buttons/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | MIT License 3 | 4 | Copyright (c) 2021-2022 kometenstaub and contributors 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | /* @settings 26 | 27 | name: Customizable Page Header and Title Bar 28 | id: customizable-page-header-buttons 29 | settings: 30 | - 31 | id: page-header-spacing-mobile 32 | title: Page Header Button Spacing (mobile) 33 | type: variable-number-slider 34 | default: 12 35 | min: 0 36 | max: 30 37 | step: 1 38 | format: px 39 | - 40 | id: page-header-spacing-desktop 41 | title: Page Header Button Spacing (desktop) 42 | type: variable-number-slider 43 | default: 8 44 | min: 0 45 | max: 30 46 | step: 1 47 | format: px 48 | - 49 | id: titlebar-button-horizontal-spacing 50 | title: Horizontal spacing of titlebar buttons 51 | type: variable-number-slider 52 | default: 16 53 | min: 4 54 | max: 16 55 | step: 1 56 | format: px 57 | - 58 | id: display-view-header-title 59 | title: Hide the view header title 60 | description: Hiding it makes sense because of the embedded title. It gives more space for buttons, which is useful when many tab containers are open. 61 | type: variable-select 62 | default: initial 63 | options: 64 | - 65 | label: Show title 66 | value: initial 67 | - 68 | label: Hide title 69 | value: none 70 | 71 | */ 72 | 73 | .view-header-title{display:var(--display-view-header-title,initial)}.page-header-button.titlebar-center{align-items:center;display:flex;flex-grow:1;font-size:13px;height:100%;justify-content:center;left:0;opacity:.8;overflow:hidden;padding:0 125px;position:absolute;text-align:center;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%}.titlebar-button{align-items:center}.titlebar-button.titlebar-button.page-header-button{align-items:center;display:flex;padding:16px var(--titlebar-button-horizontal-spacing,16px)}body:not(.is-mobile) .view-actions{align-items:center}body:not(.is-mobile) .view-action,body:not(.is-mobile) .view-action.pane-relief{display:flex;position:unset}body:not(.is-mobile) .view-action.pane-relief.app\:go-back:before,body:not(.is-mobile) .view-action.pane-relief.app\:go-forward:after{display:inline;font-size:1em;line-height:1;vertical-align:text-top}body:not(.is-mobile) .view-action.pane-relief.app\:go-forward:after{content:var(--pane-relief-forward-count);padding-left:.4em}body:not(.is-mobile) .view-action.pane-relief.app\:go-back:before{content:var(--pane-relief-backward-count);padding-right:.4em}body:not(.is-mobile) .view-action:not(:last-child){margin-right:var(--page-header-spacing-desktop)}body:not(.is-mobile) .pane-relief body:not(.no-svg-replace) svg{vertical-align:top}.is-mobile .view-actions{align-items:center}.is-mobile .view-action:not(:last-child){margin-right:var(--page-header-spacing-mobile)}.is-mobile .view-header-title{-webkit-mask-image:none;mask-image:none} -------------------------------------------------------------------------------- /.obsidian/plugins/dataview/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "renderNullAs": "\\-", 3 | "taskLinkLocation": "end", 4 | "taskLinkText": "🔗", 5 | "taskCompletionTracking": false, 6 | "taskCompletionText": "completion", 7 | "warnOnEmptyResult": true, 8 | "refreshEnabled": true, 9 | "refreshInterval": 250, 10 | "defaultDateFormat": "MMMM dd, yyyy", 11 | "defaultDateTimeFormat": "h:mm a - MMMM dd, yyyy", 12 | "maxRecursiveRenderDepth": 6, 13 | "tableIdColumnName": "File", 14 | "tableGroupColumnName": "Group", 15 | "inlineQueryPrefix": "=", 16 | "inlineJsQueryPrefix": "$=", 17 | "enableDataviewJs": true, 18 | "enableInlineDataviewJs": true, 19 | "prettyRenderInlineFields": true, 20 | "schemaVersion": 1 21 | } -------------------------------------------------------------------------------- /.obsidian/plugins/dataview/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "dataview", 3 | "name": "Dataview", 4 | "version": "0.5.67", 5 | "minAppVersion": "0.13.11", 6 | "description": "Complex data views for the data-obsessed.", 7 | "author": "Michael Brenan ", 8 | "authorUrl": "https://github.com/blacksmithgu", 9 | "helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/", 10 | "isDesktopOnly": false 11 | } 12 | -------------------------------------------------------------------------------- /.obsidian/plugins/dataview/styles.css: -------------------------------------------------------------------------------- 1 | /** Live Preview padding fixes, specifically for DataviewJS custom HTML elements. */ 2 | .is-live-preview .block-language-dataviewjs > p, .is-live-preview .block-language-dataviewjs > span { 3 | line-height: 1.0; 4 | } 5 | 6 | .block-language-dataview { 7 | overflow-y: auto; 8 | } 9 | 10 | /*****************/ 11 | /** Table Views **/ 12 | /*****************/ 13 | 14 | /* List View Default Styling; rendered internally as a table. */ 15 | .table-view-table { 16 | width: 100%; 17 | } 18 | 19 | .table-view-table > thead > tr, .table-view-table > tbody > tr { 20 | margin-top: 1em; 21 | margin-bottom: 1em; 22 | text-align: left; 23 | } 24 | 25 | .table-view-table > tbody > tr:hover { 26 | background-color: var(--table-row-background-hover); 27 | } 28 | 29 | .table-view-table > thead > tr > th { 30 | font-weight: 700; 31 | font-size: larger; 32 | border-top: none; 33 | border-left: none; 34 | border-right: none; 35 | border-bottom: solid; 36 | 37 | max-width: 100%; 38 | } 39 | 40 | .table-view-table > tbody > tr > td { 41 | text-align: left; 42 | border: none; 43 | font-weight: 400; 44 | max-width: 100%; 45 | } 46 | 47 | .table-view-table ul, .table-view-table ol { 48 | margin-block-start: 0.2em !important; 49 | margin-block-end: 0.2em !important; 50 | } 51 | 52 | /** Rendered value styling for any view. */ 53 | .dataview-result-list-root-ul { 54 | padding: 0em !important; 55 | margin: 0em !important; 56 | } 57 | 58 | .dataview-result-list-ul { 59 | margin-block-start: 0.2em !important; 60 | margin-block-end: 0.2em !important; 61 | } 62 | 63 | /** Generic grouping styling. */ 64 | .dataview.result-group { 65 | padding-left: 8px; 66 | } 67 | 68 | /*******************/ 69 | /** Inline Fields **/ 70 | /*******************/ 71 | 72 | .dataview.inline-field-key { 73 | padding-left: 8px; 74 | padding-right: 8px; 75 | font-family: var(--font-monospace); 76 | background-color: var(--background-primary-alt); 77 | color: var(--text-nav-selected); 78 | } 79 | 80 | .dataview.inline-field-value { 81 | padding-left: 8px; 82 | padding-right: 8px; 83 | font-family: var(--font-monospace); 84 | background-color: var(--background-secondary-alt); 85 | color: var(--text-nav-selected); 86 | } 87 | 88 | .dataview.inline-field-standalone-value { 89 | padding-left: 8px; 90 | padding-right: 8px; 91 | font-family: var(--font-monospace); 92 | background-color: var(--background-secondary-alt); 93 | color: var(--text-nav-selected); 94 | } 95 | 96 | /***************/ 97 | /** Task View **/ 98 | /***************/ 99 | 100 | .dataview.task-list-item, .dataview.task-list-basic-item { 101 | margin-top: 3px; 102 | margin-bottom: 3px; 103 | transition: 0.4s; 104 | } 105 | 106 | .dataview.task-list-item:hover, .dataview.task-list-basic-item:hover { 107 | background-color: var(--text-selection); 108 | box-shadow: -40px 0 0 var(--text-selection); 109 | cursor: pointer; 110 | } 111 | 112 | /*****************/ 113 | /** Error Views **/ 114 | /*****************/ 115 | 116 | div.dataview-error-box { 117 | width: 100%; 118 | min-height: 150px; 119 | display: flex; 120 | align-items: center; 121 | justify-content: center; 122 | border: 4px dashed var(--background-secondary); 123 | } 124 | 125 | .dataview-error-message { 126 | color: var(--text-muted); 127 | text-align: center; 128 | } 129 | 130 | /*************************/ 131 | /** Additional Metadata **/ 132 | /*************************/ 133 | 134 | .dataview.small-text { 135 | font-size: smaller; 136 | color: var(--text-muted); 137 | margin-left: 3px; 138 | } 139 | 140 | .dataview.small-text::before { 141 | content: "("; 142 | } 143 | 144 | .dataview.small-text::after { 145 | content: ")"; 146 | } 147 | -------------------------------------------------------------------------------- /.obsidian/plugins/homepage/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 4, 3 | "homepages": { 4 | "Main Homepage": { 5 | "version": 2, 6 | "hasRibbonIcon": true, 7 | "openMode": "Replace all open notes", 8 | "view": "Reading view", 9 | "refreshDataview": true, 10 | "value": "Dashboard++", 11 | "kind": "File", 12 | "commands": [] 13 | } 14 | }, 15 | "separateMobile": false 16 | } -------------------------------------------------------------------------------- /.obsidian/plugins/homepage/main.js: -------------------------------------------------------------------------------- 1 | "use strict";var Ve=Object.create;var Y=Object.defineProperty;var Ye=Object.getOwnPropertyDescriptor;var Be=Object.getOwnPropertyNames;var Ue=Object.getPrototypeOf,Ke=Object.prototype.hasOwnProperty;var je=(a,e)=>()=>(e||a((e={exports:{}}).exports,e),e.exports),ze=(a,e)=>{for(var t in e)Y(a,t,{get:e[t],enumerable:!0})},he=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Be(e))!Ke.call(a,i)&&i!==t&&Y(a,i,{get:()=>e[i],enumerable:!(n=Ye(e,i))||n.enumerable});return a};var qe=(a,e,t)=>(t=a!=null?Ve(Ue(a)):{},he(e||!a||!a.__esModule?Y(t,"default",{value:a,enumerable:!0}):t,a)),Ge=a=>he(Y({},"__esModule",{value:!0}),a);var Ce=je(l=>{"use strict";Object.defineProperty(l,"__esModule",{value:!0});var g=require("obsidian"),ne="YYYY-MM-DD",ae="gggg-[W]ww",Ne="YYYY-MM",ke="YYYY-[Q]Q",Pe="YYYY";function F(a){let e=window.app.plugins.getPlugin("periodic-notes");return e&&e.settings?.[a]?.enabled}function O(){try{let{internalPlugins:a,plugins:e}=window.app;if(F("daily")){let{format:o,folder:s,template:c}=e.getPlugin("periodic-notes")?.settings?.daily||{};return{format:o||ne,folder:s?.trim()||"",template:c?.trim()||""}}let{folder:t,format:n,template:i}=a.getPluginById("daily-notes")?.instance?.options||{};return{format:n||ne,folder:t?.trim()||"",template:i?.trim()||""}}catch(a){console.info("No custom daily note settings found!",a)}}function L(){try{let a=window.app.plugins,e=a.getPlugin("calendar")?.options,t=a.getPlugin("periodic-notes")?.settings?.weekly;if(F("weekly"))return{format:t.format||ae,folder:t.folder?.trim()||"",template:t.template?.trim()||""};let n=e||{};return{format:n.weeklyNoteFormat||ae,folder:n.weeklyNoteFolder?.trim()||"",template:n.weeklyNoteTemplate?.trim()||""}}catch(a){console.info("No custom weekly note settings found!",a)}}function x(){let a=window.app.plugins;try{let e=F("monthly")&&a.getPlugin("periodic-notes")?.settings?.monthly||{};return{format:e.format||Ne,folder:e.folder?.trim()||"",template:e.template?.trim()||""}}catch(e){console.info("No custom monthly note settings found!",e)}}function C(){let a=window.app.plugins;try{let e=F("quarterly")&&a.getPlugin("periodic-notes")?.settings?.quarterly||{};return{format:e.format||ke,folder:e.folder?.trim()||"",template:e.template?.trim()||""}}catch(e){console.info("No custom quarterly note settings found!",e)}}function H(){let a=window.app.plugins;try{let e=F("yearly")&&a.getPlugin("periodic-notes")?.settings?.yearly||{};return{format:e.format||Pe,folder:e.folder?.trim()||"",template:e.template?.trim()||""}}catch(e){console.info("No custom yearly note settings found!",e)}}function De(...a){let e=[];for(let n=0,i=a.length;n{let X=n(),ee=a.clone().set({hour:X.get("hour"),minute:X.get("minute"),second:X.get("second")});return E&&ee.add(parseInt(v,10),w),f?ee.format(f.substring(1).trim()):ee.format(o)}).replace(/{{\s*yesterday\s*}}/gi,a.clone().subtract(1,"day").format(o)).replace(/{{\s*tomorrow\s*}}/gi,a.clone().add(1,"d").format(o)));return e.foldManager.save(p,m),p}catch(p){console.error(`Failed to create file: '${d}'`,p),new g.Notice("Unable to create new file.")}}function et(a,e){return e[k(a,"day")]??null}function tt(){let{vault:a}=window.app,{folder:e}=O(),t=a.getAbstractFileByPath(g.normalizePath(e));if(!t)throw new ie("Failed to find daily notes folder");let n={};return g.Vault.recurseChildren(t,i=>{if(i instanceof g.TFile){let o=M(i,"day");if(o){let s=k(o,"day");n[s]=i}}}),n}var oe=class extends Error{};function nt(){let{moment:a}=window,e=a.localeData()._week.dow,t=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];for(;e;)t.push(t.shift()),e--;return t}function at(a){return nt().indexOf(a.toLowerCase())}async function Me(a){let{vault:e}=window.app,{template:t,format:n,folder:i}=L(),[o,s]=await A(t),c=a.format(n),m=await I(i,c);try{let r=await e.create(m,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,D,E,v)=>{let w=window.moment(),f=a.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return P&&f.add(parseInt(D,10),E),v?f.format(v.substring(1).trim()):f.format(n)}).replace(/{{\s*title\s*}}/gi,c).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s*:(.*?)}}/gi,(d,p,P)=>{let D=at(p);return a.weekday(D).format(P.trim())}));return window.app.foldManager.save(r,s),r}catch(r){console.error(`Failed to create file: '${m}'`,r),new g.Notice("Unable to create new file.")}}function it(a,e){return e[k(a,"week")]??null}function ot(){let a={};if(!Fe())return a;let{vault:e}=window.app,{folder:t}=L(),n=e.getAbstractFileByPath(g.normalizePath(t));if(!n)throw new oe("Failed to find weekly notes folder");return g.Vault.recurseChildren(n,i=>{if(i instanceof g.TFile){let o=M(i,"week");if(o){let s=k(o,"week");a[s]=i}}}),a}var se=class extends Error{};async function Se(a){let{vault:e}=window.app,{template:t,format:n,folder:i}=x(),[o,s]=await A(t),c=a.format(n),m=await I(i,c);try{let r=await e.create(m,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,D,E,v)=>{let w=window.moment(),f=a.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return P&&f.add(parseInt(D,10),E),v?f.format(v.substring(1).trim()):f.format(n)}).replace(/{{\s*date\s*}}/gi,c).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,c));return window.app.foldManager.save(r,s),r}catch(r){console.error(`Failed to create file: '${m}'`,r),new g.Notice("Unable to create new file.")}}function st(a,e){return e[k(a,"month")]??null}function rt(){let a={};if(!Oe())return a;let{vault:e}=window.app,{folder:t}=x(),n=e.getAbstractFileByPath(g.normalizePath(t));if(!n)throw new se("Failed to find monthly notes folder");return g.Vault.recurseChildren(n,i=>{if(i instanceof g.TFile){let o=M(i,"month");if(o){let s=k(o,"month");a[s]=i}}}),a}var re=class extends Error{};async function lt(a){let{vault:e}=window.app,{template:t,format:n,folder:i}=C(),[o,s]=await A(t),c=a.format(n),m=await I(i,c);try{let r=await e.create(m,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,D,E,v)=>{let w=window.moment(),f=a.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return P&&f.add(parseInt(D,10),E),v?f.format(v.substring(1).trim()):f.format(n)}).replace(/{{\s*date\s*}}/gi,c).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,c));return window.app.foldManager.save(r,s),r}catch(r){console.error(`Failed to create file: '${m}'`,r),new g.Notice("Unable to create new file.")}}function ct(a,e){return e[k(a,"quarter")]??null}function dt(){let a={};if(!Le())return a;let{vault:e}=window.app,{folder:t}=C(),n=e.getAbstractFileByPath(g.normalizePath(t));if(!n)throw new re("Failed to find quarterly notes folder");return g.Vault.recurseChildren(n,i=>{if(i instanceof g.TFile){let o=M(i,"quarter");if(o){let s=k(o,"quarter");a[s]=i}}}),a}var le=class extends Error{};async function pt(a){let{vault:e}=window.app,{template:t,format:n,folder:i}=H(),[o,s]=await A(t),c=a.format(n),m=await I(i,c);try{let r=await e.create(m,o.replace(/{{\s*(date|time)\s*(([+-]\d+)([yqmwdhs]))?\s*(:.+?)?}}/gi,(d,p,P,D,E,v)=>{let w=window.moment(),f=a.clone().set({hour:w.get("hour"),minute:w.get("minute"),second:w.get("second")});return P&&f.add(parseInt(D,10),E),v?f.format(v.substring(1).trim()):f.format(n)}).replace(/{{\s*date\s*}}/gi,c).replace(/{{\s*time\s*}}/gi,window.moment().format("HH:mm")).replace(/{{\s*title\s*}}/gi,c));return window.app.foldManager.save(r,s),r}catch(r){console.error(`Failed to create file: '${m}'`,r),new g.Notice("Unable to create new file.")}}function ut(a,e){return e[k(a,"year")]??null}function gt(){let a={};if(!xe())return a;let{vault:e}=window.app,{folder:t}=H(),n=e.getAbstractFileByPath(g.normalizePath(t));if(!n)throw new le("Failed to find yearly notes folder");return g.Vault.recurseChildren(n,i=>{if(i instanceof g.TFile){let o=M(i,"year");if(o){let s=k(o,"year");a[s]=i}}}),a}function mt(){let{app:a}=window,e=a.internalPlugins.plugins["daily-notes"];if(e&&e.enabled)return!0;let t=a.plugins.getPlugin("periodic-notes");return t&&t.settings?.daily?.enabled}function Fe(){let{app:a}=window;if(a.plugins.getPlugin("calendar"))return!0;let e=a.plugins.getPlugin("periodic-notes");return e&&e.settings?.weekly?.enabled}function Oe(){let{app:a}=window,e=a.plugins.getPlugin("periodic-notes");return e&&e.settings?.monthly?.enabled}function Le(){let{app:a}=window,e=a.plugins.getPlugin("periodic-notes");return e&&e.settings?.quarterly?.enabled}function xe(){let{app:a}=window,e=a.plugins.getPlugin("periodic-notes");return e&&e.settings?.yearly?.enabled}function ht(a){let e={day:O,week:L,month:x,quarter:C,year:H}[a];return e()}function ft(a,e){return{day:Ae,month:Se,week:Me}[a](e)}l.DEFAULT_DAILY_NOTE_FORMAT=ne;l.DEFAULT_MONTHLY_NOTE_FORMAT=Ne;l.DEFAULT_QUARTERLY_NOTE_FORMAT=ke;l.DEFAULT_WEEKLY_NOTE_FORMAT=ae;l.DEFAULT_YEARLY_NOTE_FORMAT=Pe;l.appHasDailyNotesPluginLoaded=mt;l.appHasMonthlyNotesPluginLoaded=Oe;l.appHasQuarterlyNotesPluginLoaded=Le;l.appHasWeeklyNotesPluginLoaded=Fe;l.appHasYearlyNotesPluginLoaded=xe;l.createDailyNote=Ae;l.createMonthlyNote=Se;l.createPeriodicNote=ft;l.createQuarterlyNote=lt;l.createWeeklyNote=Me;l.createYearlyNote=pt;l.getAllDailyNotes=tt;l.getAllMonthlyNotes=rt;l.getAllQuarterlyNotes=dt;l.getAllWeeklyNotes=ot;l.getAllYearlyNotes=gt;l.getDailyNote=et;l.getDailyNoteSettings=O;l.getDateFromFile=M;l.getDateFromPath=Xe;l.getDateUID=k;l.getMonthlyNote=st;l.getMonthlyNoteSettings=x;l.getPeriodicNoteSettings=ht;l.getQuarterlyNote=ct;l.getQuarterlyNoteSettings=C;l.getTemplateInfo=A;l.getWeeklyNote=it;l.getWeeklyNoteSettings=L;l.getYearlyNote=ut;l.getYearlyNoteSettings=H});var bt={};ze(bt,{default:()=>Z});module.exports=Ge(bt);var N=require("obsidian");var b=require("obsidian");var He=require("obsidian");var B=require("obsidian");function T(a){return a?a.extension=="md"?a.path.slice(0,-3):a.path:""}function fe(a){return a.split("/").slice(-1)[0].contains(".")?a:`${a}.md`}function we(a){let e=a.vault.getFiles().filter(t=>["md","canvas"].contains(t.extension));if(e.length){let t=Math.floor(Math.random()*e.length);return T(e[t])}}function ye(a){return a.workspace.getActiveViewOfType(B.View)?.getViewType()=="empty"}function te(a,e){return a.localeCompare(e,void 0,{sensitivity:"accent"})===0}function U(a){return new Promise(e=>setTimeout(e,a))}async function ve(a){let e=a.workspace.getLayout();e.main={id:"5324373015726ba8",type:"split",children:[{id:"4509724f8bf84da7",type:"tabs",children:[{id:"e7a7b303c61786dc",type:"leaf",state:{type:"empty",state:{},icon:"lucide-file",title:"New tab"}}]}],direction:"vertical"},e.active="e7a7b303c61786dc",await a.workspace.changeLayout(e),B.Platform.isMobile&&(a.workspace.rightSplit?.updateInfo(),$e(a))}function $e(a){let e=a.internalPlugins.plugins.sync?.instance;e&&a.workspace.onLayoutReady(()=>{e.statusIconEl=a.workspace.rightSplit.addHeaderButton("sync-small",e.openStatusIconMenu.bind(e)),e.statusIconEl.addEventListener("contextmenu",e.openStatusIconMenu.bind(e)),e.statusIconEl.addClass("sync-status-icon")})}function be(a){let e=new Promise(t=>{let n=async()=>{t(),a.workspace.off("layout-change",n)};a.workspace.on("layout-change",n)});return Promise.race([e,new Promise(t=>setTimeout(t,1500))])}var u=qe(Ce()),ce={["Daily Note"]:{noun:"day",adjective:"daily",create:u.createDailyNote,get:u.getDailyNote,getAll:u.getAllDailyNotes},["Weekly Note"]:{noun:"week",adjective:"weekly",create:u.createWeeklyNote,get:u.getWeeklyNote,getAll:u.getAllWeeklyNotes},["Monthly Note"]:{noun:"month",adjective:"monthly",create:u.createMonthlyNote,get:u.getMonthlyNote,getAll:u.getAllMonthlyNotes},["Yearly Note"]:{noun:"year",adjective:"yearly",create:u.createYearlyNote,get:u.getYearlyNote,getAll:u.getAllYearlyNotes}},K=["Daily Note","Weekly Note","Monthly Note","Yearly Note"],Ie="Date-dependent file",de="Date-dependent notes in Homepage have been removed. Set your Homepage as a Periodic or Daily Note instead.";async function Re(a,e){let t=e.communityPlugins["periodic-notes"],n=ce[a],i=(0,He.moment)().startOf(n.noun),o;if(We(t)){let s=n.getAll();Object.keys(s).length?o=n.get(i,s)||await n.create(i):o=await n.create(i)}else t.cache.initialize(),o=t.getPeriodicNote(n.noun,i)||await t.createPeriodicNote(n.noun,i);return T(o)}function _e(a,e){if(a=="Daily Note"&&e.internalPlugins["daily-notes"]?.enabled)return!0;let t=e.communityPlugins["periodic-notes"];if(!t)return!1;if(We(t)){let n=ce[a].adjective;return t.settings[n]?.enabled}else{let n=ce[a].noun;return t?.calendarSetManager?.getActiveSet()[n]?.enabled}}function j(a){let e=a.internalPlugins["daily-notes"];return e?.enabled&&e?.instance.options.autorun}function We(a){return(a?.manifest.version||"0").startsWith("0")}var y=require("obsidian");var h=require("obsidian");var z=class extends h.AbstractInputSuggest{getSuggestions(t){let n=this.app.vault.getAllLoadedFiles(),i=[],o=t.toLowerCase();return n.forEach(s=>{s instanceof h.TFile&&["md","canvas"].contains(s.extension)&&s.path.toLowerCase().contains(o)&&i.push(s)}),i}renderSuggestion(t,n){t.extension=="md"?n.setText(T(t)):(n.setText(t.path.slice(0,-7)),n.insertAdjacentHTML("beforeend",''))}selectSuggestion(t){this.textInputEl.value=T(t),this.textInputEl.trigger("input"),this.close()}},q=class extends h.AbstractInputSuggest{getSuggestions(t){let n=Object.keys(this.app.internalPlugins.plugins.workspaces?.instance.workspaces),i=t.toLowerCase();return n.filter(o=>o.toLowerCase().contains(i))}renderSuggestion(t,n){n.setText(t)}selectSuggestion(t){this.textInputEl.value=t,this.textInputEl.trigger("input"),this.close()}},G=class{constructor(e){this.app=e.plugin.app,this.homepage=e.plugin.homepage,this.tab=e,this.container=e.containerEl.createDiv({cls:"nv-command-box"}),this.dropzone=document.createElement("div"),this.dropzone.className="nv-command-pill nv-dropzone",this.dropzone.addEventListener("dragenter",t=>t.preventDefault()),this.dropzone.addEventListener("dragover",t=>t.preventDefault()),this.dropzone.addEventListener("drop",()=>this.terminateDrag()),this.update()}update(){this.container.innerHTML="",this.activeDrag=null,this.activeCommand=null;for(let e of this.homepage.data.commands){let t=this.app.commands.findCommand(e.id),n=this.container.createDiv({cls:"nv-command-pill",attr:{draggable:!0}});n.addEventListener("dragstart",o=>{o.dataTransfer.effectAllowed="move",this.activeCommand=this.homepage.data.commands.splice(this.indexOf(n),1)[0],this.activeDrag=n,this.dropzone.style.width=`${n.clientWidth}px`,this.dropzone.style.height=`${n.clientHeight}px`}),n.addEventListener("dragover",o=>this.moveDropzone(n,o)),n.addEventListener("drop",o=>o.preventDefault()),n.addEventListener("dragend",()=>this.terminateDrag()),n.createSpan({cls:"nv-command-text",text:t?.name??e.id});let i=new h.ButtonComponent(n).setIcon("route").setClass("clickable-icon").setClass("nv-command-period").onClick(o=>this.showMenu(e,o,i));e.period!="Both"&&(i.setClass("nv-command-selected"),i.setIcon(""),i.buttonEl.createSpan({text:e.period})),new h.ButtonComponent(n).setIcon("trash-2").setClass("clickable-icon").setClass("nv-command-delete").onClick(()=>this.delete(e)),t||(n.classList.add("nv-command-invalid"),n.prepend((0,h.getIcon)("ban")),(0,h.setTooltip)(n,"This command can't be found, so it won't be executed. It may belong to a disabled plugin.",{delay:.001}))}new h.ButtonComponent(this.container).setClass("nv-command-add-button").setButtonText("Add...").onClick(()=>{new pe(this.tab).open()})}delete(e){this.homepage.data.commands.remove(e),this.homepage.save(),this.update()}showMenu(e,t,n){let i=new h.Menu;for(let s of Object.values($))i.addItem(c=>{c.setTitle(s),c.setChecked(e.period==s),c.onClick(()=>{e.period=s,this.homepage.save(),this.update()})});let o=n.buttonEl.getBoundingClientRect();i.showAtPosition({x:o.x-22,y:o.y+o.height+8})}indexOf(e){return Array.from(this.container.children).indexOf(e)}moveDropzone(e,t){if(!this.activeDrag)return;this.activeDrag.hidden=!0;let n=e.getBoundingClientRect();t.xawait this.copyDebugInfo()})}sanitiseNote(t){return t===null||t.match(/^\s*$/)!==null?null:(0,y.normalizePath)(t)}display(){let t=this.plugin.homepage.data.kind=="Workspace",n=this.plugin.homepage.data.kind,i=j(this.plugin),o=!1,s=t?q:z;this.containerEl.empty(),this.elements={};let c=new y.Setting(this.containerEl).setName("Homepage").addDropdown(async d=>{for(let p of Object.values(R)){if(!this.plugin.hasRequiredPlugin(p))if(p==this.plugin.homepage.data.kind)o=!0;else{d.selectEl.createEl("option",{text:p,attr:{disabled:!0}});continue}d.addOption(p,p)}d.setValue(this.plugin.homepage.data.kind),d.onChange(async p=>{this.plugin.homepage.data.kind=p,await this.plugin.homepage.save(),this.display()})});c.settingEl.id="nv-main-setting";let m=c.settingEl.createEl("article",{text:wt[n],attr:{id:"nv-desc"}});o&&m.createDiv({text:"The plugin required for this homepage type isn't available.",cls:"mod-warning"}),me.includes(n)?c.addText(d=>{d.setDisabled(!0)}):c.addText(d=>{new s(this.app,d.inputEl),d.setPlaceholder(S.value),d.setValue(S.value==this.plugin.homepage.data.value?"":this.plugin.homepage.data.value),d.onChange(async p=>{this.plugin.homepage.data.value=this.sanitiseNote(p)||S.value,await this.plugin.homepage.save()})}),this.addToggle("Open on startup","When launching Obsidian, open the homepage.","openOnStartup",d=>this.display()),i&&(this.elements.openOnStartup.descEl.createDiv({text:`This setting has been disabled, as it isn't compatible with Daily Notes' "Open daily note on startup" functionality. To use it, disable the Daily Notes setting.`,attr:{class:"mod-warning"}}),this.disableSetting("openOnStartup")),this.addToggle("Open when empty","When there are no tabs open, open the homepage.","openWhenEmpty"),this.addToggle("Use when opening normally","Use homepage settings when opening it normally, such as from a link or the file browser.","alwaysApply");let r=new y.Setting(this.containerEl).setName("Separate mobile homepage").setDesc("For mobile devices, store the homepage and its settings separately.").addToggle(d=>d.setValue(this.plugin.settings.separateMobile).onChange(async p=>{this.plugin.settings.separateMobile=p,this.plugin.homepage=this.plugin.getHomepage(),await this.plugin.saveSettings(),this.display()}));if(this.plugin.settings.separateMobile){let d=y.Platform.isMobile?"desktop":"mobile",p=document.createElement("div");r.setClass("nv-mobile-setting"),p.className="mod-warning nv-mobile-info",p.innerHTML=`Mobile settings are stored separately. Therefore, changes to other settings will not affect 2 | ${d} devices. To edit ${d} settings, use a ${d} device.`,r.settingEl.append(p)}this.addHeading("Commands","commandsHeading"),this.containerEl.createDiv({cls:"nv-command-desc setting-item-description",text:"Select commands that will be executed when opening the homepage."}),this.commandBox=new G(this),this.addHeading("Vault environment","vaultHeading"),this.addDropdown("Opening method","Determine how extant tabs and views are affected on startup.","openMode",J),this.addDropdown("Manual opening method","Determine how extant tabs and views are affected when opening with commands or the ribbon button.","manualOpenMode",J),this.addToggle("Pin","Pin the homepage when opening.","pin"),this.addToggle("Hide release notes","Never display release notes when Obsidian updates.","hideReleaseNotes"),this.addToggle("Auto-create","When the homepage doesn't exist, create a note with its name.","autoCreate"),this.elements.autoCreate.descEl.createDiv({text:"If this vault is synced using unofficial services, this may lead to content being overwritten.",cls:"mod-warning"}),this.addHeading("Opened view","paneHeading"),this.addDropdown("Homepage view","Choose what view to open the homepage in.","view",ge),this.addToggle("Revert view on close","When navigating away from the homepage, restore the default view.","revertView"),this.addToggle("Auto-scroll","When opening the homepage, scroll to the bottom and focus on the last line.","autoScroll"),"dataview"in this.plugin.communityPlugins&&(this.addToggle("Refresh Dataview","Always attempt to reload Dataview views when opening the homepage.","refreshDataview"),this.elements.refreshDataview.descEl.createDiv({text:"Requires Dataview auto-refresh to be enabled.",attr:{class:"mod-warning"}})),y.Platform.isMobile||new y.ButtonComponent(this.containerEl).setButtonText("Copy debug info").setClass("nv-debug-button").onClick(async()=>await this.copyDebugInfo()),(t||n==="Nothing")&&this.disableSettings("openWhenEmpty","alwaysApply","vaultHeading","openMode","manualOpenMode","autoCreate","pin"),(t||["Nothing","Graph view"].includes(n))&&this.disableSettings("paneHeading","view","revertView","autoScroll","refreshDataview"),(!this.plugin.homepage.data.openOnStartup||i)&&this.disableSetting("openMode"),K.includes(this.plugin.homepage.data.kind)&&this.disableSetting("autoCreate")}disableSetting(t){this.elements[t]?.settingEl.setAttribute("nv-greyed","")}disableSettings(...t){t.forEach(n=>this.disableSetting(n))}addHeading(t,n){let i=new y.Setting(this.containerEl).setHeading().setName(t);this.elements[n]=i}addDropdown(t,n,i,o,s){let c=new y.Setting(this.containerEl).setName(t).setDesc(n).addDropdown(async m=>{for(let r of Object.values(o))m.addOption(r,r);m.setValue(this.plugin.homepage.data[i]),m.onChange(async r=>{this.plugin.homepage.data[i]=r,await this.plugin.homepage.save(),s&&s(r)})});return this.elements[i]=c,c}addToggle(t,n,i,o){let s=new y.Setting(this.containerEl).setName(t).setDesc(n).addToggle(c=>c.setValue(this.plugin.homepage.data[i]).onChange(async m=>{this.plugin.homepage.data[i]=m,await this.plugin.homepage.save(),o&&o(m)}));return this.elements[i]=s,s}async copyDebugInfo(){let t=this.app.vault.config,n={...this.settings,_defaultViewMode:t.defaultViewMode||"default",_livePreview:t.livePreview!==void 0?t.livePreview:"default",_focusNewTab:t.focusNewTab!==void 0?t.focusNewTab:"default",_plugins:Object.keys(this.plugin.communityPlugins),_internalPlugins:Object.values(this.plugin.internalPlugins).flatMap(i=>i.enabled?[i.instance.id]:[]),_obsidianVersion:window.electron?.ipcRenderer.sendSync("version")||"unknown"};await navigator.clipboard.writeText(JSON.stringify(n)),new y.Notice("Copied homepage debug information to clipboard")}};var yt=["markdown","canvas","kanban"],W="Main Homepage",V="Mobile Homepage",J=(n=>(n.ReplaceAll="Replace all open notes",n.ReplaceLast="Replace last note",n.Retain="Keep open notes",n))(J||{}),ge=(i=>(i.Default="Default view",i.Reading="Reading view",i.Source="Editing view (Source)",i.LivePreview="Editing view (Live Preview)",i))(ge||{}),R=(r=>(r.File="File",r.Workspace="Workspace",r.Random="Random file",r.Graph="Graph view",r.None="Nothing",r.DailyNote="Daily Note",r.WeeklyNote="Weekly Note",r.MonthlyNote="Monthly Note",r.YearlyNote="Yearly Note",r))(R||{}),$=(n=>(n.Both="Both",n.Startup="Startup only",n.Manual="Manual only",n))($||{}),me=["Random file","Graph view","Nothing",...K],_=class{constructor(e,t){this.lastView=void 0;this.openedViews=new WeakMap;this.name=e,this.plugin=t,this.app=t.app;let n=this.plugin.settings.homepages[e];n?this.data=Object.assign({},S,n):(this.plugin.settings.homepages[e]={...S},this.data=this.plugin.settings.homepages[e])}async open(e=!1){if(!this.plugin.hasRequiredPlugin(this.data.kind)){new b.Notice("Homepage cannot be opened due to plugin unavailablity.");return}if(this.data.kind==="Workspace")await this.launchWorkspace();else if(this.data.kind!=="Nothing"){let n=this.plugin.loaded?this.data.manualOpenMode:this.data.openMode;e&&(n="Keep open notes"),await this.launchLeaf(n)}if(this.data.commands.length<1)return;let t=this.plugin.loaded?"Startup only":"Manual only";await be(this.app);for(let{id:n,period:i}of this.data.commands)i!==t&&this.app.commands.executeCommandById(n)}async launchWorkspace(){let e=this.plugin.internalPlugins.workspaces?.instance;if(!(this.data.value in e.workspaces)){new b.Notice(`Cannot find the workspace "${this.data.value}" to use as the homepage.`);return}e.loadWorkspace(this.data.value),await U(100)}async launchLeaf(e){let t;if(this.computedValue=await this.computeValue(),this.plugin.executing=!0,!(j(this.plugin)&&!this.plugin.loaded)){if(e!=="Replace all open notes"){let n=this.getOpened();if(n.length>0){this.app.workspace.setActiveLeaf(n[0]),await this.configure(n[0]);return}else e=="Keep open notes"&&ye(this.app)&&(e="Replace last note")}e!=="Keep open notes"&&this.app.workspace.getActiveViewOfType(b.View)?.leaf.setPinned(!1),e==="Replace all open notes"&&(this.app.workspace?.floatingSplit?.children&&(await U(0),this.app.workspace.floatingSplit.children.forEach(n=>n.win.close())),await ve(this.app),await U(0)),this.data.kind==="Graph view"?t=await this.launchGraph(e):t=await this.launchNote(e),t&&await this.configure(t)}}async launchGraph(e){if(e==="Keep open notes"){let t=this.app.workspace.getLeaf("tab");this.app.workspace.setActiveLeaf(t)}return this.app.commands.executeCommandById("graph:open"),this.app.workspace.getActiveViewOfType(b.View)?.leaf}async launchNote(e){let t=this.app.metadataCache.getFirstLinkpathDest(this.computedValue,"/");if(!t){if(!this.data.autoCreate){new b.Notice(`Homepage "${this.computedValue}" does not exist.`);return}t=await this.app.vault.create(fe(this.computedValue),"")}let n=await this.app.vault.cachedRead(t),i=this.app.workspace.getLeaf(e=="Keep open notes");return await i.openFile(t),this.app.workspace.setActiveLeaf(i),n!==await this.app.vault.read(t)&&await this.app.vault.modify(t,n),i}async configure(e){this.plugin.executing=!1;let t=e.view;if(!(t instanceof b.MarkdownView)){this.data.pin&&t.leaf.setPinned(!0),this.configurePlugins();return}let n=t.getState();if(this.data.revertView&&(this.lastView=new WeakRef(t)),this.data.autoScroll){let i=t.editor.lineCount();n.mode=="preview"?t.previewMode.applyScroll(i-4):(t.editor.setCursor(i),t.editor.focus())}if(this.data.pin&&t.leaf.setPinned(!0),this.data.view!=="Default view"){switch(this.data.view){case"Editing view (Live Preview)":case"Editing view (Source)":n.mode="source",n.source=this.data.view!="Editing view (Live Preview)";break;case"Reading view":n.mode="preview";break}await t.leaf.setViewState({type:"markdown",state:n})}this.configurePlugins()}configurePlugins(){this.plugin.loaded&&this.data.refreshDataview&&this.plugin.communityPlugins.dataview?.index.touch(),this.plugin.communityPlugins["obsidian-file-color"]?.generateColorStyles()}getOpened(){return this.data.kind=="Graph view"?this.app.workspace.getLeavesOfType("graph"):yt.flatMap(t=>this.app.workspace.getLeavesOfType(t)).filter(t=>{let n=t.view.getState().file;return te(n.endsWith("md")?n.slice(0,-3):n,this.computedValue)})}async computeValue(){let e=this.data.value;switch(this.data.kind){case"Random file":let t=we(this.app);t&&(e=t);break;case"Daily Note":case"Weekly Note":case"Monthly Note":case"Yearly Note":e=await Re(this.data.kind,this.plugin);break}return e}async save(){this.plugin.settings.homepages[this.name]=this.data,await this.plugin.saveSettings()}async setToActiveFile(){this.data.value=T(this.app.workspace.getActiveFile()),await this.save(),new b.Notice(`The homepage has been changed to "${this.data.value}".`)}canSetToFile(){return this.app.workspace.getActiveFile()!==null&&!me.includes(this.data.kind)}async revertView(){if(this.lastView==null||this.data.view=="Default view")return;let e=this.lastView.deref();if(!e||te(T(e.file),this.computedValue))return;let t=e.getState(),n=this.app.vault.config,i=n.defaultViewMode||"source",o=n.livePreview!==void 0?!n.livePreview:!1;e.leaf.getViewState().type=="markdown"&&(i!=t.mode||o!=t.source)&&(t.mode=i,t.source=o,await e.leaf.setViewState({type:"markdown",state:t,active:!0})),this.lastView=void 0}async openWhenEmpty(){if(!this.plugin.loaded||this.plugin.executing)return;let e=this.app.workspace.getActiveViewOfType(b.View)?.leaf;e?.getViewState().type!=="empty"||e.parentSplit.children.length!=1||await this.open(!0)}async apply(){let e=this.app.workspace.getActiveViewOfType(b.FileView);if(!e)return;let t=T(e.file);this.openedViews.get(e)!==t&&(this.openedViews.set(e,t),t===await this.computeValue()&&this.plugin.loaded&&!this.plugin.executing&&await this.configure(e.leaf))}};var vt='',Z=class extends N.Plugin{constructor(){super(...arguments);this.newRelease=!1;this.loaded=!1;this.executing=!1;this.onLayoutChange=async()=>{this.homepage.data.revertView&&await this.homepage.revertView(),this.homepage.data.openWhenEmpty&&await this.homepage.openWhenEmpty(),this.homepage.data.alwaysApply&&await this.homepage.apply()};this.hideInterstitial=()=>{this.interstitial?.detach(),window.removeEventListener("error",this.hideInterstitial)}}async onload(){let t=this.app.workspace.layoutReady;t||this.showInterstitial(),this.patchReleaseNotes(),this.settings=await this.loadSettings(),this.internalPlugins=this.app.internalPlugins.plugins,this.communityPlugins=this.app.plugins.plugins,this.homepage=this.getHomepage(),this.app.workspace.onLayoutReady(async()=>{let n=this.homepage.data.openOnStartup&&!t&&!await this.hasUrlParams();this.patchNewTabPage(),n&&await this.homepage.open(),this.loaded=!0,this.unpatchReleaseNotes(),this.hideInterstitial()}),(0,N.addIcon)("homepage",vt),this.addRibbonIcon("homepage","Open homepage",n=>this.homepage.open(n.button==1||n.button==2||N.Keymap.isModifier(n,"Mod"))).setAttribute("id","nv-homepage-icon"),this.registerEvent(this.app.workspace.on("layout-change",this.onLayoutChange)),this.addSettingTab(new Q(this.app,this)),this.addCommand({id:"open-homepage",name:"Open homepage",callback:()=>this.homepage.open()}),this.addCommand({id:"set-to-active-file",name:"Set to active file",checkCallback:n=>{if(n)return this.homepage.canSetToFile();this.homepage.setToActiveFile()}})}async onunload(){this.app.workspace.off("layout-change",this.onLayoutChange),this.unpatchNewTabPage()}getHomepage(){return this.settings.separateMobile&&N.Platform.isMobile?(V in this.settings.homepages||(this.settings.homepages[V]={...this.settings.homepages?.[W]},this.settings.homepages[V].commands=[...this.settings.homepages?.[W]?.commands]),new _(V,this)):new _(W,this)}async loadSettings(){let t=await this.loadData();return t?.version!==4?t?this.upgradeSettings(t):Object.assign({},ue):t}async saveSettings(){await this.saveData(this.settings)}showInterstitial(){this.interstitial=createDiv({cls:"nv-homepage-interstitial"}),document.body.append(this.interstitial),window.addEventListener("error",this.hideInterstitial)}async hasUrlParams(){let t,n;if(N.Platform.isMobile){let i=await window.Capacitor.Plugins.App.getLaunchUrl();if(!i)return!1;let o=new URL(i.url);n=Array.from(o.searchParams.keys()),t=o.hostname}else if(window.OBS_ACT)n=Object.keys(window.OBS_ACT),t=window.OBS_ACT.action;else return!1;return["open","advanced-uri"].includes(t)&&["file","filepath","workspace"].some(i=>n.includes(i))}hasRequiredPlugin(t){switch(t){case"Workspace":return this.internalPlugins.workspaces?.enabled;case"Graph view":return this.internalPlugins.graph?.enabled;case"Daily Note":case"Weekly Note":case"Monthly Note":case"Yearly Note":return _e(t,this);default:return!0}}patchNewTabPage(){let t=this.communityPlugins["new-tab-default-page"];t&&(t.nvOrig_checkForNewTab=t.checkForNewTab,t.checkForNewTab=async n=>{if(!(this&&this.executing))return await t.nvOrig_checkForNewTab(n)})}unpatchNewTabPage(){let t=this.communityPlugins["new-tab-default-page"];t&&(t.checkForNewTab=t._checkForNewTab)}patchReleaseNotes(){this.app.nvOrig_showReleaseNotes=this.app.showReleaseNotes,this.app.showReleaseNotes=()=>this.newRelease=!0}unpatchReleaseNotes(){this.newRelease&&!this.homepage.data.hideReleaseNotes&&this.app.nvOrig_showReleaseNotes(),this.app.showReleaseNotes=this.app.nvOrig_showReleaseNotes}upgradeSettings(t){if(t.version==3){let i=t,o=!1;for(let s of Object.values(i.homepages))s.commands=s.commands.map(c=>({id:c,period:"Both"})),s.kind==Ie&&(o=!0,s.kind="Daily Note");return o&&new N.Notice(de),i.version=4,this.saveData(i),i}let n=Object.assign({},ue);return t.workspaceEnabled?(t.value=t.workspace,t.kind="Workspace"):t.momentFormat?(t.kind="Daily Note",new N.Notice(de)):(t.value=t.defaultNote,t.kind="File"),t.commands=[],delete t.workspace,delete t.momentFormat,delete t.defaultNote,delete t.useMoment,delete t.workspaceEnabled,n.homepages[W]=t,this.saveData(n),n}}; 3 | 4 | /* nosourcemap */ -------------------------------------------------------------------------------- /.obsidian/plugins/homepage/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "homepage", 3 | "name": "Homepage", 4 | "version": "4.0.7", 5 | "minAppVersion": "1.4.10", 6 | "description": "Open a specified note, canvas, or workspace on startup, or set it for quick access later.", 7 | "author": "novov", 8 | "authorUrl": "https://novov.me", 9 | "isDesktopOnly": false, 10 | "fundingUrl": { 11 | "Ko-fi": "https://ko-fi.com/novov" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.obsidian/plugins/homepage/styles.css: -------------------------------------------------------------------------------- 1 | .nv-homepage-interstitial { 2 | position: absolute; 3 | left: 0; 4 | top: 0; 5 | width: 100vw; 6 | height: 100vh; 7 | background: var(--background-primary); 8 | z-index: 9999; 9 | animation: 0.02s ease-in 0.5s forwards nv-interstitial-destroy; 10 | pointer-events: none; 11 | } 12 | 13 | @keyframes nv-interstitial-destroy { 14 | from { opacity: 1; } 15 | to { opacity: 0; } 16 | } 17 | 18 | .setting-item[nv-greyed] { 19 | opacity: .5; 20 | pointer-events: none !important; 21 | } 22 | 23 | #nv-main-setting { 24 | flex-wrap: wrap; 25 | margin-bottom: 30px; 26 | } 27 | 28 | #nv-main-setting .setting-item-control { 29 | padding-top: var(--size-4-2); 30 | flex-basis: 100%; 31 | align-items: stretch; 32 | } 33 | 34 | #nv-main-setting .setting-item-control input, #nv-main-setting .setting-item-control select { 35 | font-size: var(--font-ui-medium); 36 | font-weight: 600; 37 | } 38 | 39 | #nv-main-setting .setting-item-control select { 40 | padding: var(--size-4-3) var(--size-4-4); 41 | padding-right: var(--size-4-8); 42 | height: auto; 43 | } 44 | 45 | #nv-main-setting .setting-item-control input { 46 | flex-grow: 1; 47 | padding: var(--size-4-5) var(--size-4-4); 48 | } 49 | 50 | #nv-main-setting .setting-item-control input[disabled] { 51 | opacity: 0.3; 52 | } 53 | 54 | #nv-main-setting #nv-desc, #nv-main-setting #nv-info { 55 | flex-basis: 100%; 56 | } 57 | 58 | #nv-main-setting #nv-desc { 59 | font-weight: 500; 60 | color: var(--text-normal); 61 | font-size: var(--font-ui-small); 62 | padding: 10px 0 0; 63 | } 64 | 65 | #nv-main-setting #nv-desc.mod-warning { 66 | color: var(--text-error); 67 | } 68 | 69 | #nv-main-setting #nv-desc code { 70 | font-family: var(--font-monospace); 71 | font-size: var(--font-smaller); 72 | border-radius: var(--radius-s); 73 | } 74 | 75 | #nv-main-setting #nv-desc small { 76 | display: block; 77 | font-weight: 400; 78 | color: var(--text-muted); 79 | font-size: calc(var(--font-ui-smaller) * 0.9); 80 | padding: 5px 0 0; 81 | } 82 | 83 | .nv-mobile-setting { 84 | flex-wrap: wrap; 85 | row-gap: var(--size-2-2); 86 | } 87 | 88 | .nv-mobile-setting .nv-mobile-info { 89 | font-size: var(--font-ui-smaller); 90 | width: 100%; 91 | margin-right: var(--size-4-18); 92 | } 93 | 94 | .nv-command-desc { 95 | padding: 1.2em 0 0; 96 | border-top: 1px solid var(--background-modifier-border); 97 | } 98 | 99 | .nv-command-box { 100 | margin: 1em 0 1.75em; 101 | display: flex; 102 | flex-wrap: wrap; 103 | gap: 12px; 104 | align-items: center; 105 | } 106 | 107 | .nv-command-pill { 108 | background-color: var(--background-secondary); 109 | border: 1px solid var(--background-modifier-border-hover); 110 | border-radius: var(--radius-s); 111 | font-size: var(--font-ui-small); 112 | padding: var(--size-2-1) var(--size-2-2) var(--size-2-1) var(--size-2-3) ; 113 | } 114 | 115 | .nv-command-pill.nv-command-invalid { 116 | color: var(--text-faint); 117 | } 118 | 119 | .nv-command-pill button { 120 | display: inline-block; 121 | padding: 0; 122 | margin: 0 0 0 3px; 123 | vertical-align: bottom; 124 | } 125 | 126 | .nv-command-pill button:first-of-type { 127 | margin-left: var(--size-4-2); 128 | } 129 | 130 | .nv-command-pill button.nv-command-selected { 131 | margin-left: var(--size-2-2); 132 | padding: 0 var(--size-2-1); 133 | } 134 | 135 | .nv-command-pill button.nv-command-selected span { 136 | color: var(--text-accent); 137 | display: inline-block; 138 | font-size: 0.9em; 139 | vertical-align: top; 140 | position: relative; 141 | top: -1px; 142 | } 143 | 144 | .nv-command-pill > .svg-icon, .nv-command-pill button .svg-icon { 145 | height: 1em; 146 | width: 1em; 147 | } 148 | 149 | .nv-command-pill > .svg-icon { 150 | vertical-align: text-bottom; 151 | position: relative; 152 | margin: 0 var(--size-2-1) 0 0; 153 | } 154 | 155 | .nv-command-pill.nv-dragging { 156 | background-color: transparent; 157 | } 158 | 159 | .nv-command-add-button { 160 | font-size: var(--font-ui-small); 161 | padding: var(--size-2-2) var(--size-4-2); 162 | height: auto; 163 | } 164 | 165 | #nv-main-setting + .setting-item, .nv-command-desc + .setting-item { 166 | padding-top: 20px; 167 | border-top: none !important; 168 | } 169 | 170 | .nv-debug-button { 171 | margin: 3em 0 -0.2em; 172 | font-size: var(--font-ui-smaller); 173 | padding: 0; 174 | height: auto; 175 | float: right; 176 | box-shadow: none !important; 177 | background: none !important; 178 | color: var(--text-accent); 179 | font-weight: 600; 180 | cursor: pointer; 181 | } 182 | 183 | .nv-debug-button:hover, .nv-debug-button:active { 184 | text-decoration: underline; 185 | } 186 | 187 | .is-phone #nv-main-setting .setting-item-control { 188 | flex-wrap: wrap; 189 | justify-content: flex-start; 190 | } 191 | 192 | .is-phone #nv-main-setting .setting-item-control select { 193 | width: auto; 194 | max-width: auto; 195 | } 196 | 197 | .is-phone .nv-mobile-setting { 198 | row-gap: var(--size-4-2); 199 | } 200 | 201 | .is-phone .nv-mobile-setting .setting-item-info { 202 | max-width: calc(100% - 100px); 203 | } 204 | 205 | .is-phone .nv-mobile-setting { 206 | row-gap: var(--size-4-2); 207 | } 208 | 209 | .is-phone .nv-mobile-setting .setting-item-info { 210 | max-width: calc(100% - 100px); 211 | } 212 | 213 | .is-phone .nv-command-pill { 214 | width: 100%; 215 | border: none; 216 | background: none; 217 | padding: 0 0 var(--size-4-2); 218 | display: flex; 219 | gap: var(--size-4-4); 220 | align-items: baseline; 221 | } 222 | 223 | .is-phone .nv-command-pill .nv-command-text { 224 | flex-grow: 1; 225 | overflow: hidden; 226 | text-overflow: ellipsis; 227 | } 228 | 229 | .is-phone .nv-command-pill, .is-phone .nv-command-add-button { 230 | font-size: var(--font-ui-medium); 231 | justify-content: space-between; 232 | } 233 | 234 | .is-phone .nv-command-pill button { 235 | line-height: var(--font-ui-medium); 236 | height: 100%; 237 | margin: 0 !important; 238 | } 239 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-banners/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "height": 150, 3 | "style": "solid", 4 | "showInInternalEmbed": true, 5 | "internalEmbedHeight": null, 6 | "showInPreviewEmbed": true, 7 | "previewEmbedHeight": null, 8 | "frontmatterField": null, 9 | "bannerDragModifier": "ctrl", 10 | "iconHorizontalAlignment": "left", 11 | "iconHorizontalTransform": null, 12 | "iconVerticalAlignment": "center", 13 | "iconVerticalTransform": null, 14 | "useTwemoji": true, 15 | "showPreviewInLocalModal": true, 16 | "localSuggestionsLimit": null, 17 | "bannersFolder": "images", 18 | "allowMobileDrag": false 19 | } -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-banners/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-banners", 3 | "name": "Banners", 4 | "description": "Add banner images to your notes!", 5 | "version": "1.3.3", 6 | "minAppVersion": "0.13.21", 7 | "author": "Danny Hernandez", 8 | "authorUrl": "https://github.com/noatpad", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-banners/styles.css: -------------------------------------------------------------------------------- 1 | @-webkit-keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,80%,to{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.spinner{display:flex;gap:8px;width:70px;text-align:center}.spinner>div{width:18px;height:18px;background-color:var(--text-muted);border-radius:100%;display:inline-block;-webkit-animation:sk-bouncedelay 1.4s infinite ease-in-out both;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.spinner .bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.spinner .bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}.obsidian-banner{position:absolute;top:0;left:0;right:0;height:var(--banner-height);width:100%;overflow:hidden;user-select:none}.obsidian-banner.gradient:not(.error){mask-image:linear-gradient(to bottom,black 50%,transparent);-webkit-mask-image:linear-gradient(to bottom,black 50%,transparent)}.obsidian-banner .banner-message{position:absolute;inset:16px;display:flex;justify-content:center;align-items:center;padding:16px;border:2px solid var(--background-modifier-border)}.obsidian-banner .banner-message p{margin:6px 8px;text-align:center;color:var(--text-muted)}.obsidian-banner .banner-image{position:relative;object-fit:cover;max-width:none;height:100%;width:100%}.obsidian-banner .banner-image.draggable{cursor:grab}.obsidian-banner .banner-image.draggable:active{cursor:grabbing}.obsidian-banner.loaded .banner-message,.obsidian-banner.error .banner-image{display:none}.obsidian-banner-wrapper{margin-top:calc(var(--banner-height) - 15px);padding-top:.5em}.obsidian-banner-spacer{height:calc(var(--banner-height) - 24px)}.obsidian-banner-icon{display:flex;position:relative;font-size:4em;pointer-events:none;user-select:none}.obsidian-banner-icon.h-left{justify-content:flex-start}.obsidian-banner-icon.h-center{justify-content:center}.obsidian-banner-icon.h-right{justify-content:flex-end}.obsidian-banner-icon .icon-box{display:inline-flex;align-items:center;height:calc(1em + 12px);padding:6px;border-radius:4px;pointer-events:initial;transition:ease .2s background}.obsidian-banner-icon .icon-box:hover{background:#aaa3;cursor:pointer}.obsidian-banner-icon img.emoji{height:1em;width:1em;vertical-align:-.1em}.internal-embed .markdown-embed-content .obsidian-banner-wrapper{margin-top:var(--banner-internal-embed-height)}.internal-embed .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner{height:var(--banner-internal-embed-height)}.internal-embed .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner img{cursor:initial}.popover .markdown-embed-content .obsidian-banner-wrapper{margin-top:var(--banner-preview-embed-height)}.popover .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner{height:var(--banner-preview-embed-height)}.popover .markdown-embed-content .obsidian-banner-wrapper>.obsidian-banner img{cursor:initial}.obsidian-banner-wrapper.has-banner-icon{padding-top:0}.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-above{margin-top:calc(-1em - 12px)}.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-center,.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-custom{margin-top:calc(-0.5em - 6px)}.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon.v-below{padding-top:.5rem}.has-banner .cm6-banner-icon.v-above{margin-top:calc(-1em - 12px)}.has-banner .cm6-banner-icon.v-center,.has-banner .cm6-banner-icon.v-custom{margin-top:calc(-0.5em - 6px)}.has-banner .cm6-banner-icon.v-below{margin:.5rem 0}.markdown-source-view.mod-cm6 .cm-line.has-banner,.markdown-source-view.mod-cm6 .cm-line.has-banner-icon{position:inherit}.markdown-source-view.mod-cm6 .cm-line.has-banner .cm-fold-indicator,.markdown-source-view.mod-cm6 .cm-line.has-banner-icon .cm-fold-indicator{position:absolute}.markdown-source-view.mod-cm6 .cm-line.has-banner-icon .cm6-banner-icon,.markdown-source-view.mod-cm6 .cm-line.has-banner:not(.has-banner-icon) .obsidian-banner-spacer{margin-bottom:1.5rem}.markdown-source-view.mod-cm6 .cm-line.has-banner-icon:not(.has-banner) .cm-fold-indicator{top:calc(4em + 60px)}.markdown-source-view.mod-cm6 .cm-line.has-banner:not(.has-banner-icon) .cm-fold-indicator{top:calc(var(--banner-height) + 25px)}.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=above] .cm-fold-indicator{top:calc(var(--banner-height) + 25px)}.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=center] .cm-fold-indicator,.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=custom] .cm-fold-indicator{top:calc(var(--banner-height) + 2em + 31px)}.markdown-source-view.mod-cm6 .cm-line.has-banner.has-banner-icon[data-icon-v=below] .cm-fold-indicator{top:calc(var(--banner-height) + 4em + 45px)}.banner-local-image-modal .banner-suggestion-item{padding:6px 10px}.banner-local-image-modal .suggestion-text{height:0;margin:0;padding-left:10px}.banner-local-image-modal .suggestion-image-wrapper{position:relative;height:200px;width:100%;margin:6px 0;overflow:hidden}.banner-local-image-modal .suggestion-image-wrapper img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:100%;object-fit:cover}.banner-icon-modal span.regular-emoji{font-size:1.2em;vertical-align:bottom}.banner-icon-modal img.emoji{margin-right:.5em;height:1.2em;width:1.2em;vertical-align:middle}.banner-settings .banner-setting-header{display:block;padding:6px 0}.banner-settings .banner-setting-header p{margin:0;font-size:1.2em}.banner-settings .banner-setting-header .banner-setting-header-title{font-size:1.3em}.banner-settings .banner-setting-header .banner-setting-header-description{margin-top:2px;font-size:.7em;color:var(--text-muted);line-height:18px}.banner-settings .setting-item-control{gap:8px}.is-mobile .has-banner-icon{margin-top:20px}.is-mobile .obsidian-banner-wrapper{margin-top:var(--banner-height)}.is-mobile .obsidian-banner-wrapper:not(.has-banner-icon){margin-top:calc(var(--banner-height) + 20px)}@media print{.obsidian-banner-wrapper{margin-top:0}.obsidian-banner-wrapper>.obsidian-banner{position:initial;margin-bottom:20px}.has-banner-icon,.has-banner-icon .obsidian-banner-icon,.obsidian-banner-wrapper.has-banner-icon{margin-top:0}.obsidian-banner-wrapper.has-banner-icon .obsidian-banner-icon{position:initial}} 2 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-emoji-toolbar/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-emoji-toolbar", 3 | "name": "Emoji Toolbar", 4 | "version": "0.4.1", 5 | "description": "Quickly search for and insert emojis into your notes.", 6 | "author": "oliveryh", 7 | "authorUrl": "https://github.com/oliveryh/obsidian-emoji-toolbar", 8 | "isDesktopOnly": false 9 | } 10 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-emoji-toolbar/styles.css: -------------------------------------------------------------------------------- 1 | img.emoji { 2 | height: 1em; 3 | width: 1em; 4 | margin: 0 0.05em 0 0.1em; 5 | vertical-align: -0.1em; 6 | display: inline-block; 7 | } 8 | 9 | .emoji-mart, 10 | .emoji-mart * { 11 | box-sizing: border-box; 12 | line-height: 1.15; 13 | } 14 | 15 | .emoji-mart { 16 | font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", sans-serif; 17 | font-size: 16px; 18 | display: inline-block; 19 | color: #222427; 20 | border: 1px solid #d9d9d9; 21 | border-radius: 5px; 22 | background: #fff; 23 | } 24 | 25 | .emoji-mart .emoji-mart-emoji { 26 | padding: 6px !important; 27 | } 28 | 29 | .emoji-mart-bar { 30 | border: 0 solid #d9d9d9; 31 | } 32 | .emoji-mart-bar:first-child { 33 | border-bottom-width: 1px; 34 | border-top-left-radius: 5px; 35 | border-top-right-radius: 5px; 36 | } 37 | .emoji-mart-bar:last-child { 38 | border-top-width: 1px; 39 | border-bottom-left-radius: 5px; 40 | border-bottom-right-radius: 5px; 41 | } 42 | 43 | .emoji-mart-anchors { 44 | display: flex; 45 | flex-direction: row; 46 | justify-content: space-between; 47 | padding: 0 6px; 48 | line-height: 0; 49 | } 50 | 51 | .emoji-mart-anchor { 52 | position: relative; 53 | display: block; 54 | flex: 1 1 auto; 55 | color: #858585; 56 | text-align: center; 57 | padding: 12px 4px !important; 58 | overflow: hidden; 59 | transition: color .1s ease-out; 60 | margin: 0 !important; 61 | box-shadow: none !important; 62 | background: none !important; 63 | border: none !important; 64 | } 65 | .emoji-mart-anchor:focus { outline: 0 } 66 | .emoji-mart-anchor:hover, 67 | .emoji-mart-anchor:focus, 68 | .emoji-mart-anchor-selected { 69 | color: #464646; 70 | } 71 | 72 | .emoji-mart-anchor-selected .emoji-mart-anchor-bar { 73 | bottom: 0; 74 | } 75 | 76 | .emoji-mart-anchor-bar { 77 | position: absolute; 78 | bottom: -3px; left: 0; 79 | width: 100%; height: 3px; 80 | background-color: #464646; 81 | } 82 | 83 | .emoji-mart-anchors i { 84 | display: inline-block; 85 | width: 100%; 86 | max-width: 22px; 87 | } 88 | 89 | .emoji-mart-anchors svg, 90 | .emoji-mart-anchors img { 91 | fill: currentColor; 92 | height: 18px; 93 | width: 18px; 94 | } 95 | 96 | .emoji-mart-scroll { 97 | overflow-y: scroll; 98 | overflow-x: hidden; 99 | height: 270px; 100 | padding: 0 6px 6px 6px; 101 | will-change: transform; /* avoids "repaints on scroll" in mobile Chrome */ 102 | } 103 | 104 | .emoji-mart-search { 105 | margin-top: 6px; 106 | padding: 0 6px; 107 | position: relative; 108 | } 109 | 110 | .emoji-mart-search input { 111 | font-size: 16px; 112 | display: block; 113 | width: 100%; 114 | padding: 5px 25px 6px 10px; 115 | border-radius: 5px; 116 | border: 1px solid #d9d9d9; 117 | outline: 0; 118 | } 119 | 120 | .emoji-mart-search input, 121 | .emoji-mart-search input::-webkit-search-decoration, 122 | .emoji-mart-search input::-webkit-search-cancel-button, 123 | .emoji-mart-search input::-webkit-search-results-button, 124 | .emoji-mart-search input::-webkit-search-results-decoration { 125 | /* remove webkit/blink styles for 126 | * via https://stackoverflow.com/a/9422689 */ 127 | -webkit-appearance: none; 128 | } 129 | 130 | .emoji-mart-search-icon { 131 | position: absolute; 132 | top: 7px; 133 | right: 11px; 134 | z-index: 2; 135 | padding: 2px 5px 1px; 136 | border: none !important; 137 | box-shadow: none !important; 138 | background: none !important; 139 | } 140 | 141 | .emoji-mart-category .emoji-mart-emoji span { 142 | z-index: 1; 143 | position: relative; 144 | text-align: center; 145 | cursor: default; 146 | } 147 | 148 | .emoji-mart-category .emoji-mart-emoji:focus { outline: 0 } 149 | 150 | .emoji-mart-category .emoji-mart-emoji:hover:before, 151 | .emoji-mart-category .emoji-mart-emoji:focus:before { 152 | z-index: 0; 153 | content: ""; 154 | position: absolute; 155 | top: 0; left: 0; 156 | width: 100%; height: 100%; 157 | background-color: #c5c5c5; 158 | border-radius: 100%; 159 | } 160 | 161 | .emoji-mart-category-label { 162 | z-index: 2; 163 | position: relative; 164 | position: -webkit-sticky; 165 | position: sticky; 166 | top: 0; 167 | } 168 | 169 | .emoji-mart-category-label span { 170 | display: block; 171 | width: 100%; 172 | font-weight: 500; 173 | padding: 5px 6px; 174 | background-color: #fff; 175 | background-color: rgba(255, 255, 255, .95); 176 | } 177 | 178 | .emoji-mart-category-list { 179 | border-spacing: 0; 180 | margin: 0; 181 | padding: 0; 182 | } 183 | 184 | .emoji-mart-category-list td { 185 | margin: 0; 186 | padding: 0; 187 | } 188 | 189 | .emoji-mart-emoji { 190 | position: relative; 191 | display: inline-block; 192 | font-size: 0; 193 | margin: 0 !important; 194 | padding: 0 !important; 195 | border: none !important; 196 | background: none !important; 197 | box-shadow: none !important; 198 | } 199 | 200 | .emoji-mart-emoji-native { 201 | font-family: "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "Apple Color Emoji", "Twemoji Mozilla", "Noto Color Emoji", "Android Emoji"; 202 | } 203 | 204 | .emoji-mart-no-results { 205 | font-size: 14px; 206 | text-align: center; 207 | padding-top: 70px; 208 | color: #858585; 209 | } 210 | .emoji-mart-no-results-img { 211 | display: block; 212 | margin-left: auto; 213 | margin-right: auto; 214 | width: 50%; 215 | } 216 | .emoji-mart-no-results .emoji-mart-category-label { 217 | display: none; 218 | } 219 | .emoji-mart-no-results .emoji-mart-no-results-label { 220 | margin-top: .2em; 221 | } 222 | .emoji-mart-no-results .emoji-mart-emoji:hover:before { 223 | content: none; 224 | } 225 | 226 | .emoji-mart-preview { 227 | position: relative; 228 | height: 70px; 229 | } 230 | 231 | .emoji-mart-preview-emoji, 232 | .emoji-mart-preview-data, 233 | .emoji-mart-preview-skins { 234 | position: absolute; 235 | top: 50%; 236 | transform: translateY(-50%); 237 | } 238 | 239 | .emoji-mart-preview-emoji { 240 | left: 12px; 241 | } 242 | 243 | .emoji-mart-preview-data { 244 | left: 68px; right: 12px; 245 | word-break: break-all; 246 | } 247 | 248 | .emoji-mart-preview-skins { 249 | right: 30px; 250 | text-align: right; 251 | } 252 | 253 | .emoji-mart-preview-skins.custom { 254 | right: 10px; 255 | text-align: right; 256 | } 257 | 258 | .emoji-mart-preview-name { 259 | font-size: 14px; 260 | } 261 | 262 | .emoji-mart-preview-shortname { 263 | font-size: 12px; 264 | color: #888; 265 | } 266 | .emoji-mart-preview-shortname + .emoji-mart-preview-shortname, 267 | .emoji-mart-preview-shortname + .emoji-mart-preview-emoticon, 268 | .emoji-mart-preview-emoticon + .emoji-mart-preview-emoticon { 269 | margin-left: .5em; 270 | } 271 | 272 | .emoji-mart-preview-emoticon { 273 | font-size: 11px; 274 | color: #bbb; 275 | } 276 | 277 | .emoji-mart-title span { 278 | display: inline-block; 279 | vertical-align: middle; 280 | } 281 | 282 | .emoji-mart-title .emoji-mart-emoji { 283 | padding: 0; 284 | } 285 | 286 | .emoji-mart-title-label { 287 | color: #999A9C; 288 | font-size: 26px; 289 | font-weight: 300; 290 | } 291 | 292 | .emoji-mart-skin-swatches { 293 | font-size: 0; 294 | padding: 2px 0; 295 | border: 1px solid #d9d9d9; 296 | border-radius: 12px; 297 | background-color: #fff; 298 | } 299 | 300 | .emoji-mart-skin-swatches.custom { 301 | font-size: 0; 302 | border: none; 303 | background-color: #fff; 304 | } 305 | 306 | .emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch { 307 | width: 16px; 308 | padding: 0 2px; 309 | } 310 | 311 | .emoji-mart-skin-swatches.opened .emoji-mart-skin-swatch.selected:after { 312 | opacity: .75; 313 | } 314 | 315 | .emoji-mart-skin-swatch { 316 | display: inline-block; 317 | width: 0; 318 | vertical-align: middle; 319 | transition-property: width, padding; 320 | transition-duration: .125s; 321 | transition-timing-function: ease-out; 322 | } 323 | 324 | .emoji-mart-skin-swatch:nth-child(1) { transition-delay: 0s } 325 | .emoji-mart-skin-swatch:nth-child(2) { transition-delay: .03s } 326 | .emoji-mart-skin-swatch:nth-child(3) { transition-delay: .06s } 327 | .emoji-mart-skin-swatch:nth-child(4) { transition-delay: .09s } 328 | .emoji-mart-skin-swatch:nth-child(5) { transition-delay: .12s } 329 | .emoji-mart-skin-swatch:nth-child(6) { transition-delay: .15s } 330 | 331 | .emoji-mart-skin-swatch.selected { 332 | position: relative; 333 | width: 16px; 334 | padding: 0 2px; 335 | } 336 | 337 | .emoji-mart-skin-swatch.selected:after { 338 | content: ""; 339 | position: absolute; 340 | top: 50%; left: 50%; 341 | width: 4px; height: 4px; 342 | margin: -2px 0 0 -2px; 343 | background-color: #fff; 344 | border-radius: 100%; 345 | pointer-events: none; 346 | opacity: 0; 347 | transition: opacity .2s ease-out; 348 | } 349 | 350 | .emoji-mart-skin-swatch.custom { 351 | display: inline-block; 352 | width: 0; 353 | height: 38px; 354 | overflow: hidden; 355 | vertical-align: middle; 356 | transition-property: width, height; 357 | transition-duration: .125s; 358 | transition-timing-function: ease-out; 359 | cursor: default; 360 | } 361 | 362 | .emoji-mart-skin-swatch.custom.selected { 363 | position: relative; 364 | width: 36px; 365 | height: 38px; 366 | padding: 0 2px 0 0; 367 | } 368 | 369 | .emoji-mart-skin-swatch.custom.selected:after { 370 | content: ""; 371 | width: 0; 372 | height: 0; 373 | } 374 | 375 | .emoji-mart-skin-swatches.custom .emoji-mart-skin-swatch.custom:hover { 376 | background-color: #f4f4f4; 377 | border-radius: 10%; 378 | } 379 | 380 | .emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom { 381 | width: 36px; 382 | height: 38px; 383 | padding: 0 2px 0 0; 384 | } 385 | 386 | .emoji-mart-skin-swatches.custom.opened .emoji-mart-skin-swatch.custom.selected:after { 387 | opacity: .75; 388 | } 389 | 390 | .emoji-mart-skin-text.opened { 391 | display: inline-block; 392 | vertical-align: middle; 393 | text-align: left; 394 | color: #888; 395 | font-size: 11px; 396 | padding: 5px 2px; 397 | width: 95px; 398 | height: 40px; 399 | border-radius: 10%; 400 | background-color: #fff; 401 | } 402 | 403 | .emoji-mart-skin { 404 | display: inline-block; 405 | width: 100%; 406 | padding-top: 100%; 407 | max-width: 12px; 408 | border-radius: 100%; 409 | } 410 | 411 | .emoji-mart-skin-tone-1 { background-color: #ffc93a } 412 | .emoji-mart-skin-tone-2 { background-color: #fadcbc } 413 | .emoji-mart-skin-tone-3 { background-color: #e0bb95 } 414 | .emoji-mart-skin-tone-4 { background-color: #bf8f68 } 415 | .emoji-mart-skin-tone-5 { background-color: #9b643d } 416 | .emoji-mart-skin-tone-6 { background-color: #594539 } 417 | 418 | /* For screenreaders only, via https://stackoverflow.com/a/19758620 */ 419 | .emoji-mart-sr-only { 420 | position: absolute; 421 | width: 1px; 422 | height: 1px; 423 | padding: 0; 424 | margin: -1px; 425 | overflow: hidden; 426 | clip: rect(0, 0, 0, 0); 427 | border: 0; 428 | } 429 | 430 | /* 431 | * Dark mode styles 432 | */ 433 | 434 | .emoji-mart-dark { 435 | color: #fff; 436 | border-color: #555453; 437 | background-color: #222; 438 | } 439 | 440 | .emoji-mart-dark .emoji-mart-bar { 441 | border-color: #555453; 442 | } 443 | 444 | .emoji-mart-dark .emoji-mart-search input { 445 | color: #fff; 446 | border-color: #555453; 447 | background-color: #2f2f2f; 448 | } 449 | 450 | .emoji-mart-dark .emoji-mart-search-icon svg { 451 | fill: #fff; 452 | } 453 | 454 | .emoji-mart-category .emoji-mart-emoji { 455 | background-color: unset !important; 456 | } 457 | 458 | .emoji-mart-anchor { 459 | background-color: unset !important; 460 | } 461 | 462 | .emoji-mart-search-icon { 463 | background-color: unset !important; 464 | } 465 | 466 | .emoji-mart-dark .emoji-mart-category .emoji-mart-emoji:hover:before, 467 | .emoji-mart-dark .emoji-mart-category .emoji-mart-emoji:focus:before { 468 | background-color: #888; 469 | } 470 | 471 | .emoji-mart-dark .emoji-mart-category-label span { 472 | background-color: #222; 473 | color: #fff; 474 | } 475 | 476 | .emoji-mart-dark .emoji-mart-skin-swatches { 477 | border-color: #555453; 478 | background-color: #222; 479 | } 480 | 481 | .emoji-mart-dark .emoji-mart-anchor:hover, 482 | .emoji-mart-dark .emoji-mart-anchor:focus, 483 | .emoji-mart-dark .emoji-mart-anchor-selected { 484 | color: #bfbfbf; 485 | } 486 | 487 | #emoji-modal { 488 | padding: 0px; 489 | min-width: unset; 490 | width: unset !important; 491 | } 492 | 493 | #emoji-modal > .modal-content { 494 | margin-top: 0px; 495 | } 496 | 497 | #emoji-modal > button { 498 | background-color: unset; 499 | border: 0px !important; 500 | box-shadow: 0px !important; 501 | } 502 | 503 | #emoji-modal > .modal-close-button { 504 | visibility: hidden; 505 | } -------------------------------------------------------------------------------- /.obsidian/plugins/reveal-active-file-button/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | THIS IS A GENERATED/BUNDLED FILE BY ROLLUP 3 | if you want to view the source visit the plugins github repository 4 | */ 5 | 6 | 'use strict'; 7 | 8 | var obsidian = require('obsidian'); 9 | 10 | /*! ***************************************************************************** 11 | Copyright (c) Microsoft Corporation. 12 | 13 | Permission to use, copy, modify, and/or distribute this software for any 14 | purpose with or without fee is hereby granted. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 17 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 18 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 19 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 20 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 21 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22 | PERFORMANCE OF THIS SOFTWARE. 23 | ***************************************************************************** */ 24 | 25 | function __awaiter(thisArg, _arguments, P, generator) { 26 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 27 | return new (P || (P = Promise))(function (resolve, reject) { 28 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 29 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 30 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 31 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 32 | }); 33 | } 34 | 35 | // From https://icon-sets.iconify.design/feather/crosshair/ - "feather-crosshair" 36 | const REVEAL_ACTIVE_FILE_BUTTON_ICON = ''; 37 | 38 | class RevealActiveFileButtonPlugin extends obsidian.Plugin { 39 | onload() { 40 | return __awaiter(this, void 0, void 0, function* () { 41 | // Initialize 42 | this.app.workspace.onLayoutReady(() => { 43 | const explorers = this.getFileExplorers(); 44 | explorers.forEach((exp) => { 45 | this.addRevealButton(exp); 46 | }); 47 | }); 48 | // File explorers that get opened later on 49 | this.registerEvent(this.app.workspace.on('layout-change', () => { 50 | const explorers = this.getFileExplorers(); 51 | explorers.forEach((exp) => { 52 | this.addRevealButton(exp); 53 | }); 54 | })); 55 | }); 56 | } 57 | onunload() { 58 | // Remove all reveal buttons 59 | const explorers = this.getFileExplorers(); 60 | explorers.forEach((exp) => { 61 | this.removeRevealButton(exp); 62 | }); 63 | } 64 | /** 65 | * Adds the reveal button to a file explorer leaf. 66 | * Returns the newly created button element or the old one if already there. 67 | */ 68 | addRevealButton(explorer) { 69 | const container = explorer.view.containerEl; 70 | const navContainer = container.querySelector('div.nav-buttons-container'); 71 | if (!navContainer) { 72 | return null; 73 | } 74 | const existingButton = this.getRevealButton(explorer); 75 | if (existingButton) { 76 | return; 77 | } 78 | const newIcon = document.createElement('div'); 79 | this.setButtonProperties(newIcon); 80 | newIcon.className = 'clickable-icon nav-action-button reveal-active-file-button'; 81 | this.registerDomEvent(newIcon, 'click', () => { 82 | this.onButtonClick(explorer); 83 | }); 84 | navContainer.appendChild(newIcon); 85 | } 86 | /** 87 | * Remove the reveal button from a given file explorer leaf. 88 | */ 89 | removeRevealButton(explorer) { 90 | const button = this.getRevealButton(explorer); 91 | if (button) { 92 | button.remove(); 93 | } 94 | } 95 | /** 96 | * Reveal the active file in the given file explorer 97 | */ 98 | onButtonClick(explorer) { 99 | if (explorer) { 100 | // @ts-ignore 101 | this.app.commands.executeCommandById('file-explorer:reveal-active-file'); 102 | // Send the command twice like a double-click, to handle the frequent case where Obsidian fails to jump to the file 103 | setTimeout(() => { 104 | // @ts-ignore 105 | this.app.commands.executeCommandById('file-explorer:reveal-active-file'); 106 | }, 50); 107 | } 108 | } 109 | setButtonProperties(button) { 110 | button.innerHTML = REVEAL_ACTIVE_FILE_BUTTON_ICON; 111 | button.setAttribute('aria-label', 'Reveal active file'); 112 | } 113 | /** 114 | * Returns all loaded file explorer leaves 115 | */ 116 | getFileExplorers() { 117 | return this.app.workspace.getLeavesOfType('file-explorer'); 118 | } 119 | /** 120 | * Get the reveal button for a given file explorer, if it exists 121 | */ 122 | getRevealButton(explorer) { 123 | return explorer.view.containerEl.querySelector('.reveal-active-file-button'); 124 | } 125 | } 126 | 127 | module.exports = RevealActiveFileButtonPlugin; 128 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9jb25zdGFudHMudHMiLCJzcmMvcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxyXG4gICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcclxuICAgIHZhciBpLCBwO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XHJcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcclxuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuIiwiLy8gRnJvbSBodHRwczovL2ljb24tc2V0cy5pY29uaWZ5LmRlc2lnbi9mZWF0aGVyL2Nyb3NzaGFpci8gLSBcImZlYXRoZXItY3Jvc3NoYWlyXCJcbmV4cG9ydCBjb25zdCBSRVZFQUxfQUNUSVZFX0ZJTEVfQlVUVE9OX0lDT04gPVxuICAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cImltZ1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWlkWU1pZCBtZWV0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxnIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIi8+PHBhdGggZD1cIk0yMiAxMmgtNFwiLz48cGF0aCBkPVwiTTYgMTJIMlwiLz48cGF0aCBkPVwiTTEyIDZWMlwiLz48cGF0aCBkPVwiTTEyIDIydi00XCIvPjwvZz48L3N2Zz4nO1xuIiwiaW1wb3J0IHsgUGx1Z2luLCBXb3Jrc3BhY2VMZWFmfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBSRVZFQUxfQUNUSVZFX0ZJTEVfQlVUVE9OX0lDT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBSZXZlYWxBY3RpdmVGaWxlQnV0dG9uUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEluaXRpYWxpemVcbiAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSgoKSA9PiB7XG4gICAgICBjb25zdCBleHBsb3JlcnMgPSB0aGlzLmdldEZpbGVFeHBsb3JlcnMoKTtcbiAgICAgIGV4cGxvcmVycy5mb3JFYWNoKChleHApID0+IHtcbiAgICAgICAgdGhpcy5hZGRSZXZlYWxCdXR0b24oZXhwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gRmlsZSBleHBsb3JlcnMgdGhhdCBnZXQgb3BlbmVkIGxhdGVyIG9uXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KFxuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBleHBsb3JlcnMgPSB0aGlzLmdldEZpbGVFeHBsb3JlcnMoKTtcbiAgICAgICAgZXhwbG9yZXJzLmZvckVhY2goKGV4cCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkUmV2ZWFsQnV0dG9uKGV4cCk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb251bmxvYWQoKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGFsbCByZXZlYWwgYnV0dG9uc1xuICAgIGNvbnN0IGV4cGxvcmVycyA9IHRoaXMuZ2V0RmlsZUV4cGxvcmVycygpO1xuICAgIGV4cGxvcmVycy5mb3JFYWNoKChleHApID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlUmV2ZWFsQnV0dG9uKGV4cCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgcmV2ZWFsIGJ1dHRvbiB0byBhIGZpbGUgZXhwbG9yZXIgbGVhZi5cbiAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCBidXR0b24gZWxlbWVudCBvciB0aGUgb2xkIG9uZSBpZiBhbHJlYWR5IHRoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRSZXZlYWxCdXR0b24oZXhwbG9yZXI6IFdvcmtzcGFjZUxlYWYpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBleHBsb3Jlci52aWV3LmNvbnRhaW5lckVsIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgIGNvbnN0IG5hdkNvbnRhaW5lciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFxuICAgICAgJ2Rpdi5uYXYtYnV0dG9ucy1jb250YWluZXInXG4gICAgKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICBpZiAoIW5hdkNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmdCdXR0b24gPSB0aGlzLmdldFJldmVhbEJ1dHRvbihleHBsb3Jlcik7XG4gICAgaWYgKGV4aXN0aW5nQnV0dG9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3SWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuc2V0QnV0dG9uUHJvcGVydGllcyhuZXdJY29uKTtcbiAgICBuZXdJY29uLmNsYXNzTmFtZSA9ICdjbGlja2FibGUtaWNvbiBuYXYtYWN0aW9uLWJ1dHRvbiByZXZlYWwtYWN0aXZlLWZpbGUtYnV0dG9uJztcbiAgICB0aGlzLnJlZ2lzdGVyRG9tRXZlbnQobmV3SWNvbiwgJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5vbkJ1dHRvbkNsaWNrKGV4cGxvcmVyKTtcbiAgICB9KTtcbiAgICBuYXZDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3SWNvbik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSByZXZlYWwgYnV0dG9uIGZyb20gYSBnaXZlbiBmaWxlIGV4cGxvcmVyIGxlYWYuXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZVJldmVhbEJ1dHRvbihleHBsb3JlcjogV29ya3NwYWNlTGVhZik6IHZvaWQge1xuICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0UmV2ZWFsQnV0dG9uKGV4cGxvcmVyKTtcbiAgICBpZiAoYnV0dG9uKSB7XG4gICAgICBidXR0b24ucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldmVhbCB0aGUgYWN0aXZlIGZpbGUgaW4gdGhlIGdpdmVuIGZpbGUgZXhwbG9yZXJcbiAgICovXG4gIHByaXZhdGUgb25CdXR0b25DbGljayhleHBsb3JlcjogV29ya3NwYWNlTGVhZik6IHZvaWQge1xuICAgIGlmIChleHBsb3Jlcikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5hcHAuY29tbWFuZHMuZXhlY3V0ZUNvbW1hbmRCeUlkKCdmaWxlLWV4cGxvcmVyOnJldmVhbC1hY3RpdmUtZmlsZScpO1xuICAgICAgLy8gU2VuZCB0aGUgY29tbWFuZCB0d2ljZSBsaWtlIGEgZG91YmxlLWNsaWNrLCB0byBoYW5kbGUgdGhlIGZyZXF1ZW50IGNhc2Ugd2hlcmUgT2JzaWRpYW4gZmFpbHMgdG8ganVtcCB0byB0aGUgZmlsZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5hcHAuY29tbWFuZHMuZXhlY3V0ZUNvbW1hbmRCeUlkKCdmaWxlLWV4cGxvcmVyOnJldmVhbC1hY3RpdmUtZmlsZScpO1xuICAgICAgfSwgNTApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRCdXR0b25Qcm9wZXJ0aWVzKFxuICAgICAgYnV0dG9uOiBIVE1MRWxlbWVudFxuICApOiB2b2lkIHtcbiAgICBidXR0b24uaW5uZXJIVE1MID0gUkVWRUFMX0FDVElWRV9GSUxFX0JVVFRPTl9JQ09OO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICdhcmlhLWxhYmVsJyxcbiAgICAgICAgJ1JldmVhbCBhY3RpdmUgZmlsZSdcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGxvYWRlZCBmaWxlIGV4cGxvcmVyIGxlYXZlc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRGaWxlRXhwbG9yZXJzKCk6IFdvcmtzcGFjZUxlYWZbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoJ2ZpbGUtZXhwbG9yZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHJldmVhbCBidXR0b24gZm9yIGEgZ2l2ZW4gZmlsZSBleHBsb3JlciwgaWYgaXQgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGdldFJldmVhbEJ1dHRvbihleHBsb3JlcjogV29ya3NwYWNlTGVhZik6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIGV4cGxvcmVyLnZpZXcuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcihcbiAgICAgICcucmV2ZWFsLWFjdGl2ZS1maWxlLWJ1dHRvbidcbiAgICApO1xuICB9XG5cbn1cbiJdLCJuYW1lcyI6WyJQbHVnaW4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF1REE7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1A7O0FDN0VBO0FBQ08sTUFBTSw4QkFBOEIsR0FDekMsaWFBQWlhOztNQ0N0Wiw0QkFBNkIsU0FBUUEsZUFBTTtJQUNoRCxNQUFNOzs7WUFFVixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7Z0JBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRztvQkFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDM0IsQ0FBQyxDQUFDO2FBQ0osQ0FBQyxDQUFDOztZQUdILElBQUksQ0FBQyxhQUFhLENBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMxQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRztvQkFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDM0IsQ0FBQyxDQUFDO2FBQ0osQ0FBQyxDQUNILENBQUM7U0FDSDtLQUFBO0lBRUQsUUFBUTs7UUFFTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRztZQUNwQixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUIsQ0FBQyxDQUFDO0tBQ0o7Ozs7O0lBTU8sZUFBZSxDQUFDLFFBQXVCO1FBQzdDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBNkIsQ0FBQztRQUM5RCxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsYUFBYSxDQUMxQywyQkFBMkIsQ0FDVixDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEQsSUFBSSxjQUFjLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLFNBQVMsR0FBRyw0REFBNEQsQ0FBQztRQUNqRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRTtZQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzlCLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbkM7Ozs7SUFLTyxrQkFBa0IsQ0FBQyxRQUF1QjtRQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2pCO0tBQ0Y7Ozs7SUFLTyxhQUFhLENBQUMsUUFBdUI7UUFDM0MsSUFBSSxRQUFRLEVBQUU7O1lBRVosSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsa0NBQWtDLENBQUMsQ0FBQzs7WUFFekUsVUFBVSxDQUFDOztnQkFFVCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO2FBQzFFLEVBQUUsRUFBRSxDQUFDLENBQUE7U0FDUDtLQUNGO0lBRU8sbUJBQW1CLENBQ3ZCLE1BQW1CO1FBRXJCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsOEJBQThCLENBQUM7UUFDbEQsTUFBTSxDQUFDLFlBQVksQ0FDZixZQUFZLEVBQ1osb0JBQW9CLENBQ3ZCLENBQUM7S0FDSDs7OztJQUtPLGdCQUFnQjtRQUN0QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUM1RDs7OztJQUtPLGVBQWUsQ0FBQyxRQUF1QjtRQUM3QyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FDNUMsNEJBQTRCLENBQzdCLENBQUM7S0FDSDs7Ozs7In0= 129 | -------------------------------------------------------------------------------- /.obsidian/plugins/reveal-active-file-button/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "reveal-active-file-button", 3 | "name": "Reveal Active File Button", 4 | "version": "2.0.3", 5 | "minAppVersion": "0.12.11", 6 | "description": "Add a button to the top of the File Explorer, to reveal the active file.", 7 | "author": "Clare Macrae", 8 | "authorUrl": "https://claremacrae.co.uk", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/snippets/dashboard-ReadLineLength.css: -------------------------------------------------------------------------------- 1 | /* 2 | Optional css that can be added to make dashboards use wide margin 3 | if "Readable line length" is enabled in Editor 4 | 5 | Last updated 2024-11-18 6 | This solution is provided by TfT Hacker. Learn more at https://tfthacker.com 7 | */ 8 | 9 | 10 | .dashboard.markdown-preview-view.is-readable-line-width .markdown-preview-section, 11 | .dashboard.markdown-preview-view.is-readable-line-width .markdown-preview-section>div { 12 | width: 100% !important; 13 | max-width: 100% !important; 14 | } -------------------------------------------------------------------------------- /.obsidian/snippets/dashboard.css: -------------------------------------------------------------------------------- 1 | /* 2 | Last updated 2024-11-18 3 | This solution is provided by TfT Hacker. Learn more at https://tfthacker.com 4 | */ 5 | 6 | .dashboard { 7 | font-family: inherit; 8 | padding-left: 25px !important; 9 | padding-right: 25px !important; 10 | padding-top: 20px !important; 11 | } 12 | 13 | .dashboard .markdown-preview-section { 14 | max-width: 100%; 15 | } 16 | 17 | /* Title at top of the document */ 18 | .dashboard .markdown-preview-section .title { 19 | top: 60px; 20 | position: absolute; 21 | font-size: 26pt !important; 22 | font-weight: bolder; 23 | letter-spacing: 8px; 24 | } 25 | 26 | .dashboard h1 { 27 | border-bottom-style: dotted !important; 28 | border-width: 1px !important; 29 | padding-bottom: 3px !important; 30 | } 31 | 32 | 33 | /* Get rid of the parent bullet */ 34 | .dashboard div.markdown-preview-section>div>ul>li>.list-bullet { 35 | display: none !important; 36 | } 37 | 38 | /* Remove the indentation guide lines */ 39 | .dashboard.markdown-rendered.show-indentation-guide li>ul::before, 40 | .dashboard.markdown-rendered.show-indentation-guide li>ol::before { 41 | display: none; 42 | } 43 | 44 | div.markdown-preview-section>div>ul.has-list-bullet>li { 45 | padding-left: 0p !important; 46 | } 47 | 48 | .dashboard div>ul { 49 | list-style: none; 50 | display: flex; 51 | column-gap: 50px; 52 | flex-flow: row wrap; 53 | } 54 | 55 | .dashboard div>ul>li { 56 | min-width: 250px; 57 | width: 15%; 58 | } 59 | 60 | /* Dataview support */ 61 | .dashboard ul.dataview { 62 | row-gap: 0px !important; 63 | list-style-type: disc !important; 64 | } -------------------------------------------------------------------------------- /.obsidian/snippets/dim-support-files.css: -------------------------------------------------------------------------------- 1 | /* 2 | Last updated 2024-11-18 3 | This solution is provided by TfT Hacker. Learn more at https://tfthacker.com 4 | */ 5 | 6 | 7 | /* Dim README and push it away from the other foldres */ 8 | div[data-path="LICENSE.md"] { 9 | opacity: 0.25; 10 | border-top: 1px solid grey; 11 | border-radius: 0; 12 | margin-top: 50px; 13 | padding-top: 10px; 14 | } 15 | 16 | /* Dim the following files */ 17 | div[data-path="README.md"] { 18 | opacity: 0.25; 19 | } 20 | 21 | div[data-path="Ω CHANGELOG.md"] { 22 | opacity: 0.25; 23 | } -------------------------------------------------------------------------------- /.obsidian/workspace: -------------------------------------------------------------------------------- 1 | { 2 | "main": { 3 | "id": "d353772624cebe75", 4 | "type": "split", 5 | "children": [ 6 | { 7 | "id": "b84c272458d9ffa9", 8 | "type": "leaf", 9 | "state": { 10 | "type": "markdown", 11 | "state": { 12 | "file": "Dashboard++.md", 13 | "mode": "preview", 14 | "source": false 15 | } 16 | } 17 | } 18 | ], 19 | "direction": "vertical" 20 | }, 21 | "left": { 22 | "id": "42bf9280c11f2a5b", 23 | "type": "split", 24 | "children": [ 25 | { 26 | "id": "b12c8a84d26a32d1", 27 | "type": "tabs", 28 | "children": [ 29 | { 30 | "id": "e0d60735573386f5", 31 | "type": "leaf", 32 | "state": { 33 | "type": "file-explorer", 34 | "state": {} 35 | } 36 | }, 37 | { 38 | "id": "40d21c2632e07b7f", 39 | "type": "leaf", 40 | "state": { 41 | "type": "search", 42 | "state": { 43 | "query": "", 44 | "matchingCase": false, 45 | "explainSearch": false, 46 | "collapseAll": false, 47 | "extraContext": false, 48 | "sortOrder": "alphabetical" 49 | } 50 | } 51 | }, 52 | { 53 | "id": "fb9956fe647de07a", 54 | "type": "leaf", 55 | "state": { 56 | "type": "starred", 57 | "state": {} 58 | } 59 | } 60 | ] 61 | } 62 | ], 63 | "direction": "horizontal", 64 | "width": 171 65 | }, 66 | "right": { 67 | "id": "c8a13d38502f2423", 68 | "type": "split", 69 | "children": [ 70 | { 71 | "id": "86f80c5fb61f56df", 72 | "type": "tabs", 73 | "children": [ 74 | { 75 | "id": "01c06e010e844738", 76 | "type": "leaf", 77 | "state": { 78 | "type": "backlink", 79 | "state": { 80 | "file": "Dashboard++.md", 81 | "collapseAll": false, 82 | "extraContext": false, 83 | "sortOrder": "alphabetical", 84 | "showSearch": false, 85 | "searchQuery": "", 86 | "backlinkCollapsed": false, 87 | "unlinkedCollapsed": true 88 | } 89 | } 90 | }, 91 | { 92 | "id": "5a5fa2e51236c09d", 93 | "type": "leaf", 94 | "state": { 95 | "type": "outline", 96 | "state": { 97 | "file": "Dashboard++.md" 98 | } 99 | } 100 | } 101 | ] 102 | } 103 | ], 104 | "direction": "horizontal", 105 | "width": 300, 106 | "collapsed": true 107 | }, 108 | "active": "b84c272458d9ffa9", 109 | "lastOpenFiles": [ 110 | "Dashboard++.md", 111 | "Family/Recipes/Spicy-Sweet Buffalo Popcorn.md", 112 | "Work/Personnel/Sally Smith.md", 113 | "Work/Personnel/Olga Olson.md", 114 | "Work/Personnel/Brad Jefferson.md", 115 | "Work/Personnel/Bill Hansen.md", 116 | "Work/Projects/IT Cybersecurity training.md", 117 | "Work/Projects/Firewall upgrades.md", 118 | "Work/Projects/Cloud backup.md", 119 | "Work/Budget/Q4 2022.md" 120 | ] 121 | } -------------------------------------------------------------------------------- /.obsidian/workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "main": { 3 | "id": "5324373015726ba8", 4 | "type": "split", 5 | "children": [ 6 | { 7 | "id": "4509724f8bf84da7", 8 | "type": "tabs", 9 | "children": [ 10 | { 11 | "id": "e7a7b303c61786dc", 12 | "type": "leaf", 13 | "state": { 14 | "type": "markdown", 15 | "state": { 16 | "file": "Dashboard++.md", 17 | "mode": "preview", 18 | "source": false 19 | }, 20 | "icon": "lucide-file", 21 | "title": "Dashboard++" 22 | } 23 | } 24 | ] 25 | } 26 | ], 27 | "direction": "vertical" 28 | }, 29 | "left": { 30 | "id": "42bf9280c11f2a5b", 31 | "type": "split", 32 | "children": [ 33 | { 34 | "id": "b12c8a84d26a32d1", 35 | "type": "tabs", 36 | "children": [ 37 | { 38 | "id": "e0d60735573386f5", 39 | "type": "leaf", 40 | "state": { 41 | "type": "file-explorer", 42 | "state": { 43 | "sortOrder": "alphabetical" 44 | }, 45 | "icon": "lucide-folder-closed", 46 | "title": "Files" 47 | } 48 | }, 49 | { 50 | "id": "40d21c2632e07b7f", 51 | "type": "leaf", 52 | "state": { 53 | "type": "search", 54 | "state": { 55 | "query": "#shopping", 56 | "matchingCase": false, 57 | "explainSearch": false, 58 | "collapseAll": false, 59 | "extraContext": false, 60 | "sortOrder": "alphabetical" 61 | }, 62 | "icon": "lucide-search", 63 | "title": "Search" 64 | } 65 | }, 66 | { 67 | "id": "fb9956fe647de07a", 68 | "type": "leaf", 69 | "state": { 70 | "type": "starred", 71 | "state": {}, 72 | "icon": "lucide-file", 73 | "title": "Plugin no longer active" 74 | } 75 | }, 76 | { 77 | "id": "83ac81eba215c268", 78 | "type": "leaf", 79 | "state": { 80 | "type": "bookmarks", 81 | "state": {}, 82 | "icon": "lucide-bookmark", 83 | "title": "Bookmarks" 84 | } 85 | } 86 | ] 87 | } 88 | ], 89 | "direction": "horizontal", 90 | "width": 239.5 91 | }, 92 | "right": { 93 | "id": "c8a13d38502f2423", 94 | "type": "split", 95 | "children": [ 96 | { 97 | "id": "86f80c5fb61f56df", 98 | "type": "tabs", 99 | "children": [ 100 | { 101 | "id": "01c06e010e844738", 102 | "type": "leaf", 103 | "state": { 104 | "type": "backlink", 105 | "state": { 106 | "file": "Dashboard++.md", 107 | "collapseAll": false, 108 | "extraContext": false, 109 | "sortOrder": "alphabetical", 110 | "showSearch": false, 111 | "searchQuery": "", 112 | "backlinkCollapsed": false, 113 | "unlinkedCollapsed": true 114 | }, 115 | "icon": "links-coming-in", 116 | "title": "Backlinks for Dashboard++" 117 | } 118 | }, 119 | { 120 | "id": "5a5fa2e51236c09d", 121 | "type": "leaf", 122 | "state": { 123 | "type": "outline", 124 | "state": { 125 | "file": "Dashboard++.md" 126 | }, 127 | "icon": "lucide-list", 128 | "title": "Outline of Dashboard++" 129 | } 130 | }, 131 | { 132 | "id": "c5c28735a2ea7ad7", 133 | "type": "leaf", 134 | "state": { 135 | "type": "all-properties", 136 | "state": { 137 | "sortOrder": "frequency", 138 | "showSearch": false, 139 | "searchQuery": "" 140 | }, 141 | "icon": "lucide-archive", 142 | "title": "All properties" 143 | } 144 | } 145 | ], 146 | "currentTab": 1 147 | } 148 | ], 149 | "direction": "horizontal", 150 | "width": 216.5, 151 | "collapsed": true 152 | }, 153 | "left-ribbon": { 154 | "hiddenItems": { 155 | "switcher:Open quick switcher": false, 156 | "graph:Open graph view": false, 157 | "canvas:Create new canvas": false, 158 | "command-palette:Open command palette": false, 159 | "homepage:Open homepage": false 160 | } 161 | }, 162 | "active": "e7a7b303c61786dc", 163 | "lastOpenFiles": [ 164 | "Dashboard++.md", 165 | "README.md", 166 | "Ω CHANGELOG.md", 167 | "LICENSE.md", 168 | "images/dashboard-snapshot.png", 169 | "dashboard-snapshot.png", 170 | "2024-11-18_15-14-04.png", 171 | "Family/Objectives/Family Recipes.md", 172 | "Family/Recipes/Spicy-Sweet Buffalo Popcorn.md", 173 | "Work/Projects/Cloud backup.md", 174 | "Family/Guests/Guest list.md", 175 | "Family/Vacations/Austria.md", 176 | "Personal Projects/Writing/5 ways to love PKM more.md", 177 | "Personal Projects/Remodeling/Bathroom Remodel.md", 178 | "Personal Projects/Learning/Early American History.md", 179 | "Research/What is Spaced Repetition and How to use it.md", 180 | "Work/Projects/Firewall upgrades.md", 181 | "Work/Projects/IT Cybersecurity training.md", 182 | "Work/Personnel/Brad Jefferson.md", 183 | "Work/Budget/Q1 2022.md", 184 | "Family/Vacations/Peru.md", 185 | "test.md", 186 | "Family/Objectives/Family Calendar.md", 187 | "Work/Personnel/Sally Smith.md", 188 | "Research/What is Spaced Repetition and How to use it?.md", 189 | "Family/Recipes/Smores.md", 190 | "Family/Recipes/Almond Peanut Butter.md", 191 | "Personal Projects/Learning/Spanish - Entry Level.md", 192 | "Personal Projects/Remodeling/Paint entryway.md", 193 | "Research/Untitled", 194 | "Research", 195 | "images/YouTubeFromSergio.png", 196 | "images/home.jpg" 197 | ] 198 | } -------------------------------------------------------------------------------- /0-Vault-Logo/.placeholder: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/0-Vault-Logo/.placeholder -------------------------------------------------------------------------------- /Dashboard++.md: -------------------------------------------------------------------------------- 1 | --- 2 | cssclasses: 3 | - dashboard 4 | banner: "![[home.jpg]]" 5 | banner_x: 0.5 6 | banner_y: 0 7 | --- 8 |
HOME
9 | 10 | # Family 11 | - 🏈 Sunday Game 12 | - [[Spicy-Sweet Buffalo Popcorn]] 13 | - [[Guest list]] 14 | - [Jalapeno Popper Wantons](https://www.allrecipes.com/recipe/166991/jalapeno-popper-wontons/) 15 | - 👨‍👩‍👦 Objectives 16 | - [[Family Recipes]] 17 | - [[Family Calendar]] 18 | - [[Education Plan]] 19 | - [[Yearly Budget]] 20 | - 🌅 Exotic Vacations 21 | - [[Peru]] 22 | - [[Austria]] 23 | - [[Texas]] 24 | - 🎥 Movies to Watch 25 | - [Sleepless in Seattle](https://www.imdb.com/title/tt0108160/) 26 | - [Joe vs the Volcano](https://www.imdb.com/title/tt0099892/) 27 | 28 | # Personal Projects 29 | - 🏡 Remodeling Projects 30 | - [[Bathroom Remodel]] 31 | - [[Paint entryway]] 32 | - [[Research building Garage]] 33 | - ✍️ Writing Projects 34 | - [[5 ways to love PKM more]] 35 | - Read: [Obisidian core principles](https://tfthacker.medium.com/obsidian-understanding-its-core-design-principles-7f3fafbd6e36) 36 | - 📚 Learning 37 | - [[Early American History]] 38 | - [[Spanish - Entry Level]] 39 | 40 | # Work 41 | - 💼 Projects 42 | - [[Cloud backup]] 43 | - [[Firewall upgrades]] 44 | - [[IT Cybersecurity training]] 45 | - 💰 Budget review 46 | - [[Q1 2022]] 47 | - [[Q2 2022]] 48 | - [[Q3 2022]] 49 | - [[Q4 2022]] 50 | - 👥 Personnel Review 51 | - [[Sally Smith]] 52 | - [[Bill Hansen]] 53 | - [[Brad Jefferson]] 54 | - [[Olga Olson]] 55 | 56 | # Vault Info 57 | - 🗄️ Recent file updates 58 | `$=dv.list(dv.pages('').sort(f=>f.file.mtime.ts,"desc").limit(4).file.link)` 59 | - 🔖 Tagged: favorite 60 | `$=dv.list(dv.pages('#favorite').sort(f=>f.file.name,"desc").limit(4).file.link)` 61 | - 〽️ Stats 62 | - File Count: `$=dv.pages().length` 63 | - Personal recipes: `$=dv.pages('"Family/Recipes"').length` 64 | -------------------------------------------------------------------------------- /Family/Guests/Guest list.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Family/Guests/Guest list.md -------------------------------------------------------------------------------- /Family/Objectives/Education Plan.md: -------------------------------------------------------------------------------- 1 | #favorite -------------------------------------------------------------------------------- /Family/Objectives/Family Calendar.md: -------------------------------------------------------------------------------- 1 | #favorite -------------------------------------------------------------------------------- /Family/Objectives/Family Recipes.md: -------------------------------------------------------------------------------- 1 | --- 2 | banner: "![[Kitchen.jpeg]]" 3 | banner: "![[Kitchen.jpeg]]" 4 | banner_y: 0.55 5 | cssclass: dashboard 6 | banner_x: 0.5 7 | --- 8 |
Family Recipes
9 | 10 | # Family Favorites 11 | - Kids 12 | - [Mac n' cheese](https://www.allrecipes.com/recipe/218992/impromptu-mac-and-cheese/) 13 | - [[Smores]] 14 | - [[Almond Peanut Butter]] 15 | - [Grandma's Banana Bread](https://www.allrecipes.com/recipe/23810/grandmas-banana-bread/) 16 | - NFL Sundays 17 | - [Nacho cheese deep](https://www.allrecipes.com/recipe/72097/fat-boy-nacho-cheese-dip/) 18 | - [Jalapeno Popper Wantons](https://www.allrecipes.com/recipe/166991/jalapeno-popper-wontons/) 19 | - [[Spicy-Sweet Buffalo Popcorn]] 20 | 21 | # Recipes to try 22 | - Breakfest 23 | - [Southwest Breakfast Burritos](https://www.allrecipes.com/recipe/214583/southwest-breakfast-burritos/) 24 | - [Caramelized French Toast](https://www.allrecipes.com/recipe/24571/caramelized-french-toast/) 25 | - [Green Eggs And Hash Omelet](https://www.allrecipes.com/recipe/259185/green-eggs-and-hash-omelet/) 26 | - Lunch 27 | - [Greek Farro Salad](https://www.allrecipes.com/recipe/244326/greek-farro-salad/) 28 | - [Peanut Butter Noodles](https://www.allrecipes.com/recipe/11835/peanut-butter-noodles/) 29 | - Dinner 30 | - [Sesame Seared Tuna](https://www.allrecipes.com/recipe/71698/sesame-seared-tuna/) 31 | -------------------------------------------------------------------------------- /Family/Objectives/Yearly Budget.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Family/Objectives/Yearly Budget.md -------------------------------------------------------------------------------- /Family/Recipes/Almond Peanut Butter.md: -------------------------------------------------------------------------------- 1 | --- 2 | banner_x: 0.5 3 | banner_y: 0.55 4 | banner: "![[Kitchen.jpeg]]" 5 | --- -------------------------------------------------------------------------------- /Family/Recipes/Smores.md: -------------------------------------------------------------------------------- 1 | --- 2 | banner: "![[Smores.jpeg]]" 3 | banner_x: 0.5 4 | banner_y: 0.55 5 | --- 6 | 7 | # Ingredients 8 | Original recipe yields 4 servings 9 | 10 | ## Ingredient Checklist 11 | - 4 whole graham crackers, broken into two square halves 12 | - 2 tablespoons chocolate-hazelnut spread (such as Nutella®) 13 | - 2 tablespoons marshmallow creme 14 | 15 | ## Directions 16 | # Step 1 17 | 18 | Spread 1 1/2 teaspoons chocolate-hazelnut spread onto 4 of the graham cracker halves. Spread 1 1/2 teaspoons marshmallow cream onto the remaining 4 graham cracker halves. Press 1 chocolate-hazelnut graham cracker half together with 1 marshmallow cream half. Repeat with remaining graham crackers. -------------------------------------------------------------------------------- /Family/Recipes/Spicy-Sweet Buffalo Popcorn.md: -------------------------------------------------------------------------------- 1 | --- 2 | banner: "![[Spicy popcorn.jpeg]]" 3 | banner_x: 0.5 4 | banner_y: 0.5 5 | --- 6 | 7 | 8 | # Ingredients 9 | - Original recipe yields 8 servings 10 | - Ingredient Checklist 11 | - cooking spray 12 | - 8 cups popped popcorn 13 | - 1 cup white sugar 14 | - ¼ cup water 15 | - ⅓ cup Buffalo wing sauce (such as Frank's®) 16 | - 3 tablespoons butter, cut into small cubes 17 | - ½ teaspoon baking soda 18 | - ¼ teaspoon cayenne pepper (Optional) 19 | 20 | # Directions 21 | ## Step 1 22 | Spray a large bowl with cooking spray. Fill with popcorn. 23 | 24 | ## Step 2 25 | Preheat oven to 300 degrees F (150 degrees C). Line a baking sheet with parchment paper or a silicone pad. 26 | 27 | ## Step 3 28 | Combine sugar and water in a saucepan and bring to a boil over medium-high heat. Cook, without stirring and swirling pan gently as needed, until sugar has melted and the caramel is a deep amber color, 8 to 12 minutes. Remove from heat. 29 | 30 | ## Step 4 31 | Stir Buffalo sauce and butter carefully into the caramel; it will spit and bubble and may form a ball. Return to heat; bring to a boil, stirring until caramel is dissolved, about 3 minutes. Remove from heat and stir in the baking soda and cayenne pepper. 32 | 33 | ## Step 5 34 | Pour spicy caramel mixture carefully over the popcorn. Toss to completely coat, guarding your hands from the hot caramel. Spread the coated popcorn onto the prepared baking sheet. 35 | 36 | ## Step 6 37 | Bake in the preheated oven until dry, 15 to 20 minutes. Let cool for 10 minutes; stir. 38 | 39 | # Source 40 | - https://www.allrecipes.com/recipe/261199/spicy-sweet-buffalo-popcorn/ 41 | -------------------------------------------------------------------------------- /Family/Vacations/Austria.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Family/Vacations/Austria.md -------------------------------------------------------------------------------- /Family/Vacations/Peru.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Family/Vacations/Peru.md -------------------------------------------------------------------------------- /Family/Vacations/Texas.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Family/Vacations/Texas.md -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 TfTHacker 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Personal Projects/Learning/Early American History.md: -------------------------------------------------------------------------------- 1 | #favorite #project -------------------------------------------------------------------------------- /Personal Projects/Learning/Spanish - Entry Level.md: -------------------------------------------------------------------------------- 1 | #project -------------------------------------------------------------------------------- /Personal Projects/Remodeling/Bathroom Remodel.md: -------------------------------------------------------------------------------- 1 | #project -------------------------------------------------------------------------------- /Personal Projects/Remodeling/Paint entryway.md: -------------------------------------------------------------------------------- 1 | #project 2 | 3 | -------------------------------------------------------------------------------- /Personal Projects/Remodeling/Project X Definition and Specifications.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Personal Projects/Remodeling/Project X Definition and Specifications.md -------------------------------------------------------------------------------- /Personal Projects/Remodeling/Research building Garage.md: -------------------------------------------------------------------------------- 1 | #project 2 | 3 | # Questions 4 | - Build the garage myself or hire a construction company? 5 | - For one car or two? 6 | - Where would it be located? 7 | -------------------------------------------------------------------------------- /Personal Projects/Writing/5 ways to love PKM more.md: -------------------------------------------------------------------------------- 1 | #project -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dashboard++ for Obsidian 2 | 3 | 4 | 5 | # Add Dashboard++ to your Obsidian vault 6 | 7 | This repository is an Obsidian vault that demonstrates using the Dashboard++ method for organizing and navigating notes. For further details, see this article for a detailed description: 8 | 9 | - [Dashboard++ — a simple organization and navigation method for Obsidian Vaults](https://tfthacker.com/article-obsidian-dashboardplusplus2022) 10 | 11 | You can find me at https://tfthacker.com. 12 | 13 | Or better yet, watch a video on how to install this from Sergio: 14 | 15 | [![](images/YouTubeFromSergio.png)](https://youtu.be/AatZl1Z_n-g) 16 | 17 | # 2023 Obsidian Gems award for templates 18 | 19 | Dashboard++ won the "2023 Obsidian Gem of the year" in the templates category. Thank you to all of you who voted for this template! 20 | 21 | - Read more at the Official Obsidian blog: [2023 Gems of the year winners](https://obsidian.md/blog/2023-goty-winners/) 22 | 23 | ## Ways to connect with me and more information on my work 24 | 25 | - My website https://tfthacker.com/ 26 | - You can find me on Twitter [@TfTHacker](https://x.com/TfTHacker) 27 | -------------------------------------------------------------------------------- /Research/What is Spaced Repetition and How to use it.md: -------------------------------------------------------------------------------- 1 | 2 | > [!info] Summary: Spaced Repetition 3 | > 4 | Spaced repetition is a learning technique that involves spacing out the repetition of learning material over time. This method of learning has been shown to be highly effective for long-term retention and recall. - _generated by GPT-3_ 5 | 6 | # What is Spaced Repetition? 7 | Spaced repetition is a method of learning that involves gradually increasing the intervals between subsequent repetitions of learned material. This means that when you learn something new, you repeat it several times in a short period, then repeat it again after longer time gaps. The goal is to help your brain retain the information and assimilate it into your long-term memory. 8 | 9 | # How Does Spaced Repetition Work? 10 | The concept behind spaced repetition works on the principle that our brains remember things better when we recall them more frequently. 11 | 12 | When we learn something new, our brains encode it in our short-term memory. However, if we don't revisit the information, it will fade away from our memory quickly. 13 | 14 | By spacing out the repetition of learned material, we can move this information from our short-term memory to our long-term memory. Over time, the brain strengthens neural connections associated with the learned material. 15 | 16 | # How to Use Spaced Repetition Effectively? 17 | To use spaced repetition effectively, you need to make flashcards with important information or concepts. Flashcards are ideal because they are easy to carry around and review on-the-go. 18 | 19 | # Steps to follow when using spaced repetition: 20 | ## Step 1: Create Flashcards 21 | Create flashcards with questions or concepts on one side and answers on the other side. You can use online tools like Anki or Quizlet to create digital flashcards. 22 | 23 | ## Step 2: Review Flashcards Daily 24 | Review your flashcards daily and test yourself on each card until you can recall all the information correctly. 25 | 26 | ## Step 3: Space Out Your Reviews 27 | After reviewing your flashcards for a few days, start spacing out your reviews. Review the cards you struggled with the next day and then again in two days. After that, review them after a week, then two weeks, and so on. 28 | 29 | ## Step 4: Focus on Difficult Cards 30 | Focus more on the flashcards you struggle with and less on the ones you find easy. This will help you spend more time reinforcing the information that needs to be strengthened. 31 | 32 | 33 | # Examples of spaced repetition flashcards: 34 | 35 | ## Example: Biology Flashcard 36 | **Question**: What is photosynthesis? 37 | **Answer:** Photosynthesis is the process by 38 | 39 | ## Example History Flashcard 40 | **Question**: What famous ocean liner sank on its maiden voyage in 1912? 41 | **Answer**: The Titanic 42 | 43 | ## Example: Math Flashcard 44 | **Question**: What is the value of pi (rounded to two decimal places)? 45 | **Answer**: 3.14 46 | -------------------------------------------------------------------------------- /Work/Budget/Q1 2022.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Work/Budget/Q1 2022.md -------------------------------------------------------------------------------- /Work/Budget/Q2 2022.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Work/Budget/Q2 2022.md -------------------------------------------------------------------------------- /Work/Budget/Q3 2022.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Work/Budget/Q3 2022.md -------------------------------------------------------------------------------- /Work/Budget/Q4 2022.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/Work/Budget/Q4 2022.md -------------------------------------------------------------------------------- /Work/Personnel/Bill Hansen.md: -------------------------------------------------------------------------------- 1 | #personnelReview -------------------------------------------------------------------------------- /Work/Personnel/Brad Jefferson.md: -------------------------------------------------------------------------------- 1 | #personnelReview -------------------------------------------------------------------------------- /Work/Personnel/Olga Olson.md: -------------------------------------------------------------------------------- 1 | #personnelReview -------------------------------------------------------------------------------- /Work/Personnel/Sally Smith.md: -------------------------------------------------------------------------------- 1 | #personnelReview -------------------------------------------------------------------------------- /Work/Projects/Cloud backup.md: -------------------------------------------------------------------------------- 1 | #project -------------------------------------------------------------------------------- /Work/Projects/Firewall upgrades.md: -------------------------------------------------------------------------------- 1 | #project 2 | 3 | # Overview 4 | **Project Title:** Firewall Updates 5 | 6 | **Project Objective:** The objective of this project is to update the existing firewall system in order to enhance security, improve performance, and comply with industry standards. 7 | 8 | # Project Scope 9 | The scope of this project includes: 10 | 11 | 1. Conducting a thorough assessment of the current firewall system 12 | 2. Identifying the areas that need improvement 13 | 3. Developing a plan for implementing the updates 14 | 4. Implementing the updates 15 | 5. Testing the updated firewall system 16 | 6. Providing training to staff members on how to use the updated firewall system. 17 | 18 | # Project Plan 19 | 20 | 1. Assessment Phase (Duration: 2 weeks) 21 | - Identify all existing firewalls and their configurations 22 | - Review firewall logs and reports from previous months to identify any security incidents or issues with performance 23 | - Identify areas that require improvement 24 | - Analyze current industry standards and best practices 25 | 26 | 2. Planning Phase (Duration: 3 weeks) 27 | - Develop a plan for implementing updates based on assessment results 28 | - Coordinate with relevant stakeholders such as IT team, network team, and security team 29 | - Develop implementation schedule 30 | - Obtain necessary approvals 31 | 32 | 3. Implementation Phase (Duration: 6 weeks) 33 | - Install necessary software and hardware components for updating firewalls 34 | - Configure new firewall rules and policies based on industry standards and best practices 35 | - Test new rules with staff members before applying them across all systems 36 | - Update firmware for better performance 37 | 38 | 4. Testing Phase (Duration: 1 week) 39 | - Conduct testing on new firewall rules and policies 40 | - Monitor network traffic to ensure proper functioning of firewalls 41 | 42 | 5. Training Phase (Duration: 1 week) 43 | - Provide training sessions to staff members on how to use updated firewalls effectively and efficiently 44 | - Provide tips on how to identify potential threats or vulnerabilities within the system 45 | 46 | 6. Closing Phase (Duration: 1 week) 47 | - Evaluate project success by analyzing metrics such as improved security, better performance, reduced incidents, and increased user satisfaction 48 | - Obtain feedback from staff members on the updated firewall system 49 | - Document all updates and changes made to the firewall system 50 | - Close out project. 51 | 52 | # Project Timeline 53 | The estimated duration of this project is 13 weeks. 54 | 55 | # Project Budget 56 | The estimated budget for this project is $50,000. This includes costs for hardware, software, training sessions, and professional services. 57 | 58 | # Project Risks 59 | - Delays in implementation due to unforeseen issues with hardware or software components 60 | - Resistance from staff members who are not familiar with updated firewall rules and policies -------------------------------------------------------------------------------- /Work/Projects/IT Cybersecurity training.md: -------------------------------------------------------------------------------- 1 | #project -------------------------------------------------------------------------------- /images/Kitchen.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/images/Kitchen.jpeg -------------------------------------------------------------------------------- /images/Smores.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/images/Smores.jpeg -------------------------------------------------------------------------------- /images/Spicy popcorn.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/images/Spicy popcorn.jpeg -------------------------------------------------------------------------------- /images/YouTubeFromSergio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/images/YouTubeFromSergio.png -------------------------------------------------------------------------------- /images/dashboard-snapshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/images/dashboard-snapshot.png -------------------------------------------------------------------------------- /images/home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TfTHacker/DashboardPlusPlus/e202bb286cd92d7986407293c0a4a33789fef2bd/images/home.jpg -------------------------------------------------------------------------------- /Ω CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | # 2024-11-18 3 | - Added dim-support-files.css 4 | - Added vault-logo.css 5 | - Photo by [Kelly Sikkema](https://unsplash.com/@kellysikkema?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash) on [Unsplash](https://unsplash.com/photos/woman-holding-baby-beside-man-smiling-WvVyudMd1Es?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash) 6 | --------------------------------------------------------------------------------