├── .gitignore ├── .obsidian ├── app.json ├── appearance.json ├── canvas.json ├── community-plugins.json ├── core-plugins-migration.json ├── core-plugins.json ├── daily-notes.json ├── graph.json ├── hotkeys.json ├── plugins │ ├── calendar │ │ ├── data.json │ │ ├── main.js │ │ └── manifest.json │ ├── dataview │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── obsidian-auto-link-title │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── obsidian-git │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ ├── obsidian_askpass.sh │ │ └── styles.css │ ├── obsidian-hider │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── obsidian-minimal-settings │ │ ├── data.json │ │ ├── main.js │ │ └── manifest.json │ ├── obsidian-outliner │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ ├── obsidian-style-settings │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css │ └── templater-obsidian │ │ ├── data.json │ │ ├── main.js │ │ ├── manifest.json │ │ └── styles.css ├── themes │ └── Minimal │ │ ├── manifest.json │ │ └── theme.css └── workspaces.json ├── .vscode └── extensions.json ├── 00_templates ├── 01_diary.md ├── 02_note.md └── 10_current_time.md ├── 01_diary ├── 2024 │ └── 2024-09-16.md └── .gitkeep ├── 02_notes ├── 2024 │ └── SampleNote.md └── .gitkeep ├── 03_assets ├── 2024 │ └── sample │ │ ├── sample.drawio │ │ ├── sample.png │ │ └── sample.svg └── .gitkeep ├── 04_canvas ├── .gitkeep └── SampleCanvas.canvas ├── 05_dataview ├── 00_all_by_filename_asc.md ├── 00_all_by_updated_desc.md ├── 01_diary_by_filename_asc.md ├── 01_diary_by_updated_desc.md ├── 02_notes_by_filename_asc.md └── 02_notes_by_updated_desc.md ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # OR only to exclude workspace cache 2 | .obsidian/workspace.json 3 | .obsidian/workspace-mobile.json 4 | 5 | # Exclude Untitled Notes 6 | Untitled* 7 | 無題のファイル* 8 | # Exclude "bad" names 9 | null* 10 | 11 | # Add below lines to exclude OS settings and caches 12 | .trash/ 13 | .DS_Store 14 | -------------------------------------------------------------------------------- /.obsidian/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "alwaysUpdateLinks": true, 3 | "newFileLocation": "folder", 4 | "newFileFolderPath": "02_notes", 5 | "attachmentFolderPath": "03_assets" 6 | } -------------------------------------------------------------------------------- /.obsidian/appearance.json: -------------------------------------------------------------------------------- 1 | { 2 | "theme": "moonstone", 3 | "interfaceFontFamily": "M PLUS 1", 4 | "textFontFamily": "M PLUS 1", 5 | "monospaceFontFamily": "M PLUS 1 Code", 6 | "showViewHeader": false, 7 | "cssTheme": "Minimal", 8 | "accentColor": "#0050d1", 9 | "baseFontSizeAction": true, 10 | "baseFontSize": 17 11 | } -------------------------------------------------------------------------------- /.obsidian/canvas.json: -------------------------------------------------------------------------------- 1 | { 2 | "snapToObjects": true, 3 | "snapToGrid": true, 4 | "newFileLocation": "folder", 5 | "newFileFolderPath": "04_canvas" 6 | } -------------------------------------------------------------------------------- /.obsidian/community-plugins.json: -------------------------------------------------------------------------------- 1 | [ 2 | "templater-obsidian", 3 | "calendar", 4 | "obsidian-auto-link-title", 5 | "obsidian-hider", 6 | "obsidian-git", 7 | "dataview", 8 | "obsidian-outliner", 9 | "obsidian-minimal-settings", 10 | "obsidian-style-settings" 11 | ] -------------------------------------------------------------------------------- /.obsidian/core-plugins-migration.json: -------------------------------------------------------------------------------- 1 | { 2 | "file-explorer": true, 3 | "global-search": true, 4 | "switcher": true, 5 | "graph": true, 6 | "backlink": false, 7 | "canvas": true, 8 | "outgoing-link": true, 9 | "tag-pane": false, 10 | "properties": false, 11 | "page-preview": true, 12 | "daily-notes": true, 13 | "templates": false, 14 | "note-composer": false, 15 | "command-palette": true, 16 | "slash-command": false, 17 | "editor-status": true, 18 | "bookmarks": false, 19 | "markdown-importer": false, 20 | "zk-prefixer": false, 21 | "random-note": false, 22 | "outline": true, 23 | "word-count": false, 24 | "slides": false, 25 | "audio-recorder": false, 26 | "workspaces": true, 27 | "file-recovery": false, 28 | "publish": false, 29 | "sync": false 30 | } -------------------------------------------------------------------------------- /.obsidian/core-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "file-explorer": true, 3 | "global-search": true, 4 | "switcher": true, 5 | "graph": true, 6 | "backlink": true, 7 | "canvas": true, 8 | "outgoing-link": true, 9 | "tag-pane": false, 10 | "properties": false, 11 | "page-preview": true, 12 | "daily-notes": true, 13 | "templates": false, 14 | "note-composer": false, 15 | "command-palette": true, 16 | "slash-command": false, 17 | "editor-status": true, 18 | "bookmarks": false, 19 | "markdown-importer": false, 20 | "zk-prefixer": false, 21 | "random-note": false, 22 | "outline": true, 23 | "word-count": false, 24 | "slides": false, 25 | "audio-recorder": false, 26 | "workspaces": true, 27 | "file-recovery": false, 28 | "publish": false, 29 | "sync": false, 30 | "webviewer": false 31 | } -------------------------------------------------------------------------------- /.obsidian/daily-notes.json: -------------------------------------------------------------------------------- 1 | { 2 | "format": "YYYY/YYYY-MM-DD", 3 | "folder": "01_diary", 4 | "template": "00_templates/01_diary", 5 | "autorun": true 6 | } -------------------------------------------------------------------------------- /.obsidian/graph.json: -------------------------------------------------------------------------------- 1 | { 2 | "collapse-filter": false, 3 | "search": "", 4 | "showTags": false, 5 | "showAttachments": false, 6 | "hideUnresolved": false, 7 | "showOrphans": true, 8 | "collapse-color-groups": false, 9 | "colorGroups": [ 10 | { 11 | "query": "tag:#diary ", 12 | "color": { 13 | "a": 1, 14 | "rgb": 14048348 15 | } 16 | }, 17 | { 18 | "query": "tag:#note ", 19 | "color": { 20 | "a": 1, 21 | "rgb": 6065110 22 | } 23 | } 24 | ], 25 | "collapse-display": true, 26 | "showArrow": false, 27 | "textFadeMultiplier": 0, 28 | "nodeSizeMultiplier": 1, 29 | "lineSizeMultiplier": 1, 30 | "collapse-forces": true, 31 | "centerStrength": 0.518713248970312, 32 | "repelStrength": 10, 33 | "linkStrength": 1, 34 | "linkDistance": 250, 35 | "scale": 1.0000000000000018, 36 | "close": true 37 | } -------------------------------------------------------------------------------- /.obsidian/hotkeys.json: -------------------------------------------------------------------------------- 1 | { 2 | "templater-obsidian:00_templates/10_current_time.md": [ 3 | { 4 | "modifiers": [ 5 | "Alt" 6 | ], 7 | "key": "=" 8 | } 9 | ], 10 | "obsidian-outliner:move-list-item-down": [ 11 | { 12 | "modifiers": [ 13 | "Alt" 14 | ], 15 | "key": "ArrowDown" 16 | } 17 | ], 18 | "obsidian-outliner:move-list-item-up": [ 19 | { 20 | "modifiers": [ 21 | "Alt" 22 | ], 23 | "key": "ArrowUp" 24 | } 25 | ], 26 | "obsidian-git:backup-and-close": [ 27 | { 28 | "modifiers": [ 29 | "Mod" 30 | ], 31 | "key": "Q" 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /.obsidian/plugins/calendar/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "shouldConfirmBeforeCreate": true, 3 | "weekStart": "locale", 4 | "wordsPerDot": 250, 5 | "showWeeklyNote": false, 6 | "weeklyNoteFormat": "", 7 | "weeklyNoteTemplate": "", 8 | "weeklyNoteFolder": "", 9 | "localeOverride": "system-default" 10 | } -------------------------------------------------------------------------------- /.obsidian/plugins/calendar/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "calendar", 3 | "name": "Calendar", 4 | "description": "Calendar view of your daily notes", 5 | "version": "1.5.10", 6 | "author": "Liam Cain", 7 | "authorUrl": "https://github.com/liamcain/", 8 | "isDesktopOnly": false, 9 | "minAppVersion": "0.9.11" 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/plugins/dataview/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "renderNullAs": "\\-", 3 | "taskCompletionTracking": false, 4 | "taskCompletionUseEmojiShorthand": false, 5 | "taskCompletionText": "completion", 6 | "taskCompletionDateFormat": "yyyy-MM-dd", 7 | "recursiveSubTaskCompletion": false, 8 | "warnOnEmptyResult": true, 9 | "refreshEnabled": true, 10 | "refreshInterval": 2500, 11 | "defaultDateFormat": "yyyy-MM-dd", 12 | "defaultDateTimeFormat": "yyyy-MM-dd, HH:mm:ss", 13 | "maxRecursiveRenderDepth": 4, 14 | "tableIdColumnName": "File", 15 | "tableGroupColumnName": "Group", 16 | "showResultCount": true, 17 | "allowHtml": true, 18 | "inlineQueryPrefix": "=", 19 | "inlineJsQueryPrefix": "$=", 20 | "inlineQueriesInCodeblocks": true, 21 | "enableInlineDataview": true, 22 | "enableDataviewJs": false, 23 | "enableInlineDataviewJs": false, 24 | "prettyRenderInlineFields": true, 25 | "prettyRenderInlineFieldsInLivePreview": true, 26 | "dataviewJsKeyword": "dataviewjs" 27 | } -------------------------------------------------------------------------------- /.obsidian/plugins/dataview/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "dataview", 3 | "name": "Dataview", 4 | "version": "0.5.68", 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 | .block-language-dataview { 2 | overflow-y: auto; 3 | } 4 | 5 | /*****************/ 6 | /** Table Views **/ 7 | /*****************/ 8 | 9 | /* List View Default Styling; rendered internally as a table. */ 10 | .table-view-table { 11 | width: 100%; 12 | } 13 | 14 | .table-view-table > thead > tr, .table-view-table > tbody > tr { 15 | margin-top: 1em; 16 | margin-bottom: 1em; 17 | text-align: left; 18 | } 19 | 20 | .table-view-table > tbody > tr:hover { 21 | background-color: var(--table-row-background-hover); 22 | } 23 | 24 | .table-view-table > thead > tr > th { 25 | font-weight: 700; 26 | font-size: larger; 27 | border-top: none; 28 | border-left: none; 29 | border-right: none; 30 | border-bottom: solid; 31 | 32 | max-width: 100%; 33 | } 34 | 35 | .table-view-table > tbody > tr > td { 36 | text-align: left; 37 | border: none; 38 | font-weight: 400; 39 | max-width: 100%; 40 | } 41 | 42 | .table-view-table ul, .table-view-table ol { 43 | margin-block-start: 0.2em !important; 44 | margin-block-end: 0.2em !important; 45 | } 46 | 47 | /** Rendered value styling for any view. */ 48 | .dataview-result-list-root-ul { 49 | padding: 0em !important; 50 | margin: 0em !important; 51 | } 52 | 53 | .dataview-result-list-ul { 54 | margin-block-start: 0.2em !important; 55 | margin-block-end: 0.2em !important; 56 | } 57 | 58 | /** Generic grouping styling. */ 59 | .dataview.result-group { 60 | padding-left: 8px; 61 | } 62 | 63 | /*******************/ 64 | /** Inline Fields **/ 65 | /*******************/ 66 | 67 | .dataview.inline-field-key { 68 | padding-left: 8px; 69 | padding-right: 8px; 70 | font-family: var(--font-monospace); 71 | background-color: var(--background-primary-alt); 72 | color: var(--nav-item-color-selected); 73 | } 74 | 75 | .dataview.inline-field-value { 76 | padding-left: 8px; 77 | padding-right: 8px; 78 | font-family: var(--font-monospace); 79 | background-color: var(--background-secondary-alt); 80 | color: var(--nav-item-color-selected); 81 | } 82 | 83 | .dataview.inline-field-standalone-value { 84 | padding-left: 8px; 85 | padding-right: 8px; 86 | font-family: var(--font-monospace); 87 | background-color: var(--background-secondary-alt); 88 | color: var(--nav-item-color-selected); 89 | } 90 | 91 | /***************/ 92 | /** Task View **/ 93 | /***************/ 94 | 95 | .dataview.task-list-item, .dataview.task-list-basic-item { 96 | margin-top: 3px; 97 | margin-bottom: 3px; 98 | transition: 0.4s; 99 | } 100 | 101 | .dataview.task-list-item:hover, .dataview.task-list-basic-item:hover { 102 | background-color: var(--text-selection); 103 | box-shadow: -40px 0 0 var(--text-selection); 104 | cursor: pointer; 105 | } 106 | 107 | /*****************/ 108 | /** Error Views **/ 109 | /*****************/ 110 | 111 | div.dataview-error-box { 112 | width: 100%; 113 | min-height: 150px; 114 | display: flex; 115 | align-items: center; 116 | justify-content: center; 117 | border: 4px dashed var(--background-secondary); 118 | } 119 | 120 | .dataview-error-message { 121 | color: var(--text-muted); 122 | text-align: center; 123 | } 124 | 125 | /*************************/ 126 | /** Additional Metadata **/ 127 | /*************************/ 128 | 129 | .dataview.small-text { 130 | font-size: smaller; 131 | color: var(--text-muted); 132 | margin-left: 3px; 133 | } 134 | 135 | .dataview.small-text::before { 136 | content: "("; 137 | } 138 | 139 | .dataview.small-text::after { 140 | content: ")"; 141 | } 142 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-auto-link-title/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 | typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { 36 | var e = new Error(message); 37 | return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; 38 | }; 39 | 40 | const DEFAULT_SETTINGS = { 41 | regex: /^(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})$/i, 42 | lineRegex: /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/gi, 43 | linkRegex: /^\[([^\[\]]*)\]\((https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})\)$/i, 44 | linkLineRegex: /\[([^\[\]]*)\]\((https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})\)/gi, 45 | imageRegex: /\.(gif|jpe?g|tiff?|png|webp|bmp|tga|psd|ai)$/i, 46 | enhanceDefaultPaste: true, 47 | shouldPreserveSelectionAsTitle: false, 48 | enhanceDropEvents: true, 49 | websiteBlacklist: "", 50 | maximumTitleLength: 0, 51 | useNewScraper: false, 52 | linkPreviewApiKey: "", 53 | useBetterPasteId: false, 54 | }; 55 | class AutoLinkTitleSettingTab extends obsidian.PluginSettingTab { 56 | constructor(app, plugin) { 57 | super(app, plugin); 58 | this.plugin = plugin; 59 | } 60 | display() { 61 | let { containerEl } = this; 62 | containerEl.empty(); 63 | new obsidian.Setting(containerEl) 64 | .setName("Enhance Default Paste") 65 | .setDesc("Fetch the link title when pasting a link in the editor with the default paste command") 66 | .addToggle((val) => val 67 | .setValue(this.plugin.settings.enhanceDefaultPaste) 68 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 69 | console.log(value); 70 | this.plugin.settings.enhanceDefaultPaste = value; 71 | yield this.plugin.saveSettings(); 72 | }))); 73 | new obsidian.Setting(containerEl) 74 | .setName("Enhance Drop Events") 75 | .setDesc("Fetch the link title when drag and dropping a link from another program") 76 | .addToggle((val) => val 77 | .setValue(this.plugin.settings.enhanceDropEvents) 78 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 79 | console.log(value); 80 | this.plugin.settings.enhanceDropEvents = value; 81 | yield this.plugin.saveSettings(); 82 | }))); 83 | new obsidian.Setting(containerEl) 84 | .setName("Maximum title length") 85 | .setDesc("Set the maximum length of the title. Set to 0 to disable.") 86 | .addText((val) => val 87 | .setValue(this.plugin.settings.maximumTitleLength.toString(10)) 88 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 89 | const titleLength = Number(value); 90 | this.plugin.settings.maximumTitleLength = 91 | isNaN(titleLength) || titleLength < 0 ? 0 : titleLength; 92 | yield this.plugin.saveSettings(); 93 | }))); 94 | new obsidian.Setting(containerEl) 95 | .setName("Preserve selection as title") 96 | .setDesc("Whether to prefer selected text as title over fetched title when pasting") 97 | .addToggle((val) => val 98 | .setValue(this.plugin.settings.shouldPreserveSelectionAsTitle) 99 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 100 | console.log(value); 101 | this.plugin.settings.shouldPreserveSelectionAsTitle = value; 102 | yield this.plugin.saveSettings(); 103 | }))); 104 | new obsidian.Setting(containerEl) 105 | .setName("Website Blacklist") 106 | .setDesc("List of strings (comma separated) that disable autocompleting website titles. Can be URLs or arbitrary text.") 107 | .addTextArea((val) => val 108 | .setValue(this.plugin.settings.websiteBlacklist) 109 | .setPlaceholder("localhost, tiktok.com") 110 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 111 | this.plugin.settings.websiteBlacklist = value; 112 | yield this.plugin.saveSettings(); 113 | }))); 114 | new obsidian.Setting(containerEl) 115 | .setName("Use New Scraper") 116 | .setDesc("Use experimental new scraper, seems to work well on desktop but not mobile.") 117 | .addToggle((val) => val 118 | .setValue(this.plugin.settings.useNewScraper) 119 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 120 | console.log(value); 121 | this.plugin.settings.useNewScraper = value; 122 | yield this.plugin.saveSettings(); 123 | }))); 124 | new obsidian.Setting(containerEl) 125 | .setName("Use Better Fetching Placeholder") 126 | .setDesc("Use a more readable placeholder when fetching the title of a link.") 127 | .addToggle((val) => val 128 | .setValue(this.plugin.settings.useBetterPasteId) 129 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 130 | console.log(value); 131 | this.plugin.settings.useBetterPasteId = value; 132 | yield this.plugin.saveSettings(); 133 | }))); 134 | new obsidian.Setting(containerEl) 135 | .setName("LinkPreview API Key") 136 | .setDesc("API key for the LinkPreview.net service. Get one at https://my.linkpreview.net/access_keys") 137 | .addText((text) => text 138 | .setValue(this.plugin.settings.linkPreviewApiKey || "") 139 | .onChange((value) => __awaiter(this, void 0, void 0, function* () { 140 | const trimmedValue = value.trim(); 141 | if (trimmedValue.length > 0 && trimmedValue.length !== 32) { 142 | new obsidian.Notice("LinkPreview API key must be 32 characters long"); 143 | this.plugin.settings.linkPreviewApiKey = ""; 144 | } 145 | else { 146 | this.plugin.settings.linkPreviewApiKey = trimmedValue; 147 | } 148 | yield this.plugin.saveSettings(); 149 | }))); 150 | } 151 | } 152 | 153 | class CheckIf { 154 | static isMarkdownLinkAlready(editor) { 155 | let cursor = editor.getCursor(); 156 | // Check if the characters before the url are ]( to indicate a markdown link 157 | var titleEnd = editor.getRange({ ch: cursor.ch - 2, line: cursor.line }, { ch: cursor.ch, line: cursor.line }); 158 | return titleEnd == "]("; 159 | } 160 | static isAfterQuote(editor) { 161 | let cursor = editor.getCursor(); 162 | // Check if the characters before the url are " or ' to indicate we want the url directly 163 | // This is common in elements like 164 | var beforeChar = editor.getRange({ ch: cursor.ch - 1, line: cursor.line }, { ch: cursor.ch, line: cursor.line }); 165 | return beforeChar == "\"" || beforeChar == "'"; 166 | } 167 | static isUrl(text) { 168 | let urlRegex = new RegExp(DEFAULT_SETTINGS.regex); 169 | return urlRegex.test(text); 170 | } 171 | static isImage(text) { 172 | let imageRegex = new RegExp(DEFAULT_SETTINGS.imageRegex); 173 | return imageRegex.test(text); 174 | } 175 | static isLinkedUrl(text) { 176 | let urlRegex = new RegExp(DEFAULT_SETTINGS.linkRegex); 177 | return urlRegex.test(text); 178 | } 179 | } 180 | 181 | class EditorExtensions { 182 | static getSelectedText(editor) { 183 | if (!editor.somethingSelected()) { 184 | let wordBoundaries = this.getWordBoundaries(editor); 185 | editor.setSelection(wordBoundaries.start, wordBoundaries.end); 186 | } 187 | return editor.getSelection(); 188 | } 189 | static cursorWithinBoundaries(cursor, match) { 190 | let startIndex = match.index; 191 | let endIndex = match.index + match[0].length; 192 | return startIndex <= cursor.ch && cursor.ch <= endIndex; 193 | } 194 | static getWordBoundaries(editor) { 195 | let cursor = editor.getCursor(); 196 | // If its a normal URL token this is not a markdown link 197 | // In this case we can simply overwrite the link boundaries as-is 198 | let lineText = editor.getLine(cursor.line); 199 | // First check if we're in a link 200 | let linksInLine = lineText.matchAll(DEFAULT_SETTINGS.linkLineRegex); 201 | for (let match of linksInLine) { 202 | if (this.cursorWithinBoundaries(cursor, match)) { 203 | return { 204 | start: { line: cursor.line, ch: match.index }, 205 | end: { line: cursor.line, ch: match.index + match[0].length }, 206 | }; 207 | } 208 | } 209 | // If not, check if we're in just a standard ol' URL. 210 | let urlsInLine = lineText.matchAll(DEFAULT_SETTINGS.lineRegex); 211 | for (let match of urlsInLine) { 212 | if (this.cursorWithinBoundaries(cursor, match)) { 213 | return { 214 | start: { line: cursor.line, ch: match.index }, 215 | end: { line: cursor.line, ch: match.index + match[0].length }, 216 | }; 217 | } 218 | } 219 | return { 220 | start: cursor, 221 | end: cursor, 222 | }; 223 | } 224 | static getEditorPositionFromIndex(content, index) { 225 | let substr = content.substr(0, index); 226 | let l = 0; 227 | let offset = -1; 228 | let r = -1; 229 | for (; (r = substr.indexOf("\n", r + 1)) !== -1; l++, offset = r) 230 | ; 231 | offset += 1; 232 | let ch = content.substr(offset, index - offset).length; 233 | return { line: l, ch: ch }; 234 | } 235 | } 236 | 237 | function blank$1(text) { 238 | return text === undefined || text === null || text === ''; 239 | } 240 | function notBlank$1(text) { 241 | return !blank$1(text); 242 | } 243 | function scrape(url) { 244 | return __awaiter(this, void 0, void 0, function* () { 245 | try { 246 | const response = yield obsidian.requestUrl(url); 247 | if (!response.headers['content-type'].includes('text/html')) 248 | return getUrlFinalSegment$1(url); 249 | const html = response.text; 250 | const doc = new DOMParser().parseFromString(html, 'text/html'); 251 | const title = doc.querySelector('title'); 252 | if (blank$1(title === null || title === void 0 ? void 0 : title.innerText)) { 253 | // If site is javascript based and has a no-title attribute when unloaded, use it. 254 | var noTitle = title === null || title === void 0 ? void 0 : title.getAttr('no-title'); 255 | if (notBlank$1(noTitle)) { 256 | return noTitle; 257 | } 258 | // Otherwise if the site has no title/requires javascript simply return Title Unknown 259 | return url; 260 | } 261 | return title.innerText; 262 | } 263 | catch (ex) { 264 | console.error(ex); 265 | return ''; 266 | } 267 | }); 268 | } 269 | function getUrlFinalSegment$1(url) { 270 | try { 271 | const segments = new URL(url).pathname.split('/'); 272 | const last = segments.pop() || segments.pop(); // Handle potential trailing slash 273 | return last; 274 | } 275 | catch (_) { 276 | return 'File'; 277 | } 278 | } 279 | function getPageTitle$1(url) { 280 | return __awaiter(this, void 0, void 0, function* () { 281 | if (!(url.startsWith('http') || url.startsWith('https'))) { 282 | url = 'https://' + url; 283 | } 284 | return scrape(url); 285 | }); 286 | } 287 | 288 | const electronPkg = require("electron"); 289 | function blank(text) { 290 | return text === undefined || text === null || text === ""; 291 | } 292 | function notBlank(text) { 293 | return !blank(text); 294 | } 295 | // async wrapper to load a url and settle on load finish or fail 296 | function load(window, url) { 297 | return __awaiter(this, void 0, void 0, function* () { 298 | return new Promise((resolve, reject) => { 299 | window.webContents.on("did-finish-load", (event) => resolve(event)); 300 | window.webContents.on("did-fail-load", (event) => reject(event)); 301 | window.loadURL(url); 302 | }); 303 | }); 304 | } 305 | function electronGetPageTitle(url) { 306 | return __awaiter(this, void 0, void 0, function* () { 307 | const { remote } = electronPkg; 308 | const { BrowserWindow } = remote; 309 | try { 310 | const window = new BrowserWindow({ 311 | width: 1000, 312 | height: 600, 313 | webPreferences: { 314 | webSecurity: false, 315 | nodeIntegration: true, 316 | images: false, 317 | }, 318 | show: false, 319 | }); 320 | window.webContents.setAudioMuted(true); 321 | window.webContents.on("will-navigate", (event, newUrl) => { 322 | event.preventDefault(); 323 | window.loadURL(newUrl); 324 | }); 325 | yield load(window, url); 326 | try { 327 | const title = window.webContents.getTitle(); 328 | window.destroy(); 329 | if (notBlank(title)) { 330 | return title; 331 | } 332 | else { 333 | return url; 334 | } 335 | } 336 | catch (ex) { 337 | window.destroy(); 338 | return url; 339 | } 340 | } 341 | catch (ex) { 342 | console.error(ex); 343 | return ""; 344 | } 345 | }); 346 | } 347 | function nonElectronGetPageTitle(url) { 348 | return __awaiter(this, void 0, void 0, function* () { 349 | try { 350 | const html = yield obsidian.request({ url }); 351 | const doc = new DOMParser().parseFromString(html, "text/html"); 352 | const title = doc.querySelectorAll("title")[0]; 353 | if (title == null || blank(title === null || title === void 0 ? void 0 : title.innerText)) { 354 | // If site is javascript based and has a no-title attribute when unloaded, use it. 355 | var noTitle = title === null || title === void 0 ? void 0 : title.getAttr("no-title"); 356 | if (notBlank(noTitle)) { 357 | return noTitle; 358 | } 359 | // Otherwise if the site has no title/requires javascript simply return Title Unknown 360 | return url; 361 | } 362 | return title.innerText; 363 | } 364 | catch (ex) { 365 | console.error(ex); 366 | return ""; 367 | } 368 | }); 369 | } 370 | function getUrlFinalSegment(url) { 371 | try { 372 | const segments = new URL(url).pathname.split('/'); 373 | const last = segments.pop() || segments.pop(); // Handle potential trailing slash 374 | return last; 375 | } 376 | catch (_) { 377 | return "File"; 378 | } 379 | } 380 | function tryGetFileType(url) { 381 | return __awaiter(this, void 0, void 0, function* () { 382 | try { 383 | const response = yield fetch(url, { method: "HEAD" }); 384 | // Ensure site returns an ok status code before scraping 385 | if (!response.ok) { 386 | return "Site Unreachable"; 387 | } 388 | // Ensure site is an actual HTML page and not a pdf or 3 gigabyte video file. 389 | let contentType = response.headers.get("content-type"); 390 | if (!contentType.includes("text/html")) { 391 | return getUrlFinalSegment(url); 392 | } 393 | return null; 394 | } 395 | catch (err) { 396 | return null; 397 | } 398 | }); 399 | } 400 | function getPageTitle(url) { 401 | return __awaiter(this, void 0, void 0, function* () { 402 | // If we're on Desktop use the Electron scraper 403 | if (!(url.startsWith("http") || url.startsWith("https"))) { 404 | url = "https://" + url; 405 | } 406 | // Try to do a HEAD request to see if the site is reachable and if it's an HTML page 407 | // If we error out due to CORS, we'll just try to scrape the page anyway. 408 | let fileType = yield tryGetFileType(url); 409 | if (fileType) { 410 | return fileType; 411 | } 412 | if (electronPkg != null) { 413 | return electronGetPageTitle(url); 414 | } 415 | else { 416 | return nonElectronGetPageTitle(url); 417 | } 418 | }); 419 | } 420 | 421 | class AutoLinkTitle extends obsidian.Plugin { 422 | constructor() { 423 | super(...arguments); 424 | this.shortTitle = (title) => { 425 | if (this.settings.maximumTitleLength === 0) { 426 | return title; 427 | } 428 | if (title.length < this.settings.maximumTitleLength + 3) { 429 | return title; 430 | } 431 | const shortenedTitle = `${title.slice(0, this.settings.maximumTitleLength)}...`; 432 | return shortenedTitle; 433 | }; 434 | } 435 | onload() { 436 | return __awaiter(this, void 0, void 0, function* () { 437 | console.log("loading obsidian-auto-link-title"); 438 | yield this.loadSettings(); 439 | this.blacklist = this.settings.websiteBlacklist 440 | .split(",") 441 | .map((s) => s.trim()) 442 | .filter((s) => s.length > 0); 443 | // Listen to paste event 444 | this.pasteFunction = this.pasteUrlWithTitle.bind(this); 445 | // Listen to drop event 446 | this.dropFunction = this.dropUrlWithTitle.bind(this); 447 | this.addCommand({ 448 | id: "auto-link-title-paste", 449 | name: "Paste URL and auto fetch title", 450 | editorCallback: (editor) => this.manualPasteUrlWithTitle(editor), 451 | hotkeys: [], 452 | }); 453 | this.addCommand({ 454 | id: "auto-link-title-normal-paste", 455 | name: "Normal paste (no fetching behavior)", 456 | editorCallback: (editor) => this.normalPaste(editor), 457 | hotkeys: [ 458 | { 459 | modifiers: ["Mod", "Shift"], 460 | key: "v", 461 | }, 462 | ], 463 | }); 464 | this.registerEvent(this.app.workspace.on("editor-paste", this.pasteFunction)); 465 | this.registerEvent(this.app.workspace.on("editor-drop", this.dropFunction)); 466 | this.addCommand({ 467 | id: "enhance-url-with-title", 468 | name: "Enhance existing URL with link and title", 469 | editorCallback: (editor) => this.addTitleToLink(editor), 470 | hotkeys: [ 471 | { 472 | modifiers: ["Mod", "Shift"], 473 | key: "e", 474 | }, 475 | ], 476 | }); 477 | this.addSettingTab(new AutoLinkTitleSettingTab(this.app, this)); 478 | }); 479 | } 480 | addTitleToLink(editor) { 481 | // Only attempt fetch if online 482 | if (!navigator.onLine) 483 | return; 484 | let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim(); 485 | // If the cursor is on a raw html link, convert to a markdown link and fetch title 486 | if (CheckIf.isUrl(selectedText)) { 487 | this.convertUrlToTitledLink(editor, selectedText); 488 | } 489 | // If the cursor is on the URL part of a markdown link, fetch title and replace existing link title 490 | else if (CheckIf.isLinkedUrl(selectedText)) { 491 | const link = this.getUrlFromLink(selectedText); 492 | this.convertUrlToTitledLink(editor, link); 493 | } 494 | } 495 | normalPaste(editor) { 496 | return __awaiter(this, void 0, void 0, function* () { 497 | let clipboardText = yield navigator.clipboard.readText(); 498 | if (clipboardText === null || clipboardText === "") 499 | return; 500 | editor.replaceSelection(clipboardText); 501 | }); 502 | } 503 | // Simulate standard paste but using editor.replaceSelection with clipboard text since we can't seem to dispatch a paste event. 504 | manualPasteUrlWithTitle(editor) { 505 | return __awaiter(this, void 0, void 0, function* () { 506 | const clipboardText = yield navigator.clipboard.readText(); 507 | // Only attempt fetch if online 508 | if (!navigator.onLine) { 509 | editor.replaceSelection(clipboardText); 510 | return; 511 | } 512 | if (clipboardText == null || clipboardText == "") 513 | return; 514 | // If its not a URL, we return false to allow the default paste handler to take care of it. 515 | // Similarly, image urls don't have a meaningful attribute so downloading it 516 | // to fetch the title is a waste of bandwidth. 517 | if (!CheckIf.isUrl(clipboardText) || CheckIf.isImage(clipboardText)) { 518 | editor.replaceSelection(clipboardText); 519 | return; 520 | } 521 | // If it looks like we're pasting the url into a markdown link already, don't fetch title 522 | // as the user has already probably put a meaningful title, also it would lead to the title 523 | // being inside the link. 524 | if (CheckIf.isMarkdownLinkAlready(editor) || CheckIf.isAfterQuote(editor)) { 525 | editor.replaceSelection(clipboardText); 526 | return; 527 | } 528 | // If url is pasted over selected text and setting is enabled, no need to fetch title, 529 | // just insert a link 530 | let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim(); 531 | if (selectedText && this.settings.shouldPreserveSelectionAsTitle) { 532 | editor.replaceSelection(`[${selectedText}](${clipboardText})`); 533 | return; 534 | } 535 | // At this point we're just pasting a link in a normal fashion, fetch its title. 536 | this.convertUrlToTitledLink(editor, clipboardText); 537 | return; 538 | }); 539 | } 540 | pasteUrlWithTitle(clipboard, editor) { 541 | return __awaiter(this, void 0, void 0, function* () { 542 | if (!this.settings.enhanceDefaultPaste) { 543 | return; 544 | } 545 | if (clipboard.defaultPrevented) 546 | return; 547 | // Only attempt fetch if online 548 | if (!navigator.onLine) 549 | return; 550 | let clipboardText = clipboard.clipboardData.getData("text/plain"); 551 | if (clipboardText === null || clipboardText === "") 552 | return; 553 | // If its not a URL, we return false to allow the default paste handler to take care of it. 554 | // Similarly, image urls don't have a meaningful <title> attribute so downloading it 555 | // to fetch the title is a waste of bandwidth. 556 | if (!CheckIf.isUrl(clipboardText) || CheckIf.isImage(clipboardText)) { 557 | return; 558 | } 559 | // We've decided to handle the paste, stop propagation to the default handler. 560 | clipboard.stopPropagation(); 561 | clipboard.preventDefault(); 562 | // If it looks like we're pasting the url into a markdown link already, don't fetch title 563 | // as the user has already probably put a meaningful title, also it would lead to the title 564 | // being inside the link. 565 | if (CheckIf.isMarkdownLinkAlready(editor) || CheckIf.isAfterQuote(editor)) { 566 | editor.replaceSelection(clipboardText); 567 | return; 568 | } 569 | // If url is pasted over selected text and setting is enabled, no need to fetch title, 570 | // just insert a link 571 | let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim(); 572 | if (selectedText && this.settings.shouldPreserveSelectionAsTitle) { 573 | editor.replaceSelection(`[${selectedText}](${clipboardText})`); 574 | return; 575 | } 576 | // At this point we're just pasting a link in a normal fashion, fetch its title. 577 | this.convertUrlToTitledLink(editor, clipboardText); 578 | return; 579 | }); 580 | } 581 | dropUrlWithTitle(dropEvent, editor) { 582 | return __awaiter(this, void 0, void 0, function* () { 583 | if (!this.settings.enhanceDropEvents) { 584 | return; 585 | } 586 | if (dropEvent.defaultPrevented) 587 | return; 588 | // Only attempt fetch if online 589 | if (!navigator.onLine) 590 | return; 591 | let dropText = dropEvent.dataTransfer.getData("text/plain"); 592 | if (dropText === null || dropText === "") 593 | return; 594 | // If its not a URL, we return false to allow the default paste handler to take care of it. 595 | // Similarly, image urls don't have a meaningful <title> attribute so downloading it 596 | // to fetch the title is a waste of bandwidth. 597 | if (!CheckIf.isUrl(dropText) || CheckIf.isImage(dropText)) { 598 | return; 599 | } 600 | // We've decided to handle the paste, stop propagation to the default handler. 601 | dropEvent.stopPropagation(); 602 | dropEvent.preventDefault(); 603 | // If it looks like we're pasting the url into a markdown link already, don't fetch title 604 | // as the user has already probably put a meaningful title, also it would lead to the title 605 | // being inside the link. 606 | if (CheckIf.isMarkdownLinkAlready(editor) || CheckIf.isAfterQuote(editor)) { 607 | editor.replaceSelection(dropText); 608 | return; 609 | } 610 | // If url is pasted over selected text and setting is enabled, no need to fetch title, 611 | // just insert a link 612 | let selectedText = (EditorExtensions.getSelectedText(editor) || "").trim(); 613 | if (selectedText && this.settings.shouldPreserveSelectionAsTitle) { 614 | editor.replaceSelection(`[${selectedText}](${dropText})`); 615 | return; 616 | } 617 | // At this point we're just pasting a link in a normal fashion, fetch its title. 618 | this.convertUrlToTitledLink(editor, dropText); 619 | return; 620 | }); 621 | } 622 | isBlacklisted(url) { 623 | return __awaiter(this, void 0, void 0, function* () { 624 | yield this.loadSettings(); 625 | this.blacklist = this.settings.websiteBlacklist 626 | .split(/,|\n/) 627 | .map((s) => s.trim()) 628 | .filter((s) => s.length > 0); 629 | return this.blacklist.some((site) => url.includes(site)); 630 | }); 631 | } 632 | convertUrlToTitledLink(editor, url) { 633 | return __awaiter(this, void 0, void 0, function* () { 634 | if (yield this.isBlacklisted(url)) { 635 | let domain = new URL(url).hostname; 636 | editor.replaceSelection(`[${domain}](${url})`); 637 | return; 638 | } 639 | // Generate a unique id for find/replace operations for the title. 640 | const pasteId = this.getPasteId(); 641 | // Instantly paste so you don't wonder if paste is broken 642 | editor.replaceSelection(`[${pasteId}](${url})`); 643 | // Fetch title from site, replace Fetching Title with actual title 644 | const title = yield this.fetchUrlTitle(url); 645 | const escapedTitle = this.escapeMarkdown(title); 646 | const shortenedTitle = this.shortTitle(escapedTitle); 647 | const text = editor.getValue(); 648 | const start = text.indexOf(pasteId); 649 | if (start < 0) { 650 | console.log(`Unable to find text "${pasteId}" in current editor, bailing out; link ${url}`); 651 | } 652 | else { 653 | const end = start + pasteId.length; 654 | const startPos = EditorExtensions.getEditorPositionFromIndex(text, start); 655 | const endPos = EditorExtensions.getEditorPositionFromIndex(text, end); 656 | editor.replaceRange(shortenedTitle, startPos, endPos); 657 | } 658 | }); 659 | } 660 | escapeMarkdown(text) { 661 | var unescaped = text.replace(/\\(\*|_|`|~|\\|\[|\])/g, "$1"); // unescape any "backslashed" character 662 | var escaped = unescaped.replace(/(\*|_|`|<|>|~|\\|\[|\])/g, "\\$1"); // escape *, _, `, ~, \, [, ], <, and > 663 | var escaped = unescaped.replace(/(\*|_|`|\||<|>|~|\\|\[|\])/g, "\\$1"); // escape *, _, `, ~, \, |, [, ], <, and > 664 | return escaped; 665 | } 666 | fetchUrlTitleViaLinkPreview(url) { 667 | return __awaiter(this, void 0, void 0, function* () { 668 | if (this.settings.linkPreviewApiKey.length !== 32) { 669 | console.error("LinkPreview API key is not 32 characters long, please check your settings"); 670 | return ""; 671 | } 672 | try { 673 | const apiEndpoint = `https://api.linkpreview.net/?q=${encodeURIComponent(url)}`; 674 | const response = yield fetch(apiEndpoint, { 675 | headers: { 676 | "X-Linkpreview-Api-Key": this.settings.linkPreviewApiKey, 677 | }, 678 | }); 679 | const data = yield response.json(); 680 | return data.title; 681 | } 682 | catch (error) { 683 | console.error(error); 684 | return ""; 685 | } 686 | }); 687 | } 688 | fetchUrlTitle(url) { 689 | return __awaiter(this, void 0, void 0, function* () { 690 | try { 691 | let title = ""; 692 | title = yield this.fetchUrlTitleViaLinkPreview(url); 693 | console.log(`Title via Link Preview: ${title}`); 694 | if (title === "") { 695 | console.log("Title via Link Preview failed, falling back to scraper"); 696 | if (this.settings.useNewScraper) { 697 | console.log("Using new scraper"); 698 | title = yield getPageTitle$1(url); 699 | } 700 | else { 701 | console.log("Using old scraper"); 702 | title = yield getPageTitle(url); 703 | } 704 | } 705 | console.log(`Title: ${title}`); 706 | title = 707 | title.replace(/(\r\n|\n|\r)/gm, "").trim() || 708 | "Title Unavailable | Site Unreachable"; 709 | return title; 710 | } 711 | catch (error) { 712 | console.error(error); 713 | return "Error fetching title"; 714 | } 715 | }); 716 | } 717 | getUrlFromLink(link) { 718 | let urlRegex = new RegExp(DEFAULT_SETTINGS.linkRegex); 719 | return urlRegex.exec(link)[2]; 720 | } 721 | getPasteId() { 722 | var base = "Fetching Title"; 723 | if (this.settings.useBetterPasteId) { 724 | return this.getBetterPasteId(base); 725 | } 726 | else { 727 | return `${base}#${this.createBlockHash()}`; 728 | } 729 | } 730 | getBetterPasteId(base) { 731 | // After every character, add 0, 1 or 2 invisible characters 732 | // so that to the user it looks just like the base string. 733 | // The number of combinations is 3^14 = 4782969 734 | let result = ""; 735 | var invisibleCharacter = "\u200B"; 736 | var maxInvisibleCharacters = 2; 737 | for (var i = 0; i < base.length; i++) { 738 | var count = Math.floor(Math.random() * (maxInvisibleCharacters + 1)); 739 | result += base.charAt(i) + invisibleCharacter.repeat(count); 740 | } 741 | return result; 742 | } 743 | // Custom hashid by @shabegom 744 | createBlockHash() { 745 | let result = ""; 746 | var characters = "abcdefghijklmnopqrstuvwxyz0123456789"; 747 | var charactersLength = characters.length; 748 | for (var i = 0; i < 4; i++) { 749 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 750 | } 751 | return result; 752 | } 753 | onunload() { 754 | console.log("unloading obsidian-auto-link-title"); 755 | } 756 | loadSettings() { 757 | return __awaiter(this, void 0, void 0, function* () { 758 | this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); 759 | }); 760 | } 761 | saveSettings() { 762 | return __awaiter(this, void 0, void 0, function* () { 763 | yield this.saveData(this.settings); 764 | }); 765 | } 766 | } 767 | 768 | module.exports = AutoLinkTitle; 769 | 770 | 771 | /* nosourcemap */ -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-auto-link-title/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-auto-link-title", 3 | "name": "Auto Link Title", 4 | "version": "1.5.5", 5 | "minAppVersion": "0.12.17", 6 | "description": "This plugin automatically fetches the titles of links from the web", 7 | "author": "Matt Furden", 8 | "authorUrl": "https://github.com/zolrath", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-auto-link-title/styles.css: -------------------------------------------------------------------------------- 1 | /* no styles */ -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-git/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "commitMessage": "vault backup: {{date}}", 3 | "commitDateFormat": "YYYY-MM-DD HH:mm:ss", 4 | "autoSaveInterval": 0, 5 | "autoPushInterval": 20, 6 | "autoPullInterval": 60, 7 | "autoPullOnBoot": true, 8 | "disablePush": false, 9 | "pullBeforePush": true, 10 | "disablePopups": false, 11 | "disablePopupsForNoChanges": false, 12 | "listChangedFilesInMessageBody": true, 13 | "showStatusBar": true, 14 | "updateSubmodules": false, 15 | "syncMethod": "merge", 16 | "customMessageOnAutoBackup": false, 17 | "autoBackupAfterFileChange": false, 18 | "treeStructure": true, 19 | "refreshSourceControl": true, 20 | "basePath": "", 21 | "differentIntervalCommitAndPush": true, 22 | "changedFilesInStatusBar": false, 23 | "showedMobileNotice": true, 24 | "refreshSourceControlTimer": 7000, 25 | "showBranchStatusBar": true, 26 | "setLastSaveToLastCommit": false, 27 | "submoduleRecurseCheckout": false, 28 | "gitDir": "", 29 | "showFileMenu": true, 30 | "authorInHistoryView": "hide", 31 | "dateInHistoryView": false, 32 | "lineAuthor": { 33 | "show": false, 34 | "followMovement": "inactive", 35 | "authorDisplay": "initials", 36 | "showCommitHash": false, 37 | "dateTimeFormatOptions": "date", 38 | "dateTimeFormatCustomString": "YYYY-MM-DD HH:mm", 39 | "dateTimeTimezone": "viewer-local", 40 | "coloringMaxAge": "1y", 41 | "colorNew": { 42 | "r": 255, 43 | "g": 150, 44 | "b": 150 45 | }, 46 | "colorOld": { 47 | "r": 120, 48 | "g": 160, 49 | "b": 255 50 | }, 51 | "textColorCss": "var(--text-muted)", 52 | "ignoreWhitespace": false, 53 | "gutterSpacingFallbackLength": 5, 54 | "lastShownAuthorDisplay": "initials", 55 | "lastShownDateTimeFormatOptions": "date" 56 | }, 57 | "autoCommitMessage": "vault backup: {{date}}" 58 | } -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-git/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Vinzent", 3 | "authorUrl": "https://github.com/Vinzent03", 4 | "id": "obsidian-git", 5 | "name": "Git", 6 | "description": "Integrate Git version control with automatic backup and other advanced features.", 7 | "isDesktopOnly": false, 8 | "fundingUrl": "https://ko-fi.com/vinzent", 9 | "version": "2.33.0" 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-git/obsidian_askpass.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | PROMPT="$1" 4 | TEMP_FILE="$OBSIDIAN_GIT_CREDENTIALS_INPUT" 5 | 6 | cleanup() { 7 | rm -f "$TEMP_FILE" "$TEMP_FILE.response" 8 | } 9 | trap cleanup EXIT 10 | 11 | echo "$PROMPT" > "$TEMP_FILE" 12 | 13 | while [ ! -e "$TEMP_FILE.response" ]; do 14 | if [ ! -e "$TEMP_FILE" ]; then 15 | echo "Trigger file got removed: Abort" >&2 16 | exit 1 17 | fi 18 | sleep 0.1 19 | done 20 | 21 | RESPONSE=$(cat "$TEMP_FILE.response") 22 | 23 | echo "$RESPONSE" 24 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-git/styles.css: -------------------------------------------------------------------------------- 1 | @keyframes loading { 2 | 0% { 3 | transform: rotate(0deg); 4 | } 5 | 6 | 100% { 7 | transform: rotate(360deg); 8 | } 9 | } 10 | 11 | .workspace-leaf-content[data-type="git-view"] .button-border { 12 | border: 2px solid var(--interactive-accent); 13 | border-radius: var(--radius-s); 14 | } 15 | 16 | .workspace-leaf-content[data-type="git-view"] .view-content { 17 | padding: 0; 18 | } 19 | 20 | .workspace-leaf-content[data-type="git-history-view"] .view-content { 21 | padding: 0; 22 | } 23 | 24 | .loading > svg { 25 | animation: 2s linear infinite loading; 26 | transform-origin: 50% 50%; 27 | display: inline-block; 28 | } 29 | 30 | .obsidian-git-center { 31 | margin: auto; 32 | text-align: center; 33 | width: 50%; 34 | } 35 | 36 | .obsidian-git-textarea { 37 | display: block; 38 | margin-left: auto; 39 | margin-right: auto; 40 | } 41 | 42 | .obsidian-git-disabled { 43 | opacity: 0.5; 44 | } 45 | 46 | .obsidian-git-center-button { 47 | display: block; 48 | margin: 20px auto; 49 | } 50 | 51 | .tooltip.mod-left { 52 | overflow-wrap: break-word; 53 | } 54 | 55 | .tooltip.mod-right { 56 | overflow-wrap: break-word; 57 | } 58 | .git-tools { 59 | display: flex; 60 | margin-left: auto; 61 | } 62 | .git-tools .type { 63 | padding-left: var(--size-2-1); 64 | display: flex; 65 | align-items: center; 66 | justify-content: center; 67 | width: 11px; 68 | } 69 | 70 | .git-tools .type[data-type="M"] { 71 | color: orange; 72 | } 73 | .git-tools .type[data-type="D"] { 74 | color: red; 75 | } 76 | .git-tools .buttons { 77 | display: flex; 78 | } 79 | .git-tools .buttons > * { 80 | padding: 0 0; 81 | height: auto; 82 | } 83 | 84 | .is-active .git-tools .buttons > * { 85 | color: var(--nav-item-color-active); 86 | } 87 | 88 | .git-author { 89 | color: var(--text-accent); 90 | } 91 | 92 | .git-date { 93 | color: var(--text-accent); 94 | } 95 | 96 | .git-ref { 97 | color: var(--text-accent); 98 | } 99 | 100 | .workspace-leaf-content[data-type="diff-view"] .d2h-d-none { 101 | display: none; 102 | } 103 | 104 | .workspace-leaf-content[data-type="diff-view"] .d2h-wrapper { 105 | text-align: left; 106 | } 107 | 108 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-header { 109 | background-color: var(--background-primary); 110 | border-bottom: 1px solid var(--interactive-accent); 111 | font-family: var(--font-monospace); 112 | height: 35px; 113 | padding: 5px 10px; 114 | } 115 | 116 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-header, 117 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-stats { 118 | display: -webkit-box; 119 | display: -ms-flexbox; 120 | display: flex; 121 | } 122 | 123 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-stats { 124 | font-size: 14px; 125 | margin-left: auto; 126 | } 127 | 128 | .workspace-leaf-content[data-type="diff-view"] .d2h-lines-added { 129 | border: 1px solid #b4e2b4; 130 | border-radius: 5px 0 0 5px; 131 | color: #399839; 132 | padding: 2px; 133 | text-align: right; 134 | vertical-align: middle; 135 | } 136 | 137 | .workspace-leaf-content[data-type="diff-view"] .d2h-lines-deleted { 138 | border: 1px solid #e9aeae; 139 | border-radius: 0 5px 5px 0; 140 | color: #c33; 141 | margin-left: 1px; 142 | padding: 2px; 143 | text-align: left; 144 | vertical-align: middle; 145 | } 146 | 147 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-name-wrapper { 148 | -webkit-box-align: center; 149 | -ms-flex-align: center; 150 | align-items: center; 151 | display: -webkit-box; 152 | display: -ms-flexbox; 153 | display: flex; 154 | font-size: 15px; 155 | width: 100%; 156 | } 157 | 158 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-name { 159 | overflow-x: hidden; 160 | text-overflow: ellipsis; 161 | white-space: nowrap; 162 | } 163 | 164 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-wrapper { 165 | border: 1px solid var(--background-modifier-border); 166 | border-radius: 3px; 167 | margin-bottom: 1em; 168 | } 169 | 170 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse { 171 | -webkit-box-pack: end; 172 | -ms-flex-pack: end; 173 | -webkit-box-align: center; 174 | -ms-flex-align: center; 175 | align-items: center; 176 | border: 1px solid var(--background-modifier-border); 177 | border-radius: 3px; 178 | cursor: pointer; 179 | display: none; 180 | font-size: 12px; 181 | justify-content: flex-end; 182 | padding: 4px 8px; 183 | } 184 | 185 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse.d2h-selected { 186 | background-color: #c8e1ff; 187 | } 188 | 189 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse-input { 190 | margin: 0 4px 0 0; 191 | } 192 | 193 | .workspace-leaf-content[data-type="diff-view"] .d2h-diff-table { 194 | border-collapse: collapse; 195 | font-family: Menlo, Consolas, monospace; 196 | font-size: 13px; 197 | width: 100%; 198 | } 199 | 200 | .workspace-leaf-content[data-type="diff-view"] .d2h-files-diff { 201 | width: 100%; 202 | } 203 | 204 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-diff { 205 | overflow-y: hidden; 206 | } 207 | 208 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-side-diff { 209 | display: inline-block; 210 | margin-bottom: -8px; 211 | margin-right: -4px; 212 | overflow-x: scroll; 213 | overflow-y: hidden; 214 | width: 50%; 215 | } 216 | 217 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-line { 218 | padding: 0 8em; 219 | } 220 | 221 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-line, 222 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line { 223 | display: inline-block; 224 | -webkit-user-select: none; 225 | -moz-user-select: none; 226 | -ms-user-select: none; 227 | user-select: none; 228 | white-space: nowrap; 229 | width: 100%; 230 | } 231 | 232 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line { 233 | padding: 0 4.5em; 234 | } 235 | 236 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-line-ctn { 237 | word-wrap: normal; 238 | background: none; 239 | display: inline-block; 240 | padding: 0; 241 | -webkit-user-select: text; 242 | -moz-user-select: text; 243 | -ms-user-select: text; 244 | user-select: text; 245 | vertical-align: middle; 246 | white-space: pre; 247 | width: 100%; 248 | } 249 | 250 | .theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del, 251 | .theme-light 252 | .workspace-leaf-content[data-type="diff-view"] 253 | .d2h-code-side-line 254 | del { 255 | background-color: #ffb6ba; 256 | } 257 | 258 | .theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del, 259 | .theme-dark 260 | .workspace-leaf-content[data-type="diff-view"] 261 | .d2h-code-side-line 262 | del { 263 | background-color: #8d232881; 264 | } 265 | 266 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del, 267 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins, 268 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line del, 269 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line ins { 270 | border-radius: 0.2em; 271 | display: inline-block; 272 | margin-top: -1px; 273 | text-decoration: none; 274 | vertical-align: middle; 275 | } 276 | 277 | .theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins, 278 | .theme-light 279 | .workspace-leaf-content[data-type="diff-view"] 280 | .d2h-code-side-line 281 | ins { 282 | background-color: #97f295; 283 | text-align: left; 284 | } 285 | 286 | .theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins, 287 | .theme-dark 288 | .workspace-leaf-content[data-type="diff-view"] 289 | .d2h-code-side-line 290 | ins { 291 | background-color: #1d921996; 292 | text-align: left; 293 | } 294 | 295 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix { 296 | word-wrap: normal; 297 | background: none; 298 | display: inline; 299 | padding: 0; 300 | white-space: pre; 301 | } 302 | 303 | .workspace-leaf-content[data-type="diff-view"] .line-num1 { 304 | float: left; 305 | } 306 | 307 | .workspace-leaf-content[data-type="diff-view"] .line-num1, 308 | .workspace-leaf-content[data-type="diff-view"] .line-num2 { 309 | -webkit-box-sizing: border-box; 310 | box-sizing: border-box; 311 | overflow: hidden; 312 | padding: 0 0.5em; 313 | text-overflow: ellipsis; 314 | width: 3.5em; 315 | } 316 | 317 | .workspace-leaf-content[data-type="diff-view"] .line-num2 { 318 | float: right; 319 | } 320 | 321 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber { 322 | background-color: var(--background-primary); 323 | border: solid var(--background-modifier-border); 324 | border-width: 0 1px; 325 | -webkit-box-sizing: border-box; 326 | box-sizing: border-box; 327 | color: var(--text-muted); 328 | cursor: pointer; 329 | display: inline-block; 330 | position: absolute; 331 | text-align: right; 332 | width: 7.5em; 333 | } 334 | 335 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber:after { 336 | content: "\200b"; 337 | } 338 | 339 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber { 340 | background-color: var(--background-primary); 341 | border: solid var(--background-modifier-border); 342 | border-width: 0 1px; 343 | -webkit-box-sizing: border-box; 344 | box-sizing: border-box; 345 | color: var(--text-muted); 346 | cursor: pointer; 347 | display: inline-block; 348 | overflow: hidden; 349 | padding: 0 0.5em; 350 | position: absolute; 351 | text-align: right; 352 | text-overflow: ellipsis; 353 | width: 4em; 354 | } 355 | 356 | .workspace-leaf-content[data-type="diff-view"] .d2h-diff-tbody tr { 357 | position: relative; 358 | } 359 | 360 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber:after { 361 | content: "\200b"; 362 | } 363 | 364 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-emptyplaceholder, 365 | .workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder { 366 | background-color: var(--background-primary); 367 | border-color: var(--background-modifier-border); 368 | } 369 | 370 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix, 371 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber, 372 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber, 373 | .workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder { 374 | -webkit-user-select: none; 375 | -moz-user-select: none; 376 | -ms-user-select: none; 377 | user-select: none; 378 | } 379 | 380 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber, 381 | .workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber { 382 | direction: rtl; 383 | } 384 | 385 | .theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-del { 386 | background-color: #fee8e9; 387 | border-color: #e9aeae; 388 | } 389 | 390 | .theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-ins { 391 | background-color: #dfd; 392 | border-color: #b4e2b4; 393 | } 394 | 395 | .theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-del { 396 | background-color: #521b1d83; 397 | border-color: #691d1d73; 398 | } 399 | 400 | .theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-ins { 401 | background-color: rgba(30, 71, 30, 0.5); 402 | border-color: #13501381; 403 | } 404 | 405 | .workspace-leaf-content[data-type="diff-view"] .d2h-info { 406 | background-color: var(--background-primary); 407 | border-color: var(--background-modifier-border); 408 | color: var(--text-normal); 409 | } 410 | 411 | .theme-light 412 | .workspace-leaf-content[data-type="diff-view"] 413 | .d2h-file-diff 414 | .d2h-del.d2h-change { 415 | background-color: #fdf2d0; 416 | } 417 | 418 | .theme-dark 419 | .workspace-leaf-content[data-type="diff-view"] 420 | .d2h-file-diff 421 | .d2h-del.d2h-change { 422 | background-color: #55492480; 423 | } 424 | 425 | .theme-light 426 | .workspace-leaf-content[data-type="diff-view"] 427 | .d2h-file-diff 428 | .d2h-ins.d2h-change { 429 | background-color: #ded; 430 | } 431 | 432 | .theme-dark 433 | .workspace-leaf-content[data-type="diff-view"] 434 | .d2h-file-diff 435 | .d2h-ins.d2h-change { 436 | background-color: rgba(37, 78, 37, 0.418); 437 | } 438 | 439 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper { 440 | margin-bottom: 10px; 441 | } 442 | 443 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper a { 444 | color: #3572b0; 445 | text-decoration: none; 446 | } 447 | 448 | .workspace-leaf-content[data-type="diff-view"] 449 | .d2h-file-list-wrapper 450 | a:visited { 451 | color: #3572b0; 452 | } 453 | 454 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list-header { 455 | text-align: left; 456 | } 457 | 458 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list-title { 459 | font-weight: 700; 460 | } 461 | 462 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list-line { 463 | display: -webkit-box; 464 | display: -ms-flexbox; 465 | display: flex; 466 | text-align: left; 467 | } 468 | 469 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list { 470 | display: block; 471 | list-style: none; 472 | margin: 0; 473 | padding: 0; 474 | } 475 | 476 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li { 477 | border-bottom: 1px solid var(--background-modifier-border); 478 | margin: 0; 479 | padding: 5px 10px; 480 | } 481 | 482 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li:last-child { 483 | border-bottom: none; 484 | } 485 | 486 | .workspace-leaf-content[data-type="diff-view"] .d2h-file-switch { 487 | cursor: pointer; 488 | display: none; 489 | font-size: 10px; 490 | } 491 | 492 | .workspace-leaf-content[data-type="diff-view"] .d2h-icon { 493 | fill: currentColor; 494 | margin-right: 10px; 495 | vertical-align: middle; 496 | } 497 | 498 | .workspace-leaf-content[data-type="diff-view"] .d2h-deleted { 499 | color: #c33; 500 | } 501 | 502 | .workspace-leaf-content[data-type="diff-view"] .d2h-added { 503 | color: #399839; 504 | } 505 | 506 | .workspace-leaf-content[data-type="diff-view"] .d2h-changed { 507 | color: #d0b44c; 508 | } 509 | 510 | .workspace-leaf-content[data-type="diff-view"] .d2h-moved { 511 | color: #3572b0; 512 | } 513 | 514 | .workspace-leaf-content[data-type="diff-view"] .d2h-tag { 515 | background-color: var(--background-primary); 516 | display: -webkit-box; 517 | display: -ms-flexbox; 518 | display: flex; 519 | font-size: 10px; 520 | margin-left: 5px; 521 | padding: 0 2px; 522 | } 523 | 524 | .workspace-leaf-content[data-type="diff-view"] .d2h-deleted-tag { 525 | border: 2px solid #c33; 526 | } 527 | 528 | .workspace-leaf-content[data-type="diff-view"] .d2h-added-tag { 529 | border: 1px solid #399839; 530 | } 531 | 532 | .workspace-leaf-content[data-type="diff-view"] .d2h-changed-tag { 533 | border: 1px solid #d0b44c; 534 | } 535 | 536 | .workspace-leaf-content[data-type="diff-view"] .d2h-moved-tag { 537 | border: 1px solid #3572b0; 538 | } 539 | 540 | /* ====================== Line Authoring Information ====================== */ 541 | 542 | .cm-gutterElement.obs-git-blame-gutter { 543 | /* Add background color to spacing inbetween and around the gutter for better aesthetics */ 544 | border-width: 0px 2px 0.2px 2px; 545 | border-style: solid; 546 | border-color: var(--background-secondary); 547 | background-color: var(--background-secondary); 548 | } 549 | 550 | .cm-gutterElement.obs-git-blame-gutter > div, 551 | .line-author-settings-preview { 552 | /* delegate text color to settings */ 553 | color: var(--obs-git-gutter-text); 554 | font-family: monospace; 555 | height: 100%; /* ensure, that age-based background color occupies entire parent */ 556 | text-align: right; 557 | padding: 0px 6px 0px 6px; 558 | white-space: pre; /* Keep spaces and do not collapse them. */ 559 | } 560 | 561 | @media (max-width: 800px) { 562 | /* hide git blame gutter not to superpose text */ 563 | .cm-gutterElement.obs-git-blame-gutter { 564 | display: none; 565 | } 566 | } 567 | 568 | .git-unified-diff-view, 569 | .git-split-diff-view .cm-deletedLine .cm-changedText { 570 | background-color: #ee443330; 571 | } 572 | 573 | .git-unified-diff-view, 574 | .git-split-diff-view .cm-insertedLine .cm-changedText { 575 | background-color: #22bb2230; 576 | } 577 | 578 | /* Limits the scrollbar to the view body */ 579 | .git-view { 580 | display: flex; 581 | flex-direction: column; 582 | position: relative; 583 | height: 100%; 584 | } 585 | 586 | .git-obscure-prompt[git-is-obscured="true"] #git-show-password:after { 587 | -webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>'); 588 | } 589 | 590 | .git-obscure-prompt[git-is-obscured="false"] #git-show-password:after { 591 | -webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye-off"><path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"></path><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"></path><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"></path><path d="m2 2 20 20"></path></svg>'); 592 | } 593 | 594 | /* Override styling of Codemirror merge view "collapsed lines" indicator */ 595 | .git-split-diff-view .ͼ2 .cm-collapsedLines { 596 | background: var(--interactive-normal); 597 | border-radius: var(--radius-m); 598 | color: var(--text-accent); 599 | font-size: var(--font-small); 600 | padding: var(--size-4-1) var(--size-4-1); 601 | } 602 | .git-split-diff-view .ͼ2 .cm-collapsedLines:hover { 603 | background: var(--interactive-hover); 604 | color: var(--text-accent-hover); 605 | } 606 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-hider/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "hideStatus": false, 3 | "hideTabs": false, 4 | "hideScroll": false, 5 | "hideSidebarButtons": false, 6 | "hideTooltips": false, 7 | "hideFileNavButtons": false, 8 | "hideSearchSuggestions": false, 9 | "hideSearchCounts": false, 10 | "hideInstructions": false, 11 | "hidePropertiesReading": true, 12 | "hideVault": false 13 | } -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-hider/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 3 | if you want to view the source, please visit the github repository of this plugin 4 | */ 5 | 6 | var g=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var r=(a,n)=>{for(var t in n)g(a,t,{get:n[t],enumerable:!0})},c=(a,n,t,e)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of d(n))!u.call(a,s)&&s!==t&&g(a,s,{get:()=>n[s],enumerable:!(e=o(n,s))||e.enumerable});return a};var p=a=>c(g({},"__esModule",{value:!0}),a);var S={};r(S,{default:()=>h});module.exports=p(S);var i=require("obsidian"),h=class extends i.Plugin{constructor(){super(...arguments);this.refresh=()=>{this.updateStyle()};this.updateStyle=()=>{document.body.classList.toggle("hider-status",this.settings.hideStatus),document.body.classList.toggle("hider-tabs",this.settings.hideTabs),document.body.classList.toggle("hider-scroll",this.settings.hideScroll),document.body.classList.toggle("hider-sidebar-buttons",this.settings.hideSidebarButtons),document.body.classList.toggle("hider-tooltips",this.settings.hideTooltips),document.body.classList.toggle("hider-search-suggestions",this.settings.hideSearchSuggestions),document.body.classList.toggle("hider-file-nav-header",this.settings.hideFileNavButtons),document.body.classList.toggle("hider-search-counts",this.settings.hideSearchCounts),document.body.classList.toggle("hider-instructions",this.settings.hideInstructions),document.body.classList.toggle("hider-meta",this.settings.hidePropertiesReading),document.body.classList.toggle("hider-vault",this.settings.hideVault)}}async onload(){await this.loadSettings(),this.addSettingTab(new l(this.app,this)),this.addCommand({id:"toggle-tab-containers",name:"Toggle tab bar",callback:()=>{this.settings.hideTabs=!this.settings.hideTabs,this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"toggle-hider-status",name:"Toggle status bar",callback:()=>{this.settings.hideStatus=!this.settings.hideStatus,this.saveData(this.settings),this.refresh()}}),this.refresh()}onunload(){console.log("Unloading Hider plugin")}async loadSettings(){this.settings=Object.assign(b,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}},b={hideStatus:!1,hideTabs:!1,hideScroll:!1,hideSidebarButtons:!1,hideTooltips:!1,hideFileNavButtons:!1,hideSearchSuggestions:!1,hideSearchCounts:!1,hideInstructions:!1,hidePropertiesReading:!1,hideVault:!1},l=class extends i.PluginSettingTab{constructor(t,e){super(t,e);this.plugin=e}display(){let{containerEl:t}=this;t.empty(),new i.Setting(t).setName("Hide tab bar").setDesc("Hides the tab container at the top of the window.").addToggle(e=>e.setValue(this.plugin.settings.hideTabs).onChange(s=>{this.plugin.settings.hideTabs=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide status bar").setDesc("Hides word count, character count and backlink count.").addToggle(e=>e.setValue(this.plugin.settings.hideStatus).onChange(s=>{this.plugin.settings.hideStatus=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide vault name").setDesc("Hides your vault profile. Warning: this also hides access to the Settings and vault switcher icons. You can use hotkeys or the command palette to open them.").addToggle(e=>e.setValue(this.plugin.settings.hideVault).onChange(s=>{this.plugin.settings.hideVault=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide scroll bars").setDesc("Hides all scroll bars.").addToggle(e=>e.setValue(this.plugin.settings.hideScroll).onChange(s=>{this.plugin.settings.hideScroll=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide sidebar toggle buttons").setDesc("Hides both sidebar buttons.").addToggle(e=>e.setValue(this.plugin.settings.hideSidebarButtons).onChange(s=>{this.plugin.settings.hideSidebarButtons=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide tooltips").setDesc("Hides all tooltips.").addToggle(e=>e.setValue(this.plugin.settings.hideTooltips).onChange(s=>{this.plugin.settings.hideTooltips=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide file explorer buttons").setDesc("Hides buttons at the top of file explorer (new file, new folder, etc).").addToggle(e=>e.setValue(this.plugin.settings.hideFileNavButtons).onChange(s=>{this.plugin.settings.hideFileNavButtons=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide instructions").setDesc("Hides instructional tips in modals.").addToggle(e=>e.setValue(this.plugin.settings.hideInstructions).onChange(s=>{this.plugin.settings.hideInstructions=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide search suggestions").setDesc("Hides suggestions in search pane.").addToggle(e=>e.setValue(this.plugin.settings.hideSearchSuggestions).onChange(s=>{this.plugin.settings.hideSearchSuggestions=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide count of search term matches").setDesc("Hides the number of matches within each search result.").addToggle(e=>e.setValue(this.plugin.settings.hideSearchCounts).onChange(s=>{this.plugin.settings.hideSearchCounts=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new i.Setting(t).setName("Hide properties in Reading view").setDesc("Hides the properties section in Reading view.").addToggle(e=>e.setValue(this.plugin.settings.hidePropertiesReading).onChange(s=>{this.plugin.settings.hidePropertiesReading=s,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()}))}}; 7 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-hider/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-hider", 3 | "name": "Hider", 4 | "version": "1.5.1", 5 | "minAppVersion": "1.6.0", 6 | "description": "Hide UI elements such as tooltips, status, titlebar and more", 7 | "author": "@kepano", 8 | "authorUrl": "https://www.twitter.com/kepano", 9 | "fundingUrl": "https://www.buymeacoffee.com/kepano", 10 | "isDesktopOnly": false 11 | } 12 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-hider/styles.css: -------------------------------------------------------------------------------- 1 | /* Hides vault name */ 2 | .hider-vault .workspace-sidedock-vault-profile, 3 | body.hider-vault:not(.is-mobile) .workspace-split.mod-left-split .workspace-sidedock-vault-profile { 4 | display:none; 5 | } 6 | 7 | /* Hide tabs */ 8 | .hider-tabs .mod-root .workspace-tabs .workspace-tab-header-container { 9 | display: none; 10 | } 11 | 12 | .hider-tabs .mod-top-left-space .view-header { 13 | padding-left: var(--frame-left-space); 14 | } 15 | 16 | /* Hide sidebar buttons */ 17 | .hider-sidebar-buttons .sidebar-toggle-button.mod-right, 18 | .hider-sidebar-buttons .sidebar-toggle-button.mod-left { 19 | display: none; 20 | } 21 | .hider-sidebar-buttons.mod-macos.is-hidden-frameless:not(.is-popout-window) .workspace .workspace-tabs.mod-top-right-space .workspace-tab-header-container { 22 | padding-right: 4px; 23 | } 24 | .hider-sidebar-buttons.mod-macos { 25 | --frame-left-space: 60px; 26 | } 27 | 28 | /* Hide meta */ 29 | .hider-meta .markdown-reading-view .metadata-container { 30 | display:none; 31 | } 32 | 33 | /* Hide scrollbars */ 34 | .hider-scroll ::-webkit-scrollbar { 35 | display:none; 36 | } 37 | 38 | /* Hide status */ 39 | .hider-status .status-bar { 40 | display:none; 41 | } 42 | 43 | /* Hide tooltips */ 44 | .hider-tooltips .tooltip { 45 | display:none; 46 | } 47 | 48 | /* Hide search suggestions */ 49 | .hider-search-suggestions .suggestion-container.mod-search-suggestion { 50 | display: none; 51 | } 52 | 53 | /* Hide search count flair */ 54 | .hider-search-counts .tree-item-flair:not(.tag-pane-tag-count) { 55 | display:none; 56 | } 57 | 58 | /* Hide instructions */ 59 | .hider-instructions .prompt-instructions { 60 | display:none; 61 | } 62 | 63 | /* Hide file nav header */ 64 | .hider-file-nav-header .workspace-leaf-content[data-type=file-explorer] .nav-header { 65 | display: none; 66 | } 67 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-minimal-settings/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "lightStyle": "minimal-light", 3 | "darkStyle": "minimal-dark", 4 | "lightScheme": "minimal-default-light", 5 | "darkScheme": "minimal-default-dark", 6 | "editorFont": "", 7 | "lineHeight": 2, 8 | "lineWidth": 40, 9 | "lineWidthWide": 50, 10 | "maxWidth": 88, 11 | "textNormal": 17, 12 | "textSmall": 14, 13 | "imgGrid": false, 14 | "imgWidth": "img-default-width", 15 | "tableWidth": "table-default-width", 16 | "iframeWidth": "iframe-default-width", 17 | "mapWidth": "map-default-width", 18 | "chartWidth": "chart-default-width", 19 | "colorfulHeadings": false, 20 | "colorfulFrame": false, 21 | "colorfulActiveStates": false, 22 | "trimNames": true, 23 | "labeledNav": false, 24 | "fullWidthMedia": false, 25 | "bordersToggle": true, 26 | "minimalStatus": true, 27 | "focusMode": false, 28 | "underlineInternal": false, 29 | "underlineExternal": true, 30 | "folding": true, 31 | "lineNumbers": false, 32 | "readableLineLength": true, 33 | "devBlockWidth": false 34 | } -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-minimal-settings/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | THIS IS A GENERATED/BUNDLED FILE BY ESBUILD 3 | if you want to view the source, please visit the github repository of this plugin 4 | */ 5 | 6 | var x=Object.create;var u=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var T=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var v=n=>u(n,"__esModule",{value:!0});var O=(n,t)=>{v(n);for(var s in t)u(n,s,{get:t[s],enumerable:!0})},E=(n,t,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of W(t))!N.call(n,l)&&l!=="default"&&u(n,l,{get:()=>t[l],enumerable:!(s=L(t,l))||s.enumerable});return n},y=n=>E(v(u(n!=null?x(T(n)):{},"default",n&&n.__esModule&&"default"in n?{get:()=>n.default,enumerable:!0}:{value:n,enumerable:!0})),n);var p=(n,t,s)=>new Promise((l,d)=>{var f=h=>{try{m(s.next(h))}catch(o){d(o)}},g=h=>{try{m(s.throw(h))}catch(o){d(o)}},m=h=>h.done?l(h.value):Promise.resolve(h.value).then(f,g);m((s=s.apply(n,t)).next())});O(exports,{default:()=>S});var C=y(require("obsidian"));var a=y(require("obsidian")),D={lightStyle:"minimal-light",darkStyle:"minimal-dark",lightScheme:"minimal-default-light",darkScheme:"minimal-default-dark",editorFont:"",lineHeight:1.5,lineWidth:40,lineWidthWide:50,maxWidth:88,textNormal:16,textSmall:13,imgGrid:!1,imgWidth:"img-default-width",tableWidth:"table-default-width",iframeWidth:"iframe-default-width",mapWidth:"map-default-width",chartWidth:"chart-default-width",colorfulHeadings:!1,colorfulFrame:!1,colorfulActiveStates:!1,trimNames:!0,labeledNav:!1,fullWidthMedia:!0,bordersToggle:!0,minimalStatus:!0,focusMode:!1,underlineInternal:!0,underlineExternal:!0,folding:!0,lineNumbers:!1,readableLineLength:!1,devBlockWidth:!1},b=class extends a.PluginSettingTab{constructor(t,s){super(t,s);this.plugin=s}display(){let{containerEl:t}=this;t.empty();let l=t.createEl("div",{cls:"setting-item setting-item-heading"}).createEl("div",{cls:"setting-item-info"});l.createEl("div",{text:"Color scheme",cls:"setting-item-name"});let d=l.createEl("div",{cls:"setting-item-description"});d.appendChild(createEl("span",{text:"To create a custom color scheme use the "})),d.appendChild(createEl("a",{text:"Style Settings",href:"obsidian://show-plugin?id=obsidian-style-settings"})),d.appendText(" plugin. See "),d.appendChild(createEl("a",{text:"documentation",href:"https://minimal.guide/features/color-schemes"})),d.appendText(" for details."),new a.Setting(t).setName("Light mode color scheme").setDesc("Preset color options for light mode.").addDropdown(i=>i.addOption("minimal-default-light","Default").addOption("minimal-atom-light","Atom").addOption("minimal-ayu-light","Ayu").addOption("minimal-catppuccin-light","Catppuccin").addOption("minimal-eink-light","E-ink (beta)").addOption("minimal-everforest-light","Everforest").addOption("minimal-flexoki-light","Flexoki").addOption("minimal-gruvbox-light","Gruvbox").addOption("minimal-macos-light","macOS").addOption("minimal-nord-light","Nord").addOption("minimal-rose-pine-light","Ros\xE9 Pine").addOption("minimal-notion-light","Sky").addOption("minimal-solarized-light","Solarized").addOption("minimal-things-light","Things").setValue(this.plugin.settings.lightScheme).onChange(e=>{this.plugin.settings.lightScheme=e,this.plugin.saveData(this.plugin.settings),this.plugin.updateLightScheme()})),new a.Setting(t).setName("Light mode background contrast").setDesc("Level of contrast between sidebar and main content.").addDropdown(i=>i.addOption("minimal-light","Default").addOption("minimal-light-white","All white").addOption("minimal-light-tonal","Low contrast").addOption("minimal-light-contrast","High contrast").setValue(this.plugin.settings.lightStyle).onChange(e=>{this.plugin.settings.lightStyle=e,this.plugin.saveData(this.plugin.settings),this.plugin.updateLightStyle()})),new a.Setting(t).setName("Dark mode color scheme").setDesc("Preset colors options for dark mode.").addDropdown(i=>i.addOption("minimal-default-dark","Default").addOption("minimal-atom-dark","Atom").addOption("minimal-ayu-dark","Ayu").addOption("minimal-catppuccin-dark","Catppuccin").addOption("minimal-dracula-dark","Dracula").addOption("minimal-eink-dark","E-ink (beta)").addOption("minimal-everforest-dark","Everforest").addOption("minimal-flexoki-dark","Flexoki").addOption("minimal-gruvbox-dark","Gruvbox").addOption("minimal-macos-dark","macOS").addOption("minimal-nord-dark","Nord").addOption("minimal-rose-pine-dark","Ros\xE9 Pine").addOption("minimal-notion-dark","Sky").addOption("minimal-solarized-dark","Solarized").addOption("minimal-things-dark","Things").setValue(this.plugin.settings.darkScheme).onChange(e=>{this.plugin.settings.darkScheme=e,this.plugin.saveData(this.plugin.settings),this.plugin.updateDarkScheme()})),new a.Setting(t).setName("Dark mode background contrast").setDesc("Level of contrast between sidebar and main content.").addDropdown(i=>i.addOption("minimal-dark","Default").addOption("minimal-dark-tonal","Low contrast").addOption("minimal-dark-black","True black").setValue(this.plugin.settings.darkStyle).onChange(e=>{this.plugin.settings.darkStyle=e,this.plugin.saveData(this.plugin.settings),this.plugin.updateDarkStyle()})),t.createEl("br");let g=t.createEl("div",{cls:"setting-item setting-item-heading"}).createEl("div",{cls:"setting-item-info"});g.createEl("div",{text:"Features",cls:"setting-item-name"});let m=g.createEl("div",{cls:"setting-item-description"});m.appendChild(createEl("span",{text:"See "})),m.appendChild(createEl("a",{text:"documentation",href:"https://minimal.guide"})),m.appendText(" for details."),new a.Setting(t).setName("Text labels for primary navigation").setDesc("Navigation items in the left sidebar uses text labels.").addToggle(i=>i.setValue(this.plugin.settings.labeledNav).onChange(e=>{this.plugin.settings.labeledNav=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Colorful window frame").setDesc("The top area of the app uses your accent color.").addToggle(i=>i.setValue(this.plugin.settings.colorfulFrame).onChange(e=>{this.plugin.settings.colorfulFrame=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Colorful active states").setDesc("Active file and menu items use your accent color.").addToggle(i=>i.setValue(this.plugin.settings.colorfulActiveStates).onChange(e=>{this.plugin.settings.colorfulActiveStates=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Colorful headings").setDesc("Headings use a different color for each size.").addToggle(i=>i.setValue(this.plugin.settings.colorfulHeadings).onChange(e=>{this.plugin.settings.colorfulHeadings=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Minimal status bar").setDesc("Turn off to use full-width status bar.").addToggle(i=>i.setValue(this.plugin.settings.minimalStatus).onChange(e=>{this.plugin.settings.minimalStatus=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Trim file names in sidebars").setDesc("Use ellipses to fit file names on a single line.").addToggle(i=>i.setValue(this.plugin.settings.trimNames).onChange(e=>{this.plugin.settings.trimNames=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Workspace borders").setDesc("Display divider lines between workspace elements.").addToggle(i=>i.setValue(this.plugin.settings.bordersToggle).onChange(e=>{this.plugin.settings.bordersToggle=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Focus mode").setDesc("Hide tab bar and status bar, hover to display. Can be toggled via hotkey.").addToggle(i=>i.setValue(this.plugin.settings.focusMode).onChange(e=>{this.plugin.settings.focusMode=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Underline internal links").setDesc("Show underlines on internal links.").addToggle(i=>i.setValue(this.plugin.settings.underlineInternal).onChange(e=>{this.plugin.settings.underlineInternal=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Underline external links").setDesc("Show underlines on external links.").addToggle(i=>i.setValue(this.plugin.settings.underlineExternal).onChange(e=>{this.plugin.settings.underlineExternal=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Maximize media").setDesc("Images and videos fill the width of the line.").addToggle(i=>i.setValue(this.plugin.settings.fullWidthMedia).onChange(e=>{this.plugin.settings.fullWidthMedia=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),t.createEl("br");let o=t.createEl("div",{cls:"setting-item setting-item-heading"}).createEl("div",{cls:"setting-item-info"});o.createEl("div",{text:"Layout",cls:"setting-item-name"});let r=o.createEl("div",{cls:"setting-item-description"});r.appendChild(createEl("span",{text:"These options can also be defined on a per-file basis, see "})),r.appendChild(createEl("a",{text:"documentation",href:"https://minimal.guide/features/block-width"})),r.appendText(" for details."),new a.Setting(t).setName("Image grids").setDesc("Turn consecutive images into columns \u2014 to make a new row, add an extra line break between images.").addToggle(i=>i.setValue(this.plugin.settings.imgGrid).onChange(e=>{this.plugin.settings.imgGrid=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Chart width").setDesc("Default width for chart blocks.").addDropdown(i=>i.addOption("chart-default-width","Default").addOption("chart-wide","Wide line width").addOption("chart-max","Maximum line width").addOption("chart-100","100% pane width").setValue(this.plugin.settings.chartWidth).onChange(e=>{this.plugin.settings.chartWidth=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Iframe width").setDesc("Default width for iframe blocks.").addDropdown(i=>i.addOption("iframe-default-width","Default").addOption("iframe-wide","Wide line width").addOption("iframe-max","Maximum line width").addOption("iframe-100","100% pane width").setValue(this.plugin.settings.iframeWidth).onChange(e=>{this.plugin.settings.iframeWidth=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Image width").setDesc("Default width for image blocks.").addDropdown(i=>i.addOption("img-default-width","Default").addOption("img-wide","Wide line width").addOption("img-max","Maximum line width").addOption("img-100","100% pane width").setValue(this.plugin.settings.imgWidth).onChange(e=>{this.plugin.settings.imgWidth=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Map width").setDesc("Default width for map blocks.").addDropdown(i=>i.addOption("map-default-width","Default").addOption("map-wide","Wide line width").addOption("map-max","Maximum line width").addOption("map-100","100% pane width").setValue(this.plugin.settings.mapWidth).onChange(e=>{this.plugin.settings.mapWidth=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Table width").setDesc("Default width for table and Dataview blocks.").addDropdown(i=>i.addOption("table-default-width","Default").addOption("table-wide","Wide line width").addOption("table-max","Maximum line width").addOption("table-100","100% pane width").setValue(this.plugin.settings.tableWidth).onChange(e=>{this.plugin.settings.tableWidth=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),t.createEl("br"),t.createEl("div",{text:"Typography",cls:"setting-item setting-item-heading"}),new a.Setting(t).setName("Text font size").setDesc("Used for the main text (default 16).").addText(i=>i.setPlaceholder("16").setValue((this.plugin.settings.textNormal||"")+"").onChange(e=>{this.plugin.settings.textNormal=parseFloat(e),this.plugin.saveData(this.plugin.settings),this.plugin.setFontSize()})),new a.Setting(t).setName("Small font size").setDesc("Used for text in the sidebars and tabs (default 13).").addText(i=>i.setPlaceholder("13").setValue((this.plugin.settings.textSmall||"")+"").onChange(e=>{this.plugin.settings.textSmall=parseFloat(e),this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Line height").setDesc("Line height of text (default 1.5).").addText(i=>i.setPlaceholder("1.5").setValue((this.plugin.settings.lineHeight||"")+"").onChange(e=>{this.plugin.settings.lineHeight=parseFloat(e),this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Normal line width").setDesc("Number of characters per line (default 40).").addText(i=>i.setPlaceholder("40").setValue((this.plugin.settings.lineWidth||"")+"").onChange(e=>{this.plugin.settings.lineWidth=parseInt(e.trim()),this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Wide line width").setDesc("Number of characters per line for wide elements (default 50).").addText(i=>i.setPlaceholder("50").setValue((this.plugin.settings.lineWidthWide||"")+"").onChange(e=>{this.plugin.settings.lineWidthWide=parseInt(e.trim()),this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Maximum line width %").setDesc("Percentage of space inside a pane that a line can fill (default 88).").addText(i=>i.setPlaceholder("88").setValue((this.plugin.settings.maxWidth||"")+"").onChange(e=>{this.plugin.settings.maxWidth=parseInt(e.trim()),this.plugin.saveData(this.plugin.settings),this.plugin.refresh()})),new a.Setting(t).setName("Editor font").setDesc("Overrides the text font defined in Obsidian Appearance settings when in edit mode.").addText(i=>i.setPlaceholder("").setValue((this.plugin.settings.editorFont||"")+"").onChange(e=>{this.plugin.settings.editorFont=e,this.plugin.saveData(this.plugin.settings),this.plugin.refresh()}))}};var S=class extends C.Plugin{onload(){return p(this,null,function*(){yield this.loadSettings(),this.addSettingTab(new b(this.app,this)),this.loadRules();let t=()=>{let i=this.app.vault.getConfig("baseFontSize");this.settings.textNormal=i;let e=!1,w=!1,k=!1;this.app.vault.getConfig("foldHeading")?(this.settings.folding=!0,console.log("Folding is on"),e=!0):(this.settings.folding=!1,console.log("Folding is off")),this.app.vault.getConfig("showLineNumber")?(this.settings.lineNumbers=!0,console.log("Line numbers are on"),w=!0):(this.settings.lineNumbers=!1,console.log("Line numbers are off")),this.app.vault.getConfig("readableLineLength")?(this.settings.readableLineLength=!0,console.log("Readable line length is on"),k=!0):(this.settings.readableLineLength=!1,console.log("Readable line length is off"));let c=document.body.classList;c.toggle("minimal-folding",e),c.toggle("minimal-line-nums",w),c.toggle("minimal-readable",k),c.toggle("minimal-readable-off",!k),this.saveData(this.settings)},s=()=>{let i=document.getElementsByClassName("mod-left-split")[0],e=document.getElementsByClassName("side-dock-ribbon")[0];i&&e&&document.body.classList.contains("theme-light")&&this.settings.lightStyle=="minimal-light-contrast"?(i.addClass("theme-dark"),e.addClass("theme-dark")):i&&e&&(i.removeClass("theme-dark"),e.removeClass("theme-dark"))};this.registerEvent(app.vault.on("config-changed",t)),this.registerEvent(app.workspace.on("css-change",s)),t(),app.workspace.onLayoutReady(()=>{s()});let l=["minimal-light","minimal-light-tonal","minimal-light-contrast","minimal-light-white"],d=["minimal-dark","minimal-dark-tonal","minimal-dark-black"],f=["img-grid","img-grid-ratio","img-nogrid"],g=["table-100","table-default-width","table-wide","table-max"],m=["iframe-100","iframe-default-width","iframe-wide","iframe-max"],h=["img-100","img-default-width","img-wide","img-max"],o=["map-100","map-default-width","map-wide","map-max"],r=["chart-100","chart-default-width","chart-wide","chart-max"];this.addCommand({id:"increase-body-font-size",name:"Increase body font size",callback:()=>{this.settings.textNormal=this.settings.textNormal+.5,this.saveData(this.settings),this.setFontSize()}}),this.addCommand({id:"decrease-body-font-size",name:"Decrease body font size",callback:()=>{this.settings.textNormal=this.settings.textNormal-.5,this.saveData(this.settings),this.setFontSize()}}),this.addCommand({id:"toggle-minimal-dark-cycle",name:"Cycle between dark mode styles",callback:()=>{this.settings.darkStyle=d[(d.indexOf(this.settings.darkStyle)+1)%d.length],this.saveData(this.settings),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-light-cycle",name:"Cycle between light mode styles",callback:()=>{this.settings.lightStyle=l[(l.indexOf(this.settings.lightStyle)+1)%l.length],this.saveData(this.settings),this.updateLightStyle()}}),this.addCommand({id:"toggle-hidden-borders",name:"Toggle sidebar borders",callback:()=>{this.settings.bordersToggle=!this.settings.bordersToggle,this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"toggle-colorful-headings",name:"Toggle colorful headings",callback:()=>{this.settings.colorfulHeadings=!this.settings.colorfulHeadings,this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"toggle-minimal-focus-mode",name:"Toggle focus mode",callback:()=>{this.settings.focusMode=!this.settings.focusMode,this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"toggle-minimal-colorful-frame",name:"Toggle colorful window frame",callback:()=>{this.settings.colorfulFrame=!this.settings.colorfulFrame,this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"cycle-minimal-table-width",name:"Cycle between table width options",callback:()=>{this.settings.tableWidth=g[(g.indexOf(this.settings.tableWidth)+1)%g.length],this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"cycle-minimal-image-width",name:"Cycle between image width options",callback:()=>{this.settings.imgWidth=h[(h.indexOf(this.settings.imgWidth)+1)%h.length],this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"cycle-minimal-iframe-width",name:"Cycle between iframe width options",callback:()=>{this.settings.iframeWidth=m[(m.indexOf(this.settings.iframeWidth)+1)%m.length],this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"cycle-minimal-chart-width",name:"Cycle between chart width options",callback:()=>{this.settings.chartWidth=r[(r.indexOf(this.settings.chartWidth)+1)%r.length],this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"cycle-minimal-map-width",name:"Cycle between map width options",callback:()=>{this.settings.mapWidth=o[(o.indexOf(this.settings.mapWidth)+1)%o.length],this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"toggle-minimal-img-grid",name:"Toggle image grids",callback:()=>{this.settings.imgGrid=!this.settings.imgGrid,this.saveData(this.settings),this.refresh()}}),this.addCommand({id:"toggle-minimal-switch",name:"Switch between light and dark mode",callback:()=>{this.updateTheme()}}),this.addCommand({id:"toggle-minimal-light-default",name:"Use light mode (default)",callback:()=>{this.settings.lightStyle="minimal-light",this.saveData(this.settings),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-light-white",name:"Use light mode (all white)",callback:()=>{this.settings.lightStyle="minimal-light-white",this.saveData(this.settings),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-light-tonal",name:"Use light mode (low contrast)",callback:()=>{this.settings.lightStyle="minimal-light-tonal",this.saveData(this.settings),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-light-contrast",name:"Use light mode (high contrast)",callback:()=>{this.settings.lightStyle="minimal-light-contrast",this.saveData(this.settings),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-dark-default",name:"Use dark mode (default)",callback:()=>{this.settings.darkStyle="minimal-dark",this.saveData(this.settings),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-dark-tonal",name:"Use dark mode (low contrast)",callback:()=>{this.settings.darkStyle="minimal-dark-tonal",this.saveData(this.settings),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-dark-black",name:"Use dark mode (true black)",callback:()=>{this.settings.darkStyle="minimal-dark-black",this.saveData(this.settings),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-atom-light",name:"Switch light color scheme to Atom (light)",callback:()=>{this.settings.lightScheme="minimal-atom-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-ayu-light",name:"Switch light color scheme to Ayu (light)",callback:()=>{this.settings.lightScheme="minimal-ayu-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-catppuccin-light",name:"Switch light color scheme to Catppuccin (light)",callback:()=>{this.settings.lightScheme="minimal-catppuccin-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-default-light",name:"Switch light color scheme to default (light)",callback:()=>{this.settings.lightScheme="minimal-default-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-gruvbox-light",name:"Switch light color scheme to Gruvbox (light)",callback:()=>{this.settings.lightScheme="minimal-gruvbox-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-eink-light",name:"Switch light color scheme to E-ink (light)",callback:()=>{this.settings.lightScheme="minimal-eink-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-everforest-light",name:"Switch light color scheme to Everforest (light)",callback:()=>{this.settings.lightScheme="minimal-everforest-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-flexoki-light",name:"Switch light color scheme to Flexoki (light)",callback:()=>{this.settings.lightScheme="minimal-flexoki-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-macos-light",name:"Switch light color scheme to macOS (light)",callback:()=>{this.settings.lightScheme="minimal-macos-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-notion-light",name:"Switch light color scheme to Sky (light)",callback:()=>{this.settings.lightScheme="minimal-notion-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-nord-light",name:"Switch light color scheme to Nord (light)",callback:()=>{this.settings.lightScheme="minimal-nord-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-rose-pine-light",name:"Switch light color scheme to Ros\xE9 Pine (light)",callback:()=>{this.settings.lightScheme="minimal-rose-pine-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-solarized-light",name:"Switch light color scheme to Solarized (light)",callback:()=>{this.settings.lightScheme="minimal-solarized-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-things-light",name:"Switch light color scheme to Things (light)",callback:()=>{this.settings.lightScheme="minimal-things-light",this.saveData(this.settings),this.updateLightScheme(),this.updateLightStyle()}}),this.addCommand({id:"toggle-minimal-atom-dark",name:"Switch dark color scheme to Atom (dark)",callback:()=>{this.settings.darkScheme="minimal-atom-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-ayu-dark",name:"Switch dark color scheme to Ayu (dark)",callback:()=>{this.settings.darkScheme="minimal-ayu-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-catppuccin-dark",name:"Switch dark color scheme to Catppuccin (dark)",callback:()=>{this.settings.darkScheme="minimal-catppuccin-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-dracula-dark",name:"Switch dark color scheme to Dracula (dark)",callback:()=>{this.settings.darkScheme="minimal-dracula-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-default-dark",name:"Switch dark color scheme to default (dark)",callback:()=>{this.settings.darkScheme="minimal-default-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-eink-dark",name:"Switch dark color scheme to E-ink (dark)",callback:()=>{this.settings.darkScheme="minimal-eink-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-everforest-dark",name:"Switch dark color scheme to Everforest (dark)",callback:()=>{this.settings.darkScheme="minimal-everforest-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-flexoki-dark",name:"Switch dark color scheme to Flexoki (dark)",callback:()=>{this.settings.darkScheme="minimal-flexoki-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-gruvbox-dark",name:"Switch dark color scheme to Gruvbox (dark)",callback:()=>{this.settings.darkScheme="minimal-gruvbox-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-macos-dark",name:"Switch dark color scheme to macOS (dark)",callback:()=>{this.settings.darkScheme="minimal-macos-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-nord-dark",name:"Switch dark color scheme to Nord (dark)",callback:()=>{this.settings.darkScheme="minimal-nord-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-notion-dark",name:"Switch dark color scheme to Sky (dark)",callback:()=>{this.settings.darkScheme="minimal-notion-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-rose-pine-dark",name:"Switch dark color scheme to Ros\xE9 Pine (dark)",callback:()=>{this.settings.darkScheme="minimal-rose-pine-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-solarized-dark",name:"Switch dark color scheme to Solarized (dark)",callback:()=>{this.settings.darkScheme="minimal-solarized-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-things-dark",name:"Switch dark color scheme to Things (dark)",callback:()=>{this.settings.darkScheme="minimal-things-dark",this.saveData(this.settings),this.updateDarkScheme(),this.updateDarkStyle()}}),this.addCommand({id:"toggle-minimal-dev-block-width",name:"Dev \u2014 Show block widths",callback:()=>{this.settings.devBlockWidth=!this.settings.devBlockWidth,this.saveData(this.settings),this.refresh()}}),this.refresh()})}onunload(){console.log("Unloading Minimal Theme Settings plugin");let t=document.getElementsByClassName("mod-left-split")[0];t&&t.removeClass("theme-dark");let s=document.getElementsByClassName("side-dock-ribbon")[0];s&&s.removeClass("theme-dark"),this.unloadRules(),this.removeStyle(),this.removeSettings(),this.removeLightScheme(),this.removeDarkScheme()}loadSettings(){return p(this,null,function*(){this.settings=Object.assign(D,yield this.loadData())})}saveSettings(){return p(this,null,function*(){yield this.saveData(this.settings)})}refresh(){this.updateStyle()}loadRules(){let t=document.createElement("style");t.id="minimal-theme",document.getElementsByTagName("head")[0].appendChild(t),document.body.classList.add("minimal-theme"),this.updateStyle()}unloadRules(){let t=document.getElementById("minimal-theme");t&&t.parentNode.removeChild(t),document.body.classList.remove("minimal-theme")}setFontSize(){this.app.vault.setConfig("baseFontSize",this.settings.textNormal),this.app.updateFontSize()}updateStyle(){this.removeStyle(),this.removeSettings(),document.body.addClass(this.settings.lightStyle,this.settings.lightScheme,this.settings.darkStyle,this.settings.darkScheme),document.body.classList.toggle("borders-none",!this.settings.bordersToggle),document.body.classList.toggle("colorful-headings",this.settings.colorfulHeadings),document.body.classList.toggle("colorful-frame",this.settings.colorfulFrame),document.body.classList.toggle("colorful-active",this.settings.colorfulActiveStates),document.body.classList.toggle("minimal-focus-mode",this.settings.focusMode),document.body.classList.toggle("links-int-on",this.settings.underlineInternal),document.body.classList.toggle("links-ext-on",this.settings.underlineExternal),document.body.classList.toggle("full-width-media",this.settings.fullWidthMedia),document.body.classList.toggle("img-grid",this.settings.imgGrid),document.body.classList.toggle("minimal-dev-block-width",this.settings.devBlockWidth),document.body.classList.toggle("minimal-status-off",!this.settings.minimalStatus),document.body.classList.toggle("full-file-names",!this.settings.trimNames),document.body.classList.toggle("labeled-nav",this.settings.labeledNav),document.body.classList.toggle("minimal-folding",this.settings.folding),document.body.addClass(this.settings.chartWidth,this.settings.tableWidth,this.settings.imgWidth,this.settings.iframeWidth,this.settings.mapWidth);let t=document.getElementById("minimal-theme");if(t)t.innerText="body.minimal-theme{--font-ui-small:"+this.settings.textSmall+"px;--line-height:"+this.settings.lineHeight+";--line-width:"+this.settings.lineWidth+"rem;--line-width-wide:"+this.settings.lineWidthWide+"rem;--max-width:"+this.settings.maxWidth+"%;--font-editor-override:"+this.settings.editorFont+";";else throw"minimal-theme element not found!"}updateDarkStyle(){document.body.removeClass("theme-light","minimal-dark","minimal-dark-tonal","minimal-dark-black"),document.body.addClass("theme-dark",this.settings.darkStyle),this.app.vault.getConfig("theme")!=="system"&&(this.app.setTheme("obsidian"),this.app.vault.setConfig("theme","obsidian")),this.app.workspace.trigger("css-change")}updateLightStyle(){document.body.removeClass("theme-dark","minimal-light","minimal-light-tonal","minimal-light-contrast","minimal-light-white"),document.body.addClass("theme-light",this.settings.lightStyle),this.app.vault.getConfig("theme")!=="system"&&(this.app.setTheme("moonstone"),this.app.vault.setConfig("theme","moonstone")),this.app.workspace.trigger("css-change")}updateDarkScheme(){this.removeDarkScheme(),document.body.addClass(this.settings.darkScheme)}updateLightScheme(){this.removeLightScheme(),document.body.addClass(this.settings.lightScheme)}updateTheme(){if(this.app.vault.getConfig("theme")==="system")document.body.classList.contains("theme-light")?(document.body.removeClass("theme-light"),document.body.addClass("theme-dark")):(document.body.removeClass("theme-dark"),document.body.addClass("theme-light"));else{document.body.classList.contains("theme-light")?(document.body.removeClass("theme-light"),document.body.addClass("theme-dark")):(document.body.removeClass("theme-dark"),document.body.addClass("theme-light"));let s=this.app.vault.getConfig("theme")==="moonstone"?"obsidian":"moonstone";this.app.setTheme(s),this.app.vault.setConfig("theme",s)}this.app.workspace.trigger("css-change")}removeSettings(){document.body.removeClass("borders-none","colorful-headings","colorful-frame","colorful-active","minimal-focus-mode","links-int-on","links-ext-on","full-width-media","img-grid","minimal-dev-block-width","minimal-status-off","full-file-names","labeled-nav","minimal-folding"),document.body.removeClass("table-wide","table-max","table-100","table-default-width","iframe-wide","iframe-max","iframe-100","iframe-default-width","img-wide","img-max","img-100","img-default-width","chart-wide","chart-max","chart-100","chart-default-width","map-wide","map-max","map-100","map-default-width")}removeStyle(){document.body.removeClass("minimal-light","minimal-light-tonal","minimal-light-contrast","minimal-light-white","minimal-dark","minimal-dark-tonal","minimal-dark-black")}removeDarkScheme(){document.body.removeClass("minimal-atom-dark","minimal-ayu-dark","minimal-catppuccin-dark","minimal-default-dark","minimal-dracula-dark","minimal-eink-dark","minimal-everforest-dark","minimal-flexoki-dark","minimal-gruvbox-dark","minimal-macos-dark","minimal-nord-dark","minimal-notion-dark","minimal-rose-pine-dark","minimal-solarized-dark","minimal-things-dark")}removeLightScheme(){document.body.removeClass("minimal-atom-light","minimal-ayu-light","minimal-catppuccin-light","minimal-default-light","minimal-eink-light","minimal-everforest-light","minimal-flexoki-light","minimal-gruvbox-light","minimal-macos-light","minimal-nord-light","minimal-notion-light","minimal-rose-pine-light","minimal-solarized-light","minimal-things-light")}}; 7 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-minimal-settings/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-minimal-settings", 3 | "name": "Minimal Theme Settings", 4 | "version": "8.1.1", 5 | "minAppVersion": "1.1.9", 6 | "description": "Change the colors, fonts and features of Minimal Theme.", 7 | "author": "@kepano", 8 | "authorUrl": "https://www.twitter.com/kepano", 9 | "fundingUrl": "https://www.buymeacoffee.com/kepano", 10 | "isDesktopOnly": false 11 | } -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-outliner/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "styleLists": false, 3 | "debug": false, 4 | "stickCursor": "bullet-and-checkbox", 5 | "betterEnter": false, 6 | "betterTab": false, 7 | "selectAll": true, 8 | "listLines": false, 9 | "listLineAction": "toggle-folding", 10 | "dnd": true, 11 | "previousRelease": null 12 | } -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-outliner/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-outliner", 3 | "name": "Outliner", 4 | "version": "4.9.0", 5 | "minAppVersion": "1.8.7", 6 | "description": "Work with your lists like in Workflowy or RoamResearch.", 7 | "author": "Viacheslav Slinko", 8 | "authorUrl": "https://github.com/vslinko", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-outliner/styles.css: -------------------------------------------------------------------------------- 1 | /* lists and bullets */ 2 | .outliner-plugin-better-lists .cm-s-obsidian .HyperMD-list-line { 3 | /* padding-top: 0.4em; */ 4 | } 5 | 6 | .outliner-plugin-better-lists .cm-formatting-list-ul { 7 | margin-right: 0.3em; 8 | } 9 | 10 | .outliner-plugin-better-lists .list-bullet::after { 11 | width: 0.4em; 12 | height: 0.4em; 13 | background-color: var(--text-muted); 14 | } 15 | 16 | /* lines */ 17 | .outliner-plugin-list-lines-scroller { 18 | position: absolute; 19 | top: 0; 20 | right: 0; 21 | bottom: 0; 22 | left: 0; 23 | padding: var(--file-margins); 24 | padding-left: 0; 25 | pointer-events: none; 26 | overflow: hidden; 27 | } 28 | 29 | .outliner-plugin-list-lines-content-container { 30 | position: relative; 31 | } 32 | 33 | .outliner-plugin-list-line { 34 | pointer-events: auto; 35 | position: absolute; 36 | width: 5px; 37 | margin-left: 0.5ch; 38 | margin-top: 1em; 39 | z-index: 1; 40 | cursor: pointer; 41 | background: transparent; 42 | background-image: linear-gradient( 43 | to right, 44 | var(--text-faint) 1px, 45 | transparent 1px 46 | ); 47 | background-position-x: 2px; 48 | background-repeat: no-repeat; 49 | } 50 | 51 | .outliner-plugin-better-bullets .outliner-plugin-list-line { 52 | margin-top: 1.4em; 53 | } 54 | 55 | .markdown-source-view.mod-cm6.is-readable-line-width 56 | .outliner-plugin-list-lines-content-container { 57 | max-width: 700px; 58 | margin: auto; 59 | } 60 | 61 | .outliner-plugin-list-line:hover { 62 | background: var(--text-faint); 63 | } 64 | 65 | .outliner-plugin-vertical-lines 66 | .markdown-source-view.mod-cm6 67 | .cm-hmd-list-indent 68 | .cm-indent::before { 69 | content: none; 70 | } 71 | 72 | /* drag-n-drop */ 73 | .outliner-plugin-dropping-line { 74 | background-color: hsla(var(--interactive-accent-hsl), 0.4); 75 | } 76 | 77 | .outliner-plugin-dragging-line { 78 | opacity: 0.5; 79 | background-color: hsla(var(--interactive-accent-hsl), 0.2); 80 | } 81 | 82 | .outliner-plugin-drop-zone { 83 | width: 300px; 84 | height: 4px; 85 | background: var(--color-accent); 86 | z-index: 999; 87 | position: absolute; 88 | pointer-events: none; 89 | } 90 | 91 | .outliner-plugin-drop-zone-padding { 92 | position: absolute; 93 | height: 4px; 94 | } 95 | 96 | body.outliner-plugin-dnd:not(.outliner-plugin-dragging) .cm-formatting-list, 97 | body.outliner-plugin-dnd:not(.outliner-plugin-dragging) 98 | .cm-fold-indicator 99 | .collapse-indicator { 100 | cursor: grab !important; 101 | } 102 | 103 | html body.outliner-plugin-dnd.outliner-plugin-dragging { 104 | cursor: grabbing !important; 105 | } 106 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-style-settings/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "minimal-style@@h1-size": "2em", 3 | "minimal-style@@h2-size": "1.6em", 4 | "minimal-style@@h2-l": true, 5 | "minimal-style@@h3-size": "1.4em", 6 | "minimal-style@@h3-l": true, 7 | "minimal-style@@h4-size": "1.2em", 8 | "minimal-style@@h4-l": true, 9 | "minimal-style@@metadata-heading-off": true, 10 | "minimal-style@@metadata-add-property-off": true, 11 | "minimal-style@@inline-title-size": "2em", 12 | "minimal-style@@hide-help": true 13 | } -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-style-settings/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "obsidian-style-settings", 3 | "name": "Style Settings", 4 | "version": "1.0.9", 5 | "minAppVersion": "0.11.5", 6 | "description": "Offers controls for adjusting theme, plugin, and snippet CSS variables.", 7 | "author": "mgmeyers", 8 | "authorUrl": "https://github.com/mgmeyers/obsidian-style-settings", 9 | "isDesktopOnly": false 10 | } 11 | -------------------------------------------------------------------------------- /.obsidian/plugins/obsidian-style-settings/styles.css: -------------------------------------------------------------------------------- 1 | .style-settings-heading { 2 | cursor: pointer; 3 | margin-bottom: 18px; 4 | padding-bottom: 6px; 5 | border-bottom: 1px solid var(--background-modifier-border); 6 | } 7 | 8 | .style-settings-heading[data-level="0"] { 9 | margin-bottom: 26px; 10 | } 11 | 12 | .style-settings-container { 13 | padding-bottom: 16px; 14 | } 15 | 16 | .style-settings-heading[data-level="0"] + .style-settings-container { 17 | padding-left: 34px; 18 | } 19 | 20 | .style-settings-heading.is-collapsed { 21 | margin-bottom: 0; 22 | } 23 | 24 | .style-settings-heading.is-collapsed + .style-settings-container { 25 | display: none; 26 | } 27 | 28 | .style-settings-collapse-indicator { 29 | color: var(--text-faint); 30 | display: inline-block; 31 | margin-right: 8px; 32 | position: relative; 33 | top: -1px; 34 | } 35 | 36 | .style-settings-heading[data-level="0"] 37 | + .style-settings-container 38 | .style-settings-collapse-indicator { 39 | margin-left: -17px; 40 | } 41 | 42 | .style-settings-collapse-indicator > svg { 43 | height: 9px; 44 | width: 9px; 45 | } 46 | 47 | .style-settings-heading.is-collapsed .style-settings-collapse-indicator > svg { 48 | transform: rotate(-90deg); 49 | } 50 | 51 | .style-settings-filter-result-count { 52 | color: var(--text-faint); 53 | line-height: var(--line-height-tight); 54 | margin-inline: var(--size-4-2); 55 | } 56 | 57 | .style-settings-error { 58 | font-size: 14px; 59 | border-radius: 6px; 60 | background: rgba(var(--background-modifier-error-rgb), 0.2); 61 | color: var(--text-error); 62 | padding: 10px; 63 | margin-bottom: 1rem; 64 | } 65 | 66 | .style-settings-error-name { 67 | font-weight: bold; 68 | margin-bottom: 5px; 69 | } 70 | 71 | .style-settings-error-desc { 72 | white-space: pre; 73 | } 74 | 75 | .style-settings-empty { 76 | font-size: 14px; 77 | background: var(--background-secondary); 78 | padding: 10px; 79 | } 80 | 81 | .style-settings-empty-name { 82 | font-weight: bold; 83 | margin-bottom: 5px; 84 | } 85 | 86 | .style-settings-import-input { 87 | width: 0.1px; 88 | height: 0.1px; 89 | opacity: 0; 90 | overflow: hidden; 91 | position: absolute; 92 | z-index: -1; 93 | } 94 | 95 | .style-settings-import-label { 96 | cursor: pointer; 97 | color: var(--text-accent); 98 | text-decoration: underline; 99 | } 100 | 101 | .style-settings-import-label:hover { 102 | color: var(--text-accent-hover); 103 | } 104 | 105 | .style-settings-export, 106 | .style-settings-import { 107 | display: inline-block; 108 | margin-right: 10px; 109 | } 110 | 111 | .style-settings-copy, 112 | .style-settings-download { 113 | position: relative; 114 | display: inline-block; 115 | margin-left: 10px; 116 | } 117 | 118 | .style-settings-copy:before { 119 | color: var(--interactive-success); 120 | content: "✓"; 121 | position: absolute; 122 | left: -18px; 123 | font-weight: bold; 124 | opacity: 0; 125 | transition: 150ms opacity ease-in-out; 126 | } 127 | 128 | .style-settings-copy.success:before { 129 | opacity: 1; 130 | } 131 | 132 | .modal-style-settings { 133 | height: 70vh; 134 | display: flex; 135 | flex-direction: column; 136 | } 137 | 138 | .modal-style-settings .modal-content { 139 | flex-grow: 1; 140 | margin: 0; 141 | display: flex; 142 | flex-direction: column; 143 | } 144 | 145 | .modal-style-settings textarea { 146 | display: block; 147 | width: 100%; 148 | height: 100%; 149 | font-family: var(--font-monospace) !important; 150 | font-size: 12px; 151 | white-space: pre; 152 | overflow-wrap: normal; 153 | overflow-x: scroll; 154 | margin-bottom: 5px; 155 | } 156 | 157 | .modal-style-settings .setting-item { 158 | align-items: flex-start; 159 | } 160 | 161 | .modal-style-settings button { 162 | margin: 10px 0 0; 163 | } 164 | 165 | .style-settings-import-error { 166 | display: none; 167 | color: var(--text-error); 168 | } 169 | 170 | .style-settings-import-error.active { 171 | display: block; 172 | } 173 | 174 | .view-content .style-settings-container .setting-item:not(.setting-item-heading) { 175 | flex-direction: column; 176 | align-items: flex-start; 177 | } 178 | 179 | .view-content .style-settings-container .setting-item:not(.setting-item-heading) .setting-item-control { 180 | padding-top: 0.5em; 181 | } 182 | 183 | .view-content .style-settings-container .setting-item:not(.setting-item-heading) .themed-color-wrapper { 184 | display: flex; 185 | } 186 | 187 | .style-settings-ref { 188 | position: absolute; 189 | width: 0 !important; 190 | height: 0 !important; 191 | pointer-events: none; 192 | } 193 | 194 | .style-settings-info-text .style-settings-markdown :first-child { 195 | margin-top: 0; 196 | } 197 | 198 | .style-settings-info-text .style-settings-markdown :last-child { 199 | margin-bottom: 0; 200 | }.style-settings-container .pcr-app { 201 | display: none; 202 | } 203 | 204 | .style-settings-container .pcr-app.visible { 205 | display: flex; 206 | } 207 | 208 | .pcr-app .pcr-swatches > button { 209 | padding: 0; 210 | } 211 | 212 | .pickr .pcr-button { 213 | margin-right: 0; 214 | } 215 | 216 | .themed-color-wrapper > div { 217 | background: var(--background-primary); 218 | padding: 10px; 219 | display: flex; 220 | align-items: center; 221 | border-radius: 4px; 222 | } 223 | 224 | .themed-color-wrapper > div + div { 225 | margin-top: 6px; 226 | } 227 | 228 | .themed-color-wrapper button { 229 | display: block; 230 | } 231 | 232 | .themed-color-wrapper .pickr-reset > button { 233 | margin: 0 0 0 10px; 234 | padding: 9px; 235 | line-height: 1; 236 | } 237 | 238 | .themed-color-wrapper .pickr-reset > button > svg { 239 | display: block; 240 | } 241 | /*! Pickr 1.8.4 MIT | https://github.com/Simonwep/pickr */ 242 | .pickr{position:relative;overflow:visible;transform:translateY(0)}.pickr *{box-sizing:border-box;outline:none;border:none;-webkit-appearance:none}.pickr .pcr-button{position:relative;height:2em;width:2em;padding:0.5em;cursor:pointer;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Helvetica Neue",Arial,sans-serif;border-radius:.15em;background:url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" stroke="%2342445A" stroke-width="5px" stroke-linecap="round"><path d="M45,45L5,5"></path><path d="M45,5L5,45"></path></svg>') no-repeat center;background-size:0;transition:all 0.3s}.pickr .pcr-button::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');background-size:.5em;border-radius:.15em;z-index:-1}.pickr .pcr-button::before{z-index:initial}.pickr .pcr-button::after{position:absolute;content:'';top:0;left:0;height:100%;width:100%;transition:background 0.3s;background:var(--pcr-color);border-radius:.15em}.pickr .pcr-button.clear{background-size:70%}.pickr .pcr-button.clear::before{opacity:0}.pickr .pcr-button.clear:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px var(--pcr-color)}.pickr .pcr-button.disabled{cursor:not-allowed}.pickr *,.pcr-app *{box-sizing:border-box;outline:none;border:none;-webkit-appearance:none}.pickr input:focus,.pickr input.pcr-active,.pickr button:focus,.pickr button.pcr-active,.pcr-app input:focus,.pcr-app input.pcr-active,.pcr-app button:focus,.pcr-app button.pcr-active{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px var(--pcr-color)}.pickr .pcr-palette,.pickr .pcr-slider,.pcr-app .pcr-palette,.pcr-app .pcr-slider{transition:box-shadow 0.3s}.pickr .pcr-palette:focus,.pickr .pcr-slider:focus,.pcr-app .pcr-palette:focus,.pcr-app .pcr-slider:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px rgba(0,0,0,0.25)}.pcr-app{position:fixed;display:flex;flex-direction:column;z-index:10000;border-radius:0.1em;background:#fff;opacity:0;visibility:hidden;transition:opacity 0.3s, visibility 0s 0.3s;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Helvetica Neue",Arial,sans-serif;box-shadow:0 0.15em 1.5em 0 rgba(0,0,0,0.1),0 0 1em 0 rgba(0,0,0,0.03);left:0;top:0}.pcr-app.visible{transition:opacity 0.3s;visibility:visible;opacity:1}.pcr-app .pcr-swatches{display:flex;flex-wrap:wrap;margin-top:0.75em}.pcr-app .pcr-swatches.pcr-last{margin:0}@supports (display: grid){.pcr-app .pcr-swatches{display:grid;align-items:center;grid-template-columns:repeat(auto-fit, 1.75em)}}.pcr-app .pcr-swatches>button{font-size:1em;position:relative;width:calc(1.75em - 5px);height:calc(1.75em - 5px);border-radius:0.15em;cursor:pointer;margin:2.5px;flex-shrink:0;justify-self:center;transition:all 0.15s;overflow:hidden;background:transparent;z-index:1}.pcr-app .pcr-swatches>button::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');background-size:6px;border-radius:.15em;z-index:-1}.pcr-app .pcr-swatches>button::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background:var(--pcr-color);border:1px solid rgba(0,0,0,0.05);border-radius:0.15em;box-sizing:border-box}.pcr-app .pcr-swatches>button:hover{filter:brightness(1.05)}.pcr-app .pcr-swatches>button:not(.pcr-active){box-shadow:none}.pcr-app .pcr-interaction{display:flex;flex-wrap:wrap;align-items:center;margin:0 -0.2em 0 -0.2em}.pcr-app .pcr-interaction>*{margin:0 0.2em}.pcr-app .pcr-interaction input{letter-spacing:0.07em;font-size:0.75em;text-align:center;cursor:pointer;color:#75797e;background:#f1f3f4;border-radius:.15em;transition:all 0.15s;padding:0.45em 0.5em;margin-top:0.75em}.pcr-app .pcr-interaction input:hover{filter:brightness(0.975)}.pcr-app .pcr-interaction input:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px rgba(66,133,244,0.75)}.pcr-app .pcr-interaction .pcr-result{color:#75797e;text-align:left;flex:1 1 8em;min-width:8em;transition:all 0.2s;border-radius:.15em;background:#f1f3f4;cursor:text}.pcr-app .pcr-interaction .pcr-result::-moz-selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-result::selection{background:#4285f4;color:#fff}.pcr-app .pcr-interaction .pcr-type.active{color:#fff;background:#4285f4}.pcr-app .pcr-interaction .pcr-save,.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear{color:#fff;width:auto}.pcr-app .pcr-interaction .pcr-save,.pcr-app .pcr-interaction .pcr-cancel,.pcr-app .pcr-interaction .pcr-clear{color:#fff}.pcr-app .pcr-interaction .pcr-save:hover,.pcr-app .pcr-interaction .pcr-cancel:hover,.pcr-app .pcr-interaction .pcr-clear:hover{filter:brightness(0.925)}.pcr-app .pcr-interaction .pcr-save{background:#4285f4}.pcr-app .pcr-interaction .pcr-clear,.pcr-app .pcr-interaction .pcr-cancel{background:#f44250}.pcr-app .pcr-interaction .pcr-clear:focus,.pcr-app .pcr-interaction .pcr-cancel:focus{box-shadow:0 0 0 1px rgba(255,255,255,0.85),0 0 0 3px rgba(244,66,80,0.75)}.pcr-app .pcr-selection .pcr-picker{position:absolute;height:18px;width:18px;border:2px solid #fff;border-radius:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pcr-app .pcr-selection .pcr-color-palette,.pcr-app .pcr-selection .pcr-color-chooser,.pcr-app .pcr-selection .pcr-color-opacity{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-direction:column;cursor:grab;cursor:-webkit-grab}.pcr-app .pcr-selection .pcr-color-palette:active,.pcr-app .pcr-selection .pcr-color-chooser:active,.pcr-app .pcr-selection .pcr-color-opacity:active{cursor:grabbing;cursor:-webkit-grabbing}.pcr-app[data-theme='nano']{width:14.25em;max-width:95vw}.pcr-app[data-theme='nano'] .pcr-swatches{margin-top:.6em;padding:0 .6em}.pcr-app[data-theme='nano'] .pcr-interaction{padding:0 .6em .6em .6em}.pcr-app[data-theme='nano'] .pcr-selection{display:grid;grid-gap:.6em;grid-template-columns:1fr 4fr;grid-template-rows:5fr auto auto;align-items:center;height:10.5em;width:100%;align-self:flex-start}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview{grid-area:2 / 1 / 4 / 1;height:100%;width:100%;display:flex;flex-direction:row;justify-content:center;margin-left:.6em}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview .pcr-last-color{display:none}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview .pcr-current-color{position:relative;background:var(--pcr-color);width:2em;height:2em;border-radius:50em;overflow:hidden}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-preview .pcr-current-color::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-palette{grid-area:1 / 1 / 2 / 3;width:100%;height:100%;z-index:1}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-palette .pcr-palette{border-radius:.15em;width:100%;height:100%}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-palette .pcr-palette::before{position:absolute;content:'';top:0;left:0;width:100%;height:100%;background:url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');background-size:.5em;border-radius:.15em;z-index:-1}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser{grid-area:2 / 2 / 2 / 2}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity{grid-area:3 / 2 / 3 / 2}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser,.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity{height:0.5em;margin:0 .6em}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser .pcr-picker,.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity .pcr-picker{top:50%;transform:translateY(-50%)}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser .pcr-slider,.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity .pcr-slider{flex-grow:1;border-radius:50em}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-chooser .pcr-slider{background:linear-gradient(to right, red, #ff0, lime, cyan, blue, #f0f, red)}.pcr-app[data-theme='nano'] .pcr-selection .pcr-color-opacity .pcr-slider{background:linear-gradient(to right, transparent, black),url('data:image/svg+xml;utf8, <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="white" d="M1,0H2V1H1V0ZM0,1H1V2H0V1Z"/><path fill="gray" d="M0,0H1V1H0V0ZM1,1H2V2H1V1Z"/></svg>');background-size:100%, 0.25em} 243 | 244 | -------------------------------------------------------------------------------- /.obsidian/plugins/templater-obsidian/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "command_timeout": 5, 3 | "templates_folder": "00_templates", 4 | "templates_pairs": [ 5 | [ 6 | "", 7 | "" 8 | ] 9 | ], 10 | "trigger_on_file_creation": true, 11 | "auto_jump_to_cursor": false, 12 | "enable_system_commands": false, 13 | "shell_path": "", 14 | "user_scripts_folder": "", 15 | "enable_folder_templates": true, 16 | "folder_templates": [ 17 | { 18 | "folder": "02_notes", 19 | "template": "00_templates/02_note.md" 20 | } 21 | ], 22 | "syntax_highlighting": true, 23 | "syntax_highlighting_mobile": true, 24 | "enabled_templates_hotkeys": [ 25 | "00_templates/10_current_time.md" 26 | ], 27 | "startup_templates": [] 28 | } -------------------------------------------------------------------------------- /.obsidian/plugins/templater-obsidian/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "templater-obsidian", 3 | "name": "Templater", 4 | "version": "2.11.1", 5 | "description": "Create and use templates", 6 | "minAppVersion": "1.5.0", 7 | "author": "SilentVoid", 8 | "authorUrl": "https://github.com/SilentVoid13", 9 | "helpUrl": "https://silentvoid13.github.io/Templater/", 10 | "isDesktopOnly": false 11 | } 12 | -------------------------------------------------------------------------------- /.obsidian/plugins/templater-obsidian/styles.css: -------------------------------------------------------------------------------- 1 | .templater_search { 2 | width: calc(100% - 20px); 3 | } 4 | 5 | .templater_div { 6 | border-top: 1px solid var(--background-modifier-border); 7 | } 8 | 9 | .templater_div > .setting-item { 10 | border-top: none !important; 11 | align-self: center; 12 | } 13 | 14 | .templater_div > .setting-item > .setting-item-control { 15 | justify-content: space-around; 16 | padding: 0; 17 | width: 100%; 18 | } 19 | 20 | .templater_div 21 | > .setting-item 22 | > .setting-item-control 23 | > .setting-editor-extra-setting-button { 24 | align-self: center; 25 | } 26 | 27 | .templater_donating { 28 | margin: 10px; 29 | } 30 | 31 | .templater_title { 32 | margin: 0; 33 | padding: 0; 34 | margin-top: 5px; 35 | text-align: center; 36 | } 37 | 38 | .templater_template { 39 | align-self: center; 40 | margin-left: 5px; 41 | margin-right: 5px; 42 | width: 70%; 43 | } 44 | 45 | .templater_cmd { 46 | margin-left: 5px; 47 | margin-right: 5px; 48 | font-size: 14px; 49 | width: 100%; 50 | } 51 | 52 | .templater_div2 > .setting-item { 53 | align-content: center; 54 | justify-content: center; 55 | } 56 | 57 | .templater-prompt-div { 58 | display: flex; 59 | } 60 | 61 | .templater-prompt-form { 62 | display: flex; 63 | flex-grow: 1; 64 | } 65 | 66 | .templater-prompt-input { 67 | flex-grow: 1; 68 | } 69 | 70 | .templater-button-div { 71 | display: flex; 72 | flex-direction: column; 73 | align-items: center; 74 | margin-top: 1rem; 75 | } 76 | 77 | textarea.templater-prompt-input { 78 | height: 10rem; 79 | } 80 | 81 | textarea.templater-prompt-input:focus { 82 | border-color: var(--interactive-accent); 83 | } 84 | 85 | .cm-s-obsidian .templater-command-bg { 86 | left: 0px; 87 | right: 0px; 88 | background-color: var(--background-primary-alt); 89 | } 90 | 91 | .cm-s-obsidian .cm-templater-command { 92 | font-size: 0.85em; 93 | font-family: var(--font-monospace); 94 | line-height: 1.3; 95 | } 96 | 97 | .cm-s-obsidian .templater-inline .cm-templater-command { 98 | background-color: var(--background-primary-alt); 99 | } 100 | 101 | .cm-s-obsidian .cm-templater-command.cm-templater-opening-tag { 102 | font-weight: bold; 103 | } 104 | 105 | .cm-s-obsidian .cm-templater-command.cm-templater-closing-tag { 106 | font-weight: bold; 107 | } 108 | 109 | .cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag { 110 | color: var(--code-property, #008bff); 111 | } 112 | 113 | .cm-s-obsidian .cm-templater-command.cm-templater-execution-tag { 114 | color: var(--code-function, #c0d700); 115 | } 116 | 117 | .cm-s-obsidian .cm-templater-command.cm-keyword { 118 | color: var(--code-keyword, #00a7aa); 119 | font-weight: normal; 120 | } 121 | 122 | .cm-s-obsidian .cm-templater-command.cm-atom { 123 | color: var(--code-normal, #f39b35); 124 | } 125 | 126 | .cm-s-obsidian .cm-templater-command.cm-value, 127 | .cm-s-obsidian .cm-templater-command.cm-number, 128 | .cm-s-obsidian .cm-templater-command.cm-type { 129 | color: var(--code-value, #a06fca); 130 | } 131 | 132 | .cm-s-obsidian .cm-templater-command.cm-def, 133 | .cm-s-obsidian .cm-templater-command.cm-type.cm-def { 134 | color: var(--code-normal, var(--text-normal)); 135 | } 136 | 137 | .cm-s-obsidian .cm-templater-command.cm-property, 138 | .cm-s-obsidian .cm-templater-command.cm-property.cm-def, 139 | .cm-s-obsidian .cm-templater-command.cm-attribute { 140 | color: var(--code-function, #98e342); 141 | } 142 | 143 | .cm-s-obsidian .cm-templater-command.cm-variable, 144 | .cm-s-obsidian .cm-templater-command.cm-variable-2, 145 | .cm-s-obsidian .cm-templater-command.cm-variable-3, 146 | .cm-s-obsidian .cm-templater-command.cm-meta { 147 | color: var(--code-property, #d4d4d4); 148 | } 149 | 150 | .cm-s-obsidian .cm-templater-command.cm-callee, 151 | .cm-s-obsidian .cm-templater-command.cm-operator, 152 | .cm-s-obsidian .cm-templater-command.cm-qualifier, 153 | .cm-s-obsidian .cm-templater-command.cm-builtin { 154 | color: var(--code-operator, #fc4384); 155 | } 156 | 157 | .cm-s-obsidian .cm-templater-command.cm-tag { 158 | color: var(--code-tag, #fc4384); 159 | } 160 | 161 | .cm-s-obsidian .cm-templater-command.cm-comment, 162 | .cm-s-obsidian .cm-templater-command.cm-comment.cm-tag, 163 | .cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute { 164 | color: var(--code-comment, #696d70); 165 | } 166 | 167 | .cm-s-obsidian .cm-templater-command.cm-string, 168 | .cm-s-obsidian .cm-templater-command.cm-string-2 { 169 | color: var(--code-string, #e6db74); 170 | } 171 | 172 | .cm-s-obsidian .cm-templater-command.cm-header, 173 | .cm-s-obsidian .cm-templater-command.cm-hr { 174 | color: var(--code-keyword, #da7dae); 175 | } 176 | 177 | .cm-s-obsidian .cm-templater-command.cm-link { 178 | color: var(--code-normal, #696d70); 179 | } 180 | 181 | .cm-s-obsidian .cm-templater-command.cm-error { 182 | border-bottom: 1px solid #c42412; 183 | } 184 | 185 | .CodeMirror-hints { 186 | position: absolute; 187 | z-index: 10; 188 | overflow: hidden; 189 | list-style: none; 190 | 191 | margin: 0; 192 | padding: 2px; 193 | 194 | -webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2); 195 | -moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2); 196 | box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2); 197 | border-radius: 3px; 198 | border: 1px solid silver; 199 | 200 | background: white; 201 | font-size: 90%; 202 | font-family: monospace; 203 | 204 | max-height: 20em; 205 | overflow-y: auto; 206 | } 207 | 208 | .CodeMirror-hint { 209 | margin: 0; 210 | padding: 0 4px; 211 | border-radius: 2px; 212 | white-space: pre; 213 | color: black; 214 | cursor: pointer; 215 | } 216 | 217 | li.CodeMirror-hint-active { 218 | background: #08f; 219 | color: white; 220 | } 221 | -------------------------------------------------------------------------------- /.obsidian/themes/Minimal/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Minimal", 3 | "version": "7.7.19", 4 | "minAppVersion": "1.6.1", 5 | "author": "@kepano", 6 | "authorUrl": "https://twitter.com/kepano", 7 | "fundingUrl": "https://www.buymeacoffee.com/kepano" 8 | } 9 | -------------------------------------------------------------------------------- /.obsidian/workspaces.json: -------------------------------------------------------------------------------- 1 | { 2 | "workspaces": { 3 | "default": { 4 | "main": { 5 | "id": "4f2dedffcb7babec", 6 | "type": "split", 7 | "children": [ 8 | { 9 | "id": "03bb6189dcf7bedc", 10 | "type": "tabs", 11 | "children": [ 12 | { 13 | "id": "6e2175e4f9190ac5", 14 | "type": "leaf", 15 | "pinned": true, 16 | "state": { 17 | "type": "markdown", 18 | "state": { 19 | "file": "05_dataview/00_all_by_updated_desc.md", 20 | "mode": "source", 21 | "backlinks": false, 22 | "source": false 23 | }, 24 | "pinned": true, 25 | "icon": "lucide-file", 26 | "title": "00_all_by_updated_desc" 27 | } 28 | }, 29 | { 30 | "id": "3fc6bb0e8e5a084a", 31 | "type": "leaf", 32 | "pinned": true, 33 | "state": { 34 | "type": "graph", 35 | "state": {}, 36 | "pinned": true, 37 | "icon": "lucide-git-fork", 38 | "title": "グラフビュー" 39 | } 40 | } 41 | ], 42 | "currentTab": 1 43 | } 44 | ], 45 | "direction": "vertical" 46 | }, 47 | "left": { 48 | "id": "9b8f7349c4be646b", 49 | "type": "split", 50 | "children": [ 51 | { 52 | "id": "fb81e9a5bb533dc6", 53 | "type": "tabs", 54 | "dimension": 24.520255863539443, 55 | "children": [ 56 | { 57 | "id": "f2a3e2439cb34eab", 58 | "type": "leaf", 59 | "state": { 60 | "type": "file-explorer", 61 | "state": { 62 | "sortOrder": "alphabetical" 63 | }, 64 | "icon": "lucide-folder-closed", 65 | "title": "ファイルエクスプローラ" 66 | } 67 | } 68 | ] 69 | }, 70 | { 71 | "id": "9398d9c402675aea", 72 | "type": "tabs", 73 | "dimension": 75.47974413646055, 74 | "children": [ 75 | { 76 | "id": "60ab1460e0a6f793", 77 | "type": "leaf", 78 | "state": { 79 | "type": "git-history-view", 80 | "state": {}, 81 | "icon": "history", 82 | "title": "History" 83 | } 84 | }, 85 | { 86 | "id": "d4c1c8bdaec2b9ce", 87 | "type": "leaf", 88 | "state": { 89 | "type": "git-view", 90 | "state": {}, 91 | "icon": "git-pull-request", 92 | "title": "Source Control" 93 | } 94 | } 95 | ] 96 | } 97 | ], 98 | "direction": "horizontal", 99 | "width": 291.5 100 | }, 101 | "right": { 102 | "id": "3b8c3cad91b8fd5d", 103 | "type": "split", 104 | "children": [ 105 | { 106 | "id": "2f07cd6754ee3e10", 107 | "type": "tabs", 108 | "dimension": 64.58752515090544, 109 | "children": [ 110 | { 111 | "id": "d3ceec7114c16dee", 112 | "type": "leaf", 113 | "state": { 114 | "type": "outgoing-link", 115 | "state": { 116 | "linksCollapsed": false, 117 | "unlinkedCollapsed": false 118 | }, 119 | "icon": "links-going-out", 120 | "title": "アウトゴーイングリンク" 121 | } 122 | }, 123 | { 124 | "id": "1d9032e6d9b31efb", 125 | "type": "leaf", 126 | "state": { 127 | "type": "backlink", 128 | "state": { 129 | "collapseAll": false, 130 | "extraContext": false, 131 | "sortOrder": "alphabetical", 132 | "showSearch": false, 133 | "searchQuery": "", 134 | "backlinkCollapsed": false, 135 | "unlinkedCollapsed": false 136 | }, 137 | "icon": "links-coming-in", 138 | "title": "バックリンク" 139 | } 140 | }, 141 | { 142 | "id": "0241c411ee7ba555", 143 | "type": "leaf", 144 | "state": { 145 | "type": "outline", 146 | "state": {}, 147 | "icon": "lucide-list", 148 | "title": "アウトライン" 149 | } 150 | }, 151 | { 152 | "id": "020433e299f4cbda", 153 | "type": "leaf", 154 | "state": { 155 | "type": "search", 156 | "state": { 157 | "query": "", 158 | "matchingCase": false, 159 | "explainSearch": false, 160 | "collapseAll": false, 161 | "extraContext": false, 162 | "sortOrder": "alphabetical" 163 | }, 164 | "icon": "lucide-search", 165 | "title": "検索" 166 | } 167 | } 168 | ], 169 | "currentTab": 3 170 | }, 171 | { 172 | "id": "ba2ef338343b38e7", 173 | "type": "tabs", 174 | "dimension": 35.412474849094565, 175 | "children": [ 176 | { 177 | "id": "beef9903c7a71599", 178 | "type": "leaf", 179 | "state": { 180 | "type": "calendar", 181 | "state": {}, 182 | "icon": "calendar-with-checkmark", 183 | "title": "Calendar" 184 | } 185 | } 186 | ] 187 | } 188 | ], 189 | "direction": "horizontal", 190 | "width": 300 191 | }, 192 | "left-ribbon": { 193 | "hiddenItems": { 194 | "workspaces:ワークスペースレイアウトを管理": false, 195 | "switcher:クイックスイッチャーを開く": true, 196 | "graph:グラフビューを開く": false, 197 | "canvas:新規キャンバスを作成": true, 198 | "command-palette:コマンドパレットを開く": false, 199 | "templater-obsidian:Templater": true, 200 | "daily-notes:今日のデイリーノートを開く": false, 201 | "obsidian-git:Open Git source control": true 202 | } 203 | }, 204 | "active": "020433e299f4cbda", 205 | "mtime": "2024-12-02T19:21:17+09:00" 206 | } 207 | }, 208 | "active": "default" 209 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "mhutchie.git-graph", 4 | "hediet.vscode-drawio" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /00_templates/01_diary.md: -------------------------------------------------------------------------------- 1 | --- 2 | tags: 3 | - diary 4 | --- 5 | > [!IMPORTANT] 6 | > このテンプレート[[01_diary]]の内容(TODOやTimeline)はサンプルです。 7 | > ご自分にとって使いやすいように編集してください。 8 | 9 | ## TODO 10 | 11 | - [ ] task A 12 | - [ ] task B 13 | 14 | ## Timeline 15 | -------------------------------------------------------------------------------- /00_templates/02_note.md: -------------------------------------------------------------------------------- 1 | --- 2 | tags: 3 | - note 4 | --- 5 | > [!IMPORTANT] 6 | > このテンプレート[[02_note]]の内容(見出しNote)はサンプルです。 7 | > ご自分にとって使いやすいように編集してください。 8 | 9 | ## note 10 | <%* 11 | const year = tp.date.now("YYYY"); 12 | const fileName = tp.file.title; 13 | await tp.file.move(`02_notes/${year}/${fileName}`); 14 | %> 15 | -------------------------------------------------------------------------------- /00_templates/10_current_time.md: -------------------------------------------------------------------------------- 1 | ### <% tp.date.now("HH:mm") %> 2 | -------------------------------------------------------------------------------- /01_diary/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amatzk/obsidian-amatzk-template/e604a322762f83685bd29d8d0dc1e43d8ef72ff1/01_diary/.gitkeep -------------------------------------------------------------------------------- /01_diary/2024/2024-09-16.md: -------------------------------------------------------------------------------- 1 | --- 2 | tags: 3 | - diary 4 | --- 5 | note: 日記のサンプルファイル、削除してください 6 | ## TODO 7 | 8 | - [ ] Task A 9 | - [ ] Task B 10 | 11 | ## 時系列の記録 12 | 13 | ### 21:00 14 | 15 | [[SampleNote]]を作成 16 | -------------------------------------------------------------------------------- /02_notes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amatzk/obsidian-amatzk-template/e604a322762f83685bd29d8d0dc1e43d8ef72ff1/02_notes/.gitkeep -------------------------------------------------------------------------------- /02_notes/2024/SampleNote.md: -------------------------------------------------------------------------------- 1 | --- 2 | tags: 3 | - note 4 | --- 5 | note: 本ファイルは 02_notes フォルダをコミットするためのサンプルファイルです。削除してください 6 | 7 | ## Heading 2 8 | 9 | ### Heading 3 10 | 11 | drawioで作成した画像 12 | .pngファイル 13 | ![[sample.png]] 14 | .svgファイル 15 | ![[sample.svg]] 16 | 17 | キャンバス 18 | [[SampleCanvas.canvas]] 19 | -------------------------------------------------------------------------------- /03_assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amatzk/obsidian-amatzk-template/e604a322762f83685bd29d8d0dc1e43d8ef72ff1/03_assets/.gitkeep -------------------------------------------------------------------------------- /03_assets/2024/sample/sample.drawio: -------------------------------------------------------------------------------- 1 | <mxfile host="65bd71144e"> 2 | <diagram id="2HlhxyFN50_vKFgvICUU" name="ページ1"> 3 | <mxGraphModel dx="825" dy="480" grid="1" gridSize="6" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" background="#ffffff" math="0" shadow="0"> 4 | <root> 5 | <mxCell id="0"/> 6 | <mxCell id="1" parent="0"/> 7 | <mxCell id="2" value="<font style="font-size: 20px;">Sample</font>" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1"> 8 | <mxGeometry x="120" y="120" width="160" height="80" as="geometry"/> 9 | </mxCell> 10 | </root> 11 | </mxGraphModel> 12 | </diagram> 13 | </mxfile> 14 | -------------------------------------------------------------------------------- /03_assets/2024/sample/sample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amatzk/obsidian-amatzk-template/e604a322762f83685bd29d8d0dc1e43d8ef72ff1/03_assets/2024/sample/sample.png -------------------------------------------------------------------------------- /03_assets/2024/sample/sample.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="161px" height="81px" viewBox="-0.5 -0.5 161 81" content="<mxfile><diagram id="2HlhxyFN50_vKFgvICUU" name="ページ1">jZNNb4MwDIZ/DcdJhaysO6606y47cdg5AwNRA2YhFNivnyEJH6smLUiQPG/sGNvxWFT2F8Xr4h1TkF6wS3uPnbwgOAR7eo9gMODxsDMgVyI1yF9ALL7BwNDCVqTQbPZpRKlFvYUJVhUkesO4Uthtt2Uot4fWPIc7ECdc3tMPkerC/dXTwt9A5IU72Q+fjfLJk2uusK3seV7AsmkYueTOl01HU/AUuxViZ49FClGbWdlHIMfMuqwZu9c/1DluBZX+j0FgDG5ctuAiDiWZHjMkDxSgHmxSwq8WnfDQTBV7oQ10GhX9uOg0y8dvzMuaTK07CsF4NKL9+9l5MOUMxqh2JHeF0BDXPBnVjjqMWKFLSSt/DEFIGaFENdmybD8+xBut8AorJZyGDXrFzZjjWOfLpvAGSkO/QjZ/F8AStBpoi1NdLYdf627pHD+0rFh1jbsS3DZrPrteCkYTWzO3XHpj0lbXj51/AA==</diagram></mxfile>" style="background-color: rgb(255, 255, 255);"><defs/><g><rect x="0" y="0" width="160" height="80" fill="#f5f5f5" stroke="#666666" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 40px; margin-left: 1px;"><div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 20px;">Sample</font></div></div></div></foreignObject><text x="80" y="44" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Sample</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> -------------------------------------------------------------------------------- /04_canvas/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amatzk/obsidian-amatzk-template/e604a322762f83685bd29d8d0dc1e43d8ef72ff1/04_canvas/.gitkeep -------------------------------------------------------------------------------- /04_canvas/SampleCanvas.canvas: -------------------------------------------------------------------------------- 1 | { 2 | "nodes":[ 3 | {"id":"4d36879dae2ccd21","x":-125,"y":-30,"width":250,"height":60,"type":"text","text":"サンプル"}, 4 | {"id":"48f4006da9e1926c","x":-125,"y":-30,"width":250,"height":60,"type":"text","text":"さんぷる"}, 5 | {"id":"a2b9b96cc863884f","x":-125,"y":-30,"width":250,"height":60,"type":"text","text":""}, 6 | {"id":"dbf48a633707c710","x":-125,"y":-30,"width":250,"height":60,"type":"text","text":"sample 1"}, 7 | {"id":"b55622ea076fe158","x":-125,"y":200,"width":250,"height":60,"type":"text","text":"sample 2"}, 8 | {"id":"397d2cb8e2544c64","x":180,"y":200,"width":250,"height":60,"type":"text","text":"Sample 3"} 9 | ], 10 | "edges":[ 11 | {"id":"04b75f0305f82747","fromNode":"dbf48a633707c710","fromSide":"bottom","toNode":"b55622ea076fe158","toSide":"top"}, 12 | {"id":"d338e40f4e1691bb","fromNode":"dbf48a633707c710","fromSide":"bottom","toNode":"397d2cb8e2544c64","toSide":"top"} 13 | ] 14 | } -------------------------------------------------------------------------------- /05_dataview/00_all_by_filename_asc.md: -------------------------------------------------------------------------------- 1 | ``` dataview 2 | TABLE 3 | dateformat(file.ctime,"yyyy-MM-dd, HH:mm") AS "作成日時", 4 | dateformat(file.mtime,"yyyy-MM-dd, HH:mm") AS "更新日時" 5 | FROM "01_diary" OR "02_notes" 6 | SORT file.filename ASC 7 | ``` 8 | -------------------------------------------------------------------------------- /05_dataview/00_all_by_updated_desc.md: -------------------------------------------------------------------------------- 1 | ``` dataview 2 | TABLE 3 | dateformat(file.ctime,"yyyy-MM-dd, HH:mm") AS "作成日時", 4 | dateformat(file.mtime,"yyyy-MM-dd, HH:mm") AS "更新日時" 5 | FROM "01_diary" OR "02_notes" 6 | SORT file.mtime DESC 7 | ``` 8 | -------------------------------------------------------------------------------- /05_dataview/01_diary_by_filename_asc.md: -------------------------------------------------------------------------------- 1 | ``` dataview 2 | TABLE 3 | dateformat(file.mtime,"yyyy-MM-dd, HH:mm") AS "更新日時" 4 | FROM "01_diary" 5 | SORT file.name ASC 6 | ``` 7 | -------------------------------------------------------------------------------- /05_dataview/01_diary_by_updated_desc.md: -------------------------------------------------------------------------------- 1 | ``` dataview 2 | TABLE 3 | dateformat(file.ctime,"yyyy-MM-dd, HH:mm") AS "作成日時", 4 | dateformat(file.mtime,"yyyy-MM-dd, HH:mm") AS "更新日時" 5 | FROM "01_diary" 6 | SORT file.mtime DESC 7 | ``` 8 | -------------------------------------------------------------------------------- /05_dataview/02_notes_by_filename_asc.md: -------------------------------------------------------------------------------- 1 | ``` dataview 2 | TABLE 3 | dateformat(file.mtime,"yyyy-MM-dd, HH:mm") AS "更新日時" 4 | FROM "02_notes" 5 | SORT file.name ASC 6 | ``` 7 | -------------------------------------------------------------------------------- /05_dataview/02_notes_by_updated_desc.md: -------------------------------------------------------------------------------- 1 | ``` dataview 2 | TABLE 3 | dateformat(file.ctime,"yyyy-MM-dd, HH:mm") AS "作成日時", 4 | dateformat(file.mtime,"yyyy-MM-dd, HH:mm") AS "更新日時" 5 | FROM "02_notes" 6 | SORT file.mtime DESC 7 | ``` 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 amatzk 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # obsidian-amatzk-template 2 | 3 | > [!IMPORTANT] 4 | > このREADMEは、自分のリポジトリを作成したときに削除してください。 5 | 6 | ## コンセプト 7 | 8 | ノートを取ることに集中できる環境。 9 | 認知負荷が低くなるように設計した、シンプルな構成のテンプレートです。 10 | 迷いを生むような、認知負荷を上げる原因となる機能や、視覚的情報をできるだけ削っています。 11 | 12 | ## 設計思想 13 | 14 | このテンプレートは、以下の設計思想に基づいています。 15 | 16 | **ネットワーク構造の情報** 17 | - リンクを使って情報をネットワーク構造で繋ぐ 18 | - Obsidian グラフビュー や Dataview(プラグイン)で、情報の関連性を視覚化および俯瞰する 19 | 20 | **検索による情報アクセス** 21 | - Obsidianの検索機能やVSCodeの検索機能を使用して、情報を見つける 22 | - Googleなどの検索エンジンと同じようなアプローチ 23 | 24 | **シンプルさの維持** 25 | - シンプルなディレクトリ構造 26 | - ディレクトリ構造による分類は、不整合が発生しやすいので避ける 27 | - 年単位のディレクトリによるファイリング 28 | - 日記やノートの新規作成時、自動でファイル配置 29 | - 必要最低限のタグ 30 | - タグ付けによる分類は、認知負荷が大きいので避ける 31 | - 使用するタグは、日記 #diary とノート #note のみ 32 | - 日記やノートの新規作成時、タグの自動付与 33 | 34 | **認知負荷の低減** 35 | - 不要な機能(プラグインや設定)をOFF 36 | - Minimalテーマなどで視覚情報を削る 37 | 38 | ## テンプレートの使い方 39 | 40 | > [!WARNING] 41 | > このテンプレートを使用する際は、必ずプライベートリポジトリとして設定してください。個人情報や機密データの保護は利用者の責任となります。公開リポジトリでの使用は推奨されません。 42 | 43 | 「Use this template」から新規リポジトリを作成した場合は、不要なファイルが含まれているので削除しコミットしてください。 44 | 45 | 削除対象の不要なファイルおよびディレクトリ: 46 | - README.md 47 | - LICENSE 48 | - 01_diary/2024/2024-09-16.md 49 | - 02_notes/2024/SampleNote.md 50 | - 03_assets/2024/sample/ 51 | - 03_assets/2024/sample/sample.drawio 52 | - 03_assets/2024/sample/sample.png 53 | - 03_assets/2024/sample/sample.svg 54 | - 04_canvas/SampleCanvas.canvas 55 | 56 | ## ディレクトリの用途 57 | 58 | - 00_template 59 | - テンプレート 60 | - 01_diary 61 | - 日記 62 | - 02_notes 63 | - ノート 64 | - 03_assets 65 | - .md と .canvas 以外のファイル置き場 66 | - 04_canvas 67 | - .canvas ファイル置き場 68 | - 05_dataview 69 | - データ一覧表示 70 | 71 | ## 運用ルール(参考) 72 | 73 | 自身の用途に合わせてカスタマイズしてください。 74 | 75 | **日々の記録** 76 | - #diary ノートを毎日作成 77 | - 毎日の出来事、感想 78 | - その日限りの思考や感情 79 | - 1つの事柄に対して短い記述(10行以下) 80 | - 長くなるなら #note に書く 81 | - 01_diary/YYYY 配下にファイルを配置(YYYYは年) 82 | - 1年で最大365~366ファイルのため、月別でディレクトリを別けない 83 | 84 | **知識の蓄積** 85 | - #diary から #note へのリンクを記載し、内容を記述 86 | - 1つの事柄、1つのノート 87 | - Zettelkastenと同様に、1つのノートには1つの概念、アイデア、事柄のみを書く 88 | - 書くこと: 89 | - 論題のタイトルに沿った事柄 90 | - 日付に依存しない情報や考え 91 | - 抽象的な概念や一般化された知識 92 | - 一般的、普遍的な内容 93 | - 02_notes/YYYY 配下にファイルを配置(YYYYは年) 94 | - ノートを新規作成した年のディレクトリ配下にファイルが配置される 95 | - 年ごとのディレクトリ分割により、1ディレクトリあたりのファイル数を抑制 96 | - 大量のファイルによるパフォーマンス低下やファイルシステムの制限を回避 97 | - 長期的な運用でも安定したファイル管理が可能 98 | 99 | **アセットの管理** 100 | - アセットを使用するのは基本的に #note のみ 101 | - 03_assets/YYYY 配下にアセットのグループごとにディレクトリを作成(YYYYは年) 102 | - 年ディレクトリは手動で作成 103 | - 関連する #note と同じ年になるように 104 | - 図の作成: 105 | - VSCodeでdrawio拡張機能を使用 106 | - ソースファイルは *.drawio 形式で保存 107 | - 作成した図は *.png や *.svg などの形式で保存(drawio拡張機能で作成) 108 | - ディレクトリ構成例: 109 | - 03_assets/2024/sample/ 110 | - アセットグループディレクトリ 111 | - 03_assets/2024/sample/sample.drawio 112 | - drawioファイル 113 | - 03_assets/2024/sample/sample.png 114 | - drawioから出力した画像ファイル 115 | 116 | **リンクの管理** 117 | - リンクの作成方法: 118 | - `[[ノート名]]`の形式でリンクを作成する 119 | - リンクとなるノート名は、文章中に自然に登場できるような名称にする 120 | - 例:`[[バージョン管理]]には[[Git]]を使用している` 121 | - #diary から #note へのリンク: 122 | - #diary では簡潔に書き、詳細を #note のリンクを作成し書く 123 | - 例:`今日は[[git branch コマンド]]について学んだ` 124 | - #note 同士のリンク: 125 | - 現在のノートの内容と直接関連するノート間でリンクを作成 126 | - 例: 127 | ```markdown 128 | # Git branch コマンド 129 | 130 | [[Git]]のブランチ操作に使用するコマンド。主な用途は[[バージョン管理]]における並行開発の実現。[[git merge コマンド]]と組み合わせて使用することが多い。 131 | 132 | ## 基本的な使い方 133 | ... 134 | ``` 135 | - Map of Contents (MOC): 136 | - 必要に応じて特定のトピックに関するMOCを作成可能 137 | - MOCは一階層のみとし、複雑な階層構造は避ける 138 | - 例: 139 | ```markdown 140 | # Git (MOCとなるノート) 141 | - [[git branch コマンド]] 142 | - [[git init コマンド]] 143 | - [[git commit コマンド]] 144 | ``` 145 | - リンクの見直し: 146 | - 定期的にリンクの妥当性を確認し、必要に応じて更新や削除を行う 147 | 148 | ### #diary と #note の区分基準 149 | 150 | 1. 時間性: 151 | - #diary: 今日の出来事、その日限りの思考や感情 152 | - #note: 日付に依存しない情報や考え 153 | 2. 記述量: 154 | - #diary: 短い記述(10行以下) 155 | - #note: より長い、詳細な記述 156 | 3. 具体性vs抽象性: 157 | - #diary: 具体的な出来事や行動(例:今日の予定、実際に行ったこと) 158 | - #note: 抽象的な概念や一般化された知識 159 | 4. 個人的vs一般的: 160 | - #diary: 個人的な経験や感想 161 | - #note: より一般的、普遍的な内容 162 | 5. 再利用性: 163 | - #diary: 一時的な情報や、その日限りの記録 164 | - #note: 将来的に参照する可能性が高い情報 165 | 166 | 例: 167 | - 「今日の朝食はパンだった」→ #diary 168 | - 「効果的な朝食の取り方について」→ #note 169 | - 「明日の会議の準備をした」→ #diary 170 | - 「プロジェクト管理の方法論」→ #note 171 | - 「今日学んだこと:プログラミングの新概念X」→ #diary に簡潔に記述し、詳細は #note にリンクを張って記載 172 | 173 | ## Obsidian 設定 174 | 175 | [ここからはじめる - Obsidian 日本語ヘルプ - Obsidian Publish](https://publish.obsidian.md/help-ja/%E3%81%93%E3%81%93%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B) 176 | デフォルト設定から変更している部分を記載します。 177 | 178 | ### ファイルとリンク 179 | 180 | - 内部リンクを毎回更新する 181 | - ON 182 | - 新規ノートの作成場所 183 | - 以下で指定されたフォルダ 184 | - 新規ノートを作成するフォルダ 185 | - 02_notes 186 | - 新規添付ファイルの作成場所 187 | - 以下で指定されたフォルダ 188 | - 添付ファイルフォルダのパス 189 | - 03_assets 190 | 191 | ### 外観 192 | 193 | テーマ 194 | - [Minimal](https://github.com/kepano/obsidian-minimal) 195 | #### フォント 196 | 197 | デフォルトは、中国語フォントになっています。 198 | 自分好みの日本語フォントを設定するとよいでしょう。 199 | ここでは [M+ FONTS](https://mplusfonts.github.io) を設定しています。 200 | 201 | - インターフェースフォント 202 | - M PLUS 1 203 | - テキストフォント 204 | - M PLUS 1 205 | - モノスペースフォント 206 | - M PLUS 1 Code 207 | 208 | #### Interface 209 | 210 | タブタイトルバーでファイル名が編集できるけれど、ファイル内でも編集できるので不要だと判断しました。 211 | ヘッダーのメニューは使いません。機能はコマンドパレットから使います。 212 | 213 | - タブタイトルバーを表示 214 | - OFF 215 | 216 | ## [コアプラグイン](https://publish.obsidian.md/help-ja/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/%E3%82%B3%E3%82%A2%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3) 設定 217 | 218 | 使用するコアプラグインを選択します。 219 | 220 | ON のコアプラグインは以下 221 | 222 | - アウトゴーイングリンク 223 | - アウトライン 224 | - クイックスイッチャー 225 | - グラフビュー 226 | - コマンドパレット 227 | - デイリーノート 228 | - ファイルエクスプローラ 229 | - ページビュー 230 | - ワークスペース 231 | - 検索 232 | - キャンバス 233 | - バックリンク 234 | 235 | ### [デイリーノート](https://publish.obsidian.md/help-ja/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3/%E3%83%87%E3%82%A4%E3%83%AA%E3%83%BC%E3%83%8E%E3%83%BC%E3%83%88) 236 | 237 | `01_diary/YYYY/YYYY-MM-DD.md` のディレクトリ構造となります。 238 | 年ディレクトリ配下に、一年で最大で365~366ファイルが生成されるだけなので、月ごとにフォルダ分けするのは不要と判断しました。 239 | 240 | - 日付の書式 241 | - YYYY/YYYY-MM-DD 242 | - 新規ファイルの場所 243 | - 01_diary 244 | - テンプレートファイルの場所 245 | - 00_template/[[01_diary]] 246 | - 起動時にデイリーノートを開く 247 | - ON 248 | 249 | ### [キャンバス](https://help.obsidian.md/Plugins/Canvas) 250 | 251 | - 新規キャンバスファイルのデフォルトロケーション 252 | - 以下で指定されたフォルダ 253 | - 新規キャンバスファイルが作成されるフォルダ 254 | - 04_canvas 255 | 256 | ## コミュニティプラグイン 設定 257 | 258 | ### [Auto Link Title](https://github.com/zolrath/obsidian-auto-link-title) 259 | 260 | URLを貼ったら、自動的にウェブページを取得してリンクタイトルを抽出し、正しいタイトルが設定されたマークダウンリンクを作成するプラグイン 261 | 262 | 設定の変更なし 263 | 264 | ### [Calendar](https://github.com/liamcain/obsidian-calendar-plugin) 265 | 266 | シンプルなカレンダーを表示するプラグイン 267 | 268 | 設定の変更なし 269 | 270 | ### [Dataview](https://github.com/blacksmithgu/obsidian-dataview) 271 | 272 | Obsidian Vaultをクエリ可能なデータベースとして扱うプラグイン 273 | 274 | 日記 #diary とノート #note を一覧表示するために使用します。 275 | 05_dataview配下に使いそうな一覧表示を用意しています。 276 | 自分自身の用途に合わせてカスタムしてください。 277 | 278 | - [[00_all_by_filename_asc]] 279 | - 日記とノートの全ファイルをファイル名昇順で表示 280 | - [[00_all_by_updated_desc]] 281 | - 日記とノートの全ファイルを最終更新日降順で表示 282 | - [[01_diary_by_filename_asc]] 283 | - 日記の全ファイルをファイル名昇順で表示 284 | - [[01_diary_by_updated_desc]] 285 | - 日記の全ファイルを最終更新日降順で表示 286 | - [[02_notes_by_filename_asc]] 287 | - ノートの全ファイルをファイル名昇順で表示 288 | - [[02_notes_by_updated_desc]] 289 | - ノートの全ファイルを最終更新日降順で表示 290 | 291 | ### [Hider](https://github.com/kepano/obsidian-hider) 292 | 293 | Obsidian UI の特定の部分を隠すことができるプラグイン 294 | 295 | デフォルトから変更した設定: 296 | - Hide properties in Reading view → ON 297 | - リーディングビューでプロパティを隠す 298 | - その他 299 | - 自身の好みで設定してください 300 | 301 | ### [Templater](https://github.com/SilentVoid13/Templater) 302 | 303 | Templaterプラグインは、テンプレート言語を定義しています。 304 | それによって、変数や関数の結果をノートに挿入することができます。 305 | また、それらの変数や関数を操作するJavaScriptコードを実行することもできます。 306 | 307 | デフォルトから変更した設定: 308 | 309 | - Template folder location → 00_templates 310 | - テンプレートフォルダの場所 311 | - Trigger Templater on new file creation → ON 312 | - 新規ファイル作成でTemplaterをトリガーするか 313 | 314 | Template hotkeys 315 | - 00_templates/[[10_current_time]].md 316 | - [[10_current_time]]は、H3で時間を挿入するテンプレート 317 | - Hotkey設定: 318 | - Templater: Insert 00_templates/10_current_time.md → Alt + ; 319 | 320 | Folder templates 321 | - 02_notes ... 00_templates/[[02_note]].md 322 | - 02_notesフォルダ配下に、新規ファイル作成したときに適応するテンプレートの設定 323 | 324 | ### [Git](https://github.com/Vinzent03/obsidian-git) 325 | 326 | Gitで保管庫を管理するプラグイン 327 | 328 | 方針: 329 | - mainブランチ1本 330 | - コミットは手動で行う 331 | - Backup で一括操作 332 | - Backup = Staging → Commit → Pull → Push 333 | - プッシュとプルは定期的に自動で行う 334 | - リポジトリの競合を可能な限り防ぐ 335 | - Obsidianの起動時は自動的にプル 336 | - Obsidianの終了方法はショートカット(Ctrl + Q)を使用 337 | - `Git: Create backup and close` 338 | - Backup 339 | - Obsidianを閉じる 340 | 341 | デフォルトから変更した設定: 342 | 343 | Automatic: 344 | - Split automatic commit and push → ON 345 | - 自動コミットとプッシュを分割 346 | - Vault commit interval (minites) → 0 (OFF) 347 | - 自動で`git commit`を行う周期 348 | - Vault push interval (minutes) → 20 349 | - 自動で`git push`を行う周期 350 | - Auto pull interval (minites) → 60 351 | - 自動で`git pull`を行う周期 352 | 353 | Backup: 354 | - Pull updates on startup → ON 355 | - Obsidian起動時に最新の変更を取得 356 | - Push on backup → ON 357 | - バックアップをプッシュする 358 | - Pull changes before push → ON 359 | - プッシュ前にプルを行う 360 | 361 | Hotkey 設定: 362 | - Git: Create backup and close → Ctrl + Q 363 | - バックアップの作成とObsidianの終了 364 | 365 | ### [Outliner](https://github.com/vslinko/obsidian-outliner) 366 | 367 | WorkflowyやRoamResearchのようなリストの操作感にするためのプラグイン 368 | 369 | 個人的に、VSCodeと同じような操作感にするために入れています。 370 | - Alt + ↑ でリストを上に移動 371 | - Alt + ↓ でリストを下に移動 372 | 373 | Outliner 設定: 374 | - Stick the cursor to the content → Stick cursor out of bullets and checkboxes 375 | - カーソルをコンテンツに固定 → カーソルを箇条書きやチェックボックスの外に固定 376 | - Enhance the Tab key → OFF 377 | - Tabキーの機能拡張 378 | - Enhance the Enter key → OFF 379 | - Enterキーの機能拡張 380 | - Enhance the Ctrl+A or Cmd+A behavior → ON 381 | - Ctrl+AまたはCmd+Aの動作拡張 382 | - Improve the style of your lists → OFF 383 | - リストのスタイル改善 384 | - Draw vertical indentation lines → OFF 385 | - 垂直インデントラインの描画 386 | - Vertical indentation line click action → Toggle Folding 387 | - 垂直インデントラインクリック時の動作 → 折りたたみの切り替え 388 | - Drag-and-Drop → ON 389 | - ドラッグアンドドロップ 390 | - Debug mode → ON 391 | - デバッグモード 392 | 393 | Hotkey 設定: 394 | - Outliner:Move list and sublists down → Alt + ↓ 395 | - アウトライナー:リストとサブリストを下に移動 396 | - Outliner:Move list and sublists up → Alt + ↑ 397 | - アウトライナー:リストとサブリストを上に移動 398 | 399 | ### [Minimal Theme Settings](https://github.com/kepano/obsidian-minimal-settings) 400 | 401 | Minimal Theme 付属のプラグイン 402 | Obsidianの設定パネルからテーマをカスタマイズすることができます。 403 | 404 | デフォルトから変更した設定: 405 | - フォントサイズの設定はご自由に 406 | 407 | Features: 408 | - Underline internal links → OFF 409 | - 内部リンクに下線を引く 410 | - Maximize media → OFF 411 | - 画像と動画を行幅分埋める 412 | 413 | Typography: 414 | 415 | - Text font size → 16 416 | - テキストのフォントサイズ 417 | - Small font size → 13 418 | - 小さいフォントサイズ 419 | - Line height → 2 420 | - 行の高さ 421 | - Normal line witdh → 40 422 | - 通常の行の幅 423 | 424 | ### [Style Settings](https://github.com/mgmeyers/obsidian-style-settings) 425 | 426 | スニペット、テーマ、プラグインのCSSファイルで設定オプションのセットを定義することができるプラグイン 427 | 428 | デフォルトから変更した設定: 429 | - フォントサイズの設定はご自由に 430 | 431 | Minimal → Headings → Level 1 Headings: 432 | - H1 font size → 2em 433 | - H1のフォントサイズ 434 | 435 | Minimal → Headings → Level 2 Headings: 436 | - H2 font size → 1.6em 437 | - H2のフォントサイズ 438 | - H2 divider line → ON 439 | - H2の区切り線 440 | 441 | Minimal → Headings → Level 3 Headings: 442 | - H3 font size → 1.4em 443 | - H3のフォントサイズ 444 | - H3 divider line → ON 445 | - H3の区切り線 446 | 447 | Minimal → Headings → Level 4 Headings: 448 | - H4 font size → 1.2em 449 | - H4のフォントサイズ 450 | - H4 divider line → ON 451 | - H4の区切り線 452 | 453 | Minimal → Properties: 454 | - Hide properties heading → ON 455 | - プロパティの見出しを隠す 456 | - Hide "Add property" button → ON 457 | - "プロパティの追加"ボタンを隠す 458 | 459 | Minimal → Sidebars: 460 | - Hide help button → ON 461 | - ヘルプボタンを隠す 462 | --------------------------------------------------------------------------------