Import initial world files
big masiv bigger masiv
This commit is contained in:
commit
c94a50d582
1
.obsidian/app.json
vendored
Normal file
1
.obsidian/app.json
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
3
.obsidian/appearance.json
vendored
Normal file
3
.obsidian/appearance.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"theme": "obsidian"
|
||||
}
|
||||
19
.obsidian/community-plugins.json
vendored
Normal file
19
.obsidian/community-plugins.json
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
[
|
||||
"obsidian-git",
|
||||
"obsidian-kanban",
|
||||
"obsidian-style-settings",
|
||||
"obsidian-icon-folder",
|
||||
"find-unlinked-files",
|
||||
"system3-relay",
|
||||
"colored-tags",
|
||||
"sheet-plus",
|
||||
"obsidian-icons-plugin",
|
||||
"obsidian-plugin-todo",
|
||||
"fantasy-content-generator",
|
||||
"advanced-canvas",
|
||||
"dataview",
|
||||
"highlightr-plugin",
|
||||
"omnisearch",
|
||||
"obsidian-paste-image-rename",
|
||||
"templater-obsidian"
|
||||
]
|
||||
33
.obsidian/core-plugins.json
vendored
Normal file
33
.obsidian/core-plugins.json
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"file-explorer": true,
|
||||
"global-search": true,
|
||||
"switcher": true,
|
||||
"graph": true,
|
||||
"backlink": true,
|
||||
"canvas": true,
|
||||
"outgoing-link": true,
|
||||
"tag-pane": true,
|
||||
"footnotes": false,
|
||||
"properties": true,
|
||||
"page-preview": true,
|
||||
"daily-notes": true,
|
||||
"templates": true,
|
||||
"note-composer": true,
|
||||
"command-palette": true,
|
||||
"slash-command": false,
|
||||
"editor-status": true,
|
||||
"bookmarks": true,
|
||||
"markdown-importer": false,
|
||||
"zk-prefixer": false,
|
||||
"random-note": false,
|
||||
"outline": true,
|
||||
"word-count": true,
|
||||
"slides": false,
|
||||
"audio-recorder": true,
|
||||
"workspaces": false,
|
||||
"file-recovery": true,
|
||||
"publish": false,
|
||||
"sync": false,
|
||||
"bases": true,
|
||||
"webviewer": false
|
||||
}
|
||||
3
.obsidian/daily-notes.json
vendored
Normal file
3
.obsidian/daily-notes.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"format": "DD-MM-YYYY"
|
||||
}
|
||||
22
.obsidian/graph.json
vendored
Normal file
22
.obsidian/graph.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"collapse-filter": true,
|
||||
"search": "",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": true,
|
||||
"colorGroups": [],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 1,
|
||||
"close": true
|
||||
}
|
||||
7372
.obsidian/plugins/advanced-canvas/main.js
vendored
Normal file
7372
.obsidian/plugins/advanced-canvas/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/advanced-canvas/manifest.json
vendored
Normal file
11
.obsidian/plugins/advanced-canvas/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "advanced-canvas",
|
||||
"name": "Advanced Canvas",
|
||||
"version": "5.6.5",
|
||||
"minAppVersion": "1.1.0",
|
||||
"description": "Supercharge your canvas experience! Create presentations, flowcharts and more!",
|
||||
"author": "Developer-Mike",
|
||||
"authorUrl": "https://github.com/Developer-Mike",
|
||||
"fundingUrl": "https://ko-fi.com/X8X27IA08",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
508
.obsidian/plugins/advanced-canvas/styles.css
vendored
Normal file
508
.obsidian/plugins/advanced-canvas/styles.css
vendored
Normal file
|
|
@ -0,0 +1,508 @@
|
|||
/* src/styles.scss */
|
||||
.properties-field > .setting-item-info {
|
||||
flex: 0;
|
||||
margin: 0;
|
||||
padding: var(--size-4-1) var(--size-4-2);
|
||||
border: var(--input-border-width) solid var(--background-modifier-border);
|
||||
border-radius: var(--input-radius) 0 0 var(--input-radius);
|
||||
}
|
||||
.properties-field > .setting-item-control > input {
|
||||
width: 100%;
|
||||
border-radius: 0 var(--input-radius) var(--input-radius) 0;
|
||||
}
|
||||
.ac-settings-heading {
|
||||
border-bottom: 1px solid var(--color-accent);
|
||||
}
|
||||
.ac-settings-heading:not(:first-child) {
|
||||
margin-top: var(--size-4-10) !important;
|
||||
}
|
||||
.ac-settings-heading:has(.checkbox-container:not(.is-enabled)) {
|
||||
border-bottom-color: var(--background-modifier-border-hover);
|
||||
}
|
||||
.ac-settings-heading .setting-item-description {
|
||||
margin-inline-end: 20px;
|
||||
}
|
||||
.settings-header-children {
|
||||
transform-origin: top center;
|
||||
transform: scaleY(1);
|
||||
transition: transform 0.2s ease-in-out;
|
||||
}
|
||||
.settings-header-children details {
|
||||
flex-direction: column;
|
||||
align-items: initial;
|
||||
}
|
||||
.ac-settings-heading:has(.checkbox-container:not(.is-enabled)) + .settings-header-children {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
height: 0;
|
||||
transform: scaleY(0);
|
||||
}
|
||||
details.setting-item[open] > summary {
|
||||
margin-bottom: 0.75em;
|
||||
}
|
||||
details.setting-item > *:not(summary) {
|
||||
padding-left: 1em;
|
||||
border-left: 1px solid var(--color-accent);
|
||||
}
|
||||
.kofi-banner {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: var(--size-4-3);
|
||||
background-color: var(--background-secondary);
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: var(--radius-s);
|
||||
}
|
||||
.kofi-banner h1 {
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
font-size: var(--font-ui-large);
|
||||
font-weight: 600;
|
||||
}
|
||||
.kofi-banner .progress-container {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-items: center;
|
||||
}
|
||||
.kofi-banner .progress-container progress {
|
||||
background: transparent;
|
||||
}
|
||||
.kofi-banner .progress-container progress::-webkit-progress-bar {
|
||||
background-color: var(--background-modifier-border);
|
||||
border-radius: var(--input-radius);
|
||||
}
|
||||
.kofi-banner .progress-container progress::-webkit-progress-value {
|
||||
background-color: var(--color-accent);
|
||||
border-radius: var(--input-radius);
|
||||
}
|
||||
.kofi-banner .progress-container .hourly-rate {
|
||||
margin-left: 10px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.kofi-banner .ac-kofi-button {
|
||||
align-self: flex-end;
|
||||
width: min-content;
|
||||
height: min-content;
|
||||
line-height: 0;
|
||||
}
|
||||
.kofi-banner .ac-kofi-button img {
|
||||
min-width: 100px;
|
||||
width: 25%;
|
||||
max-width: 200px;
|
||||
}
|
||||
.canvas-wrapper > .document-search-container {
|
||||
transform: translateZ(0);
|
||||
margin: 0;
|
||||
}
|
||||
.canvas-wrapper:not(.mod-readonly) .show-while-readonly {
|
||||
display: none;
|
||||
}
|
||||
.canvas-control-item[data-toggled=true] {
|
||||
background-color: var(--color-accent);
|
||||
}
|
||||
.canvas-control-item[data-toggled=true] svg {
|
||||
stroke: var(--text-on-accent);
|
||||
}
|
||||
.reactive-node,
|
||||
.canvas-node[data-shape=database],
|
||||
.canvas-node[data-shape=document],
|
||||
.canvas-node[data-shape=predefined-process],
|
||||
.canvas-node[data-shape=diamond] {
|
||||
--border-color: rgb(var(--canvas-color));
|
||||
--border-width: 3px;
|
||||
--box-shadow: none;
|
||||
}
|
||||
.reactive-node.is-focused,
|
||||
.is-focused.canvas-node[data-shape=database],
|
||||
.is-focused.canvas-node[data-shape=document],
|
||||
.is-focused.canvas-node[data-shape=predefined-process],
|
||||
.is-focused.canvas-node[data-shape=diamond],
|
||||
.reactive-node.is-selected,
|
||||
.is-selected.canvas-node[data-shape=database],
|
||||
.is-selected.canvas-node[data-shape=document],
|
||||
.is-selected.canvas-node[data-shape=predefined-process],
|
||||
.is-selected.canvas-node[data-shape=diamond] {
|
||||
--border-color: var(--color-accent);
|
||||
--border-width: 5px;
|
||||
--box-shadow: var(--shadow-border-accent);
|
||||
}
|
||||
.reactive-node.is-themed,
|
||||
.is-themed.canvas-node[data-shape=database],
|
||||
.is-themed.canvas-node[data-shape=document],
|
||||
.is-themed.canvas-node[data-shape=predefined-process],
|
||||
.is-themed.canvas-node[data-shape=diamond] {
|
||||
--border-color: rgba(var(--canvas-color), 0.7);
|
||||
}
|
||||
.reactive-node.is-themed.is-focused,
|
||||
.is-themed.is-focused.canvas-node[data-shape=database],
|
||||
.is-themed.is-focused.canvas-node[data-shape=document],
|
||||
.is-themed.is-focused.canvas-node[data-shape=predefined-process],
|
||||
.is-themed.is-focused.canvas-node[data-shape=diamond],
|
||||
.reactive-node.is-themed.is-selected,
|
||||
.is-themed.is-selected.canvas-node[data-shape=database],
|
||||
.is-themed.is-selected.canvas-node[data-shape=document],
|
||||
.is-themed.is-selected.canvas-node[data-shape=predefined-process],
|
||||
.is-themed.is-selected.canvas-node[data-shape=diamond] {
|
||||
--border-color: rgb(var(--canvas-color));
|
||||
--box-shadow: var(--shadow-border-themed);
|
||||
}
|
||||
.canvas-node[data-text-align=center] .markdown-preview-view {
|
||||
scrollbar-gutter: auto;
|
||||
}
|
||||
.canvas-node[data-text-align=center] .markdown-preview-view .markdown-preview-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
min-height: 0 !important;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.canvas-node[data-text-align=right] {
|
||||
text-align: right;
|
||||
}
|
||||
.canvas-node[data-shape] .canvas-node-container .markdown-preview-view.markdown-rendered {
|
||||
transform: unset;
|
||||
}
|
||||
.canvas-node[data-shape=pill] .canvas-node-container {
|
||||
border-radius: 5000px;
|
||||
}
|
||||
.canvas-node[data-shape=diamond] {
|
||||
}
|
||||
.canvas-node[data-shape=diamond].is-focused,
|
||||
.canvas-node[data-shape=diamond].is-selected {
|
||||
border-radius: var(--radius-m);
|
||||
outline: 2px solid var(--color-accent);
|
||||
outline-offset: 5px;
|
||||
}
|
||||
.canvas-node[data-shape=diamond] .canvas-node-container {
|
||||
border: none;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
.canvas-node[data-shape=diamond] .canvas-node-container:not(:has(.embed-iframe)) {
|
||||
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||
mask-repeat: no-repeat;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
mask-size: 100%;
|
||||
-webkit-mask-size: 100%;
|
||||
}
|
||||
.canvas-node[data-shape=diamond] .canvas-node-container .canvas-node-placeholder::after {
|
||||
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||
mask-repeat: no-repeat;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
mask-size: 100%;
|
||||
-webkit-mask-size: 100%;
|
||||
}
|
||||
.canvas-node[data-shape=diamond]::before {
|
||||
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 141.42135624 141.42135624' preserveAspectRatio='none'%3E%3Cstyle%3E rect %7B transform-origin: center; transform: rotate(45deg) scale(1.05); %7D %3C/style%3E%3Crect rx='8' x='20.71067812' y='20.71067812' width='100' height='100' /%3E%3C/svg%3E");
|
||||
mask-repeat: no-repeat;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
mask-size: 100%;
|
||||
-webkit-mask-size: 100%;
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: calc(var(--border-width) * -1);
|
||||
left: calc(var(--border-width) * -1);
|
||||
width: calc(100% + var(--border-width) * 2);
|
||||
height: calc(100% + var(--border-width) * 2);
|
||||
background-color: var(--border-color);
|
||||
}
|
||||
.canvas-node[data-shape=parallelogram] .canvas-node-container {
|
||||
transform: skewX(-20deg);
|
||||
backface-visibility: hidden;
|
||||
}
|
||||
.canvas-node[data-shape=parallelogram] .canvas-node-container .canvas-node-content .markdown-embed-content {
|
||||
transform: skewX(20deg);
|
||||
}
|
||||
.canvas-node[data-shape=circle] .canvas-node-container {
|
||||
border-radius: 50%;
|
||||
}
|
||||
.canvas-node[data-shape=circle] .canvas-node-container .markdown-preview-view {
|
||||
overflow-y: initial;
|
||||
}
|
||||
.canvas-node[data-shape=predefined-process] .canvas-node-container .canvas-node-content {
|
||||
padding: 0 10px;
|
||||
}
|
||||
.canvas-node[data-shape=predefined-process] .canvas-node-container::before,
|
||||
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
|
||||
content: "";
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 0;
|
||||
height: 100%;
|
||||
border-left: var(--border-width) solid var(--border-color);
|
||||
}
|
||||
.canvas-node[data-shape=predefined-process] .canvas-node-container::before {
|
||||
left: calc(10px - var(--border-width));
|
||||
}
|
||||
.canvas-node[data-shape=predefined-process] .canvas-node-container::after {
|
||||
right: calc(10px - var(--border-width));
|
||||
}
|
||||
.canvas-node[data-shape=document] {
|
||||
--border-width: 2.5px;
|
||||
filter: drop-shadow(0 var(--border-width) 0 var(--border-color)) drop-shadow(0 calc(var(--border-width) * -1) 0 var(--border-color));
|
||||
}
|
||||
.canvas-node[data-shape=document] .canvas-node-container {
|
||||
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
|
||||
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 75 45' preserveAspectRatio='none'%3E%3Cpath d='M75 0 75 39.375Q56.25 29.25 37.5 39.375 18.75 49.5 0 39.375L0 0Z' /%3E%3C/svg%3E");
|
||||
mask-repeat: no-repeat;
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
mask-size: 100%;
|
||||
-webkit-mask-size: 100%;
|
||||
border: var(--border-width) solid var(--border-color);
|
||||
border-top: none;
|
||||
border-bottom: none;
|
||||
}
|
||||
.canvas-node[data-shape=document].is-focused,
|
||||
.canvas-node[data-shape=document].is-selected {
|
||||
--border-width: 4px;
|
||||
}
|
||||
.canvas-node[data-shape=database] {
|
||||
}
|
||||
.canvas-node[data-shape=database] .canvas-node-container {
|
||||
border: var(--border-width) solid var(--border-color);
|
||||
border-bottom: 0;
|
||||
border-top: 0;
|
||||
border-radius: 0;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
.canvas-node[data-shape=database] .canvas-node-container .canvas-node-placeholder {
|
||||
transform: translateY(25px);
|
||||
}
|
||||
.canvas-node[data-shape=database]::before,
|
||||
.canvas-node[data-shape=database]::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
border-radius: 50%;
|
||||
border: var(--border-width) solid var(--border-color);
|
||||
background-color: var(--background-primary);
|
||||
}
|
||||
.canvas-node[data-shape=database]::after {
|
||||
top: -25px;
|
||||
}
|
||||
.canvas-node[data-shape=database]::before {
|
||||
bottom: -25px;
|
||||
}
|
||||
.canvas-node[data-shape=database].is-themed .canvas-node-content {
|
||||
background-color: transparent;
|
||||
}
|
||||
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe)) .canvas-node-container,
|
||||
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::after,
|
||||
.canvas-node[data-shape=database].is-themed:not(:has(.embed-iframe))::before {
|
||||
box-shadow: inset 0 0 0 1000px rgba(var(--canvas-color), 0.07) !important;
|
||||
}
|
||||
.canvas-node[data-shape=database] .canvas-node-content:not(:has(.embed-iframe)) {
|
||||
transform: translateY(20px);
|
||||
}
|
||||
.canvas-node[data-shape=database]:has(.embed-iframe)::after {
|
||||
z-index: -1;
|
||||
}
|
||||
.canvas-node[data-border=dashed] .canvas-node-container {
|
||||
box-shadow: none;
|
||||
border-style: dashed;
|
||||
}
|
||||
.canvas-node[data-border=dotted] .canvas-node-container {
|
||||
box-shadow: none;
|
||||
border-style: dotted;
|
||||
}
|
||||
.canvas-node[data-border=invisible] {
|
||||
box-shadow: none;
|
||||
}
|
||||
.canvas-node[data-border=invisible]:not(.is-focused):not(.is-selected) .canvas-node-container {
|
||||
border-color: transparent !important;
|
||||
}
|
||||
.canvas-node[data-border=invisible] .canvas-node-label {
|
||||
display: none;
|
||||
}
|
||||
.canvas-node[data-border=invisible] .canvas-node-container {
|
||||
background-color: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
.canvas-node[data-border][data-shape=predefined-process] {
|
||||
--border-width: 2px;
|
||||
}
|
||||
.canvas-node[data-border][data-shape=predefined-process] .is-focused,
|
||||
.canvas-node[data-border][data-shape=predefined-process] .is-selected {
|
||||
--border-width: 2px;
|
||||
}
|
||||
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::before,
|
||||
.canvas-node[data-border=dashed][data-shape=predefined-process] .canvas-node-container::after {
|
||||
border-left: var(--border-width) dashed var(--border-color);
|
||||
}
|
||||
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::before,
|
||||
.canvas-node[data-border=dotted][data-shape=predefined-process] .canvas-node-container::after {
|
||||
border-left: var(--border-width) dotted var(--border-color);
|
||||
}
|
||||
.canvas-node[data-border][data-shape=document] .canvas-node-container {
|
||||
border-top: none;
|
||||
border-bottom: none;
|
||||
}
|
||||
.canvas-edges path[data-path=dotted] {
|
||||
stroke-dasharray: calc(3px * var(--zoom-multiplier));
|
||||
}
|
||||
.canvas-edges path[data-path=short-dashed] {
|
||||
stroke-dasharray: 9px;
|
||||
}
|
||||
.canvas-edges path[data-path=long-dashed] {
|
||||
stroke-dasharray: 18px;
|
||||
}
|
||||
.canvas-edges [data-arrow=triangle-outline] polygon,
|
||||
.canvas-edges [data-arrow=diamond-outline] polygon,
|
||||
.canvas-edges [data-arrow=circle-outline] polygon {
|
||||
fill: var(--canvas-background);
|
||||
stroke: rgb(var(--canvas-color));
|
||||
stroke-width: calc(3px * var(--zoom-multiplier));
|
||||
}
|
||||
.canvas-edges [data-arrow=thin-triangle] polygon {
|
||||
fill: transparent;
|
||||
stroke: rgb(var(--canvas-color));
|
||||
stroke-width: calc(4px * var(--zoom-multiplier));
|
||||
}
|
||||
.canvas.is-exporting {
|
||||
--zoom-multiplier: 1;
|
||||
}
|
||||
.canvas.is-exporting * {
|
||||
pointer-events: none !important;
|
||||
transition: none !important;
|
||||
}
|
||||
.canvas.is-exporting .collapse-button {
|
||||
display: none;
|
||||
}
|
||||
.canvas.is-exporting #watermark-ac {
|
||||
z-index: 9999999;
|
||||
position: absolute;
|
||||
}
|
||||
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas.is-exporting .canvas-node .canvas-group-label {
|
||||
left: 0;
|
||||
}
|
||||
.progress-bar-modal-ac {
|
||||
margin-top: 0.75em;
|
||||
}
|
||||
.progress-bar-modal-ac.error .setting-progress-bar {
|
||||
color: var(--color-error);
|
||||
}
|
||||
.canvas-wrapper[data-disable-font-size-relative-to-zoom=true] {
|
||||
--zoom-multiplier: 1 !important;
|
||||
}
|
||||
.canvas-wrapper.mod-readonly[data-hide-background-grid-when-in-readonly=true] .canvas-background {
|
||||
visibility: hidden;
|
||||
}
|
||||
.collapse-button {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
|
||||
padding: var(--size-4-1) var(--size-4-2);
|
||||
transform-origin: bottom left;
|
||||
transform: translate(0, -100%) scale(var(--zoom-multiplier));
|
||||
border-radius: var(--radius-s);
|
||||
color: var(--text-muted);
|
||||
background-color: rgba(var(--canvas-color), 0.1);
|
||||
font-size: 1.5em;
|
||||
line-height: 1;
|
||||
pointer-events: initial;
|
||||
cursor: pointer;
|
||||
transition: transform 500ms cubic-bezier(0.16, 1, 0.3, 1);
|
||||
}
|
||||
.canvas-wrapper[data-collapsible-groups-feature-enabled=true] .canvas-node .canvas-group-label {
|
||||
left: calc(40px * var(--zoom-multiplier));
|
||||
}
|
||||
.canvas-node[data-collapsed] .canvas-node-container {
|
||||
display: none;
|
||||
}
|
||||
.canvas-node[data-collapsed] .canvas-group-label {
|
||||
max-width: initial;
|
||||
}
|
||||
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-collapsed] .canvas-node-container {
|
||||
display: block;
|
||||
opacity: 0.5;
|
||||
border-style: dashed;
|
||||
}
|
||||
.canvas-wrapper[data-collapsed-group-preview-on-drag=true][data-is-dragging] .canvas-node[data-collapsed] .canvas-node-container .canvas-node-content {
|
||||
background-color: transparent;
|
||||
}
|
||||
.canvas-node-interaction-layer[data-target-collapsed] .canvas-node-resizer {
|
||||
pointer-events: none;
|
||||
cursor: inherit;
|
||||
}
|
||||
.canvas-node-interaction-layer[data-target-collapsed] .canvas-node-resizer .canvas-node-connection-point {
|
||||
display: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
.canvas-wrapper[data-allow-floating-edge-creation=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group)::after {
|
||||
all: unset;
|
||||
content: "";
|
||||
z-index: 100;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
|
||||
height: max(10px, 100% - 50px * var(--zoom-multiplier) * 2);
|
||||
transform: translate(-50%, -50%);
|
||||
border-radius: var(--radius-m);
|
||||
outline: calc(4px * var(--zoom-multiplier)) dashed hsla(var(--color-accent-hsl), 0.5);
|
||||
}
|
||||
.canvas-wrapper[data-allow-floating-edge-creation=true] .canvas.is-connecting .canvas-node:not(.canvas-node-group).hovering-floating-edge-zone::after {
|
||||
outline-color: var(--color-accent);
|
||||
outline-style: solid;
|
||||
background-color: hsla(var(--color-accent-hsl), 0.1);
|
||||
}
|
||||
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-node:not(.is-focused) {
|
||||
filter: blur(5px);
|
||||
}
|
||||
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-edges {
|
||||
filter: blur(5px);
|
||||
}
|
||||
.canvas-wrapper[data-focus-mode-enabled=true] .canvas:has(.canvas-node.is-focused) .canvas-path-label-wrapper {
|
||||
filter: blur(5px);
|
||||
}
|
||||
.canvas-wrapper.presentation-mode .canvas-controls {
|
||||
visibility: hidden;
|
||||
}
|
||||
.canvas-wrapper.presentation-mode .canvas-card-menu {
|
||||
visibility: hidden;
|
||||
}
|
||||
.canvas-wrapper:not(.presentation-mode) .canvas-node[data-is-start-node=true]::before {
|
||||
content: "Start";
|
||||
position: absolute;
|
||||
top: calc(-1 * var(--size-4-1) * var(--zoom-multiplier));
|
||||
right: 0;
|
||||
transform: translate(0, -100%) scale(var(--zoom-multiplier));
|
||||
transform-origin: bottom right;
|
||||
max-width: calc(100% / var(--zoom-multiplier));
|
||||
padding: var(--size-4-1) var(--size-4-2);
|
||||
font-size: 1em;
|
||||
border-radius: var(--radius-s);
|
||||
color: var(--color-green);
|
||||
background-color: rgba(var(--color-green-rgb), 0.1);
|
||||
}
|
||||
.canvas-node[data-is-portal-loaded=true] {
|
||||
pointer-events: all;
|
||||
}
|
||||
.canvas-node[data-is-portal-loaded=true]:not(.is-focused) {
|
||||
pointer-events: none;
|
||||
}
|
||||
.canvas-node[data-is-portal-loaded=true]:not(.is-focused) .canvas-node-label {
|
||||
pointer-events: all;
|
||||
}
|
||||
.canvas-node[data-is-portal-loaded=true] .canvas-node-container {
|
||||
background-color: transparent;
|
||||
border-style: dashed;
|
||||
}
|
||||
.canvas-node[data-is-portal-loaded=true] .canvas-node-container .canvas-node-content {
|
||||
display: none;
|
||||
}
|
||||
.canvas-node-interaction-layer[data-is-from-portal=true] .canvas-node-resizer {
|
||||
pointer-events: none;
|
||||
cursor: inherit;
|
||||
}
|
||||
.canvas-node-interaction-layer[data-is-from-portal=true] .canvas-node-resizer .canvas-node-connection-point {
|
||||
pointer-events: all;
|
||||
}
|
||||
24
.obsidian/plugins/colored-tags/data.json
vendored
Normal file
24
.obsidian/plugins/colored-tags/data.json
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"palette": {
|
||||
"seed": 5,
|
||||
"selected": "adaptive-bright",
|
||||
"custom": "e12729-f37324-f8cc1b-72b043-007f4e"
|
||||
},
|
||||
"mixColors": true,
|
||||
"transition": true,
|
||||
"accessibility": {
|
||||
"highTextContrast": false
|
||||
},
|
||||
"knownTags": {
|
||||
"country": 1,
|
||||
"eldoria": 2,
|
||||
"landmark": 3,
|
||||
"location": 4,
|
||||
"worldbuilding": 5,
|
||||
"eldoria/faction": 1,
|
||||
"location/city": 1,
|
||||
"worldbuilding/culture": 1
|
||||
},
|
||||
"tagColors": {},
|
||||
"_version": 4
|
||||
}
|
||||
5350
.obsidian/plugins/colored-tags/main.js
vendored
Normal file
5350
.obsidian/plugins/colored-tags/main.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
10
.obsidian/plugins/colored-tags/manifest.json
vendored
Normal file
10
.obsidian/plugins/colored-tags/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "colored-tags",
|
||||
"name": "Colored Tags",
|
||||
"version": "6.1.1",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Colorizes tags in different colors. Colors of nested tags are mixed with the root tag to improve readability. Text color contrast is automatically matched to comply with AA level of WCAG 2.1.",
|
||||
"author": "Pavel Frankov",
|
||||
"authorUrl": "https://github.com/pfrankov",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
196
.obsidian/plugins/colored-tags/styles.css
vendored
Normal file
196
.obsidian/plugins/colored-tags/styles.css
vendored
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
/* src/styles.css */
|
||||
.colored-tags-settings .tagsExample {
|
||||
display: flex;
|
||||
gap: 0.5em;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
margin: 1em 0 2em;
|
||||
}
|
||||
.colored-tags-settings .palette {
|
||||
display: flex;
|
||||
align-items: stretch;
|
||||
border-radius: var(--radius-m);
|
||||
overflow: hidden;
|
||||
}
|
||||
.colored-tags-settings .visually-hidden {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
.colored-tags-settings .community-palettes {
|
||||
display: block;
|
||||
}
|
||||
.colored-tags-settings .community-palettes > *:first-child {
|
||||
margin-inline-end: 0;
|
||||
}
|
||||
.colored-tags-settings .community-palettes__scroll {
|
||||
margin-top: var(--size-4-3);
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
padding: var(--size-4-3);
|
||||
}
|
||||
.colored-tags-settings .community-palettes__grid {
|
||||
display: grid;
|
||||
gap: var(--size-4-4);
|
||||
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
||||
}
|
||||
.colored-tags-settings .community-palettes__status {
|
||||
color: var(--text-faint);
|
||||
padding: var(--size-4-3);
|
||||
border-radius: var(--radius-m);
|
||||
background-color: var(--background-primary);
|
||||
border: var(--border-width) solid var(--background-modifier-border);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--size-4-2);
|
||||
padding: var(--size-4-3);
|
||||
border-radius: var(--radius-m);
|
||||
position: relative;
|
||||
background-color: var(--dropdown-background);
|
||||
box-shadow: var(--input-shadow);
|
||||
cursor: pointer;
|
||||
transition: all 120ms ease-in-out;
|
||||
}
|
||||
.colored-tags-settings .community-palette-card.is-selected {
|
||||
box-shadow: 0 0 0 2px var(--interactive-accent), var(--input-shadow);
|
||||
cursor: auto;
|
||||
}
|
||||
.colored-tags-settings .community-palette-card.is-selected::after {
|
||||
content: "\2713";
|
||||
position: absolute;
|
||||
top: var(--size-4-2);
|
||||
right: var(--size-4-2);
|
||||
width: var(--size-4-4);
|
||||
height: var(--size-4-4);
|
||||
border-radius: var(--radius-round, 999px);
|
||||
background-color: var(--interactive-accent);
|
||||
color: var(--text-on-accent, var(--background-primary));
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: var(--font-semibold, 600);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card:hover {
|
||||
background-color: var(--dropdown-background-hover);
|
||||
box-shadow: var(--input-shadow-hover);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card.is-selected:hover {
|
||||
box-shadow: 0 0 0 2px var(--interactive-accent), var(--input-shadow);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card:focus-visible {
|
||||
outline: var(--border-width) solid var(--interactive-accent);
|
||||
outline-offset: var(--outline-offset);
|
||||
box-shadow: 0 0 0 3px var(--background-modifier-border-focus);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card__preview {
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
border-radius: var(--radius-m);
|
||||
height: var(--input-height);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card__meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: var(--size-4-2);
|
||||
min-height: var(--line-height-tight);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card__author {
|
||||
font-family: var(--font-monospace);
|
||||
color: var(--text-muted);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card.is-selected .community-palette-card__author {
|
||||
font-weight: var(--font-semibold, 600);
|
||||
}
|
||||
.colored-tags-settings .community-palette-card__upvotes {
|
||||
color: var(--text-muted);
|
||||
font-size: var(--font-ui-smaller);
|
||||
font-weight: var(--font-medium);
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting-item {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
gap: var(--size-4-2);
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting-item .setting-item-control {
|
||||
width: 100%;
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--size-4-2);
|
||||
width: 100%;
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__row {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
gap: var(--size-4-3);
|
||||
align-items: start;
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__input input[type=text] {
|
||||
width: 220px;
|
||||
font-weight: var(--font-normal, 400);
|
||||
}
|
||||
.theme-light .colored-tags-settings .tag-color-setting__input input[type=text] {
|
||||
color-scheme: light;
|
||||
background-color: var(--background-primary);
|
||||
color: var(--text-normal);
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__palette {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--size-2-2);
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__swatch {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: var(--radius-s);
|
||||
cursor: pointer;
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__swatch:disabled {
|
||||
opacity: 0.6;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__swatch.is-selected {
|
||||
box-shadow: 0 0 0 3px var(--interactive-accent);
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__chips {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--size-2-2);
|
||||
margin-top: var(--size-2-3);
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__chip {
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: var(--size-2-1);
|
||||
text-decoration: none;
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__chip-remove {
|
||||
background: none;
|
||||
border: none;
|
||||
color: var(--text-faint);
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
box-shadow: none;
|
||||
font-size: var(--font-ui-smaller);
|
||||
margin-left: -6px;
|
||||
}
|
||||
.colored-tags-settings .tag-color-setting__empty {
|
||||
color: var(--text-faint);
|
||||
font-style: italic;
|
||||
}
|
||||
20876
.obsidian/plugins/dataview/main.js
vendored
Normal file
20876
.obsidian/plugins/dataview/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/dataview/manifest.json
vendored
Normal file
11
.obsidian/plugins/dataview/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "dataview",
|
||||
"name": "Dataview",
|
||||
"version": "0.5.68",
|
||||
"minAppVersion": "0.13.11",
|
||||
"description": "Complex data views for the data-obsessed.",
|
||||
"author": "Michael Brenan <blacksmithgu@gmail.com>",
|
||||
"authorUrl": "https://github.com/blacksmithgu",
|
||||
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
141
.obsidian/plugins/dataview/styles.css
vendored
Normal file
141
.obsidian/plugins/dataview/styles.css
vendored
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
.block-language-dataview {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/*****************/
|
||||
/** Table Views **/
|
||||
/*****************/
|
||||
|
||||
/* List View Default Styling; rendered internally as a table. */
|
||||
.table-view-table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.table-view-table > thead > tr, .table-view-table > tbody > tr {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.table-view-table > tbody > tr:hover {
|
||||
background-color: var(--table-row-background-hover);
|
||||
}
|
||||
|
||||
.table-view-table > thead > tr > th {
|
||||
font-weight: 700;
|
||||
font-size: larger;
|
||||
border-top: none;
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
border-bottom: solid;
|
||||
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.table-view-table > tbody > tr > td {
|
||||
text-align: left;
|
||||
border: none;
|
||||
font-weight: 400;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.table-view-table ul, .table-view-table ol {
|
||||
margin-block-start: 0.2em !important;
|
||||
margin-block-end: 0.2em !important;
|
||||
}
|
||||
|
||||
/** Rendered value styling for any view. */
|
||||
.dataview-result-list-root-ul {
|
||||
padding: 0em !important;
|
||||
margin: 0em !important;
|
||||
}
|
||||
|
||||
.dataview-result-list-ul {
|
||||
margin-block-start: 0.2em !important;
|
||||
margin-block-end: 0.2em !important;
|
||||
}
|
||||
|
||||
/** Generic grouping styling. */
|
||||
.dataview.result-group {
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
/*******************/
|
||||
/** Inline Fields **/
|
||||
/*******************/
|
||||
|
||||
.dataview.inline-field-key {
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
font-family: var(--font-monospace);
|
||||
background-color: var(--background-primary-alt);
|
||||
color: var(--nav-item-color-selected);
|
||||
}
|
||||
|
||||
.dataview.inline-field-value {
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
font-family: var(--font-monospace);
|
||||
background-color: var(--background-secondary-alt);
|
||||
color: var(--nav-item-color-selected);
|
||||
}
|
||||
|
||||
.dataview.inline-field-standalone-value {
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
font-family: var(--font-monospace);
|
||||
background-color: var(--background-secondary-alt);
|
||||
color: var(--nav-item-color-selected);
|
||||
}
|
||||
|
||||
/***************/
|
||||
/** Task View **/
|
||||
/***************/
|
||||
|
||||
.dataview.task-list-item, .dataview.task-list-basic-item {
|
||||
margin-top: 3px;
|
||||
margin-bottom: 3px;
|
||||
transition: 0.4s;
|
||||
}
|
||||
|
||||
.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
|
||||
background-color: var(--text-selection);
|
||||
box-shadow: -40px 0 0 var(--text-selection);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/*****************/
|
||||
/** Error Views **/
|
||||
/*****************/
|
||||
|
||||
div.dataview-error-box {
|
||||
width: 100%;
|
||||
min-height: 150px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 4px dashed var(--background-secondary);
|
||||
}
|
||||
|
||||
.dataview-error-message {
|
||||
color: var(--text-muted);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/*************************/
|
||||
/** Additional Metadata **/
|
||||
/*************************/
|
||||
|
||||
.dataview.small-text {
|
||||
font-size: smaller;
|
||||
color: var(--text-muted);
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.dataview.small-text::before {
|
||||
content: "(";
|
||||
}
|
||||
|
||||
.dataview.small-text::after {
|
||||
content: ")";
|
||||
}
|
||||
19899
.obsidian/plugins/fantasy-content-generator/main.js
vendored
Normal file
19899
.obsidian/plugins/fantasy-content-generator/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
.obsidian/plugins/fantasy-content-generator/manifest.json
vendored
Normal file
9
.obsidian/plugins/fantasy-content-generator/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"id": "fantasy-content-generator",
|
||||
"name": "Fantasy Content Generator",
|
||||
"version": "1.2.4",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "A Fantasy Content Generator for Obsidian for All Your TTRPG / World Building Needs",
|
||||
"author": "Gregory Jagermeister ",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
36
.obsidian/plugins/fantasy-content-generator/styles.css
vendored
Normal file
36
.obsidian/plugins/fantasy-content-generator/styles.css
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
.theme-light .OFCGDetails {
|
||||
border: 1px solid #ccc;
|
||||
box-shadow: 0px 12px 0px 0px rgba(255, 255, 255, 0.37);
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.theme-light .OFCGDetails[open] summary {
|
||||
border-bottom: 1px solid #666;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
.theme-dark .OFCGDetails {
|
||||
border: 1px solid #272727;
|
||||
box-shadow: 0px 12px 0px 0px rgba(0, 0, 0, 0.37);
|
||||
background-color: #313131;
|
||||
padding: 0.5em 0.5em 0.5em;
|
||||
margin: 1em;
|
||||
}
|
||||
|
||||
.OFCGSSummary {
|
||||
font-weight: bold;
|
||||
margin: -0.5em -0.5em 0.5em;
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
.OFCGDetails[open] {
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
.theme-dark .OFCGDetails[open] summary {
|
||||
border-bottom: 1px solid #aaa;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
.FCGInput>input[type="file"] {
|
||||
display: none;
|
||||
}
|
||||
907
.obsidian/plugins/find-unlinked-files/main.js
vendored
Normal file
907
.obsidian/plugins/find-unlinked-files/main.js
vendored
Normal file
|
|
@ -0,0 +1,907 @@
|
|||
/*
|
||||
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
||||
if you want to view the source visit the plugins github repository (https://github.com/Vinzent03/obsidian-advanced-uri)
|
||||
*/
|
||||
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __export = (target, all) => {
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __copyProps = (to, from, except, desc) => {
|
||||
if (from && typeof from === "object" || typeof from === "function") {
|
||||
for (let key of __getOwnPropNames(from))
|
||||
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||
}
|
||||
return to;
|
||||
};
|
||||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||
|
||||
// src/main.ts
|
||||
var main_exports = {};
|
||||
__export(main_exports, {
|
||||
default: () => FindOrphanedFilesPlugin
|
||||
});
|
||||
module.exports = __toCommonJS(main_exports);
|
||||
var import_obsidian4 = require("obsidian");
|
||||
|
||||
// src/deleteFilesModal.ts
|
||||
var import_obsidian = require("obsidian");
|
||||
var DeleteFilesModal = class extends import_obsidian.Modal {
|
||||
constructor(app, filesToDelete) {
|
||||
super(app);
|
||||
this.filesToDelete = filesToDelete;
|
||||
}
|
||||
onOpen() {
|
||||
let { contentEl, titleEl } = this;
|
||||
titleEl.setText(
|
||||
"Move " + this.filesToDelete.length + " files to system trash?"
|
||||
);
|
||||
contentEl.createEl("button", { text: "Cancel" }).addEventListener("click", () => this.close());
|
||||
contentEl.setAttr("margin", "auto");
|
||||
contentEl.createEl("button", {
|
||||
cls: "mod-cta",
|
||||
text: "Confirm"
|
||||
}).addEventListener("click", async () => {
|
||||
for (const file of this.filesToDelete) {
|
||||
await this.app.vault.trash(file, true);
|
||||
}
|
||||
this.close();
|
||||
});
|
||||
}
|
||||
onClose() {
|
||||
let { contentEl } = this;
|
||||
contentEl.empty();
|
||||
}
|
||||
};
|
||||
|
||||
// src/settingsTab.ts
|
||||
var import_obsidian2 = require("obsidian");
|
||||
var SettingsTab = class extends import_obsidian2.PluginSettingTab {
|
||||
constructor(app, plugin, defaultSettings) {
|
||||
super(app, plugin);
|
||||
this.defaultSettings = defaultSettings;
|
||||
this.plugin = plugin;
|
||||
}
|
||||
// Add trailing slash to catch files named like the directory. See https://github.com/Vinzent03/find-unlinked-files/issues/24
|
||||
formatPath(path, addDirectorySlash) {
|
||||
if (path.length == 0)
|
||||
return path;
|
||||
path = (0, import_obsidian2.normalizePath)(path);
|
||||
if (addDirectorySlash)
|
||||
return path + "/";
|
||||
else
|
||||
return path;
|
||||
}
|
||||
display() {
|
||||
let { containerEl } = this;
|
||||
containerEl.empty();
|
||||
containerEl.createEl("h2", { text: this.plugin.manifest.name });
|
||||
containerEl.createEl("h4", {
|
||||
text: "Settings for finding orphaned files"
|
||||
});
|
||||
new import_obsidian2.Setting(containerEl).setName("Open output file").addToggle(
|
||||
(cb) => cb.setValue(this.plugin.settings.openOutputFile).onChange((value) => {
|
||||
this.plugin.settings.openOutputFile = value;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Output file name").setDesc(
|
||||
"Set name of output file (without file extension). Make sure no file exists with this name because it will be overwritten! If the name is empty, the default name is set."
|
||||
).addText(
|
||||
(cb) => cb.onChange((value) => {
|
||||
if (value.length == 0) {
|
||||
this.plugin.settings.outputFileName = this.defaultSettings.outputFileName;
|
||||
} else {
|
||||
this.plugin.settings.outputFileName = value;
|
||||
}
|
||||
this.plugin.saveSettings();
|
||||
}).setValue(this.plugin.settings.outputFileName)
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Disable working links").setDesc(
|
||||
"Indent lines to disable the link and to clean up the graph view"
|
||||
).addToggle(
|
||||
(cb) => cb.onChange((value) => {
|
||||
this.plugin.settings.disableWorkingLinks = value;
|
||||
this.plugin.saveSettings();
|
||||
}).setValue(this.plugin.settings.disableWorkingLinks)
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files in the given directories").setDesc(
|
||||
"Enable to exclude files in the given directories. Disable to only include files in the given directories"
|
||||
).addToggle(
|
||||
(cb) => cb.setValue(this.plugin.settings.ignoreDirectories).onChange((value) => {
|
||||
this.plugin.settings.ignoreDirectories = value;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Directories").setDesc("Add each directory path in a new line").addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/Subdirectory").setValue(
|
||||
this.plugin.settings.directoriesToIgnore.join("\n")
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, true));
|
||||
this.plugin.settings.directoriesToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files").setDesc("Add each file path in a new line (with file extension!)").addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/file.md").setValue(this.plugin.settings.filesToIgnore.join("\n")).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, false));
|
||||
this.plugin.settings.filesToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude links").setDesc(
|
||||
"Exclude files, which contain the given file as link. Add each file path in a new line (with file extension!). Set it to `*` to exclude files with links."
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/file.md").setValue(this.plugin.settings.linksToIgnore.join("\n")).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, false));
|
||||
this.plugin.settings.linksToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files with the given filetypes").setDesc(
|
||||
"Enable to exclude files with the given filetypes. Disable to only include files with the given filetypes"
|
||||
).addToggle(
|
||||
(cb) => cb.setValue(this.plugin.settings.ignoreFileTypes).onChange((value) => {
|
||||
this.plugin.settings.ignoreFileTypes = value;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("File types").setDesc("Effect depends on toggle above").addTextArea(
|
||||
(cb) => cb.setPlaceholder("docx,txt").setValue(this.plugin.settings.fileTypesToIgnore.join(",")).onChange((value) => {
|
||||
let extensions = value.trim().split(",");
|
||||
this.plugin.settings.fileTypesToIgnore = extensions;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude tags").setDesc(
|
||||
"Exclude files, which contain the given tag. Add each tag separated by comma (without `#`)"
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("todo,unfinished").setValue(this.plugin.settings.tagsToIgnore.join(",")).onChange((value) => {
|
||||
let tags = value.trim().split(",");
|
||||
this.plugin.settings.tagsToIgnore = tags;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Filetypes to delete per command. See README.").setDesc(
|
||||
"Add each filetype separated by comma. Set to `*` to delete all files."
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("jpg,png").setValue(this.plugin.settings.fileTypesToDelete.join(",")).onChange((value) => {
|
||||
let extensions = value.trim().split(",");
|
||||
this.plugin.settings.fileTypesToDelete = extensions;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
containerEl.createEl("h4", {
|
||||
text: "Settings for finding broken links"
|
||||
});
|
||||
new import_obsidian2.Setting(containerEl).setName("Output file name").setDesc(
|
||||
"Set name of output file (without file extension). Make sure no file exists with this name because it will be overwritten! If the name is empty, the default name is set."
|
||||
).addText(
|
||||
(cb) => cb.onChange((value) => {
|
||||
if (value.length == 0) {
|
||||
this.plugin.settings.unresolvedLinksOutputFileName = this.defaultSettings.unresolvedLinksOutputFileName;
|
||||
} else {
|
||||
this.plugin.settings.unresolvedLinksOutputFileName = value;
|
||||
}
|
||||
this.plugin.saveSettings();
|
||||
}).setValue(
|
||||
this.plugin.settings.unresolvedLinksOutputFileName
|
||||
)
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files in the given directories").setDesc(
|
||||
"Enable to exclude files in the given directories. Disable to only include files in the given directories"
|
||||
).addToggle(
|
||||
(cb) => cb.setValue(
|
||||
this.plugin.settings.unresolvedLinksIgnoreDirectories
|
||||
).onChange((value) => {
|
||||
this.plugin.settings.unresolvedLinksIgnoreDirectories = value;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Directories").setDesc("Add each directory path in a new line").addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/Subdirectory").setValue(
|
||||
this.plugin.settings.unresolvedLinksDirectoriesToIgnore.join(
|
||||
"\n"
|
||||
)
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, true));
|
||||
this.plugin.settings.unresolvedLinksDirectoriesToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files").setDesc(
|
||||
"Exclude links in the specified file. Add each file path in a new line (with file extension!)"
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/file.md").setValue(
|
||||
this.plugin.settings.unresolvedLinksFilesToIgnore.join(
|
||||
"\n"
|
||||
)
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, false));
|
||||
this.plugin.settings.unresolvedLinksFilesToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude links").setDesc(
|
||||
"Exclude files, which contain the given file as link. Add each file path in a new line (with file extension!). Set it to `*` to exclude files with links."
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/file.md").setValue(
|
||||
this.plugin.settings.unresolvedLinksLinksToIgnore.join(
|
||||
"\n"
|
||||
)
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, false));
|
||||
this.plugin.settings.unresolvedLinksLinksToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude filetypes").setDesc(
|
||||
"Exclude links with the specified filetype. Add each filetype separated by comma"
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("docx,txt").setValue(
|
||||
this.plugin.settings.unresolvedLinksFileTypesToIgnore.join(
|
||||
","
|
||||
)
|
||||
).onChange((value) => {
|
||||
let extensions = value.trim().split(",");
|
||||
this.plugin.settings.unresolvedLinksFileTypesToIgnore = extensions;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude tags").setDesc(
|
||||
"Exclude links in files, which contain the given tag. Add each tag separated by comma (without `#`)"
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("todo,unfinished").setValue(
|
||||
this.plugin.settings.unresolvedLinksTagsToIgnore.join(
|
||||
","
|
||||
)
|
||||
).onChange((value) => {
|
||||
let tags = value.trim().split(",");
|
||||
this.plugin.settings.unresolvedLinksTagsToIgnore = tags;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
containerEl.createEl("h4", {
|
||||
text: "Settings for finding files without tags"
|
||||
});
|
||||
new import_obsidian2.Setting(containerEl).setName("Output file name").setDesc(
|
||||
"Set name of output file (without file extension). Make sure no file exists with this name because it will be overwritten! If the name is empty, the default name is set."
|
||||
).addText(
|
||||
(cb) => cb.onChange((value) => {
|
||||
if (value.length == 0) {
|
||||
this.plugin.settings.withoutTagsOutputFileName = this.defaultSettings.withoutTagsOutputFileName;
|
||||
} else {
|
||||
this.plugin.settings.withoutTagsOutputFileName = value;
|
||||
}
|
||||
this.plugin.saveSettings();
|
||||
}).setValue(this.plugin.settings.withoutTagsOutputFileName)
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files").setDesc(
|
||||
"Exclude the specific files. Add each file path in a new line (with file extension!)"
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/file.md").setValue(
|
||||
this.plugin.settings.withoutTagsFilesToIgnore.join("\n")
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, false));
|
||||
this.plugin.settings.withoutTagsFilesToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude directories").setDesc(
|
||||
"Exclude files in the specified directories. Add each directory path in a new line"
|
||||
).addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/Subdirectory").setValue(
|
||||
this.plugin.settings.withoutTagsDirectoriesToIgnore.join(
|
||||
"\n"
|
||||
)
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, true));
|
||||
this.plugin.settings.withoutTagsDirectoriesToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
containerEl.createEl("h4", {
|
||||
text: "Settings for finding empty files"
|
||||
});
|
||||
new import_obsidian2.Setting(containerEl).setName("Output file name").setDesc(
|
||||
"Set name of output file (without file extension). Make sure no file exists with this name because it will be overwritten! If the name is empty, the default name is set."
|
||||
).addText(
|
||||
(cb) => cb.onChange((value) => {
|
||||
if (value.length == 0) {
|
||||
this.plugin.settings.emptyFilesOutputFileName = this.defaultSettings.emptyFilesOutputFileName;
|
||||
} else {
|
||||
this.plugin.settings.emptyFilesOutputFileName = value;
|
||||
}
|
||||
this.plugin.saveSettings();
|
||||
}).setValue(this.plugin.settings.emptyFilesOutputFileName)
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files in the given directories").setDesc(
|
||||
"Enable to exclude files in the given directories. Disable to only include files in the given directories"
|
||||
).addToggle(
|
||||
(cb) => cb.setValue(this.plugin.settings.emptyFilesIgnoreDirectories).onChange((value) => {
|
||||
this.plugin.settings.emptyFilesIgnoreDirectories = value;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Directories").setDesc("Add each directory path in a new line").addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/Subdirectory").setValue(
|
||||
this.plugin.settings.emptyFilesDirectories.join("\n")
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, true));
|
||||
this.plugin.settings.emptyFilesDirectories = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude files").setDesc("Add each file path in a new line (with file extension!)").addTextArea(
|
||||
(cb) => cb.setPlaceholder("Directory/file.md").setValue(
|
||||
this.plugin.settings.emptyFilesFilesToIgnore.join("\n")
|
||||
).onChange((value) => {
|
||||
let paths = value.trim().split("\n").map((value2) => this.formatPath(value2, false));
|
||||
this.plugin.settings.emptyFilesFilesToIgnore = paths;
|
||||
this.plugin.saveSettings();
|
||||
})
|
||||
);
|
||||
new import_obsidian2.Setting(containerEl).setName("Donate").setDesc(
|
||||
"If you like this Plugin, consider donating to support continued development."
|
||||
).addButton((bt) => {
|
||||
bt.buttonEl.outerHTML = "<a href='https://ko-fi.com/F1F195IQ5' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://cdn.ko-fi.com/cdn/kofi3.png?v=3' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>";
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// src/utils.ts
|
||||
var import_obsidian3 = require("obsidian");
|
||||
var Utils = class {
|
||||
/**
|
||||
* Checks for the given settings. Is used for `Find orphaned files` and `Find broken links`
|
||||
* @param app
|
||||
* @param filePath
|
||||
* @param tagsToIgnore
|
||||
* @param linksToIgnore
|
||||
* @param directoriesToIgnore
|
||||
* @param filesToIgnore
|
||||
* @param ignoreDirectories
|
||||
*/
|
||||
constructor(app, filePath, tagsToIgnore, linksToIgnore, directoriesToIgnore, filesToIgnore, ignoreDirectories = true, dir) {
|
||||
this.app = app;
|
||||
this.filePath = filePath;
|
||||
this.tagsToIgnore = tagsToIgnore;
|
||||
this.linksToIgnore = linksToIgnore;
|
||||
this.directoriesToIgnore = directoriesToIgnore;
|
||||
this.filesToIgnore = filesToIgnore;
|
||||
this.ignoreDirectories = ignoreDirectories;
|
||||
this.dir = dir;
|
||||
this.fileCache = app.metadataCache.getCache(filePath);
|
||||
}
|
||||
hasTagsToIgnore() {
|
||||
const tags = (0, import_obsidian3.getAllTags)(this.fileCache);
|
||||
return (tags == null ? void 0 : tags.find(
|
||||
(tag) => this.tagsToIgnore.contains(tag.substring(1))
|
||||
)) !== void 0;
|
||||
}
|
||||
hasLinksToIgnore() {
|
||||
var _a, _b;
|
||||
if ((((_a = this.fileCache) == null ? void 0 : _a.embeds) != null || ((_b = this.fileCache) == null ? void 0 : _b.links) != null) && this.linksToIgnore[0] == "*") {
|
||||
return true;
|
||||
}
|
||||
return (0, import_obsidian3.iterateCacheRefs)(this.fileCache, (cb) => {
|
||||
var _a2;
|
||||
const link = (_a2 = this.app.metadataCache.getFirstLinkpathDest(
|
||||
cb.link,
|
||||
this.filePath
|
||||
)) == null ? void 0 : _a2.path;
|
||||
return this.linksToIgnore.contains(link);
|
||||
});
|
||||
}
|
||||
checkDirectory() {
|
||||
if (this.dir) {
|
||||
if (!this.filePath.startsWith(this.dir)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
const contains = this.directoriesToIgnore.find(
|
||||
(value) => value.length != 0 && this.filePath.startsWith(value)
|
||||
) !== void 0;
|
||||
if (this.ignoreDirectories) {
|
||||
return contains;
|
||||
} else {
|
||||
return !contains;
|
||||
}
|
||||
}
|
||||
isFileToIgnore() {
|
||||
return this.filesToIgnore.contains(this.filePath);
|
||||
}
|
||||
shouldIgnoreFile() {
|
||||
return this.hasTagsToIgnore() || this.hasLinksToIgnore() || this.checkDirectory() || this.isFileToIgnore();
|
||||
}
|
||||
/**
|
||||
* Writes the text to the file and opens the file in a new pane if it is not opened yet
|
||||
* @param app
|
||||
* @param outputFileName name of the output file
|
||||
* @param text data to be written to the file
|
||||
*/
|
||||
static async writeAndOpenFile(app, outputFileName, text, openFile) {
|
||||
await app.vault.adapter.write(outputFileName, text);
|
||||
if (!openFile)
|
||||
return;
|
||||
let fileIsAlreadyOpened = false;
|
||||
app.workspace.iterateAllLeaves((leaf) => {
|
||||
if (leaf.getDisplayText() != "" && outputFileName.startsWith(leaf.getDisplayText())) {
|
||||
fileIsAlreadyOpened = true;
|
||||
}
|
||||
});
|
||||
if (!fileIsAlreadyOpened) {
|
||||
const newPane = app.workspace.getLeavesOfType("empty").length == 0;
|
||||
if (newPane) {
|
||||
app.workspace.openLinkText(outputFileName, "/", true);
|
||||
} else {
|
||||
const file = app.vault.getAbstractFileByPath(outputFileName);
|
||||
if (file instanceof import_obsidian3.TFile) {
|
||||
await app.workspace.getLeavesOfType("empty")[0].openFile(file);
|
||||
} else {
|
||||
app.workspace.openLinkText(outputFileName, "/", true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
var DEFAULT_SETTINGS = {
|
||||
outputFileName: "orphaned files output",
|
||||
disableWorkingLinks: false,
|
||||
directoriesToIgnore: [],
|
||||
filesToIgnore: [],
|
||||
fileTypesToIgnore: [],
|
||||
linksToIgnore: [],
|
||||
tagsToIgnore: [],
|
||||
fileTypesToDelete: [],
|
||||
ignoreFileTypes: true,
|
||||
ignoreDirectories: true,
|
||||
unresolvedLinksIgnoreDirectories: true,
|
||||
unresolvedLinksOutputFileName: "broken links output",
|
||||
unresolvedLinksDirectoriesToIgnore: [],
|
||||
unresolvedLinksFilesToIgnore: [],
|
||||
unresolvedLinksFileTypesToIgnore: [],
|
||||
unresolvedLinksLinksToIgnore: [],
|
||||
unresolvedLinksTagsToIgnore: [],
|
||||
withoutTagsDirectoriesToIgnore: [],
|
||||
withoutTagsFilesToIgnore: [],
|
||||
withoutTagsOutputFileName: "files without tags",
|
||||
emptyFilesOutputFileName: "empty files",
|
||||
emptyFilesDirectories: [],
|
||||
emptyFilesFilesToIgnore: [],
|
||||
emptyFilesIgnoreDirectories: true,
|
||||
openOutputFile: true
|
||||
};
|
||||
var FindOrphanedFilesPlugin = class extends import_obsidian4.Plugin {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.findExtensionRegex = /(\.[^.]+)$/;
|
||||
}
|
||||
async onload() {
|
||||
console.log("loading " + this.manifest.name + " plugin");
|
||||
await this.loadSettings();
|
||||
this.addCommand({
|
||||
id: "find-unlinked-files",
|
||||
name: "Find orphaned files",
|
||||
callback: () => this.findOrphanedFiles()
|
||||
});
|
||||
this.addCommand({
|
||||
id: "find-unresolved-link",
|
||||
name: "Find broken links",
|
||||
callback: () => this.findBrokenLinks()
|
||||
});
|
||||
this.addCommand({
|
||||
id: "delete-unlinked-files",
|
||||
name: "Delete orphaned files with certain extension. See README",
|
||||
callback: () => this.deleteOrphanedFiles()
|
||||
});
|
||||
this.addCommand({
|
||||
id: "create-files-of-broken-links",
|
||||
name: "Create files of broken links",
|
||||
callback: () => this.createFilesOfBrokenLinks()
|
||||
});
|
||||
this.addCommand({
|
||||
id: "find-files-without-tags",
|
||||
name: "Find files without tags",
|
||||
callback: () => this.findFilesWithoutTags()
|
||||
});
|
||||
this.addCommand({
|
||||
id: "find-empty-files",
|
||||
name: "Find empty files",
|
||||
callback: () => this.findEmptyFiles()
|
||||
});
|
||||
this.addCommand({
|
||||
id: "delete-empty-files",
|
||||
name: "Delete empty files",
|
||||
callback: () => this.deleteEmptyFiles()
|
||||
});
|
||||
this.addSettingTab(new SettingsTab(this.app, this, DEFAULT_SETTINGS));
|
||||
this.app.workspace.on("file-menu", (menu, file, _, __) => {
|
||||
if (file instanceof import_obsidian4.TFolder) {
|
||||
menu.addItem((cb) => {
|
||||
cb.setIcon("search");
|
||||
cb.setTitle("Find orphaned files");
|
||||
cb.onClick((_2) => {
|
||||
this.findOrphanedFiles(file.path + "/");
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
async createFilesOfBrokenLinks() {
|
||||
var _a, _b;
|
||||
if (!await this.app.vault.adapter.exists(
|
||||
this.settings.unresolvedLinksOutputFileName + ".md"
|
||||
)) {
|
||||
new import_obsidian4.Notice(
|
||||
"Can't find file - Please run the `Find broken files' command before"
|
||||
);
|
||||
return;
|
||||
}
|
||||
const links = (_a = this.app.metadataCache.getCache(
|
||||
this.settings.unresolvedLinksOutputFileName + ".md"
|
||||
)) == null ? void 0 : _a.links;
|
||||
if (!links) {
|
||||
new import_obsidian4.Notice("No broken links found");
|
||||
return;
|
||||
}
|
||||
const filesToCreate = [];
|
||||
for (const link of links) {
|
||||
const file = this.app.metadataCache.getFirstLinkpathDest(
|
||||
link.link,
|
||||
"/"
|
||||
);
|
||||
if (file)
|
||||
continue;
|
||||
const foundType = (_b = this.findExtensionRegex.exec(link.link)) == null ? void 0 : _b[0];
|
||||
if ((foundType != null ? foundType : ".md") == ".md") {
|
||||
if (foundType) {
|
||||
filesToCreate.push(link.link);
|
||||
} else {
|
||||
filesToCreate.push(link.link + ".md");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (filesToCreate) {
|
||||
for (const file of filesToCreate) {
|
||||
await this.app.vault.create(file, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
async findEmptyFiles() {
|
||||
var _a;
|
||||
const files = this.app.vault.getFiles();
|
||||
const emptyFiles = [];
|
||||
for (const file of files) {
|
||||
if (new Utils(
|
||||
this.app,
|
||||
file.path,
|
||||
[],
|
||||
[],
|
||||
this.settings.emptyFilesDirectories,
|
||||
this.settings.emptyFilesFilesToIgnore,
|
||||
this.settings.emptyFilesIgnoreDirectories
|
||||
).shouldIgnoreFile()) {
|
||||
continue;
|
||||
}
|
||||
const content = await this.app.vault.read(file);
|
||||
const trimmedContent = content.trim();
|
||||
if (!trimmedContent) {
|
||||
emptyFiles.push(file);
|
||||
}
|
||||
const cache = this.app.metadataCache.getFileCache(file);
|
||||
const frontmatter = cache == null ? void 0 : cache.frontmatter;
|
||||
if (frontmatter) {
|
||||
const lines = content.trimRight().split("\n").length;
|
||||
if (((_a = cache.frontmatterPosition) != null ? _a : frontmatter.position).end.line == lines - 1) {
|
||||
emptyFiles.push(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
let prefix;
|
||||
if (this.settings.disableWorkingLinks)
|
||||
prefix = " ";
|
||||
else
|
||||
prefix = "";
|
||||
const text = emptyFiles.map((file) => `${prefix}- [[${file.path}]]`).join("\n");
|
||||
Utils.writeAndOpenFile(
|
||||
this.app,
|
||||
this.settings.emptyFilesOutputFileName + ".md",
|
||||
text,
|
||||
this.settings.openOutputFile
|
||||
);
|
||||
}
|
||||
async findOrphanedFiles(dir) {
|
||||
const startTime = Date.now();
|
||||
const outFileName = this.settings.outputFileName + ".md";
|
||||
let outFile = null;
|
||||
const allFiles = this.app.vault.getFiles();
|
||||
const markdownFiles = this.app.vault.getMarkdownFiles();
|
||||
const canvasFiles = allFiles.filter(
|
||||
(file) => file.extension === "canvas"
|
||||
);
|
||||
const links = /* @__PURE__ */ new Set();
|
||||
const findLinkInTextRegex = /\[\[(.*?)\]\]|\[.*?\]\((.*?)\)/g;
|
||||
const canvasParsingPromises = canvasFiles.map(
|
||||
async (canvasFile) => {
|
||||
var _a;
|
||||
const canvasFileContent = JSON.parse(
|
||||
await this.app.vault.cachedRead(canvasFile) || "{}"
|
||||
);
|
||||
(_a = canvasFileContent.nodes) == null ? void 0 : _a.forEach((node) => {
|
||||
var _a2;
|
||||
let linkTexts = [];
|
||||
if (node.type === "file") {
|
||||
linkTexts.push(node.file);
|
||||
} else if (node.type === "text") {
|
||||
let match;
|
||||
while ((match = findLinkInTextRegex.exec(node.text)) !== null) {
|
||||
linkTexts.push((_a2 = match[1]) != null ? _a2 : match[2]);
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
linkTexts.forEach((linkText) => {
|
||||
const targetFile = this.app.metadataCache.getFirstLinkpathDest(
|
||||
linkText.split("|")[0].split("#")[0],
|
||||
canvasFile.path
|
||||
);
|
||||
if (targetFile != null)
|
||||
links.add(targetFile.path);
|
||||
});
|
||||
});
|
||||
}
|
||||
);
|
||||
markdownFiles.forEach((mdFile) => {
|
||||
var _a, _b, _c;
|
||||
if (outFile === null && mdFile.path == outFileName) {
|
||||
outFile = mdFile;
|
||||
return;
|
||||
}
|
||||
const cache = this.app.metadataCache.getFileCache(mdFile);
|
||||
for (const ref of [
|
||||
...(_a = cache.embeds) != null ? _a : [],
|
||||
...(_b = cache.links) != null ? _b : [],
|
||||
...(_c = cache.frontmatterLinks) != null ? _c : []
|
||||
]) {
|
||||
const txt = this.app.metadataCache.getFirstLinkpathDest(
|
||||
(0, import_obsidian4.getLinkpath)(ref.link),
|
||||
mdFile.path
|
||||
);
|
||||
if (txt != null)
|
||||
links.add(txt.path);
|
||||
}
|
||||
});
|
||||
await Promise.all(canvasParsingPromises);
|
||||
const notLinkedFiles = allFiles.filter(
|
||||
(file) => this.isFileAnOrphan(file, links, dir)
|
||||
);
|
||||
notLinkedFiles.remove(outFile);
|
||||
let text = "";
|
||||
let prefix;
|
||||
if (this.settings.disableWorkingLinks)
|
||||
prefix = " ";
|
||||
else
|
||||
prefix = "";
|
||||
notLinkedFiles.sort((a, b) => b.stat.size - a.stat.size);
|
||||
notLinkedFiles.forEach((file) => {
|
||||
text += prefix + "- [[" + this.app.metadataCache.fileToLinktext(file, "/", false) + "]]\n";
|
||||
});
|
||||
Utils.writeAndOpenFile(
|
||||
this.app,
|
||||
outFileName,
|
||||
text,
|
||||
this.settings.openOutputFile
|
||||
);
|
||||
const endTime = Date.now();
|
||||
const diff = endTime - startTime;
|
||||
if (diff > 1e3) {
|
||||
new import_obsidian4.Notice(
|
||||
`Found ${notLinkedFiles.length} orphaned files in ${diff}ms`
|
||||
);
|
||||
}
|
||||
}
|
||||
async deleteOrphanedFiles() {
|
||||
var _a, _b;
|
||||
if (!await this.app.vault.adapter.exists(
|
||||
this.settings.outputFileName + ".md"
|
||||
)) {
|
||||
new import_obsidian4.Notice(
|
||||
"Can't find file - Please run the `Find orphaned files' command before"
|
||||
);
|
||||
return;
|
||||
}
|
||||
const links = (_b = (_a = this.app.metadataCache.getCache(
|
||||
this.settings.outputFileName + ".md"
|
||||
)) == null ? void 0 : _a.links) != null ? _b : [];
|
||||
const filesToDelete = [];
|
||||
links.forEach((link) => {
|
||||
const file = this.app.metadataCache.getFirstLinkpathDest(
|
||||
link.link,
|
||||
"/"
|
||||
);
|
||||
if (!file)
|
||||
return;
|
||||
if (this.settings.fileTypesToDelete[0] == "*" || this.settings.fileTypesToDelete.contains(file.extension)) {
|
||||
filesToDelete.push(file);
|
||||
}
|
||||
});
|
||||
if (filesToDelete.length > 0)
|
||||
new DeleteFilesModal(this.app, filesToDelete).open();
|
||||
}
|
||||
async deleteEmptyFiles() {
|
||||
var _a, _b;
|
||||
if (!await this.app.vault.adapter.exists(
|
||||
this.settings.emptyFilesOutputFileName + ".md"
|
||||
)) {
|
||||
new import_obsidian4.Notice(
|
||||
"Can't find file - Please run the `Find orphaned files' command before"
|
||||
);
|
||||
return;
|
||||
}
|
||||
const links = (_b = (_a = this.app.metadataCache.getCache(
|
||||
this.settings.emptyFilesOutputFileName + ".md"
|
||||
)) == null ? void 0 : _a.links) != null ? _b : [];
|
||||
const filesToDelete = [];
|
||||
for (const link of links) {
|
||||
const file = this.app.metadataCache.getFirstLinkpathDest(
|
||||
link.link,
|
||||
"/"
|
||||
);
|
||||
if (!file)
|
||||
return;
|
||||
filesToDelete.push(file);
|
||||
}
|
||||
if (filesToDelete.length > 0)
|
||||
new DeleteFilesModal(this.app, filesToDelete).open();
|
||||
}
|
||||
findBrokenLinks() {
|
||||
const outFileName = this.settings.unresolvedLinksOutputFileName + ".md";
|
||||
const links = [];
|
||||
const brokenLinks = this.app.metadataCache.unresolvedLinks;
|
||||
for (const sourceFilepath in brokenLinks) {
|
||||
if (sourceFilepath == this.settings.unresolvedLinksOutputFileName + ".md")
|
||||
continue;
|
||||
const fileType = sourceFilepath.substring(
|
||||
sourceFilepath.lastIndexOf(".") + 1
|
||||
);
|
||||
const utils = new Utils(
|
||||
this.app,
|
||||
sourceFilepath,
|
||||
this.settings.unresolvedLinksTagsToIgnore,
|
||||
this.settings.unresolvedLinksLinksToIgnore,
|
||||
this.settings.unresolvedLinksDirectoriesToIgnore,
|
||||
this.settings.unresolvedLinksFilesToIgnore,
|
||||
this.settings.unresolvedLinksIgnoreDirectories
|
||||
);
|
||||
if (utils.shouldIgnoreFile())
|
||||
continue;
|
||||
for (const link in brokenLinks[sourceFilepath]) {
|
||||
const linkFileType = link.substring(link.lastIndexOf(".") + 1);
|
||||
if (this.settings.unresolvedLinksFileTypesToIgnore.contains(
|
||||
linkFileType
|
||||
))
|
||||
continue;
|
||||
let formattedFilePath = sourceFilepath;
|
||||
if (fileType == "md") {
|
||||
formattedFilePath = sourceFilepath.substring(
|
||||
0,
|
||||
sourceFilepath.lastIndexOf(".md")
|
||||
);
|
||||
}
|
||||
const brokenLink = {
|
||||
files: [formattedFilePath],
|
||||
link
|
||||
};
|
||||
if (links.contains(brokenLink))
|
||||
continue;
|
||||
const duplication = links.find((e) => e.link == link);
|
||||
if (duplication) {
|
||||
duplication.files.push(formattedFilePath);
|
||||
} else {
|
||||
links.push(brokenLink);
|
||||
}
|
||||
}
|
||||
}
|
||||
Utils.writeAndOpenFile(
|
||||
this.app,
|
||||
outFileName,
|
||||
[
|
||||
"Don't forget that creating the file from here may create the file in the wrong directory!",
|
||||
...links.map(
|
||||
(e) => `- [[${e.link}]] in [[${e.files.join("]], [[")}]]`
|
||||
)
|
||||
].join("\n"),
|
||||
this.settings.openOutputFile
|
||||
);
|
||||
}
|
||||
findFilesWithoutTags() {
|
||||
const outFileName = this.settings.withoutTagsOutputFileName + ".md";
|
||||
let outFile;
|
||||
const files = this.app.vault.getMarkdownFiles();
|
||||
let withoutFiles = files.filter((file) => {
|
||||
var _a;
|
||||
const utils = new Utils(
|
||||
this.app,
|
||||
file.path,
|
||||
[],
|
||||
[],
|
||||
this.settings.withoutTagsDirectoriesToIgnore,
|
||||
this.settings.withoutTagsFilesToIgnore,
|
||||
true
|
||||
);
|
||||
if (utils.shouldIgnoreFile()) {
|
||||
return false;
|
||||
}
|
||||
return ((_a = (0, import_obsidian4.getAllTags)(this.app.metadataCache.getFileCache(file)).length) != null ? _a : 0) <= 0;
|
||||
});
|
||||
withoutFiles.remove(outFile);
|
||||
let prefix;
|
||||
if (this.settings.disableWorkingLinks)
|
||||
prefix = " ";
|
||||
else
|
||||
prefix = "";
|
||||
const text = withoutFiles.map((file) => `${prefix}- [[${file.path}]]`).join("\n");
|
||||
Utils.writeAndOpenFile(
|
||||
this.app,
|
||||
outFileName,
|
||||
text,
|
||||
this.settings.openOutputFile
|
||||
);
|
||||
}
|
||||
/**
|
||||
* Checks if the given file in an orphaned file
|
||||
*
|
||||
* @param file file to check
|
||||
* @param links all links in the vault
|
||||
*/
|
||||
isFileAnOrphan(file, links, dir) {
|
||||
if (links.has(file.path))
|
||||
return false;
|
||||
if (file.extension == "css")
|
||||
return false;
|
||||
if (this.settings.fileTypesToIgnore[0] !== "") {
|
||||
const containsFileType = this.settings.fileTypesToIgnore.contains(
|
||||
file.extension
|
||||
);
|
||||
if (this.settings.ignoreFileTypes) {
|
||||
if (containsFileType)
|
||||
return;
|
||||
} else {
|
||||
if (!containsFileType)
|
||||
return;
|
||||
}
|
||||
}
|
||||
const utils = new Utils(
|
||||
this.app,
|
||||
file.path,
|
||||
this.settings.tagsToIgnore,
|
||||
this.settings.linksToIgnore,
|
||||
this.settings.directoriesToIgnore,
|
||||
this.settings.filesToIgnore,
|
||||
this.settings.ignoreDirectories,
|
||||
dir
|
||||
);
|
||||
if (utils.shouldIgnoreFile())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
onunload() {
|
||||
console.log("unloading " + this.manifest.name + " plugin");
|
||||
}
|
||||
async loadSettings() {
|
||||
this.settings = Object.assign(DEFAULT_SETTINGS, await this.loadData());
|
||||
}
|
||||
async saveSettings() {
|
||||
await this.saveData(this.settings);
|
||||
}
|
||||
};
|
||||
|
||||
/* nosourcemap */
|
||||
10
.obsidian/plugins/find-unlinked-files/manifest.json
vendored
Normal file
10
.obsidian/plugins/find-unlinked-files/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "find-unlinked-files",
|
||||
"name": "Find orphaned files and broken links",
|
||||
"version": "1.10.1",
|
||||
"description": "Find files that are not linked anywhere and would otherwise be lost in your vault. In other words: files with no backlinks.",
|
||||
"author": "Vinzent",
|
||||
"fundingUrl": "https://ko-fi.com/vinzent",
|
||||
"authorUrl": "https://github.com/Vinzent03",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
3637
.obsidian/plugins/highlightr-plugin/main.js
vendored
Normal file
3637
.obsidian/plugins/highlightr-plugin/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/highlightr-plugin/manifest.json
vendored
Normal file
10
.obsidian/plugins/highlightr-plugin/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "highlightr-plugin",
|
||||
"name": "Highlightr",
|
||||
"version": "1.2.2",
|
||||
"minAppVersion": "0.12.8",
|
||||
"description": "A minimal and aesthetically pleasing highlighting menu that makes color-coded highlighting much easier with a configurable assortment of highlight colors 🎨.",
|
||||
"author": "chetachi",
|
||||
"authorUrl": "https://github.com/chetachiezikeuzor",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
774
.obsidian/plugins/highlightr-plugin/styles.css
vendored
Normal file
774
.obsidian/plugins/highlightr-plugin/styles.css
vendored
Normal file
|
|
@ -0,0 +1,774 @@
|
|||
/*highlighter style*/
|
||||
/*lowlight*/
|
||||
.highlightr-lowlight mark,
|
||||
.highlightr-lowlight span.cm-highlight,
|
||||
.highlightr-lowlight .markdown-preview-view mark {
|
||||
--lowlight-background: var(--background-primary);
|
||||
border-radius: 0;
|
||||
background-image: linear-gradient(
|
||||
360deg,
|
||||
rgba(255, 255, 255, 0) 40%,
|
||||
var(--lowlight-background) 40%
|
||||
) !important;
|
||||
}
|
||||
|
||||
.highlightr-lowlight .workspace-split.mod-left-split mark,
|
||||
.highlightr-lowlight .workspace-split.mod-left-split span.cm-highlight,
|
||||
.highlightr-lowlight
|
||||
.workspace-split.mod-left-split
|
||||
.markdown-preview-view
|
||||
mark,
|
||||
.highlightr-lowlight .workspace-split.mod-right-split mark,
|
||||
.highlightr-lowlight .workspace-split.mod-right-split span.cm-highlight,
|
||||
.highlightr-lowlight
|
||||
.workspace-split.mod-right-split
|
||||
.markdown-preview-view
|
||||
mark {
|
||||
--lowlight-background: var(--background-secondary);
|
||||
}
|
||||
|
||||
.highlightr-lowlight .admonition-content mark,
|
||||
.highlightr-lowlight .admonition-content span.cm-highlight,
|
||||
.highlightr-lowlight .admonition-content > .markdown-preview-view mark {
|
||||
--lowlight-background: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
/*floating*/
|
||||
.highlightr-floating mark,
|
||||
.highlightr-floating span.cm-highlight,
|
||||
.highlightr-floating .markdown-preview-view mark {
|
||||
--floating-background: var(--background-primary);
|
||||
border-radius: 0;
|
||||
padding-bottom: 5px;
|
||||
background-image: linear-gradient(
|
||||
360deg,
|
||||
rgba(255, 255, 255, 0) 28%,
|
||||
var(--floating-background) 28%
|
||||
) !important;
|
||||
}
|
||||
|
||||
.highlightr-floating .workspace-split.mod-left-split mark,
|
||||
.highlightr-floating .workspace-split.mod-left-split span.cm-highlight,
|
||||
.highlightr-floating
|
||||
.workspace-split.mod-left-split
|
||||
.markdown-preview-view
|
||||
mark,
|
||||
.highlightr-floating .workspace-split.mod-right-split mark,
|
||||
.highlightr-floating .workspace-split.mod-right-split span.cm-highlight,
|
||||
.highlightr-floating
|
||||
.workspace-split.mod-right-split
|
||||
.markdown-preview-view
|
||||
mark {
|
||||
--floating-background: var(--background-secondary);
|
||||
}
|
||||
|
||||
.highlightr-floating .admonition-content mark,
|
||||
.highlightr-floating .admonition-content span.cm-highlight,
|
||||
.highlightr-floating .admonition-content > .markdown-preview-view mark {
|
||||
--floating-background: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
/*rounded*/
|
||||
.highlightr-rounded mark,
|
||||
.highlightr-rounded .markdown-preview-view mark {
|
||||
margin: 0 -0.05em;
|
||||
padding: 0.125em 0.15em;
|
||||
border-radius: 0.2em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
}
|
||||
|
||||
.highlightr-rounded span.cm-highlight {
|
||||
border-radius: 0.2em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
}
|
||||
|
||||
.highlightr-rounded .cm-s-obsidian span.cm-highlight {
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
.highlightr-rounded .cm-highlight + span.cm-formatting-highlight {
|
||||
padding-left: 0em;
|
||||
padding-right: 0.15em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
}
|
||||
|
||||
/*realistic*/
|
||||
.highlightr-realistic mark,
|
||||
.highlightr-realistic .markdown-preview-view mark {
|
||||
margin: 0 -0.05em;
|
||||
padding: 0.1em 0.4em;
|
||||
border-radius: 0.8em 0.3em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
text-shadow: 0 0 0.75em var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.highlightr-realistic.hide-tokens .cm-s-obsidian span.cm-highlight,
|
||||
.hide-tokens.highlightr-realistic .cm-s-obsidian span.cm-highlight {
|
||||
border-radius: 0.8em 0.3em;
|
||||
}
|
||||
|
||||
.highlightr-realistic .cm-s-obsidian span.cm-highlight {
|
||||
padding: 0.15em 0.25em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
text-shadow: 0 0 0.75em var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.highlightr-realistic .cm-s-obsidian span.cm-formatting-highlight {
|
||||
margin: 0 0 0 -0.05em;
|
||||
padding: 0.15em 0.25em;
|
||||
border-radius: 0.8em 0 0 0.3em;
|
||||
-webkit-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
}
|
||||
|
||||
.highlightr-realistic
|
||||
.cm-s-obsidian
|
||||
.cm-highlight
|
||||
+ span.cm-formatting-highlight {
|
||||
margin: 0 -0.05em 0 0;
|
||||
padding: 0.15em 0.25em;
|
||||
border-radius: 0 0.3em 0.8em 0;
|
||||
-webkit-box-decoration-break: clone;
|
||||
box-decoration-break: clone;
|
||||
}
|
||||
|
||||
/**/
|
||||
|
||||
button.copy-highlights {
|
||||
padding: 4px 14px;
|
||||
border-radius: 5px;
|
||||
background-color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.copy-highlights svg {
|
||||
width: 1.3em;
|
||||
height: 1.3em;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
details summary.highlight-summary:before {
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
content: "☐";
|
||||
font-size: 9px;
|
||||
cursor: pointer;
|
||||
margin-right: 5px;
|
||||
display: inline-block;
|
||||
vertical-align: 0.05em;
|
||||
background-color: currentColor;
|
||||
-webkit-mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><path fill="black" d="M10.707 17.707L16.414 12l-5.707-5.707l-1.414 1.414L13.586 12l-4.293 4.293z"></path></svg>');
|
||||
}
|
||||
|
||||
details[open] summary.highlight-summary::before {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
/*highlightr component*/
|
||||
|
||||
@keyframes fade {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
20% {
|
||||
opacity: 0.9;
|
||||
}
|
||||
40% {
|
||||
opacity: 0.95;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.menu.highlighterContainer {
|
||||
min-width: 140px;
|
||||
max-width: 225px;
|
||||
max-height: 180px;
|
||||
padding-left: 0em;
|
||||
padding: 0;
|
||||
margin: 0 auto;
|
||||
border-radius: 6px;
|
||||
font-size: 14px;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
position: fixed;
|
||||
animation: fade 300ms ease-in-out;
|
||||
background-color: var(--background-primary);
|
||||
box-shadow: 0px 3px 25px rgba(31, 38, 135, 0.1);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.menu.highlighterContainer .menu-item .menu-item-icon {
|
||||
display: inline-block;
|
||||
width: 25px;
|
||||
position: relative;
|
||||
top: 2px;
|
||||
}
|
||||
|
||||
.menu.highlighterContainer .menu-item {
|
||||
display: flex;
|
||||
padding: 2px 14px 3px 14px;
|
||||
align-items: unset;
|
||||
margin: auto;
|
||||
cursor: pointer;
|
||||
font-size: 14px;
|
||||
height: 32px;
|
||||
line-height: 31px;
|
||||
white-space: nowrap;
|
||||
border-radius: 0;
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.menu.highlighterContainer .menu-item:last-of-type {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
SETTINGS TAB
|
||||
----------------------------------------------------------------*/
|
||||
|
||||
button.HighlightrSettingsButton {
|
||||
padding: 4px 14px;
|
||||
border-radius: 6px;
|
||||
height: fit-content;
|
||||
}
|
||||
|
||||
button.HighlightrSettingsButton svg {
|
||||
width: 1.3em;
|
||||
height: 1.3em;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.highlighter-settings-color,
|
||||
.highlighter-settings-value {
|
||||
width: 42%;
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
.highlighterplugin-setting-item {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.highlighterplugin-setting-item .setting-item-control {
|
||||
justify-content: space-between;
|
||||
margin-top: 12px;
|
||||
align-content: center;
|
||||
align-items: flex-end;
|
||||
grid-gap: 6px;
|
||||
}
|
||||
|
||||
.modal.mod-settings
|
||||
button:not(.mod-cta):not(.mod-warning).HighlightrSettingsButton.HighlightrSettingsButtonAdd,
|
||||
button:not(.mod-cta):not(.mod-warning).HighlightrSettingsButton.HighlightrSettingsButtonAdd {
|
||||
background-color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.modal.mod-settings
|
||||
button:not(.mod-cta):not(.mod-warning).HighlightrSettingsButton.HighlightrSettingsButtonDelete,
|
||||
button:not(.mod-cta):not(.mod-warning).HighlightrSettingsButton.HighlightrSettingsButtonDelete {
|
||||
background-color: #989cab;
|
||||
}
|
||||
|
||||
/**/
|
||||
.highlighter-setting-icon {
|
||||
display: flex;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
}
|
||||
|
||||
.highlighter-item-draggable {
|
||||
cursor: grab;
|
||||
display: grid;
|
||||
grid-gap: 8px;
|
||||
grid-template-columns: 0.5fr 7fr;
|
||||
align-items: center;
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.HighlightrSettingsTabsContainer {
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.setting-item.highlighter-setting-item:first-child {
|
||||
padding-top: 18px;
|
||||
}
|
||||
|
||||
.highlighter-setting-item {
|
||||
padding: 18px 0 18px 0;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
.highlighter-sortable-fallback {
|
||||
cursor: grabbing;
|
||||
box-shadow: 0px 3px 32px rgb(31 38 135 / 15%);
|
||||
}
|
||||
|
||||
.highlighter-sortable-grab {
|
||||
cursor: grabbing !important;
|
||||
}
|
||||
|
||||
.highlighter-sortable-ghost {
|
||||
opacity: 0.4;
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.highlighter-sortable-chosen {
|
||||
cursor: grabbing;
|
||||
padding: 0 0 0 18px;
|
||||
background-color: var(--background-primary);
|
||||
}
|
||||
|
||||
.highlighter-sortable-drag {
|
||||
cursor: grabbing;
|
||||
box-shadow: 0px 3px 32px rgb(31 38 135 / 15%);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
HIGHLIGHTR SUPPORT
|
||||
----------------------------------------------------------------*/
|
||||
|
||||
.hltrDonationSection {
|
||||
width: 65%;
|
||||
height: 50vh;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
.pcr-app .pcr-swatches > button {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.pickr .pcr-button {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
.themed-color-wrapper > div {
|
||||
background: var(--background-primary);
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.themed-color-wrapper > div + div {
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.themed-color-wrapper button {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.themed-color-wrapper .pickr-reset > button {
|
||||
margin: 0 0 0 10px;
|
||||
padding: 9px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.themed-color-wrapper .pickr-reset > button > svg {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
PICKR 1.8.2 MIT | https://github.com/Simonwep/pickr
|
||||
----------------------------------------------------------------*/
|
||||
.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: 0.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: 0.5em;
|
||||
border-radius: 0.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: 0.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: 0.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: 0.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: 0.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: 0.6em;
|
||||
padding: 0 0.6em;
|
||||
}
|
||||
.pcr-app[data-theme="nano"] .pcr-interaction {
|
||||
padding: 0 0.6em 0.6em 0.6em;
|
||||
}
|
||||
.pcr-app[data-theme="nano"] .pcr-selection {
|
||||
display: grid;
|
||||
grid-gap: 0.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: 0.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: 0.5em;
|
||||
border-radius: 0.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: 0.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: 0.5em;
|
||||
border-radius: 0.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 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;
|
||||
}
|
||||
442
.obsidian/plugins/obsidian-git/main.js
vendored
Normal file
442
.obsidian/plugins/obsidian-git/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"author": "Vinzent",
|
||||
"authorUrl": "https://github.com/Vinzent03",
|
||||
"id": "obsidian-git",
|
||||
"name": "Git",
|
||||
"description": "Integrate Git version control with automatic backup and other advanced features.",
|
||||
"isDesktopOnly": false,
|
||||
"fundingUrl": "https://ko-fi.com/vinzent",
|
||||
"version": "2.36.1"
|
||||
}
|
||||
23
.obsidian/plugins/obsidian-git/obsidian_askpass.sh
vendored
Normal file
23
.obsidian/plugins/obsidian-git/obsidian_askpass.sh
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#!/bin/sh
|
||||
|
||||
PROMPT="$1"
|
||||
TEMP_FILE="$OBSIDIAN_GIT_CREDENTIALS_INPUT"
|
||||
|
||||
cleanup() {
|
||||
rm -f "$TEMP_FILE" "$TEMP_FILE.response"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "$PROMPT" > "$TEMP_FILE"
|
||||
|
||||
while [ ! -e "$TEMP_FILE.response" ]; do
|
||||
if [ ! -e "$TEMP_FILE" ]; then
|
||||
echo "Trigger file got removed: Abort" >&2
|
||||
exit 1
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
RESPONSE=$(cat "$TEMP_FILE.response")
|
||||
|
||||
echo "$RESPONSE"
|
||||
705
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal file
705
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal file
|
|
@ -0,0 +1,705 @@
|
|||
@keyframes loading {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.git-signs-gutter {
|
||||
.cm-gutterElement {
|
||||
/* Needed to align the sign properly for different line heigts. Such as
|
||||
* when having a heading or list item.
|
||||
*/
|
||||
padding-top: 0 !important;
|
||||
}
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="git-view"] .button-border {
|
||||
border: 2px solid var(--interactive-accent);
|
||||
border-radius: var(--radius-s);
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="git-view"] .view-content {
|
||||
padding-left: 0;
|
||||
padding-top: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="git-history-view"] .view-content {
|
||||
padding-left: 0;
|
||||
padding-top: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.loading {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.loading > svg {
|
||||
animation: 2s linear infinite loading;
|
||||
transform-origin: 50% 50%;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.obsidian-git-center {
|
||||
margin: auto;
|
||||
text-align: center;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.obsidian-git-textarea {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.obsidian-git-disabled {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.obsidian-git-center-button {
|
||||
display: block;
|
||||
margin: 20px auto;
|
||||
}
|
||||
|
||||
.tooltip.mod-left {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.tooltip.mod-right {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
/* Limits the scrollbar to the view body */
|
||||
.git-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.git-tools {
|
||||
display: flex;
|
||||
margin-left: auto;
|
||||
}
|
||||
.git-tools .type {
|
||||
padding-left: var(--size-2-1);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 11px;
|
||||
}
|
||||
|
||||
.git-tools .type[data-type="M"] {
|
||||
color: orange;
|
||||
}
|
||||
.git-tools .type[data-type="D"] {
|
||||
color: red;
|
||||
}
|
||||
.git-tools .buttons {
|
||||
display: flex;
|
||||
}
|
||||
.git-tools .buttons > * {
|
||||
padding: 0 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="git-view"] .tree-item-self,
|
||||
.workspace-leaf-content[data-type="git-history-view"] .tree-item-self {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.workspace-leaf-content[data-type="git-view"]
|
||||
.tree-item-self:hover
|
||||
.clickable-icon,
|
||||
.workspace-leaf-content[data-type="git-history-view"]
|
||||
.tree-item-self:hover
|
||||
.clickable-icon {
|
||||
color: var(--icon-color-hover);
|
||||
}
|
||||
|
||||
/* Highlight an item as active if it's diff is currently opened */
|
||||
.is-active .git-tools .buttons > * {
|
||||
color: var(--nav-item-color-active);
|
||||
}
|
||||
|
||||
.git-author {
|
||||
color: var(--text-accent);
|
||||
}
|
||||
|
||||
.git-date {
|
||||
color: var(--text-accent);
|
||||
}
|
||||
|
||||
.git-ref {
|
||||
color: var(--text-accent);
|
||||
}
|
||||
|
||||
/* ====== diff2html ======
|
||||
The following styles are adapted from the obsidian-version-history plugin by
|
||||
@kometenstaub https://github.com/kometenstaub/obsidian-version-history-diff/blob/main/src/styles.scss
|
||||
which itself is adapted from the diff2html library with the following original license:
|
||||
|
||||
https://github.com/rtfpessoa/diff2html/blob/master/LICENSE.md
|
||||
|
||||
Copyright 2014-2016 Rodrigo Fernandes https://rtfpessoa.github.io/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
.theme-dark,
|
||||
.theme-light {
|
||||
--git-delete-bg: #ff475040;
|
||||
--git-delete-hl: #96050a75;
|
||||
--git-insert-bg: #68d36840;
|
||||
--git-insert-hl: #23c02350;
|
||||
--git-change-bg: #ffd55840;
|
||||
--git-selected: #3572b0;
|
||||
|
||||
--git-delete: #c33;
|
||||
--git-insert: #399839;
|
||||
--git-change: #d0b44c;
|
||||
--git-move: #3572b0;
|
||||
}
|
||||
|
||||
.git-diff {
|
||||
.d2h-d-none {
|
||||
display: none;
|
||||
}
|
||||
.d2h-wrapper {
|
||||
text-align: left;
|
||||
border-radius: 0.25em;
|
||||
overflow: auto;
|
||||
}
|
||||
.d2h-file-header.d2h-file-header {
|
||||
background-color: var(--background-secondary);
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
font-family:
|
||||
Source Sans Pro,
|
||||
Helvetica Neue,
|
||||
Helvetica,
|
||||
Arial,
|
||||
sans-serif;
|
||||
height: 35px;
|
||||
padding: 5px 10px;
|
||||
}
|
||||
.d2h-file-header,
|
||||
.d2h-file-stats {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
}
|
||||
.d2h-file-header {
|
||||
display: none;
|
||||
}
|
||||
.d2h-file-stats {
|
||||
font-size: 14px;
|
||||
margin-left: auto;
|
||||
}
|
||||
.d2h-lines-added {
|
||||
border: 1px solid var(--color-green);
|
||||
border-radius: 5px 0 0 5px;
|
||||
color: var(--color-green);
|
||||
padding: 2px;
|
||||
text-align: right;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.d2h-lines-deleted {
|
||||
border: 1px solid var(--color-red);
|
||||
border-radius: 0 5px 5px 0;
|
||||
color: var(--color-red);
|
||||
margin-left: 1px;
|
||||
padding: 2px;
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.d2h-file-name-wrapper {
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
font-size: 15px;
|
||||
width: 100%;
|
||||
}
|
||||
.d2h-file-name {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
color: var(--text-normal);
|
||||
font-size: var(--h5-size);
|
||||
}
|
||||
.d2h-file-wrapper {
|
||||
border: 1px solid var(--background-secondary-alt);
|
||||
border-radius: 3px;
|
||||
margin-bottom: 1em;
|
||||
max-height: 100%;
|
||||
}
|
||||
.d2h-file-collapse {
|
||||
-webkit-box-pack: end;
|
||||
-ms-flex-pack: end;
|
||||
-webkit-box-align: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
border: 1px solid var(--background-secondary-alt);
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
display: none;
|
||||
font-size: 12px;
|
||||
justify-content: flex-end;
|
||||
padding: 4px 8px;
|
||||
}
|
||||
.d2h-file-collapse.d2h-selected {
|
||||
background-color: var(--git-selected);
|
||||
}
|
||||
.d2h-file-collapse-input {
|
||||
margin: 0 4px 0 0;
|
||||
}
|
||||
.d2h-diff-table {
|
||||
border-collapse: collapse;
|
||||
font-family: var(--font-monospace);
|
||||
font-size: var(--code-size);
|
||||
width: 100%;
|
||||
}
|
||||
.d2h-files-diff {
|
||||
width: 100%;
|
||||
}
|
||||
.d2h-file-diff {
|
||||
/*
|
||||
overflow-y: scroll;
|
||||
*/
|
||||
border-radius: 5px;
|
||||
font-size: var(--font-text-size);
|
||||
line-height: var(--line-height-normal);
|
||||
}
|
||||
.d2h-file-side-diff {
|
||||
display: inline-block;
|
||||
margin-bottom: -8px;
|
||||
margin-right: -4px;
|
||||
overflow-x: scroll;
|
||||
overflow-y: hidden;
|
||||
width: 50%;
|
||||
}
|
||||
.d2h-code-line {
|
||||
padding-left: 6em;
|
||||
padding-right: 1.5em;
|
||||
}
|
||||
.d2h-code-line,
|
||||
.d2h-code-side-line {
|
||||
display: inline-block;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
.d2h-code-side-line {
|
||||
/* needed to be changed */
|
||||
padding-left: 0.5em;
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
.d2h-code-line-ctn {
|
||||
word-wrap: normal;
|
||||
background: none;
|
||||
display: inline-block;
|
||||
padding: 0;
|
||||
-webkit-user-select: text;
|
||||
-moz-user-select: text;
|
||||
-ms-user-select: text;
|
||||
user-select: text;
|
||||
vertical-align: middle;
|
||||
width: 100%;
|
||||
/* only works for line-by-line */
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
.d2h-code-line del,
|
||||
.d2h-code-side-line del {
|
||||
background-color: var(--git-delete-hl);
|
||||
color: var(--text-normal);
|
||||
}
|
||||
.d2h-code-line del,
|
||||
.d2h-code-line ins,
|
||||
.d2h-code-side-line del,
|
||||
.d2h-code-side-line ins {
|
||||
border-radius: 0.2em;
|
||||
display: inline-block;
|
||||
margin-top: -1px;
|
||||
text-decoration: none;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.d2h-code-line ins,
|
||||
.d2h-code-side-line ins {
|
||||
background-color: var(--git-insert-hl);
|
||||
text-align: left;
|
||||
}
|
||||
.d2h-code-line-prefix {
|
||||
word-wrap: normal;
|
||||
background: none;
|
||||
display: inline;
|
||||
padding: 0;
|
||||
white-space: pre;
|
||||
}
|
||||
.line-num1 {
|
||||
float: left;
|
||||
}
|
||||
.line-num1,
|
||||
.line-num2 {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
/*
|
||||
padding: 0 0.5em;
|
||||
*/
|
||||
text-overflow: ellipsis;
|
||||
width: 2.5em;
|
||||
padding-left: 0;
|
||||
}
|
||||
.line-num2 {
|
||||
float: right;
|
||||
}
|
||||
.d2h-code-linenumber {
|
||||
background-color: var(--background-primary);
|
||||
border: solid var(--background-modifier-border);
|
||||
border-width: 0 1px;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: var(--text-faint);
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
text-align: right;
|
||||
width: 5.5em;
|
||||
}
|
||||
.d2h-code-linenumber:after {
|
||||
content: "\200b";
|
||||
}
|
||||
.d2h-code-side-linenumber {
|
||||
background-color: var(--background-primary);
|
||||
border: solid var(--background-modifier-border);
|
||||
border-width: 0 1px;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
color: var(--text-faint);
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
padding: 0 0.5em;
|
||||
text-align: right;
|
||||
text-overflow: ellipsis;
|
||||
width: 4em;
|
||||
/* needed to be changed */
|
||||
display: table-cell;
|
||||
position: relative;
|
||||
}
|
||||
.d2h-code-side-linenumber:after {
|
||||
content: "\200b";
|
||||
}
|
||||
.d2h-code-side-emptyplaceholder,
|
||||
.d2h-emptyplaceholder {
|
||||
background-color: var(--background-primary);
|
||||
border-color: var(--background-modifier-border);
|
||||
}
|
||||
.d2h-code-line-prefix,
|
||||
.d2h-code-linenumber,
|
||||
.d2h-code-side-linenumber,
|
||||
.d2h-emptyplaceholder {
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.d2h-code-linenumber,
|
||||
.d2h-code-side-linenumber {
|
||||
direction: rtl;
|
||||
}
|
||||
.d2h-del {
|
||||
background-color: var(--git-delete-bg);
|
||||
border-color: var(--git-delete-hl);
|
||||
}
|
||||
.d2h-ins {
|
||||
background-color: var(--git-insert-bg);
|
||||
border-color: var(--git-insert-hl);
|
||||
}
|
||||
.d2h-info {
|
||||
background-color: var(--background-primary);
|
||||
border-color: var(--background-modifier-border);
|
||||
color: var(--text-faint);
|
||||
}
|
||||
.d2h-del,
|
||||
.d2h-ins,
|
||||
.d2h-file-diff .d2h-change {
|
||||
color: var(--text-normal);
|
||||
}
|
||||
.d2h-file-diff .d2h-del.d2h-change {
|
||||
background-color: var(--git-change-bg);
|
||||
}
|
||||
.d2h-file-diff .d2h-ins.d2h-change {
|
||||
background-color: var(--git-insert-bg);
|
||||
}
|
||||
.d2h-file-list-wrapper {
|
||||
a {
|
||||
text-decoration: none;
|
||||
cursor: default;
|
||||
-webkit-user-drag: none;
|
||||
}
|
||||
|
||||
svg {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.d2h-file-list-header {
|
||||
text-align: left;
|
||||
}
|
||||
.d2h-file-list-title {
|
||||
display: none;
|
||||
}
|
||||
.d2h-file-list-line {
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
text-align: left;
|
||||
}
|
||||
.d2h-file-list {
|
||||
}
|
||||
.d2h-file-list > li {
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
margin: 0;
|
||||
padding: 5px 10px;
|
||||
}
|
||||
.d2h-file-list > li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
.d2h-file-switch {
|
||||
cursor: pointer;
|
||||
display: none;
|
||||
font-size: 10px;
|
||||
}
|
||||
.d2h-icon {
|
||||
fill: currentColor;
|
||||
margin-right: 10px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.d2h-deleted {
|
||||
color: var(--git-delete);
|
||||
}
|
||||
.d2h-added {
|
||||
color: var(--git-insert);
|
||||
}
|
||||
.d2h-changed {
|
||||
color: var(--git-change);
|
||||
}
|
||||
.d2h-moved {
|
||||
color: var(--git-move);
|
||||
}
|
||||
.d2h-tag {
|
||||
background-color: var(--background-secondary);
|
||||
display: -webkit-box;
|
||||
display: -ms-flexbox;
|
||||
display: flex;
|
||||
font-size: 10px;
|
||||
margin-left: 5px;
|
||||
padding: 0 2px;
|
||||
}
|
||||
.d2h-deleted-tag {
|
||||
border: 1px solid var(--git-delete);
|
||||
}
|
||||
.d2h-added-tag {
|
||||
border: 1px solid var(--git-insert);
|
||||
}
|
||||
.d2h-changed-tag {
|
||||
border: 1px solid var(--git-change);
|
||||
}
|
||||
.d2h-moved-tag {
|
||||
border: 1px solid var(--git-move);
|
||||
}
|
||||
|
||||
/* needed for line-by-line*/
|
||||
|
||||
.d2h-diff-tbody {
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
/* ====================== Line Authoring Information ====================== */
|
||||
|
||||
.cm-gutterElement.obs-git-blame-gutter {
|
||||
/* Add background color to spacing inbetween and around the gutter for better aesthetics */
|
||||
border-width: 0px 2px 0.2px 2px;
|
||||
border-style: solid;
|
||||
border-color: var(--background-secondary);
|
||||
background-color: var(--background-secondary);
|
||||
}
|
||||
|
||||
.cm-gutterElement.obs-git-blame-gutter > div,
|
||||
.line-author-settings-preview {
|
||||
/* delegate text color to settings */
|
||||
color: var(--obs-git-gutter-text);
|
||||
font-family: monospace;
|
||||
height: 100%; /* ensure, that age-based background color occupies entire parent */
|
||||
text-align: right;
|
||||
padding: 0px 6px 0px 6px;
|
||||
white-space: pre; /* Keep spaces and do not collapse them. */
|
||||
}
|
||||
|
||||
@media (max-width: 800px) {
|
||||
/* hide git blame gutter not to superpose text */
|
||||
.cm-gutterElement.obs-git-blame-gutter {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.git-unified-diff-view,
|
||||
.git-split-diff-view .cm-deletedLine .cm-changedText {
|
||||
background-color: #ee443330;
|
||||
}
|
||||
|
||||
.git-unified-diff-view,
|
||||
.git-split-diff-view .cm-insertedLine .cm-changedText {
|
||||
background-color: #22bb2230;
|
||||
}
|
||||
|
||||
.git-obscure-prompt[git-is-obscured="true"] #git-show-password:after {
|
||||
-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>');
|
||||
}
|
||||
|
||||
.git-obscure-prompt[git-is-obscured="false"] #git-show-password:after {
|
||||
-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>');
|
||||
}
|
||||
|
||||
/* Override styling of Codemirror merge view "collapsed lines" indicator */
|
||||
.git-split-diff-view .ͼ2 .cm-collapsedLines {
|
||||
background: var(--interactive-normal);
|
||||
border-radius: var(--radius-m);
|
||||
color: var(--text-accent);
|
||||
font-size: var(--font-small);
|
||||
padding: var(--size-4-1) var(--size-4-1);
|
||||
}
|
||||
.git-split-diff-view .ͼ2 .cm-collapsedLines:hover {
|
||||
background: var(--interactive-hover);
|
||||
color: var(--text-accent-hover);
|
||||
}
|
||||
|
||||
.git-signs-gutter {
|
||||
.cm-gutterElement {
|
||||
display: grid;
|
||||
}
|
||||
}
|
||||
|
||||
.git-gutter-marker:hover {
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.git-gutter-marker.git-add {
|
||||
background-color: var(--color-green);
|
||||
justify-self: center;
|
||||
height: inherit;
|
||||
width: 0.2rem;
|
||||
}
|
||||
|
||||
.git-gutter-marker.git-change {
|
||||
background-color: var(--color-yellow);
|
||||
justify-self: center;
|
||||
height: inherit;
|
||||
width: 0.2rem;
|
||||
}
|
||||
|
||||
.git-gutter-marker.git-changedelete {
|
||||
color: var(--color-yellow);
|
||||
font-weight: var(--font-bold);
|
||||
font-size: 1rem;
|
||||
justify-self: center;
|
||||
height: inherit;
|
||||
}
|
||||
|
||||
.git-gutter-marker.git-delete {
|
||||
background-color: var(--color-red);
|
||||
height: 0.2rem;
|
||||
width: 0.8rem;
|
||||
align-self: end;
|
||||
}
|
||||
|
||||
.git-gutter-marker.git-topdelete {
|
||||
background-color: var(--color-red);
|
||||
height: 0.2rem;
|
||||
width: 0.8rem;
|
||||
align-self: start;
|
||||
}
|
||||
|
||||
div:hover > .git-gutter-marker.git-change {
|
||||
width: 0.6rem;
|
||||
}
|
||||
|
||||
div:hover > .git-gutter-marker.git-add {
|
||||
width: 0.6rem;
|
||||
}
|
||||
|
||||
div:hover > .git-gutter-marker.git-delete {
|
||||
height: 0.6rem;
|
||||
}
|
||||
|
||||
div:hover > .git-gutter-marker.git-topdelete {
|
||||
height: 0.6rem;
|
||||
}
|
||||
|
||||
div:hover > .git-gutter-marker.git-changedelete {
|
||||
font-weight: var(--font-bold);
|
||||
}
|
||||
|
||||
.git-gutter-marker.staged {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.git-diff {
|
||||
.cm-merge-revert {
|
||||
width: 4em;
|
||||
}
|
||||
/* Ensure that merge revert markers are positioned correctly */
|
||||
.cm-merge-revert > * {
|
||||
position: absolute;
|
||||
background-color: var(--background-secondary);
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
/* Prevent shifting of the editor when git signs gutter is the only gutter present */
|
||||
.cm-gutters.cm-gutters-before:has(> .git-signs-gutter:only-child) {
|
||||
margin-inline-end: 0;
|
||||
.git-signs-gutter {
|
||||
margin-inline-start: -1rem;
|
||||
}
|
||||
}
|
||||
|
||||
.git-changes-status-bar-colored {
|
||||
.git-add {
|
||||
color: var(--color-green);
|
||||
}
|
||||
.git-change {
|
||||
color: var(--color-yellow);
|
||||
}
|
||||
.git-delete {
|
||||
color: var(--color-red);
|
||||
}
|
||||
}
|
||||
|
||||
.git-changes-status-bar .git-add {
|
||||
margin-right: 0.3em;
|
||||
}
|
||||
|
||||
.git-changes-status-bar .git-change {
|
||||
margin-right: 0.3em;
|
||||
}
|
||||
31
.obsidian/plugins/obsidian-icon-folder/data.json
vendored
Normal file
31
.obsidian/plugins/obsidian-icon-folder/data.json
vendored
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"settings": {
|
||||
"migrated": 6,
|
||||
"iconPacksPath": ".obsidian/icons",
|
||||
"fontSize": 16,
|
||||
"emojiStyle": "native",
|
||||
"iconColor": null,
|
||||
"recentlyUsedIcons": [],
|
||||
"recentlyUsedIconsSize": 5,
|
||||
"rules": [],
|
||||
"extraMargin": {
|
||||
"top": 0,
|
||||
"right": 4,
|
||||
"bottom": 0,
|
||||
"left": 0
|
||||
},
|
||||
"iconInTabsEnabled": false,
|
||||
"iconInTitleEnabled": false,
|
||||
"iconInTitlePosition": "above",
|
||||
"iconInFrontmatterEnabled": false,
|
||||
"iconInFrontmatterFieldName": "icon",
|
||||
"iconColorInFrontmatterFieldName": "iconColor",
|
||||
"iconsBackgroundCheckEnabled": false,
|
||||
"iconsInNotesEnabled": true,
|
||||
"iconsInLinksEnabled": true,
|
||||
"iconIdentifier": ":",
|
||||
"lucideIconPackType": "native",
|
||||
"debugMode": false,
|
||||
"useInternalPlugins": false
|
||||
}
|
||||
}
|
||||
7158
.obsidian/plugins/obsidian-icon-folder/main.js
vendored
Normal file
7158
.obsidian/plugins/obsidian-icon-folder/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-icon-folder/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-icon-folder/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-icon-folder",
|
||||
"name": "Iconize",
|
||||
"version": "2.14.7",
|
||||
"minAppVersion": "0.9.12",
|
||||
"description": "Add icons to anything you desire in Obsidian, including files, folders, and text.",
|
||||
"author": "Florian Woelki",
|
||||
"authorUrl": "https://florianwoelki.com/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
120
.obsidian/plugins/obsidian-icon-folder/styles.css
vendored
Normal file
120
.obsidian/plugins/obsidian-icon-folder/styles.css
vendored
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
.iconize-inline-title-wrapper {
|
||||
width: var(--line-width);
|
||||
max-width: var(--max-width);
|
||||
margin-inline: var(--content-margin);
|
||||
}
|
||||
|
||||
.iconize-title-icon {
|
||||
max-width: var(--max-width);
|
||||
margin-right: var(--size-4-2);
|
||||
}
|
||||
|
||||
.iconize-icon-in-link {
|
||||
transform: translateY(20%);
|
||||
margin-right: var(--size-2-2);
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.iconize-icon {
|
||||
border: 1px solid transparent;
|
||||
margin: 0px 4px 0px 0px;
|
||||
display: flex;
|
||||
align-self: center;
|
||||
margin: auto 0;
|
||||
}
|
||||
|
||||
.nav-folder-title,
|
||||
.nav-file-title {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.iconize-setting input[type='color'] {
|
||||
margin: 0 6px;
|
||||
}
|
||||
|
||||
.iconize-modal.prompt-results {
|
||||
margin: 0;
|
||||
overflow-y: auto;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(5, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.prompt .iconize-subheadline {
|
||||
margin-top: 12px;
|
||||
font-size: 12px;
|
||||
color: gray;
|
||||
grid-column-start: 1;
|
||||
grid-column-end: 6;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.iconize-modal.prompt-results {
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
}
|
||||
.prompt .iconize-subheadline {
|
||||
grid-column-end: 4;
|
||||
}
|
||||
}
|
||||
|
||||
.iconize-modal.prompt-results .suggestion-item {
|
||||
cursor: pointer;
|
||||
white-space: pre-wrap;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
flex-direction: column-reverse;
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
color: var(--text-muted);
|
||||
padding: 16px 8px;
|
||||
line-break: auto;
|
||||
word-break: break-word;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.iconize-modal.prompt-results .suggestion-item.suggestion-item__center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.iconize-icon-preview {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.iconize-icon-preview img {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.iconize-icon-preview svg {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
color: currentColor;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.iconize-dragover {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.iconize-dragover-el {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
color: var(--text-normal);
|
||||
background-color: var(--background-secondary-alt);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* Custom rule modal. */
|
||||
.iconize-custom-modal .modal-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.iconize-custom-modal .modal-content input {
|
||||
width: 100%;
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
26327
.obsidian/plugins/obsidian-icons-plugin/main.js
vendored
Normal file
26327
.obsidian/plugins/obsidian-icons-plugin/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-icons-plugin/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-icons-plugin/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-icons-plugin",
|
||||
"name": "Icons",
|
||||
"version": "0.3.0",
|
||||
"minAppVersion": "0.10.7",
|
||||
"description": "Add icons to your Obsidian notes.",
|
||||
"author": "Camillo Visini",
|
||||
"authorUrl": "https://github.com/visini",
|
||||
"isDesktopOnly": true
|
||||
}
|
||||
16
.obsidian/plugins/obsidian-icons-plugin/styles.css
vendored
Normal file
16
.obsidian/plugins/obsidian-icons-plugin/styles.css
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
.obsidian-icon {
|
||||
font-size: inherit;
|
||||
display: inline-block;
|
||||
width: 2rem !important;
|
||||
text-align: center;
|
||||
/* margin-right: -0.5rem !important; */
|
||||
}
|
||||
|
||||
p .obsidian-icon {
|
||||
width: 1.75rem !important;
|
||||
}
|
||||
|
||||
.obsidian-icon.react-icon > svg {
|
||||
vertical-align: middle;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
153
.obsidian/plugins/obsidian-kanban/main.js
vendored
Normal file
153
.obsidian/plugins/obsidian-kanban/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/obsidian-kanban/manifest.json
vendored
Normal file
11
.obsidian/plugins/obsidian-kanban/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "obsidian-kanban",
|
||||
"name": "Kanban",
|
||||
"version": "2.0.51",
|
||||
"minAppVersion": "1.0.0",
|
||||
"description": "Create markdown-backed Kanban boards in Obsidian.",
|
||||
"author": "mgmeyers",
|
||||
"authorUrl": "https://github.com/mgmeyers/obsidian-kanban",
|
||||
"helpUrl": "https://publish.obsidian.md/kanban/Obsidian+Kanban+Plugin",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
1
.obsidian/plugins/obsidian-kanban/styles.css
vendored
Normal file
1
.obsidian/plugins/obsidian-kanban/styles.css
vendored
Normal file
File diff suppressed because one or more lines are too long
944
.obsidian/plugins/obsidian-paste-image-rename/main.js
vendored
Normal file
944
.obsidian/plugins/obsidian-paste-image-rename/main.js
vendored
Normal file
|
|
@ -0,0 +1,944 @@
|
|||
/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD */
|
||||
var __defProp = Object.defineProperty;
|
||||
var __defProps = Object.defineProperties;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
||||
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
||||
var __spreadValues = (a, b) => {
|
||||
for (var prop in b || (b = {}))
|
||||
if (__hasOwnProp.call(b, prop))
|
||||
__defNormalProp(a, prop, b[prop]);
|
||||
if (__getOwnPropSymbols)
|
||||
for (var prop of __getOwnPropSymbols(b)) {
|
||||
if (__propIsEnum.call(b, prop))
|
||||
__defNormalProp(a, prop, b[prop]);
|
||||
}
|
||||
return a;
|
||||
};
|
||||
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
||||
var __commonJS = (cb, mod) => function __require() {
|
||||
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
||||
};
|
||||
var __export = (target, all) => {
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __copyProps = (to, from, except, desc) => {
|
||||
if (from && typeof from === "object" || typeof from === "function") {
|
||||
for (let key of __getOwnPropNames(from))
|
||||
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||
}
|
||||
return to;
|
||||
};
|
||||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||
var __async = (__this, __arguments, generator) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
var fulfilled = (value) => {
|
||||
try {
|
||||
step(generator.next(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var rejected = (value) => {
|
||||
try {
|
||||
step(generator.throw(value));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
};
|
||||
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
||||
step((generator = generator.apply(__this, __arguments)).next());
|
||||
});
|
||||
};
|
||||
|
||||
// package.json
|
||||
var require_package = __commonJS({
|
||||
"package.json"(exports, module2) {
|
||||
module2.exports = {
|
||||
name: "obsidian-paste-image-rename",
|
||||
version: "1.6.1",
|
||||
main: "main.js",
|
||||
scripts: {
|
||||
start: "node esbuild.config.mjs",
|
||||
build: "tsc -noEmit -skipLibCheck && BUILD_ENV=production node esbuild.config.mjs && cp manifest.json build",
|
||||
version: "node version-bump.mjs && git add manifest.json versions.json",
|
||||
release: "npm run build && gh release create ${npm_package_version} build/*"
|
||||
},
|
||||
keywords: [],
|
||||
author: "Reorx",
|
||||
license: "MIT",
|
||||
devDependencies: {
|
||||
"@types/node": "^18.11.18",
|
||||
"@typescript-eslint/eslint-plugin": "^5.49.0",
|
||||
"@typescript-eslint/parser": "^5.49.0",
|
||||
"builtin-modules": "^3.3.0",
|
||||
esbuild: "0.16.17",
|
||||
obsidian: "^1.1.1",
|
||||
tslib: "2.5.0",
|
||||
typescript: "4.9.4"
|
||||
},
|
||||
dependencies: {
|
||||
"cash-dom": "^8.1.2"
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
// src/main.ts
|
||||
var main_exports = {};
|
||||
__export(main_exports, {
|
||||
default: () => PasteImageRenamePlugin
|
||||
});
|
||||
module.exports = __toCommonJS(main_exports);
|
||||
var import_obsidian2 = require("obsidian");
|
||||
|
||||
// src/batch.ts
|
||||
var import_obsidian = require("obsidian");
|
||||
|
||||
// src/utils.ts
|
||||
var DEBUG = false;
|
||||
if (DEBUG)
|
||||
console.log("DEBUG is enabled");
|
||||
function debugLog(...args) {
|
||||
if (DEBUG) {
|
||||
console.log(new Date().toISOString().slice(11, 23), ...args);
|
||||
}
|
||||
}
|
||||
function createElementTree(rootEl, opts) {
|
||||
const result = {
|
||||
el: rootEl.createEl(opts.tag, opts),
|
||||
children: []
|
||||
};
|
||||
const children = opts.children || [];
|
||||
for (const child of children) {
|
||||
result.children.push(createElementTree(result.el, child));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
var path = {
|
||||
// Credit: @creationix/path.js
|
||||
join(...partSegments) {
|
||||
let parts = [];
|
||||
for (let i = 0, l = partSegments.length; i < l; i++) {
|
||||
parts = parts.concat(partSegments[i].split("/"));
|
||||
}
|
||||
const newParts = [];
|
||||
for (let i = 0, l = parts.length; i < l; i++) {
|
||||
const part = parts[i];
|
||||
if (!part || part === ".")
|
||||
continue;
|
||||
else
|
||||
newParts.push(part);
|
||||
}
|
||||
if (parts[0] === "")
|
||||
newParts.unshift("");
|
||||
return newParts.join("/");
|
||||
},
|
||||
// returns the last part of a path, e.g. 'foo.jpg'
|
||||
basename(fullpath) {
|
||||
const sp = fullpath.split("/");
|
||||
return sp[sp.length - 1];
|
||||
},
|
||||
// return extension without dot, e.g. 'jpg'
|
||||
extension(fullpath) {
|
||||
const positions = [...fullpath.matchAll(new RegExp("\\.", "gi"))].map((a) => a.index);
|
||||
return fullpath.slice(positions[positions.length - 1] + 1);
|
||||
}
|
||||
};
|
||||
var filenameNotAllowedChars = /[^\p{L}0-9~`!@$&*()\-_=+{};'",<.>? ]/ug;
|
||||
var sanitizer = {
|
||||
filename(s) {
|
||||
return s.replace(filenameNotAllowedChars, "").trim();
|
||||
},
|
||||
delimiter(s) {
|
||||
s = this.filename(s);
|
||||
if (!s)
|
||||
s = "-";
|
||||
return s;
|
||||
}
|
||||
};
|
||||
function escapeRegExp(s) {
|
||||
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
||||
}
|
||||
function lockInputMethodComposition(el) {
|
||||
const state = {
|
||||
lock: false
|
||||
};
|
||||
el.addEventListener("compositionstart", () => {
|
||||
state.lock = true;
|
||||
});
|
||||
el.addEventListener("compositionend", () => {
|
||||
state.lock = false;
|
||||
});
|
||||
return state;
|
||||
}
|
||||
|
||||
// src/batch.ts
|
||||
var ImageBatchRenameModal = class extends import_obsidian.Modal {
|
||||
constructor(app, activeFile, renameFunc, onClose) {
|
||||
super(app);
|
||||
this.activeFile = activeFile;
|
||||
this.renameFunc = renameFunc;
|
||||
this.onCloseExtra = onClose;
|
||||
this.state = {
|
||||
namePattern: "",
|
||||
extPattern: "",
|
||||
nameReplace: "",
|
||||
renameTasks: []
|
||||
};
|
||||
}
|
||||
onOpen() {
|
||||
this.containerEl.addClass("image-rename-modal");
|
||||
const { contentEl, titleEl } = this;
|
||||
titleEl.setText("Batch rename embeded files");
|
||||
const namePatternSetting = new import_obsidian.Setting(contentEl).setName("Name pattern").setDesc("Please input the name pattern to match files (regex)").addText((text) => text.setValue(this.state.namePattern).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.state.namePattern = value;
|
||||
})
|
||||
));
|
||||
const npInputEl = namePatternSetting.controlEl.children[0];
|
||||
npInputEl.focus();
|
||||
const npInputState = lockInputMethodComposition(npInputEl);
|
||||
npInputEl.addEventListener("keydown", (e) => __async(this, null, function* () {
|
||||
if (e.key === "Enter" && !npInputState.lock) {
|
||||
e.preventDefault();
|
||||
if (!this.state.namePattern) {
|
||||
errorEl.innerText = 'Error: "Name pattern" could not be empty';
|
||||
errorEl.style.display = "block";
|
||||
return;
|
||||
}
|
||||
this.matchImageNames(tbodyEl);
|
||||
}
|
||||
}));
|
||||
const extPatternSetting = new import_obsidian.Setting(contentEl).setName("Extension pattern").setDesc("Please input the extension pattern to match files (regex)").addText((text) => text.setValue(this.state.extPattern).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.state.extPattern = value;
|
||||
})
|
||||
));
|
||||
const extInputEl = extPatternSetting.controlEl.children[0];
|
||||
extInputEl.addEventListener("keydown", (e) => __async(this, null, function* () {
|
||||
if (e.key === "Enter") {
|
||||
e.preventDefault();
|
||||
this.matchImageNames(tbodyEl);
|
||||
}
|
||||
}));
|
||||
const nameReplaceSetting = new import_obsidian.Setting(contentEl).setName("Name replace").setDesc("Please input the string to replace the matched name (use $1, $2 for regex groups)").addText((text) => text.setValue(this.state.nameReplace).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.state.nameReplace = value;
|
||||
})
|
||||
));
|
||||
const nrInputEl = nameReplaceSetting.controlEl.children[0];
|
||||
const nrInputState = lockInputMethodComposition(nrInputEl);
|
||||
nrInputEl.addEventListener("keydown", (e) => __async(this, null, function* () {
|
||||
if (e.key === "Enter" && !nrInputState.lock) {
|
||||
e.preventDefault();
|
||||
this.matchImageNames(tbodyEl);
|
||||
}
|
||||
}));
|
||||
const matchedContainer = contentEl.createDiv({
|
||||
cls: "matched-container"
|
||||
});
|
||||
const tableET = createElementTree(matchedContainer, {
|
||||
tag: "table",
|
||||
children: [
|
||||
{
|
||||
tag: "thead",
|
||||
children: [
|
||||
{
|
||||
tag: "tr",
|
||||
children: [
|
||||
{
|
||||
tag: "td",
|
||||
text: "Original path"
|
||||
},
|
||||
{
|
||||
tag: "td",
|
||||
text: "Renamed Name"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
tag: "tbody"
|
||||
}
|
||||
]
|
||||
});
|
||||
const tbodyEl = tableET.children[1].el;
|
||||
const errorEl = contentEl.createDiv({
|
||||
cls: "error",
|
||||
attr: {
|
||||
style: "display: none;"
|
||||
}
|
||||
});
|
||||
new import_obsidian.Setting(contentEl).addButton((button) => {
|
||||
button.setButtonText("Rename all").setClass("mod-cta").onClick(() => {
|
||||
new ConfirmModal(
|
||||
this.app,
|
||||
"Confirm rename all",
|
||||
`Are you sure? This will rename all the ${this.state.renameTasks.length} images matched the pattern.`,
|
||||
() => {
|
||||
this.renameAll();
|
||||
this.close();
|
||||
}
|
||||
).open();
|
||||
});
|
||||
}).addButton((button) => {
|
||||
button.setButtonText("Cancel").onClick(() => {
|
||||
this.close();
|
||||
});
|
||||
});
|
||||
}
|
||||
onClose() {
|
||||
const { contentEl } = this;
|
||||
contentEl.empty();
|
||||
this.onCloseExtra();
|
||||
}
|
||||
renameAll() {
|
||||
return __async(this, null, function* () {
|
||||
debugLog("renameAll", this.state);
|
||||
for (const task of this.state.renameTasks) {
|
||||
yield this.renameFunc(task.file, task.name);
|
||||
}
|
||||
});
|
||||
}
|
||||
matchImageNames(tbodyEl) {
|
||||
const { state } = this;
|
||||
const renameTasks = [];
|
||||
tbodyEl.empty();
|
||||
const fileCache = this.app.metadataCache.getFileCache(this.activeFile);
|
||||
if (!fileCache || !fileCache.embeds)
|
||||
return;
|
||||
const namePatternRegex = new RegExp(state.namePattern, "g");
|
||||
const extPatternRegex = new RegExp(state.extPattern);
|
||||
fileCache.embeds.forEach((embed) => {
|
||||
const file = this.app.metadataCache.getFirstLinkpathDest(embed.link, this.activeFile.path);
|
||||
if (!file) {
|
||||
console.warn("file not found", embed.link);
|
||||
return;
|
||||
}
|
||||
if (state.extPattern) {
|
||||
const m0 = extPatternRegex.exec(file.extension);
|
||||
if (!m0)
|
||||
return;
|
||||
}
|
||||
const stem = file.basename;
|
||||
namePatternRegex.lastIndex = 0;
|
||||
const m1 = namePatternRegex.exec(stem);
|
||||
if (!m1)
|
||||
return;
|
||||
let renamedName = file.name;
|
||||
if (state.nameReplace) {
|
||||
namePatternRegex.lastIndex = 0;
|
||||
renamedName = stem.replace(namePatternRegex, state.nameReplace);
|
||||
renamedName = `${renamedName}.${file.extension}`;
|
||||
}
|
||||
renameTasks.push({
|
||||
file,
|
||||
name: renamedName
|
||||
});
|
||||
createElementTree(tbodyEl, {
|
||||
tag: "tr",
|
||||
children: [
|
||||
{
|
||||
tag: "td",
|
||||
children: [
|
||||
{
|
||||
tag: "span",
|
||||
text: file.name
|
||||
},
|
||||
{
|
||||
tag: "div",
|
||||
text: file.path,
|
||||
attr: {
|
||||
class: "file-path"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
tag: "td",
|
||||
children: [
|
||||
{
|
||||
tag: "span",
|
||||
text: renamedName
|
||||
},
|
||||
{
|
||||
tag: "div",
|
||||
text: path.join(file.parent.path, renamedName),
|
||||
attr: {
|
||||
class: "file-path"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
});
|
||||
});
|
||||
debugLog("new renameTasks", renameTasks);
|
||||
state.renameTasks = renameTasks;
|
||||
}
|
||||
};
|
||||
var ConfirmModal = class extends import_obsidian.Modal {
|
||||
constructor(app, title, message, onConfirm) {
|
||||
super(app);
|
||||
this.title = title;
|
||||
this.message = message;
|
||||
this.onConfirm = onConfirm;
|
||||
}
|
||||
onOpen() {
|
||||
const { contentEl, titleEl } = this;
|
||||
titleEl.setText(this.title);
|
||||
contentEl.createEl("p", {
|
||||
text: this.message
|
||||
});
|
||||
new import_obsidian.Setting(contentEl).addButton((button) => {
|
||||
button.setButtonText("Yes").setClass("mod-warning").onClick(() => {
|
||||
this.onConfirm();
|
||||
this.close();
|
||||
});
|
||||
}).addButton((button) => {
|
||||
button.setButtonText("No").onClick(() => {
|
||||
this.close();
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// src/template.ts
|
||||
var dateTmplRegex = /{{DATE:([^}]+)}}/gm;
|
||||
var frontmatterTmplRegex = /{{frontmatter:([^}]+)}}/gm;
|
||||
var replaceDateVar = (s, date) => {
|
||||
const m = dateTmplRegex.exec(s);
|
||||
if (!m)
|
||||
return s;
|
||||
return s.replace(m[0], date.format(m[1]));
|
||||
};
|
||||
var replaceFrontmatterVar = (s, frontmatter) => {
|
||||
if (!frontmatter)
|
||||
return s;
|
||||
const m = frontmatterTmplRegex.exec(s);
|
||||
if (!m)
|
||||
return s;
|
||||
return s.replace(m[0], frontmatter[m[1]] || "");
|
||||
};
|
||||
var renderTemplate = (tmpl, data, frontmatter) => {
|
||||
const now = window.moment();
|
||||
let text = tmpl;
|
||||
let newtext;
|
||||
while ((newtext = replaceDateVar(text, now)) != text) {
|
||||
text = newtext;
|
||||
}
|
||||
while ((newtext = replaceFrontmatterVar(text, frontmatter)) != text) {
|
||||
text = newtext;
|
||||
}
|
||||
text = text.replace(/{{imageNameKey}}/gm, data.imageNameKey).replace(/{{fileName}}/gm, data.fileName).replace(/{{dirName}}/gm, data.dirName).replace(/{{firstHeading}}/gm, data.firstHeading);
|
||||
return text;
|
||||
};
|
||||
|
||||
// src/main.ts
|
||||
var DEFAULT_SETTINGS = {
|
||||
imageNamePattern: "{{fileName}}",
|
||||
dupNumberAtStart: false,
|
||||
dupNumberDelimiter: "-",
|
||||
dupNumberAlways: false,
|
||||
autoRename: false,
|
||||
handleAllAttachments: false,
|
||||
excludeExtensionPattern: "",
|
||||
disableRenameNotice: false
|
||||
};
|
||||
var PASTED_IMAGE_PREFIX = "Pasted image ";
|
||||
var PasteImageRenamePlugin = class extends import_obsidian2.Plugin {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.modals = [];
|
||||
}
|
||||
onload() {
|
||||
return __async(this, null, function* () {
|
||||
const pkg = require_package();
|
||||
console.log(`Plugin loading: ${pkg.name} ${pkg.version} BUILD_ENV=${"production"}`);
|
||||
yield this.loadSettings();
|
||||
this.registerEvent(
|
||||
this.app.vault.on("create", (file) => {
|
||||
if (!(file instanceof import_obsidian2.TFile))
|
||||
return;
|
||||
const timeGapMs = new Date().getTime() - file.stat.ctime;
|
||||
if (timeGapMs > 1e3)
|
||||
return;
|
||||
if (isMarkdownFile(file))
|
||||
return;
|
||||
if (isPastedImage(file)) {
|
||||
debugLog("pasted image created", file);
|
||||
this.startRenameProcess(file, this.settings.autoRename);
|
||||
} else {
|
||||
if (this.settings.handleAllAttachments) {
|
||||
debugLog("handleAllAttachments for file", file);
|
||||
if (this.testExcludeExtension(file)) {
|
||||
debugLog("excluded file by ext", file);
|
||||
return;
|
||||
}
|
||||
this.startRenameProcess(file, this.settings.autoRename);
|
||||
}
|
||||
}
|
||||
})
|
||||
);
|
||||
const startBatchRenameProcess = () => {
|
||||
this.openBatchRenameModal();
|
||||
};
|
||||
this.addCommand({
|
||||
id: "batch-rename-embeded-files",
|
||||
name: "Batch rename embeded files (in the current file)",
|
||||
callback: startBatchRenameProcess
|
||||
});
|
||||
if (DEBUG) {
|
||||
this.addRibbonIcon("wand-glyph", "Batch rename embeded files", startBatchRenameProcess);
|
||||
}
|
||||
const batchRenameAllImages = () => {
|
||||
this.batchRenameAllImages();
|
||||
};
|
||||
this.addCommand({
|
||||
id: "batch-rename-all-images",
|
||||
name: "Batch rename all images instantly (in the current file)",
|
||||
callback: batchRenameAllImages
|
||||
});
|
||||
if (DEBUG) {
|
||||
this.addRibbonIcon("wand-glyph", "Batch rename all images instantly (in the current file)", batchRenameAllImages);
|
||||
}
|
||||
this.addSettingTab(new SettingTab(this.app, this));
|
||||
});
|
||||
}
|
||||
startRenameProcess(file, autoRename = false) {
|
||||
return __async(this, null, function* () {
|
||||
const activeFile = this.getActiveFile();
|
||||
if (!activeFile) {
|
||||
new import_obsidian2.Notice("Error: No active file found.");
|
||||
return;
|
||||
}
|
||||
const { stem, newName, isMeaningful } = this.generateNewName(file, activeFile);
|
||||
debugLog("generated newName:", newName, isMeaningful);
|
||||
if (!isMeaningful || !autoRename) {
|
||||
this.openRenameModal(file, isMeaningful ? stem : "", activeFile.path);
|
||||
return;
|
||||
}
|
||||
this.renameFile(file, newName, activeFile.path, true);
|
||||
});
|
||||
}
|
||||
renameFile(file, inputNewName, sourcePath, replaceCurrentLine) {
|
||||
return __async(this, null, function* () {
|
||||
const { name: newName } = yield this.deduplicateNewName(inputNewName, file);
|
||||
debugLog("deduplicated newName:", newName);
|
||||
const originName = file.name;
|
||||
const linkText = this.app.fileManager.generateMarkdownLink(file, sourcePath);
|
||||
const newPath = path.join(file.parent.path, newName);
|
||||
try {
|
||||
yield this.app.fileManager.renameFile(file, newPath);
|
||||
} catch (err) {
|
||||
new import_obsidian2.Notice(`Failed to rename ${newName}: ${err}`);
|
||||
throw err;
|
||||
}
|
||||
if (!replaceCurrentLine) {
|
||||
return;
|
||||
}
|
||||
const newLinkText = this.app.fileManager.generateMarkdownLink(file, sourcePath);
|
||||
debugLog("replace text", linkText, newLinkText);
|
||||
const editor = this.getActiveEditor();
|
||||
if (!editor) {
|
||||
new import_obsidian2.Notice(`Failed to rename ${newName}: no active editor`);
|
||||
return;
|
||||
}
|
||||
const cursor = editor.getCursor();
|
||||
const line = editor.getLine(cursor.line);
|
||||
const replacedLine = line.replace(linkText, newLinkText);
|
||||
debugLog("current line -> replaced line", line, replacedLine);
|
||||
editor.transaction({
|
||||
changes: [
|
||||
{
|
||||
from: __spreadProps(__spreadValues({}, cursor), { ch: 0 }),
|
||||
to: __spreadProps(__spreadValues({}, cursor), { ch: line.length }),
|
||||
text: replacedLine
|
||||
}
|
||||
]
|
||||
});
|
||||
if (!this.settings.disableRenameNotice) {
|
||||
new import_obsidian2.Notice(`Renamed ${originName} to ${newName}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
openRenameModal(file, newName, sourcePath) {
|
||||
const modal = new ImageRenameModal(
|
||||
this.app,
|
||||
file,
|
||||
newName,
|
||||
(confirmedName) => {
|
||||
debugLog("confirmedName:", confirmedName);
|
||||
this.renameFile(file, confirmedName, sourcePath, true);
|
||||
},
|
||||
() => {
|
||||
this.modals.splice(this.modals.indexOf(modal), 1);
|
||||
}
|
||||
);
|
||||
this.modals.push(modal);
|
||||
modal.open();
|
||||
debugLog("modals count", this.modals.length);
|
||||
}
|
||||
openBatchRenameModal() {
|
||||
const activeFile = this.getActiveFile();
|
||||
const modal = new ImageBatchRenameModal(
|
||||
this.app,
|
||||
activeFile,
|
||||
(file, name) => __async(this, null, function* () {
|
||||
yield this.renameFile(file, name, activeFile.path);
|
||||
}),
|
||||
() => {
|
||||
this.modals.splice(this.modals.indexOf(modal), 1);
|
||||
}
|
||||
);
|
||||
this.modals.push(modal);
|
||||
modal.open();
|
||||
}
|
||||
batchRenameAllImages() {
|
||||
return __async(this, null, function* () {
|
||||
const activeFile = this.getActiveFile();
|
||||
const fileCache = this.app.metadataCache.getFileCache(activeFile);
|
||||
if (!fileCache || !fileCache.embeds)
|
||||
return;
|
||||
const extPatternRegex = /jpe?g|png|gif|tiff|webp/i;
|
||||
for (const embed of fileCache.embeds) {
|
||||
const file = this.app.metadataCache.getFirstLinkpathDest(embed.link, activeFile.path);
|
||||
if (!file) {
|
||||
console.warn("file not found", embed.link);
|
||||
return;
|
||||
}
|
||||
const m0 = extPatternRegex.exec(file.extension);
|
||||
if (!m0)
|
||||
return;
|
||||
const { newName, isMeaningful } = this.generateNewName(file, activeFile);
|
||||
debugLog("generated newName:", newName, isMeaningful);
|
||||
if (!isMeaningful) {
|
||||
new import_obsidian2.Notice("Failed to batch rename images: the generated name is not meaningful");
|
||||
break;
|
||||
}
|
||||
yield this.renameFile(file, newName, activeFile.path, false);
|
||||
}
|
||||
});
|
||||
}
|
||||
// returns a new name for the input file, with extension
|
||||
generateNewName(file, activeFile) {
|
||||
let imageNameKey = "";
|
||||
let firstHeading = "";
|
||||
let frontmatter;
|
||||
const fileCache = this.app.metadataCache.getFileCache(activeFile);
|
||||
if (fileCache) {
|
||||
debugLog("frontmatter", fileCache.frontmatter);
|
||||
frontmatter = fileCache.frontmatter;
|
||||
imageNameKey = (frontmatter == null ? void 0 : frontmatter.imageNameKey) || "";
|
||||
firstHeading = getFirstHeading(fileCache.headings);
|
||||
} else {
|
||||
console.warn("could not get file cache from active file", activeFile.name);
|
||||
}
|
||||
const stem = renderTemplate(
|
||||
this.settings.imageNamePattern,
|
||||
{
|
||||
imageNameKey,
|
||||
fileName: activeFile.basename,
|
||||
dirName: activeFile.parent.name,
|
||||
firstHeading
|
||||
},
|
||||
frontmatter
|
||||
);
|
||||
const meaninglessRegex = new RegExp(`[${this.settings.dupNumberDelimiter}\\s]`, "gm");
|
||||
return {
|
||||
stem,
|
||||
newName: stem + "." + file.extension,
|
||||
isMeaningful: stem.replace(meaninglessRegex, "") !== ""
|
||||
};
|
||||
}
|
||||
// newName: foo.ext
|
||||
deduplicateNewName(newName, file) {
|
||||
return __async(this, null, function* () {
|
||||
const dir = file.parent.path;
|
||||
const listed = yield this.app.vault.adapter.list(dir);
|
||||
debugLog("sibling files", listed);
|
||||
const newNameExt = path.extension(newName), newNameStem = newName.slice(0, newName.length - newNameExt.length - 1), newNameStemEscaped = escapeRegExp(newNameStem), delimiter = this.settings.dupNumberDelimiter, delimiterEscaped = escapeRegExp(delimiter);
|
||||
let dupNameRegex;
|
||||
if (this.settings.dupNumberAtStart) {
|
||||
dupNameRegex = new RegExp(
|
||||
`^(?<number>\\d+)${delimiterEscaped}(?<name>${newNameStemEscaped})\\.${newNameExt}$`
|
||||
);
|
||||
} else {
|
||||
dupNameRegex = new RegExp(
|
||||
`^(?<name>${newNameStemEscaped})${delimiterEscaped}(?<number>\\d+)\\.${newNameExt}$`
|
||||
);
|
||||
}
|
||||
debugLog("dupNameRegex", dupNameRegex);
|
||||
const dupNameNumbers = [];
|
||||
let isNewNameExist = false;
|
||||
for (let sibling of listed.files) {
|
||||
sibling = path.basename(sibling);
|
||||
if (sibling == newName) {
|
||||
isNewNameExist = true;
|
||||
continue;
|
||||
}
|
||||
const m = dupNameRegex.exec(sibling);
|
||||
if (!m)
|
||||
continue;
|
||||
dupNameNumbers.push(parseInt(m.groups.number));
|
||||
}
|
||||
if (isNewNameExist || this.settings.dupNumberAlways) {
|
||||
const newNumber = dupNameNumbers.length > 0 ? Math.max(...dupNameNumbers) + 1 : 1;
|
||||
if (this.settings.dupNumberAtStart) {
|
||||
newName = `${newNumber}${delimiter}${newNameStem}.${newNameExt}`;
|
||||
} else {
|
||||
newName = `${newNameStem}${delimiter}${newNumber}.${newNameExt}`;
|
||||
}
|
||||
}
|
||||
return {
|
||||
name: newName,
|
||||
stem: newName.slice(0, newName.length - newNameExt.length - 1),
|
||||
extension: newNameExt
|
||||
};
|
||||
});
|
||||
}
|
||||
getActiveFile() {
|
||||
const view = this.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView);
|
||||
const file = view == null ? void 0 : view.file;
|
||||
debugLog("active file", file == null ? void 0 : file.path);
|
||||
return file;
|
||||
}
|
||||
getActiveEditor() {
|
||||
const view = this.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView);
|
||||
return view == null ? void 0 : view.editor;
|
||||
}
|
||||
onunload() {
|
||||
this.modals.map((modal) => modal.close());
|
||||
}
|
||||
testExcludeExtension(file) {
|
||||
const pattern = this.settings.excludeExtensionPattern;
|
||||
if (!pattern)
|
||||
return false;
|
||||
return new RegExp(pattern).test(file.extension);
|
||||
}
|
||||
loadSettings() {
|
||||
return __async(this, null, function* () {
|
||||
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
||||
});
|
||||
}
|
||||
saveSettings() {
|
||||
return __async(this, null, function* () {
|
||||
yield this.saveData(this.settings);
|
||||
});
|
||||
}
|
||||
};
|
||||
function getFirstHeading(headings) {
|
||||
if (headings && headings.length > 0) {
|
||||
for (const heading of headings) {
|
||||
if (heading.level === 1) {
|
||||
return heading.heading;
|
||||
}
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
function isPastedImage(file) {
|
||||
if (file instanceof import_obsidian2.TFile) {
|
||||
if (file.name.startsWith(PASTED_IMAGE_PREFIX)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isMarkdownFile(file) {
|
||||
if (file instanceof import_obsidian2.TFile) {
|
||||
if (file.extension === "md") {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
var ImageRenameModal = class extends import_obsidian2.Modal {
|
||||
constructor(app, src, stem, renameFunc, onClose) {
|
||||
super(app);
|
||||
this.src = src;
|
||||
this.stem = stem;
|
||||
this.renameFunc = renameFunc;
|
||||
this.onCloseExtra = onClose;
|
||||
}
|
||||
onOpen() {
|
||||
this.containerEl.addClass("image-rename-modal");
|
||||
const { contentEl, titleEl } = this;
|
||||
titleEl.setText("Rename image");
|
||||
const imageContainer = contentEl.createDiv({
|
||||
cls: "image-container"
|
||||
});
|
||||
imageContainer.createEl("img", {
|
||||
attr: {
|
||||
src: this.app.vault.getResourcePath(this.src)
|
||||
}
|
||||
});
|
||||
let stem = this.stem;
|
||||
const ext = this.src.extension;
|
||||
const getNewName = (stem2) => stem2 + "." + ext;
|
||||
const getNewPath = (stem2) => path.join(this.src.parent.path, getNewName(stem2));
|
||||
const infoET = createElementTree(contentEl, {
|
||||
tag: "ul",
|
||||
cls: "info",
|
||||
children: [
|
||||
{
|
||||
tag: "li",
|
||||
children: [
|
||||
{
|
||||
tag: "span",
|
||||
text: "Origin path"
|
||||
},
|
||||
{
|
||||
tag: "span",
|
||||
text: this.src.path
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
tag: "li",
|
||||
children: [
|
||||
{
|
||||
tag: "span",
|
||||
text: "New path"
|
||||
},
|
||||
{
|
||||
tag: "span",
|
||||
text: getNewPath(stem)
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
});
|
||||
const doRename = () => __async(this, null, function* () {
|
||||
debugLog("doRename", `stem=${stem}`);
|
||||
this.renameFunc(getNewName(stem));
|
||||
});
|
||||
const nameSetting = new import_obsidian2.Setting(contentEl).setName("New name").setDesc("Please input the new name for the image (without extension)").addText((text) => text.setValue(stem).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
stem = sanitizer.filename(value);
|
||||
infoET.children[1].children[1].el.innerText = getNewPath(stem);
|
||||
})
|
||||
));
|
||||
const nameInputEl = nameSetting.controlEl.children[0];
|
||||
nameInputEl.focus();
|
||||
const nameInputState = lockInputMethodComposition(nameInputEl);
|
||||
nameInputEl.addEventListener("keydown", (e) => __async(this, null, function* () {
|
||||
if (e.key === "Enter" && !nameInputState.lock) {
|
||||
e.preventDefault();
|
||||
if (!stem) {
|
||||
errorEl.innerText = 'Error: "New name" could not be empty';
|
||||
errorEl.style.display = "block";
|
||||
return;
|
||||
}
|
||||
doRename();
|
||||
this.close();
|
||||
}
|
||||
}));
|
||||
const errorEl = contentEl.createDiv({
|
||||
cls: "error",
|
||||
attr: {
|
||||
style: "display: none;"
|
||||
}
|
||||
});
|
||||
new import_obsidian2.Setting(contentEl).addButton((button) => {
|
||||
button.setButtonText("Rename").onClick(() => {
|
||||
doRename();
|
||||
this.close();
|
||||
});
|
||||
}).addButton((button) => {
|
||||
button.setButtonText("Cancel").onClick(() => {
|
||||
this.close();
|
||||
});
|
||||
});
|
||||
}
|
||||
onClose() {
|
||||
const { contentEl } = this;
|
||||
contentEl.empty();
|
||||
this.onCloseExtra();
|
||||
}
|
||||
};
|
||||
var imageNamePatternDesc = `
|
||||
The pattern indicates how the new name should be generated.
|
||||
|
||||
Available variables:
|
||||
- {{fileName}}: name of the active file, without ".md" extension.
|
||||
- {{imageNameKey}}: this variable is read from the markdown file's frontmatter, from the same key "imageNameKey".
|
||||
- {{DATE:$FORMAT}}: use "$FORMAT" to format the current date, "$FORMAT" must be a Moment.js format string, e.g. {{DATE:YYYY-MM-DD}}.
|
||||
|
||||
Here are some examples from pattern to image names (repeat in sequence), variables: fileName = "My note", imageNameKey = "foo":
|
||||
- {{fileName}}: My note, My note-1, My note-2
|
||||
- {{imageNameKey}}: foo, foo-1, foo-2
|
||||
- {{imageNameKey}}-{{DATE:YYYYMMDD}}: foo-20220408, foo-20220408-1, foo-20220408-2
|
||||
`;
|
||||
var SettingTab = class extends import_obsidian2.PluginSettingTab {
|
||||
constructor(app, plugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
display() {
|
||||
const { containerEl } = this;
|
||||
containerEl.empty();
|
||||
new import_obsidian2.Setting(containerEl).setName("Image name pattern").setDesc(imageNamePatternDesc).setClass("long-description-setting-item").addText((text) => text.setPlaceholder("{{imageNameKey}}").setValue(this.plugin.settings.imageNamePattern).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.imageNamePattern = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
new import_obsidian2.Setting(containerEl).setName("Duplicate number at start (or end)").setDesc(`If enabled, duplicate number will be added at the start as prefix for the image name, otherwise it will be added at the end as suffix for the image name.`).addToggle((toggle) => toggle.setValue(this.plugin.settings.dupNumberAtStart).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.dupNumberAtStart = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
new import_obsidian2.Setting(containerEl).setName("Duplicate number delimiter").setDesc(`The delimiter to generate the number prefix/suffix for duplicated names. For example, if the value is "-", the suffix will be like "-1", "-2", "-3", and the prefix will be like "1-", "2-", "3-". Only characters that are valid in file names are allowed.`).addText((text) => text.setValue(this.plugin.settings.dupNumberDelimiter).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.dupNumberDelimiter = sanitizer.delimiter(value);
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
new import_obsidian2.Setting(containerEl).setName("Always add duplicate number").setDesc(`If enabled, duplicate number will always be added to the image name. Otherwise, it will only be added when the name is duplicated.`).addToggle((toggle) => toggle.setValue(this.plugin.settings.dupNumberAlways).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.dupNumberAlways = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
new import_obsidian2.Setting(containerEl).setName("Auto rename").setDesc(`By default, the rename modal will always be shown to confirm before renaming, if this option is set, the image will be auto renamed after pasting.`).addToggle((toggle) => toggle.setValue(this.plugin.settings.autoRename).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.autoRename = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
new import_obsidian2.Setting(containerEl).setName("Handle all attachments").setDesc(`By default, the plugin only handles images that starts with "Pasted image " in name,
|
||||
which is the prefix Obsidian uses to create images from pasted content.
|
||||
If this option is set, the plugin will handle all attachments that are created in the vault.`).addToggle((toggle) => toggle.setValue(this.plugin.settings.handleAllAttachments).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.handleAllAttachments = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
new import_obsidian2.Setting(containerEl).setName("Exclude extension pattern").setDesc(`This option is only useful when "Handle all attachments" is enabled.
|
||||
Write a Regex pattern to exclude certain extensions from being handled. Only the first line will be used.`).setClass("single-line-textarea").addTextArea((text) => text.setPlaceholder("docx?|xlsx?|pptx?|zip|rar").setValue(this.plugin.settings.excludeExtensionPattern).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.excludeExtensionPattern = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
new import_obsidian2.Setting(containerEl).setName("Disable rename notice").setDesc(`Turn off this option if you don't want to see the notice when renaming images.
|
||||
Note that Obsidian may display a notice when a link has changed, this option cannot disable that.`).addToggle((toggle) => toggle.setValue(this.plugin.settings.disableRenameNotice).onChange(
|
||||
(value) => __async(this, null, function* () {
|
||||
this.plugin.settings.disableRenameNotice = value;
|
||||
yield this.plugin.saveSettings();
|
||||
})
|
||||
));
|
||||
}
|
||||
};
|
||||
|
||||
/* nosourcemap */
|
||||
10
.obsidian/plugins/obsidian-paste-image-rename/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-paste-image-rename/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-paste-image-rename",
|
||||
"name": "Paste image rename",
|
||||
"version": "1.6.1",
|
||||
"minAppVersion": "0.12.0",
|
||||
"description": "Rename pasted images and all the other attchments added to the vault",
|
||||
"author": "Reorx",
|
||||
"authorUrl": "https://github.com/reorx",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
79
.obsidian/plugins/obsidian-paste-image-rename/styles.css
vendored
Normal file
79
.obsidian/plugins/obsidian-paste-image-rename/styles.css
vendored
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
/* src/styles.css */
|
||||
:root {
|
||||
--shadow-color: 0deg 0% 0%;
|
||||
--shadow-elevation-medium:
|
||||
0.5px 0.5px 0.7px hsl(var(--shadow-color) / 0.14),
|
||||
1.1px 1.1px 1.5px -0.9px hsl(var(--shadow-color) / 0.12),
|
||||
2.4px 2.5px 3.3px -1.8px hsl(var(--shadow-color) / 0.1),
|
||||
5.3px 5.6px 7.3px -2.7px hsl(var(--shadow-color) / 0.09),
|
||||
11px 11.4px 15.1px -3.6px hsl(var(--shadow-color) / 0.07);
|
||||
}
|
||||
.image-rename-modal .modal {
|
||||
width: 65%;
|
||||
min-width: 600px;
|
||||
}
|
||||
.image-rename-modal .modal-content {
|
||||
padding: 10px 5px;
|
||||
}
|
||||
.image-rename-modal .image-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
.image-rename-modal .info {
|
||||
padding: 10px 0;
|
||||
color: var(--text-muted);
|
||||
user-select: text;
|
||||
}
|
||||
.image-rename-modal .info li > span:nth-of-type(1) {
|
||||
display: inline-block;
|
||||
width: 6em;
|
||||
margin-right: .5em;
|
||||
}
|
||||
.image-rename-modal .info li > span:nth-of-type(1):after {
|
||||
content: ":";
|
||||
float: right;
|
||||
}
|
||||
.image-rename-modal .image-container img {
|
||||
display: block;
|
||||
max-height: 300px;
|
||||
box-shadow: var(--shadow-elevation-medium);
|
||||
}
|
||||
.image-rename-modal .setting-item-control input {
|
||||
min-width: 300px;
|
||||
}
|
||||
.image-rename-modal .error {
|
||||
border: 1px solid rgb(201, 90, 90);
|
||||
color: rgb(134, 22, 22);
|
||||
padding: 10px;
|
||||
}
|
||||
.image-rename-modal table {
|
||||
font-size: .9em;
|
||||
line-height: 1.8;
|
||||
margin-bottom: 1.5em;
|
||||
user-select: text;
|
||||
}
|
||||
.image-rename-modal table td {
|
||||
padding-right: 1em;
|
||||
}
|
||||
.image-rename-modal table thead td {
|
||||
font-weight: 700;
|
||||
}
|
||||
.image-rename-modal table tbody td .file-path {
|
||||
font-size: .8em;
|
||||
color: var(--text-faint);
|
||||
line-height: 1;
|
||||
}
|
||||
.long-description-setting-item {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.long-description-setting-item .setting-item-description {
|
||||
white-space: pre-wrap;
|
||||
line-height: 1.3em;
|
||||
}
|
||||
.long-description-setting-item .setting-item-control {
|
||||
padding-top: 10px;
|
||||
}
|
||||
.long-description-setting-item .setting-item-control input {
|
||||
min-width: 300px;
|
||||
width: 50%;
|
||||
}
|
||||
10073
.obsidian/plugins/obsidian-plugin-todo/main.js
vendored
Normal file
10073
.obsidian/plugins/obsidian-plugin-todo/main.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
10
.obsidian/plugins/obsidian-plugin-todo/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-plugin-todo/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-plugin-todo",
|
||||
"name": "TODO | Text-based GTD",
|
||||
"version": "0.2.8",
|
||||
"minAppVersion": "0.11.0",
|
||||
"description": "Text-based GTD in Obsidian. Collects all outstanding TODOs from your vault and presents them in lists Today, Scheduled, Inbox and Someday/Maybe.",
|
||||
"author": "Lars Lockefeer",
|
||||
"authorUrl": "https://lars.lockefeer.online",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
77
.obsidian/plugins/obsidian-plugin-todo/styles.css
vendored
Normal file
77
.obsidian/plugins/obsidian-plugin-todo/styles.css
vendored
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
div.todo-item-view-container {
|
||||
}
|
||||
|
||||
div.todo-item-view-toolbar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border-bottom: 1px solid #cccccc;
|
||||
border-top: 1px solid #cccccc;
|
||||
}
|
||||
|
||||
div.todo-item-view-toolbar-item {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
div.todo-item-view-items {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
div.todo-item-view-item {
|
||||
display: flex;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
div.todo-item-view-item p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
div.todo-item-view-item span.due-date {
|
||||
padding: 5px 8px 5px 8px;
|
||||
font-size: 0.6em;
|
||||
border-radius: 12px;
|
||||
background-color: #fbb034;
|
||||
border-color: #fbb034;
|
||||
}
|
||||
|
||||
div.todo-item-view-item span.due-date.overdue {
|
||||
background-color: #ff2400;
|
||||
border-color: #ff2400;
|
||||
}
|
||||
|
||||
div.todo-item-view-item span.due-date.future-due {
|
||||
background-color: #6fdf94;
|
||||
border-color: #6fdf94;
|
||||
}
|
||||
|
||||
div.todo-item-view-item-checkbox {
|
||||
flex-basis: 25px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
div.todo-item-view-item-description {
|
||||
flex-grow: 1;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
div.todo-item-view-item-link {
|
||||
flex-basis: 25px;
|
||||
flex-shrink: 0;
|
||||
cursor: pointer;
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
div.todo-item-view-item-link svg, div.todo-item-view-toolbar-item svg {
|
||||
fill: #cccccc;
|
||||
}
|
||||
|
||||
div.todo-item-view-toolbar-item.active svg {
|
||||
fill: #7f6df2;
|
||||
}
|
||||
165
.obsidian/plugins/obsidian-style-settings/main.js
vendored
Normal file
165
.obsidian/plugins/obsidian-style-settings/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-style-settings/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-style-settings/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-style-settings",
|
||||
"name": "Style Settings",
|
||||
"version": "1.0.9",
|
||||
"minAppVersion": "0.11.5",
|
||||
"description": "Offers controls for adjusting theme, plugin, and snippet CSS variables.",
|
||||
"author": "mgmeyers",
|
||||
"authorUrl": "https://github.com/mgmeyers/obsidian-style-settings",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
243
.obsidian/plugins/obsidian-style-settings/styles.css
vendored
Normal file
243
.obsidian/plugins/obsidian-style-settings/styles.css
vendored
Normal file
File diff suppressed because one or more lines are too long
42
.obsidian/plugins/omnisearch/data.json
vendored
Normal file
42
.obsidian/plugins/omnisearch/data.json
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
"useCache": true,
|
||||
"hideExcluded": false,
|
||||
"recencyBoost": "0",
|
||||
"downrankedFoldersFilters": [],
|
||||
"ignoreDiacritics": true,
|
||||
"ignoreArabicDiacritics": false,
|
||||
"indexedFileTypes": [],
|
||||
"displayTitle": "",
|
||||
"PDFIndexing": false,
|
||||
"officeIndexing": false,
|
||||
"imagesIndexing": false,
|
||||
"aiImageIndexing": false,
|
||||
"unsupportedFilesIndexing": "default",
|
||||
"splitCamelCase": false,
|
||||
"openInNewPane": false,
|
||||
"vimLikeNavigationShortcut": false,
|
||||
"ribbonIcon": true,
|
||||
"showExcerpt": true,
|
||||
"maxEmbeds": 5,
|
||||
"renderLineReturnInExcerpts": true,
|
||||
"showCreateButton": false,
|
||||
"highlight": true,
|
||||
"showPreviousQueryResults": true,
|
||||
"simpleSearch": false,
|
||||
"tokenizeUrls": false,
|
||||
"fuzziness": "1",
|
||||
"weightBasename": 10,
|
||||
"weightDirectory": 7,
|
||||
"weightH1": 6,
|
||||
"weightH2": 5,
|
||||
"weightH3": 4,
|
||||
"weightUnmarkedTags": 2,
|
||||
"weightCustomProperties": [],
|
||||
"httpApiEnabled": false,
|
||||
"httpApiPort": "51361",
|
||||
"httpApiNotice": true,
|
||||
"welcomeMessage": "1.21.0",
|
||||
"verboseLogging": false,
|
||||
"DANGER_httpHost": null,
|
||||
"DANGER_forceSaveCache": false
|
||||
}
|
||||
171
.obsidian/plugins/omnisearch/main.js
vendored
Normal file
171
.obsidian/plugins/omnisearch/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
14
.obsidian/plugins/omnisearch/manifest.json
vendored
Normal file
14
.obsidian/plugins/omnisearch/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"id": "omnisearch",
|
||||
"name": "Omnisearch",
|
||||
"version": "1.28.0",
|
||||
"minAppVersion": "1.7.2",
|
||||
"description": "A search engine that just works",
|
||||
"author": "Simon Cambier",
|
||||
"authorUrl": "https://github.com/scambier/obsidian-omnisearch",
|
||||
"fundingUrl": {
|
||||
"Github": "https://github.com/sponsors/scambier",
|
||||
"Ko-fi": "https://ko-fi.com/scambier"
|
||||
},
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
135
.obsidian/plugins/omnisearch/styles.css
vendored
Normal file
135
.obsidian/plugins/omnisearch/styles.css
vendored
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
.omnisearch-modal {
|
||||
}
|
||||
|
||||
.omnisearch-result {
|
||||
white-space: normal;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
/* justify-content: space-between; */
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.omnisearch-result__title-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
column-gap: 5px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.omnisearch-result__title {
|
||||
white-space: pre-wrap;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.omnisearch-result__title > span {
|
||||
}
|
||||
|
||||
.omnisearch-result__folder-path {
|
||||
font-size: 0.75rem;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.omnisearch-result__extension {
|
||||
font-size: 0.7rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.omnisearch-result__counter {
|
||||
font-size: 0.7rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.omnisearch-result__body {
|
||||
white-space: normal;
|
||||
font-size: small;
|
||||
word-wrap: normal;
|
||||
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 3;
|
||||
-webkit-box-orient: vertical;
|
||||
|
||||
color: var(--text-muted);
|
||||
margin-inline-start: 0.5em;
|
||||
}
|
||||
|
||||
.omnisearch-result__embed {
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
|
||||
.omnisearch-result__image-container {
|
||||
flex-basis: 20%;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
.omnisearch-highlight {
|
||||
}
|
||||
|
||||
.omnisearch-default-highlight {
|
||||
text-decoration: underline;
|
||||
text-decoration-color: var(--text-highlight-bg);
|
||||
text-decoration-thickness: 3px;
|
||||
text-underline-offset: -1px;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
.omnisearch-input-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.omnisearch-result__icon {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.omnisearch-result__icon svg {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.omnisearch-result__icon--emoji {
|
||||
font-size: 16px;
|
||||
vertical-align: middle;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 600px) {
|
||||
.omnisearch-input-container {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.omnisearch-input-container__buttons {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
padding: 0 1em 0 1em;
|
||||
gap: 1em;
|
||||
}
|
||||
.omnisearch-input-container__buttons > button {
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 600px) {
|
||||
.omnisearch-input-container__buttons {
|
||||
margin-inline-end: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
.omnisearch-input-field {
|
||||
position: relative;
|
||||
flex-grow: 1;
|
||||
}
|
||||
21
.obsidian/plugins/sheet-plus/data.json
vendored
Normal file
21
.obsidian/plugins/sheet-plus/data.json
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"showSheetButton": "true",
|
||||
"folder": "/",
|
||||
"excelFilenamePrefix": "Excel ",
|
||||
"excelFilenameDateTime": "DD-MM-YYYY HH.mm.ss",
|
||||
"sheetHeight": "300",
|
||||
"rowHeight": "25",
|
||||
"colWidth": "100",
|
||||
"authorizationCode": "",
|
||||
"embedLinkShowFooter": "false",
|
||||
"numberFormatLocal": "en",
|
||||
"mobileRenderMode": "mobile",
|
||||
"darkModal": "dark",
|
||||
"isBigSheet": "false",
|
||||
"fontFolder": "fonts",
|
||||
"selectedFontName": "",
|
||||
"aiModePlatform": "openai",
|
||||
"aiModel": "gpt-5-mini",
|
||||
"aiApiKey": "",
|
||||
"aiBaseUrl": "https://api.openai.com/v1"
|
||||
}
|
||||
1724
.obsidian/plugins/sheet-plus/main.js
vendored
Normal file
1724
.obsidian/plugins/sheet-plus/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/sheet-plus/manifest.json
vendored
Normal file
11
.obsidian/plugins/sheet-plus/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "sheet-plus",
|
||||
"name": "Sheet Plus",
|
||||
"version": "2.7.5",
|
||||
"minAppVersion": "1.5.11",
|
||||
"description": "Create Excel-like spreadsheets and easily embed them in Markdown.",
|
||||
"author": "ljcoder",
|
||||
"authorUrl": "https://github.com/ljcoder2015",
|
||||
"fundingUrl": "https://ko-fi.com/ljcoder",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
5
.obsidian/plugins/sheet-plus/styles.css
vendored
Normal file
5
.obsidian/plugins/sheet-plus/styles.css
vendored
Normal file
File diff suppressed because one or more lines are too long
28
.obsidian/plugins/system3-relay/data.json
vendored
Normal file
28
.obsidian/plugins/system3-relay/data.json
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"release": {
|
||||
"channel": "stable"
|
||||
},
|
||||
"sharedFolders": [],
|
||||
"endpoints": {},
|
||||
"enableDocumentStatus": false,
|
||||
"enableNewLinkFormat": false,
|
||||
"enableDeltaLogging": false,
|
||||
"enableDocumentHistory": false,
|
||||
"enableEditorTweens": false,
|
||||
"enableNetworkLogging": false,
|
||||
"enableCanvasSync": false,
|
||||
"enableVerifyUploads": false,
|
||||
"enableAutomaticDiffResolution": true,
|
||||
"enableDiscordLogin": false,
|
||||
"enableSelfManageHosts": true,
|
||||
"enableToasts": true,
|
||||
"enablePresenceAvatars": true,
|
||||
"enableLiveEmbeds": true,
|
||||
"enablePreviewViewHooks": true,
|
||||
"enableMetadataViewHooks": true,
|
||||
"enableKanbanView": true,
|
||||
"debugging": false,
|
||||
"login": {
|
||||
"provider": "google"
|
||||
}
|
||||
}
|
||||
171
.obsidian/plugins/system3-relay/main.js
vendored
Normal file
171
.obsidian/plugins/system3-relay/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/system3-relay/manifest.json
vendored
Normal file
11
.obsidian/plugins/system3-relay/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "system3-relay",
|
||||
"name": "Relay",
|
||||
"version": "0.7.4",
|
||||
"minAppVersion": "0.15.0",
|
||||
"description": "Collaborate in real time with live cursors. Create multiplayer folders and manage user access.",
|
||||
"author": "System 3",
|
||||
"authorUrl": "https://system3.md",
|
||||
"fundingUrl": "https://www.buymeacoffee.com/dtkav",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
314
.obsidian/plugins/system3-relay/styles.css
vendored
Normal file
314
.obsidian/plugins/system3-relay/styles.css
vendored
Normal file
|
|
@ -0,0 +1,314 @@
|
|||
.invalid-link {
|
||||
color: var(--link-external-color);
|
||||
width: 0.8em;
|
||||
margin-left: 1px;
|
||||
}
|
||||
|
||||
.remote-caret {
|
||||
position: absolute;
|
||||
border-left: black;
|
||||
border-left-style: solid;
|
||||
border-left-width: 2px;
|
||||
height: 1em;
|
||||
}
|
||||
|
||||
.remote-caret > div {
|
||||
position: relative;
|
||||
top: -1.05em;
|
||||
font-size: 13px;
|
||||
background-color: rgb(0, 129, 0);
|
||||
font-family: serif;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
line-height: normal;
|
||||
user-select: none;
|
||||
color: white;
|
||||
padding-left: 2px;
|
||||
padding-right: 2px;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.system3-pill {
|
||||
padding-inline-end: 0px !important;
|
||||
}
|
||||
|
||||
.system3-pill:hover > .system3-folder-icons {
|
||||
background-color: var(--color-base-05);
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.system3-pill:hover > .system3-folder-icons > .system3-icon {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.nav-file-tag .nav-file-title:not(:first-child) .system3-pill {
|
||||
margin-inline-start: 1em;
|
||||
}
|
||||
|
||||
.nav-file-title,
|
||||
.nav-folder-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.nav-folder-title-content {
|
||||
margin-inline-end: auto;
|
||||
}
|
||||
.inline-icon {
|
||||
display: inline-block;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
width: 1.3em;
|
||||
max-height: 1.3em;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.connection-status-icon {
|
||||
opacity: 0.5;
|
||||
color: var(--color-gray);
|
||||
}
|
||||
|
||||
.connection-status-icon-unknown {
|
||||
color: var(--color-gray);
|
||||
}
|
||||
|
||||
.connection-status-icon-connected {
|
||||
color: var(--color-green);
|
||||
}
|
||||
|
||||
.connection-status-icon-disconnected {
|
||||
color: var(--color-red);
|
||||
}
|
||||
|
||||
.workspace-split.mod-root
|
||||
.workspace-leaf:nth-child(n)
|
||||
.workspace-leaf-content[data-type="markdown"]:has(
|
||||
.system3-banner-box
|
||||
)::before {
|
||||
top: 4em !important;
|
||||
}
|
||||
|
||||
.obsidian-live-banner {
|
||||
position: relative;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
display: flex;
|
||||
border-width: var(--modal-border-width);
|
||||
border: var(--modal-border-width) solid;
|
||||
border-color: var(--modal-border-color);
|
||||
border-radius: var(--modal-radius);
|
||||
padding: 10px;
|
||||
background: var(--modal-background);
|
||||
margin: 10px -10px 10px -10px;
|
||||
}
|
||||
|
||||
.form-live {
|
||||
display: grid;
|
||||
grid-auto-flow: column;
|
||||
}
|
||||
|
||||
#shareLink-guid {
|
||||
width: 32em;
|
||||
}
|
||||
|
||||
.system3-banner {
|
||||
border-color: var(--pill-border-color-hover);
|
||||
cursor: pointer;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
display: flex;
|
||||
border-width: var(--modal-border-width);
|
||||
padding: 5px 20px 5px 20px;
|
||||
background: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.system3-banner > span {
|
||||
font-weight: bold;
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
font-size: var(--font-ui-medium);
|
||||
color: var(--text-on-accent);
|
||||
font: var(--font-interface-theme);
|
||||
text-shadow: var(--input-shadow);
|
||||
}
|
||||
|
||||
.system3-login-button,
|
||||
.system3-merge-button {
|
||||
background: var(--interactive-accent) !important;
|
||||
color: var(--text-on-accent) !important;
|
||||
border: var(--modal-border-width) solid var(--pill-border-color-hover) !important;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
font-size: var(--font-ui-medium);
|
||||
font: var(--font-interface-theme);
|
||||
text-shadow: var(--input-shadow);
|
||||
}
|
||||
|
||||
.system3-syncing:not(.is-active) {
|
||||
animation: system3-glow-sync 1.5s ease-in-out;
|
||||
transition: background-color 2s ease-in-out;
|
||||
}
|
||||
|
||||
.system3-downloading:not(.is-active) {
|
||||
animation: system3-glow-download 1.5s ease-in-out;
|
||||
transition: background-color 2s ease-in-out;
|
||||
}
|
||||
@keyframes system3-glow-sync {
|
||||
0% {
|
||||
background-color: transparent;
|
||||
}
|
||||
20% {
|
||||
background-color: hsla(var(--color-accent-hsl), 0.1);
|
||||
}
|
||||
80% {
|
||||
background-color: hsla(var(--color-accent-hsl), 0.1);
|
||||
}
|
||||
100% {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes system3-glow-download {
|
||||
0% {
|
||||
background-color: transparent;
|
||||
}
|
||||
20% {
|
||||
background-color: hsla(var(--color-accent-hsl), 0.1);
|
||||
}
|
||||
80% {
|
||||
background-color: hsla(var(--color-accent-hsl), 0.1);
|
||||
}
|
||||
100% {
|
||||
background-color: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.nav-folder > .nav-folder-children.system3-live {
|
||||
border-inline-start: var(--nav-indentation-guide-width) solid
|
||||
var(--color-accent) !important;
|
||||
}
|
||||
|
||||
.nav-file.system3-connected {
|
||||
border-inline-start: 1px solid var(--color-accent);
|
||||
}
|
||||
|
||||
.nav-file.system3-connecting {
|
||||
border-inline-start: 1px solid var(--color-base-40);
|
||||
}
|
||||
|
||||
.file-diff__container {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
overflow-x: scroll;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.file-diff__line {
|
||||
padding: 0.1rem 0;
|
||||
}
|
||||
|
||||
.file-diff__button-container {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
.file-diff__top-line__bg {
|
||||
background-color: #d9f4ef;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
|
||||
.file-diff_top-line__character {
|
||||
background-color: #99e1d3;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
|
||||
.file-diff__bottom-line__bg {
|
||||
background-color: #d9edff;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
|
||||
.file-diff_bottom-line__character {
|
||||
background-color: #b1d4f2;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.file-diff__top-line__bg {
|
||||
background-color: #25403b;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
|
||||
.file-diff_top-line__character {
|
||||
background-color: #236559;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
|
||||
.file-diff__bottom-line__bg {
|
||||
background-color: #25394b;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
|
||||
.file-diff_bottom-line__character {
|
||||
background-color: #2e618d;
|
||||
border-radius: 0.25rem; /* 4px */
|
||||
}
|
||||
}
|
||||
|
||||
.file-diff__no-bottom-border {
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
.file-diff__no-top-border {
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.file-diff__action-line {
|
||||
color: #919191;
|
||||
}
|
||||
|
||||
/* Tailwind CSS */
|
||||
.flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.gap-1 {
|
||||
gap: 0.25rem; /* 4px */
|
||||
}
|
||||
|
||||
.no-decoration {
|
||||
text-decoration-line: none;
|
||||
}
|
||||
|
||||
.no-decoration:hover {
|
||||
text-decoration-line: none;
|
||||
}
|
||||
|
||||
.text-xxs {
|
||||
font-size: 0.65rem;
|
||||
}
|
||||
|
||||
/* Rename from py-0.5 to py-0-5, as dots aren't allowed in selector names */
|
||||
.py-0-5 {
|
||||
padding-top: 0.125rem; /* 2px */
|
||||
padding-bottom: 0.125rem; /* 2px */
|
||||
}
|
||||
|
||||
.mr-2 {
|
||||
margin-right: 0.5rem; /* 8px */
|
||||
}
|
||||
|
||||
.mb-20 {
|
||||
margin-bottom: 5rem; /* 80px */
|
||||
}
|
||||
|
||||
/* Fix button width on mobile in setting items for our components */
|
||||
.is-phone .modal .setting-item-control button.system3-button {
|
||||
width: auto !important;
|
||||
}
|
||||
45
.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
45
.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal file
11
.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "templater-obsidian",
|
||||
"name": "Templater",
|
||||
"version": "2.18.1",
|
||||
"description": "Create and use templates",
|
||||
"minAppVersion": "1.5.0",
|
||||
"author": "SilentVoid",
|
||||
"authorUrl": "https://github.com/SilentVoid13",
|
||||
"helpUrl": "https://silentvoid13.github.io/Templater/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
226
.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal file
226
.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal file
|
|
@ -0,0 +1,226 @@
|
|||
.templater_search {
|
||||
width: calc(100% - 20px);
|
||||
}
|
||||
|
||||
.templater_div {
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.templater_div > .setting-item {
|
||||
border-top: none !important;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_div > .setting-item > .setting-item-control {
|
||||
justify-content: space-around;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div
|
||||
> .setting-item
|
||||
> .setting-item-control
|
||||
> .setting-editor-extra-setting-button {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_donating {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.templater_title {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
margin-top: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.templater_template {
|
||||
align-self: center;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
.templater_cmd {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
font-size: 14px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div2 > .setting-item {
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.templater-prompt-div,
|
||||
.templater-multisuggester-div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.templater-prompt-form {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-prompt-input,
|
||||
.templater-multisuggester-input {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-button-div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input {
|
||||
height: 10rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input:focus {
|
||||
border-color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.templater-multisuggester-list {
|
||||
margin: 1.5em 0;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-command-bg {
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command {
|
||||
font-size: 0.85em;
|
||||
font-family: var(--font-monospace);
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-inline .cm-templater-command {
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
|
||||
color: var(--code-property, #008bff);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
|
||||
color: var(--code-function, #c0d700);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-keyword {
|
||||
color: var(--code-keyword, #00a7aa);
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-atom {
|
||||
color: var(--code-normal, #f39b35);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-value,
|
||||
.cm-s-obsidian .cm-templater-command.cm-number,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type {
|
||||
color: var(--code-value, #a06fca);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
|
||||
color: var(--code-normal, var(--text-normal));
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-property,
|
||||
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-attribute {
|
||||
color: var(--code-function, #98e342);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-2,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-3,
|
||||
.cm-s-obsidian .cm-templater-command.cm-meta {
|
||||
color: var(--code-property, #d4d4d4);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-callee,
|
||||
.cm-s-obsidian .cm-templater-command.cm-operator,
|
||||
.cm-s-obsidian .cm-templater-command.cm-qualifier,
|
||||
.cm-s-obsidian .cm-templater-command.cm-builtin {
|
||||
color: var(--code-operator, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-tag {
|
||||
color: var(--code-tag, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
|
||||
color: var(--code-comment, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-string,
|
||||
.cm-s-obsidian .cm-templater-command.cm-string-2 {
|
||||
color: var(--code-string, #e6db74);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-header,
|
||||
.cm-s-obsidian .cm-templater-command.cm-hr {
|
||||
color: var(--code-keyword, #da7dae);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-link {
|
||||
color: var(--code-normal, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-error {
|
||||
border-bottom: 1px solid #c42412;
|
||||
}
|
||||
|
||||
.CodeMirror-hints {
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
overflow: hidden;
|
||||
list-style: none;
|
||||
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
|
||||
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
border-radius: 3px;
|
||||
border: 1px solid silver;
|
||||
|
||||
background: white;
|
||||
font-size: 90%;
|
||||
font-family: monospace;
|
||||
|
||||
max-height: 20em;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.CodeMirror-hint {
|
||||
margin: 0;
|
||||
padding: 0 4px;
|
||||
border-radius: 2px;
|
||||
white-space: pre;
|
||||
color: black;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li.CodeMirror-hint-active {
|
||||
background: #08f;
|
||||
color: white;
|
||||
}
|
||||
258
.obsidian/workspace.json
vendored
Normal file
258
.obsidian/workspace.json
vendored
Normal file
|
|
@ -0,0 +1,258 @@
|
|||
{
|
||||
"main": {
|
||||
"id": "0606b787ed3b5599",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "f9f7296f257902bf",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "bb26a06a1d15610e",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "1.TOUSE/culture template.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "culture template"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "086990ccafb02201",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "release-notes",
|
||||
"state": {
|
||||
"currentVersion": "1.11.7"
|
||||
},
|
||||
"icon": "lucide-book-up",
|
||||
"title": "Release Notes 1.11.7"
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 1
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "f4a3a9d269eceb20",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "feb49763baf7b594",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "5e77a5099bcd00b1",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical",
|
||||
"autoReveal": false
|
||||
},
|
||||
"icon": "lucide-folder-closed",
|
||||
"title": "Files"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "9d3dd3124f5f56c5",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-search",
|
||||
"title": "Search"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "532451f326128076",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {},
|
||||
"icon": "lucide-bookmark",
|
||||
"title": "Bookmarks"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300
|
||||
},
|
||||
"right": {
|
||||
"id": "704c30d4d81d3a92",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "7a1bcbeb0ac3caaa",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "c0ff35703372c12a",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"file": "TOUSE/building template.md",
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-coming-in",
|
||||
"title": "Backlinks for building template"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "400374469f58cbc0",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"file": "TOUSE/building template.md",
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-going-out",
|
||||
"title": "Outgoing links from building template"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "1d02a183d053e27a",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-tags",
|
||||
"title": "Tags"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "09e63cedca78b1c5",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "all-properties",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-archive",
|
||||
"title": "All properties"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "87b99edb94bcbe35",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "TOUSE/building template.md",
|
||||
"followCursor": false,
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
},
|
||||
"icon": "lucide-list",
|
||||
"title": "Outline of building template"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "d6d23ef537f69511",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "online.larslockefeer.obsidian-plugin-todo",
|
||||
"state": {},
|
||||
"icon": "checkmark",
|
||||
"title": "Todo"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "e4b19664db0a1c32",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "git-view",
|
||||
"state": {},
|
||||
"icon": "git-pull-request",
|
||||
"title": "Source Control"
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 6
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"switcher:Open quick switcher": false,
|
||||
"graph:Open graph view": false,
|
||||
"canvas:Create new canvas": false,
|
||||
"daily-notes:Open today's daily note": false,
|
||||
"templates:Insert template": false,
|
||||
"command-palette:Open command palette": false,
|
||||
"bases:Create new base": false,
|
||||
"obsidian-git:Open Git source control": false,
|
||||
"obsidian-kanban:Create new board": false,
|
||||
"system3-relay:Relay": false,
|
||||
"sheet-plus:Create excel file": false,
|
||||
"fantasy-content-generator:Fantasy Generators": false,
|
||||
"audio-recorder:Start/stop recording": false,
|
||||
"omnisearch:Omnisearch": false,
|
||||
"templater-obsidian:Templater": false
|
||||
}
|
||||
},
|
||||
"active": "086990ccafb02201",
|
||||
"lastOpenFiles": [
|
||||
"1.TOUSE/deity template.md",
|
||||
"1.TOUSE/example character arc template.md",
|
||||
"1.TOUSE/Welcome.md",
|
||||
"1.TOUSE/protagonists.md",
|
||||
"1.TOUSE/location template.md",
|
||||
"Details/Items/bjn,mkghkghkghjkgvh.md",
|
||||
"1.TOUSE/factions template.md",
|
||||
"1.TOUSE/example character template.md",
|
||||
"1.TOUSE/example character interaction template.md",
|
||||
"1.TOUSE/culture template.md",
|
||||
"1.TOUSE/country template.md",
|
||||
"1.TOUSE/city template.md",
|
||||
"1.TOUSE/building template.md",
|
||||
"3. Details/Currencies",
|
||||
"3. Details/Resources & Materials",
|
||||
"3. Details/Afflictions & Boons & Conditions",
|
||||
"3. Details/Occupation & Classes",
|
||||
"3. Details/Items",
|
||||
"3. Details/Skills & Spells & Other",
|
||||
"4. Groups & Teachings/Sciences & Technological Groups",
|
||||
"4. Groups & Teachings/Schools of Magic & Magical Groups",
|
||||
"4. Groups & Teachings/Organizations & Other Groups",
|
||||
"4. Groups & Teachings/Teachings & Religious Groups",
|
||||
"example character arc template 2.md",
|
||||
"Untitled Kanban.md",
|
||||
"Excel 18-01-2026 22.32.59.univer.md",
|
||||
"Untitled Kanban 1.md",
|
||||
"18-01-2026.md"
|
||||
]
|
||||
}
|
||||
5
1.TOUSE/Welcome.md
Normal file
5
1.TOUSE/Welcome.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
This is your new *vault*.
|
||||
|
||||
Make a note of something, [[create a link]], or try [the Importer](https://help.obsidian.md/Plugins/Importer)!
|
||||
|
||||
When ![[example character arc template 2]]you're ready, delete this note and make the vault your own.
|
||||
265
1.TOUSE/building template.md
Normal file
265
1.TOUSE/building template.md
Normal file
|
|
@ -0,0 +1,265 @@
|
|||
---
|
||||
Description:
|
||||
History:
|
||||
tags:
|
||||
-
|
||||
---
|
||||
|
||||
# Basics
|
||||
|
||||
| Location name:| |
|
||||
|---|---|
|
||||
|Earth/Alternate Earth/Not Earth:||
|
||||
|Estimate Population:||
|
||||
|One Sentence Description:||
|
||||
|
||||
# Geography
|
||||
## The Natural World
|
||||
| How was it created?| |
|
||||
|---|---|
|
||||
|Age:||
|
||||
|Celestial beings(Sun, Moon, Stars):||
|
||||
|Special plants:||
|
||||
|Wildlife:||
|
||||
|Wildlife locations:||
|
||||
|Mythical creatures:||
|
||||
|Landscape:||
|
||||
|Natural wonders:||
|
||||
|Diseases:||
|
||||
## Locations of significance
|
||||
|
||||
| Major cities:| |
|
||||
|---|---|
|
||||
|Ports:||
|
||||
|Capital City:||
|
||||
|Buildings of significance:||
|
||||
|Flags & Symbols||
|
||||
|
||||
# Weather
|
||||
|
||||
| Climate:| |
|
||||
|---|---|
|
||||
|Seasons:||
|
||||
|
||||
# People
|
||||
## Races & People
|
||||
|
||||
| Races:| |
|
||||
|---|---|
|
||||
|How did they get here:||
|
||||
|How do they co-exist:||
|
||||
|What do they look like:||
|
||||
|Societal standard for beauty:||
|
||||
|Conduct between different ranks & classes:||
|
||||
|Universally insulting gesture:||
|
||||
|Rites of passages:||
|
||||
|Age of adulthood:||
|
||||
|Death and Burial traditions:||
|
||||
|Death and burial traditions:||
|
||||
|Marriage traditions:||
|
||||
|Important calendar events;||
|
||||
|
||||
## Languages
|
||||
|
||||
| Languages:| |
|
||||
|---|---|
|
||||
|Most commonly spoken:||
|
||||
|Universal language||
|
||||
|Common sayings:||
|
||||
|Accents||
|
||||
|Greetings:||
|
||||
|
||||
## Social frameworks
|
||||
|
||||
| Social taboos:| |
|
||||
|---|---|
|
||||
|How would you get shunned from this society:||
|
||||
|Class or caste system:||
|
||||
|How do you join or change castes:||
|
||||
|How do you advance in society:||
|
||||
|Describe a normal family unit:||
|
||||
|Family unit social system:||
|
||||
|Marriage:||
|
||||
|
||||
# Civilization
|
||||
## History
|
||||
|
||||
| How did civilization begin:| |
|
||||
|---|---|
|
||||
|Significant wars:||
|
||||
|What changes occurred after each war:||
|
||||
|Earliest known record of history:||
|
||||
|Era’s of history(First age, second age, etc)||
|
||||
|World myths:||
|
||||
|How are stories passed through generations:||
|
||||
|
||||
## Culture
|
||||
|
||||
| How is culture preserved:| |
|
||||
|---|---|
|
||||
|What defines culture:||
|
||||
|Roles of arts in culture:||
|
||||
|Celebrated or noted artists:||
|
||||
|Normal men clothes:||
|
||||
|Normal women’s clothes||
|
||||
|Profession dress code:||
|
||||
|Regional crusine:||
|
||||
|Difference between poor and rich food||
|
||||
|Staple food:||
|
||||
|Traditions before or after a meal:||
|
||||
|
||||
## Religion
|
||||
|
||||
| When do people worship?| |
|
||||
|---|---|
|
||||
|When and where do people worship?||
|
||||
|Major Gods:||
|
||||
|Minor Gods:||
|
||||
|Function of Religion:||
|
||||
|Holy Texts:||
|
||||
|If Holy Texts exist, are they well known:||
|
||||
|Important Religious figures:||
|
||||
|
||||
## Education
|
||||
|
||||
| Does formal education exist:| |
|
||||
|---|---|
|
||||
|Who can access it:||
|
||||
|How is magic studied:||
|
||||
|Schools or Academy:||
|
||||
|Rich vs Poor Education:||
|
||||
|
||||
## Leisure
|
||||
|
||||
| How do people spend their free time:| |
|
||||
|---|---|
|
||||
|Forms of entertainment:||
|
||||
|Organized sports:||
|
||||
|
||||
## Technology, magic & weapons
|
||||
|
||||
| How advanced is technology?| |
|
||||
|---|---|
|
||||
|How does it work:||
|
||||
|How does it impact different parts of society:||
|
||||
|Transportation:||
|
||||
|Communication:||
|
||||
|Medicine:||
|
||||
|Predominant Weapons:||
|
||||
|Who makes weapons:||
|
||||
|How do they work?||
|
||||
|Where do you get them:||
|
||||
|Weapons of significance:||
|
||||
|Common weapons:||
|
||||
|Professions that require a weapon:||
|
||||
|
||||
# Economy
|
||||
## Trade & Commerce
|
||||
| How is trade faciliated:| |
|
||||
|---|---|
|
||||
|Allies & Trade partners:||
|
||||
|Currency:||
|
||||
|Major imports:||
|
||||
|Major exports:||
|
||||
|Region specialty:||
|
||||
|Region natural resources:||
|
||||
|
||||
## Transportation
|
||||
| How easy is it to travel:| |
|
||||
|---|---|
|
||||
|Modes of transportation:||
|
||||
|How is imformation disseminated(ink & paper, owl, etc)||
|
||||
|
||||
## Business
|
||||
|
||||
| Highly valued crafts or trades:| |
|
||||
|---|---|
|
||||
|Elite or respectable professions:||
|
||||
|How do you advance your career||
|
||||
|Normal work schedule:||
|
||||
|Average income||
|
||||
|
||||
# Politics
|
||||
## Government
|
||||
| Form of government:| |
|
||||
|---|---|
|
||||
|Responsibilities of government:||
|
||||
|How is the government percieved:||
|
||||
|
||||
## Law
|
||||
| What is the rule of law:| |
|
||||
|---|---|
|
||||
|Most important laws:||
|
||||
|Punishments for breaking the law:||
|
||||
|Justice system:||
|
||||
|How is war declared:||
|
||||
|Legal process:||
|
||||
|Army command structure:||
|
||||
|How big is the army||
|
||||
|How is it comprised of:||
|
||||
|
||||
## First impressions
|
||||
|
||||
| Colors:| |
|
||||
|---|---|
|
||||
|Facade:||
|
||||
|Windows:||
|
||||
|Door:||
|
||||
|Entrance:||
|
||||
|Roof:||
|
||||
|Garden:||
|
||||
|Interior:||
|
||||
|Pathway:||
|
||||
|Built out of:||
|
||||
|Looks like a:||
|
||||
|
||||
## Detail
|
||||
|
||||
| Time it was built:| |
|
||||
|---|---|
|
||||
|Age:||
|
||||
|Theme it’s built in:||
|
||||
|Designer:||
|
||||
|Owner:||
|
||||
|Who lives here:||
|
||||
|Size/amount of floors:||
|
||||
|Insulation on walls:||
|
||||
|Insulation on roof:||
|
||||
|How it gains warmth||
|
||||
|
||||
## Inside
|
||||
| Type of exterior:| |
|
||||
|---|---|
|
||||
|Type of interior:||
|
||||
|Type of furnitures:||
|
||||
|Condition of building||
|
||||
|
||||
## Amounts
|
||||
|
||||
| # of entrances:| |
|
||||
|---|---|
|
||||
|# of doors:||
|
||||
|# of windows:||
|
||||
|# of residents:||
|
||||
|# of workers:||
|
||||
|# of animals:||
|
||||
|
||||
## Material
|
||||
|
||||
| Facade:| |
|
||||
|---|---|
|
||||
|Walls:||
|
||||
|Windows:||
|
||||
|Door:||
|
||||
|Entrance:||
|
||||
|Roof:||
|
||||
|Pathway:||
|
||||
|
||||
## Various things it contains
|
||||
|
||||
| Backyard: | |
|
||||
| ------------------ | --- |
|
||||
| Garden: | |
|
||||
| Stable: | |
|
||||
| Swimmingpool: | |
|
||||
| Training stations: | |
|
||||
236
1.TOUSE/city template.md
Normal file
236
1.TOUSE/city template.md
Normal file
|
|
@ -0,0 +1,236 @@
|
|||
---
|
||||
Type of Settlement:
|
||||
tags:
|
||||
- location/city
|
||||
---
|
||||
|
||||
| Name: | |
|
||||
| ------------------- | --- |
|
||||
| Type of Settlement: | |
|
||||
| Size of Settlement: | |
|
||||
| Notable Areas: | |
|
||||
# General
|
||||
| Financial Status: | |
|
||||
| ---------------------- | --- |
|
||||
| Local Government: | |
|
||||
| Growth/development | |
|
||||
| Public services: | |
|
||||
| Crime rate: | |
|
||||
| Cost of living: | |
|
||||
| Employement prospects: | |
|
||||
# Basics
|
||||
| Location name: | |
|
||||
| ------------------------------- | --- |
|
||||
| Earth/Alternate Earth/Not Earth | |
|
||||
| Estimate Population | |
|
||||
| One sentence description | |
|
||||
# Apperance
|
||||
|
||||
|Overall apperance: | |
|
||||
| ---- | ---- |
|
||||
| Urban area: | |
|
||||
| General construction level: | |
|
||||
| General level of upkeep | |
|
||||
| General street condition: | |
|
||||
# People
|
||||
|
||||
| Population: | |
|
||||
| -------------------------- | --- |
|
||||
| Level of contentment: | |
|
||||
| Racial diversity: | |
|
||||
| Attitudes towards vistors: | |
|
||||
| Regional accent: | |
|
||||
# Geography
|
||||
## The natural world
|
||||
|
||||
|How was it created?||
|
||||
|---|---|
|
||||
|Age:||
|
||||
|Celestial beings(Sun, Moon, Stars):||
|
||||
|Special plants:||
|
||||
|Wildlife:||
|
||||
|Wildlife locations:||
|
||||
|Mythical creatures:||
|
||||
|Landscape:||
|
||||
|Natural wonders:||
|
||||
|Diseases:||
|
||||
|
||||
## Locations of Significance:
|
||||
|
||||
|Major cities:||
|
||||
|---|---|
|
||||
|Ports:||
|
||||
|Capital City:||
|
||||
|Buildings of significance:||
|
||||
|Flags & Symbols||
|
||||
|
||||
### Weather
|
||||
|
||||
|Climate:||
|
||||
|---|---|
|
||||
|Seasons:||
|
||||
|
||||
# People
|
||||
|
||||
## Races & People
|
||||
|
||||
|Races:||
|
||||
|---|---|
|
||||
|How did they get here:||
|
||||
|How do they co-exist:||
|
||||
|What do they look like:||
|
||||
|Societal standard for beauty:||
|
||||
|Conduct between different ranks & classes:||
|
||||
|Universally insulting gesture:||
|
||||
|Rites of passages:||
|
||||
|Age of adulthood:||
|
||||
|Death and Burial traditions:||
|
||||
|Death and burial traditions:||
|
||||
|Marriage traditions:||
|
||||
|Important calendar events;||
|
||||
|
||||
## Languages
|
||||
|
||||
|Languages:||
|
||||
|---|---|
|
||||
|Most commonly spoken:||
|
||||
|Universal language||
|
||||
|Common sayings:||
|
||||
|Accents||
|
||||
|Greetings:||
|
||||
|
||||
## Social Frameworks
|
||||
|
||||
|Social taboos:||
|
||||
|---|---|
|
||||
|How would you get shunned from this society:||
|
||||
|Class or caste system:||
|
||||
|How do you join or change castes:||
|
||||
|How do you advance in society:||
|
||||
|Describe a normal family unit:||
|
||||
|Family unit social system:||
|
||||
|Marriage:||
|
||||
|
||||
# Civilization
|
||||
|
||||
## History
|
||||
|
||||
|How did civilization begin:||
|
||||
|---|---|
|
||||
|Significant wars:||
|
||||
|What changes occurred after each war:||
|
||||
|Earliest known record of history:||
|
||||
|Era’s of history(First age, second age, etc)||
|
||||
|World myths:||
|
||||
|How are stories passed through generations:||
|
||||
|
||||
## Culture
|
||||
|
||||
|How is culture preserved:||
|
||||
|---|---|
|
||||
|What defines culture:||
|
||||
|Roles of arts in culture:||
|
||||
|Celebrated or noted artists:||
|
||||
|Normal men clothes:||
|
||||
|Normal women’s clothes||
|
||||
|Profession dress code:||
|
||||
|Regional crusine:||
|
||||
|Difference between poor and rich food||
|
||||
|Staple food:||
|
||||
|Traditions before or after a meal:||
|
||||
|
||||
## Religon
|
||||
|
||||
|When do people worship?||
|
||||
|---|---|
|
||||
|When and where do people worship?||
|
||||
|Major Gods:||
|
||||
|Minor Gods:||
|
||||
|Function of Religion:||
|
||||
|Holy Texts:||
|
||||
|If Holy Texts exist, are they well known:||
|
||||
|Important Religious figures:||
|
||||
|
||||
## Education
|
||||
|
||||
|Does formal education exist:||
|
||||
|---|---|
|
||||
|Who can access it:||
|
||||
|How is magic studied:||
|
||||
|Schools or Academy:||
|
||||
|Rich vs Poor Education:||
|
||||
|
||||
## Leisure:
|
||||
|
||||
|How do people spend their free time:||
|
||||
|---|---|
|
||||
|Forms of entertainment:||
|
||||
|Organized sports:||
|
||||
|
||||
# Technology, Magic & Weapons
|
||||
|
||||
|How advanced is technology?||
|
||||
|---|---|
|
||||
|How does it work:||
|
||||
|How does it impact different parts of society:||
|
||||
|Transportation:||
|
||||
|Communication:||
|
||||
|Medicine:||
|
||||
|Predominant Weapons:||
|
||||
|Who makes weapons:||
|
||||
|How do they work?||
|
||||
|Where do you get them:||
|
||||
|Weapons of significance:||
|
||||
|Common weapons:||
|
||||
|Professions that require a weapon:||
|
||||
|
||||
# Economy
|
||||
|
||||
## Trade & Commerce
|
||||
|
||||
|How is trade faciliated:||
|
||||
|---|---|
|
||||
|Allies & Trade partners:||
|
||||
|Currency:||
|
||||
|Major imports:||
|
||||
|Major exports:||
|
||||
|Region specialty:||
|
||||
|Region natural resources:||
|
||||
|
||||
## Transportation
|
||||
|
||||
|How easy is it to travel:||
|
||||
|---|---|
|
||||
|Modes of transportation:||
|
||||
|How is imformation disseminated(ink & paper, owl, etc)||
|
||||
|
||||
## Business
|
||||
|
||||
|Highly valued crafts or trades:||
|
||||
|---|---|
|
||||
|Elite or respectable professions:||
|
||||
|How do you advance your career||
|
||||
|Normal work schedule:||
|
||||
|Average income||
|
||||
|
||||
# Politics
|
||||
|
||||
## Government
|
||||
|
||||
|Form of government:||
|
||||
|---|---|
|
||||
|Responsibilities of government:||
|
||||
|How is the government percieved:||
|
||||
|
||||
## Law
|
||||
|
||||
|What is the rule of law:||
|
||||
|---|---|
|
||||
|Most important laws:||
|
||||
|Punishments for breaking the law:||
|
||||
|Justice system:||
|
||||
|How is war declared:||
|
||||
|Legal process:||
|
||||
|Army command structure:||
|
||||
|How big is the army||
|
||||
|How is it comprised of:||
|
||||
168
1.TOUSE/country template.md
Normal file
168
1.TOUSE/country template.md
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
---
|
||||
aliases:
|
||||
Capital:
|
||||
Population:
|
||||
Languages:
|
||||
tags:
|
||||
- "#country"
|
||||
Maps:
|
||||
Timeline:
|
||||
Lineages:
|
||||
World Era:
|
||||
Internal Rules:
|
||||
---
|
||||
|
||||
# Location Template - Country
|
||||
> [!infobox]
|
||||
> ###### Info
|
||||
> | |
|
||||
> ---|---|
|
||||
> Capital |
|
||||
> Population |
|
||||
> Government Type |
|
||||
> Ruler |
|
||||
> Demonym |
|
||||
> Common Races |
|
||||
> Common Languages |
|
||||
> Currency |
|
||||
> Imports |
|
||||
> Exports |
|
||||
|
||||
## History
|
||||
[[Recorded Histories]]
|
||||
[[Legends]]
|
||||
[[Fossils]]
|
||||
[[Artifacts]]
|
||||
[[Ruins]]
|
||||
|
||||
## Linguistics
|
||||
[[Figures of Speech]]
|
||||
[[Slang & Curses]]
|
||||
[[Lies & Propoganda]]
|
||||
[[Alphabets]]
|
||||
[[Long Distance Communications]]
|
||||
|
||||
## Technology
|
||||
[[Tools]]
|
||||
[[Arms & Armor]]
|
||||
[[Medicine]]
|
||||
[[Alternative Techologies]]
|
||||
|
||||
## General
|
||||
[[Epsomol Maps]]
|
||||
[[Timeline of Epsomol]]
|
||||
[[Lineages]]
|
||||
[[World Era]]
|
||||
[[Internal Rules/Laws]]
|
||||
|
||||
## Ecology
|
||||
[[People MOC]]
|
||||
[[Creatures]]
|
||||
[[05 Archives/Life/Flora/Flora]]
|
||||
[[Behavior & Reproduction]]
|
||||
[[Ecosystems]]
|
||||
[[Pets & Companions]]
|
||||
[[Domesticated Animals]]
|
||||
|
||||
## Culture
|
||||
[[Art]]
|
||||
[[Music]]
|
||||
[[Architecture]]
|
||||
[[Fashion]]
|
||||
[[Poetry & Prose]]
|
||||
[[Rituals]]
|
||||
[[Cruisine]]
|
||||
[[Celebrations]]
|
||||
[[Etiquette]]
|
||||
[[Taboos]]
|
||||
[[Sports & Games]]
|
||||
[[Entertainment]]
|
||||
[[Body Adornment]]
|
||||
[[Morals]]
|
||||
|
||||
## Organization
|
||||
[[Guilds]]
|
||||
[[Hiearchies]]
|
||||
[[Heraldry]]
|
||||
[[Secret Organization]]
|
||||
[[Timekeeping]]
|
||||
|
||||
## Geopolitics
|
||||
[[Governments]]
|
||||
[[Diplomacy & Politics]]
|
||||
[[Political Events]]
|
||||
[[War]]
|
||||
[[Law & Order]]
|
||||
|
||||
## Economy
|
||||
[[Currencies & Trade]]
|
||||
[[Business & Cooporations]]
|
||||
[[Factories & Warehouses]]
|
||||
[[Rare Goods]]
|
||||
[[Imported Goods]]
|
||||
[[Exported Goods]]
|
||||
|
||||
## Infrastructure
|
||||
[[Water System]]
|
||||
[[Power System]]
|
||||
[[Waste System]]
|
||||
[[Transport System]]
|
||||
[[05 Archives/Material/Agriculture/Agriculture]]
|
||||
[[Deathcare]]
|
||||
[[Education]]
|
||||
[[Healthcare]]
|
||||
|
||||
## Religion
|
||||
[[Gods]]
|
||||
[[Religions]]
|
||||
[[Afterlife Beliefs]]
|
||||
[[Sacred Texts]]
|
||||
[[Prophecies]]
|
||||
|
||||
## Fantasy
|
||||
[[Magical Creatures]]
|
||||
[[Alien Lifeforms]]
|
||||
[[Unique Abilities]]
|
||||
[[Spells & Magic]]
|
||||
[[Constructed Intelligences]]
|
||||
[[Paranormal Entities]]
|
||||
[[Mutated Organsisms]]
|
||||
[[Legendary Items]]
|
||||
[[Other Realms]]
|
||||
[[Fantastic Lands]]
|
||||
[[Spirit Domains]]
|
||||
[[Netherworlds]]
|
||||
[[Multiverses]]
|
||||
|
||||
## Nefarious
|
||||
[[Forbidden Magic]]
|
||||
[[Cults]]
|
||||
[[Diseases]]
|
||||
[[Illicit Goods & Services]]
|
||||
[[Forbidden Tech]]
|
||||
[[Riddles & Puzzles]]
|
||||
[[Traps]]
|
||||
[[Outlaw Organizations]]
|
||||
|
||||
## Environment
|
||||
[[Bogs & Swamps]]
|
||||
[[Volcanic]]
|
||||
[[Subterannean]]
|
||||
[[Aquatic Zones]]
|
||||
[[Islands]]
|
||||
[[Jungles & Rainforests]]
|
||||
[[Artic Regions]]
|
||||
[[Seas & Oceans]]
|
||||
[[Fields & Praries]]
|
||||
[[Mountains]]
|
||||
[[Rivers & Lakes]]
|
||||
[[Forests]]
|
||||
[[Badlands]]
|
||||
[[Deserts]]
|
||||
[[Weather & Storms]]
|
||||
[[05 Archives/Material/Climate/Climate]]
|
||||
[[Wildlife]]
|
||||
[[Migration]]
|
||||
# Notes
|
||||
|
||||
## Inspiration
|
||||
82
1.TOUSE/culture template.md
Normal file
82
1.TOUSE/culture template.md
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
---
|
||||
Complete:
|
||||
Series:
|
||||
tags:
|
||||
- worldbuilding/culture
|
||||
---
|
||||
|
||||
# Family & Friendships
|
||||
|
||||
| What is a normal family unit?| |
|
||||
|---|---|
|
||||
|Do people marry for love or other reasons?||
|
||||
|What reasons? Are the genders treated differently? Who raises the children?||
|
||||
|
||||
# Social Rules
|
||||
| What is a gesture of respect(bowing, saluting)?| |
|
||||
|---|---|
|
||||
|What is considered a rude gesture?||
|
||||
|How do they curse?||
|
||||
|Gods?||
|
||||
|Body parts?||
|
||||
|What topics of conversation are controversial?||
|
||||
|What topics of conservation are safe?||
|
||||
|What constitutes a social faux pas||
|
||||
|Do people live in happiness or fear?||
|
||||
|Does the culture value strength or compassion more highly?||
|
||||
|Does the culture value wealth or generosity more highly?||
|
||||
|
||||
# Food
|
||||
| What does a feast look like?| |
|
||||
|---|---|
|
||||
|What does a basic pauper’s meal look like?||
|
||||
|Do people mostly eat meat, fish or vegetables?||
|
||||
|Do people eat together or seperately?||
|
||||
|Do people eat in small or large groups?||
|
||||
|What utensils do people use to eat?||
|
||||
|Are there many restaurants?||
|
||||
|Who goes to them?||
|
||||
|Are there street food sellers?||
|
||||
|What do people drink?||
|
||||
|Is the water generally clean enough to drink?||
|
||||
|Are some foods poisonous to certain people?||
|
||||
|What are the tables like? Shape? High or low?||
|
||||
|
||||
# Art
|
||||
|
||||
| What forms of art are there?| |
|
||||
|---|---|
|
||||
|Do people value art?||
|
||||
|Can everyone afford art, or only the wealthy?||
|
||||
|What subjects does art concern itself with?||
|
||||
|
||||
# Religion
|
||||
|
||||
| Do people believe in one God, many or more?| |
|
||||
|---|---|
|
||||
|Is there more than one religion?||
|
||||
|Do people make sacrifices to Gods?||
|
||||
|Do an elite control religion or is it accessible to all?||
|
||||
|What are temples like?||
|
||||
|What are the common superstitions?||
|
||||
|
||||
# Languages
|
||||
|
||||
| What languages do people speak?| |
|
||||
|---|---|
|
||||
|Do most people speak more than one language?||
|
||||
|Is there a common language for trade?||
|
||||
|
||||
# Architecture
|
||||
|
||||
| What are the cities like, if any?| |
|
||||
|---|---|
|
||||
|What are the houses like?||
|
||||
|Is architecture indulgent or functional?||
|
||||
|
||||
# Clothing/Fashion
|
||||
|
||||
| What do people wear?| |
|
||||
|---|---|
|
||||
|What is in fashion this year?||
|
||||
|What was in fashion last year?||
|
||||
101
1.TOUSE/deity template.md
Normal file
101
1.TOUSE/deity template.md
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
---
|
||||
|
||||
---
|
||||
> [!metadata|metadata]- Metadata
|
||||
>> [!metadata|metadataoption]- System
|
||||
>> #### System
|
||||
>> |
|
||||
>> ---|---|
|
||||
>> **Tags** | `INPUT[Tags][inlineListSuggester:tags]` |
|
||||
>
|
||||
>> [!metadata|metadataoption]- Art
|
||||
>> #### Art
|
||||
>> |
|
||||
>> ---|---|
|
||||
>> **Art** | `INPUT[imageSuggester(optionQuery("")):art]` |
|
||||
>
|
||||
>> [!metadata|metadataoption]- Bio
|
||||
>> #### Bio
|
||||
>> |
|
||||
>> ---|---|
|
||||
>> **Pronounced** | `INPUT[textArea:pronounced]` |
|
||||
>> **Aliases** | `INPUT[list:aliases]` |
|
||||
>> **Pronouns** | `INPUT[Pronouns][:pronouns]` |
|
||||
>> **Alignment** | `INPUT[Alignment][:alignment]` |
|
||||
>
|
||||
>> [!metadata|metadataoption]- Deity Info
|
||||
>> #### Deity Info
|
||||
>> |
|
||||
>>---|---|
|
||||
>> **Ideals** | `INPUT[textArea:ideals]` |
|
||||
>> **Flaws** | `INPUT[textArea:flaws]` |
|
||||
>> **Fears** | `INPUT[textArea:fears]` |
|
||||
>> **Mannerisms** | `INPUT[textArea:mannerisms]` |
|
||||
>> **Occupations** | `INPUT[Occupation][inlineListSuggester:occupation]` |
|
||||
>> **Power** | `INPUT[DeityPower][:deitypower]` |
|
||||
>> **Organizations** | `INPUT[inlineListSuggester(optionQuery(#Organization AND !"z_Templates"), useLinks(partial)):organization]` |
|
||||
>> **Owned Locations** | `INPUT[inlineListSuggester(optionQuery(#Location AND !"z_Templates"), useLinks(partial)):ownedlocation]` |
|
||||
>> **Current Location** | `INPUT[inlineListSuggester(optionQuery(#Location AND !"z_Templates"), useLinks(partial)):location]` |
|
||||
>> **Condition** | `INPUT[Condition][:condition]` |
|
||||
>
|
||||
>> [!metadata|metadataoption]- Party Info
|
||||
>> #### Character Info
|
||||
>> |
|
||||
>> ---|---|
|
||||
>> **Traveling With** | `INPUT[inlineListSuggester(optionQuery(#Party AND !"z_Templates"), useLinks(partial)):whichparty]` |
|
||||
>> **Character 1 Relation** | `INPUT[Party1Relation][:party1relation]` |
|
||||
>
|
||||
|
||||
> [!infobox]+
|
||||
> # `=this.file.name`
|
||||
> ![[placeholder.png.png]]
|
||||
>
|
||||
> ###### Bio
|
||||
> |
|
||||
> ---|---|
|
||||
> **Aliases** | `VIEW[{aliases}][text]` |
|
||||
> **Pronouns** | `VIEW[{pronouns}]` |
|
||||
> **Gender** | `VIEW[{alignment}]` |
|
||||
> ###### Info
|
||||
> |
|
||||
> ---|---|
|
||||
> **Original Locations** | `VIEW[{ownedlocation}][link]` |
|
||||
> **Current Location** | `VIEW[{location}][link]` |
|
||||
> **Condition** | `VIEW[{condition}]` |
|
||||
|
||||
|
||||
# **`=this.file.name`** <span style="font-size: medium"></span>
|
||||
> [!metadata|organizations]- Related Organizations
|
||||
> ```dataview
|
||||
> TABLE join(aliases, ", ") AS Aliases, join(organizationtype, ", ") AS Type
|
||||
> FROM "20 Stories/00 Royal Legacies/01 Throne of Shadows/07 Worldbuilding/7.5 Species/02 Groups"
|
||||
> WHERE econtains(worship, this.file.link) AND contains(tags, "Organization")
|
||||
> SORT organizationtype ASC, file.name ASC
|
||||
|
||||
## Overview
|
||||
> [!column|2 no-title]
|
||||
>
|
||||
>
|
||||
>> [!metadata|ideals] Ideals
|
||||
> `VIEW[{ideals}][text]`
|
||||
>
|
||||
>> [!metadata|flaws] Flaws
|
||||
> `VIEW[{flaws}][text]`
|
||||
>
|
||||
>> [!metadata|fear] Fears
|
||||
> `VIEW[{fears}][text]`
|
||||
>
|
||||
>> [!metadata|mannerism] Mannerisms
|
||||
> `VIEW[{mannerisms}][text]`
|
||||
|
||||
## Goals
|
||||
|
||||
### Example #1
|
||||
|
||||
## Acquaintances
|
||||
|
||||
## Current Events
|
||||
|
||||
## History
|
||||
|
||||
## Notes
|
||||
4
1.TOUSE/example character arc template.md
Normal file
4
1.TOUSE/example character arc template.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
## Character Arc for [Character]
|
||||
- **Beginning:** [Character] starts as a reluctant hero, unsure of their abilities.
|
||||
- **Middle:** They face significant challenges that test their resolve and skills.
|
||||
- **End:** [Character] emerges as a confident leader, having embraced their destiny.
|
||||
4
1.TOUSE/example character interaction template.md
Normal file
4
1.TOUSE/example character interaction template.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
## Interaction between [Character] and [Character]
|
||||
- **Scene:** [Character] confronts [Character] about their secret.
|
||||
- **Dialogue:** "Why didn't you tell me the truth, [Character]?" [Character] demanded, their voice trembling.
|
||||
- **Impact:** This confrontation marks a turning point in their relationship, leading to greater trust.
|
||||
8
1.TOUSE/example character template.md
Normal file
8
1.TOUSE/example character template.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
## Name:
|
||||
## Age:
|
||||
## Physical Description
|
||||
## Personality Traits
|
||||
## Backstory
|
||||
## Motivations
|
||||
## Relationships
|
||||
## Key Story Arcs
|
||||
19
1.TOUSE/factions template.md
Normal file
19
1.TOUSE/factions template.md
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
tags:
|
||||
- eldoria/faction
|
||||
Characters:
|
||||
Description:
|
||||
Name: "{{title}}"
|
||||
Items:
|
||||
Leader:
|
||||
LocatedIn:
|
||||
---
|
||||
# Members
|
||||
```dataview
|
||||
TABLE location as "Location", status as "Status"
|
||||
WHERE (econtains(tags, "npc") and (econtains(faction, this.name) or econtains(faction, link(this.name)))) and !econtains(tags, "template")
|
||||
SORT name asc
|
||||
```
|
||||
|
||||
# Notes
|
||||
*
|
||||
29
1.TOUSE/location template.md
Normal file
29
1.TOUSE/location template.md
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
---
|
||||
tags:
|
||||
- location
|
||||
- landmark
|
||||
---
|
||||
> [!infobox]
|
||||
> # `{{title}}`
|
||||
> ![[99 - Meta/01 Images/image.png|200]]
|
||||
> ###### About
|
||||
> | Location Type | |
|
||||
> | ---- | ---- |
|
||||
> | Other Titles | |
|
||||
> | Region | |
|
||||
> | Size | |
|
||||
|
||||
# Description
|
||||
|
||||
|
||||
|
||||
# History
|
||||
|
||||
|
||||
|
||||
# Significant locations in {{title}}
|
||||
|
||||
|
||||
|
||||
# Other Notes
|
||||
|
||||
221
1.TOUSE/protagonists.md
Normal file
221
1.TOUSE/protagonists.md
Normal file
|
|
@ -0,0 +1,221 @@
|
|||
> [!infobox]
|
||||
> ![[image url here]]
|
||||
> ###### Profile
|
||||
> | |
|
||||
> ---|---|
|
||||
> Name |
|
||||
> Title |
|
||||
> Reason or meaning of name |
|
||||
> Nicknames |
|
||||
> Reason for nickname |
|
||||
> Born |
|
||||
> Birthdate |
|
||||
> Build |
|
||||
> Appearance |
|
||||
> Parents: |
|
||||
> Siblings |
|
||||
> Married |
|
||||
>
|
||||
## Info
|
||||
* **Sexuality:**
|
||||
* **Ethnicity:**
|
||||
* **Occupation:**
|
||||
* **Nationality:**
|
||||
* **Ethnicity:**
|
||||
* **Languages:**
|
||||
|
||||
# Past
|
||||
* **Hometown**:
|
||||
* **Type of Childhood:**
|
||||
* **Pets:**
|
||||
* **First memory:**
|
||||
* **Most important childhood memory. Why?**
|
||||
* **Childhood hero:**
|
||||
* **Dream job:**
|
||||
* **Education:**
|
||||
* **Religion:**
|
||||
* **Finances:**
|
||||
|
||||
# Present
|
||||
* **Current Location:**
|
||||
* **Currently living with:**
|
||||
* **Pets:**
|
||||
* **Religion:**
|
||||
* **Occupation:**
|
||||
* **Finances:**
|
||||
|
||||
# Family
|
||||
* **Mother:**
|
||||
* **Relationship with her:**
|
||||
* **Father:**
|
||||
- **Relationship with him:**
|
||||
- **Siblings:**
|
||||
- **Relationship with them:**
|
||||
- **Spouse:**
|
||||
- **Relationship with him/her:**
|
||||
- **Children:**
|
||||
- **Relationship with them:**
|
||||
- **Other important family members:**
|
||||
|
||||
## Physical Attributes
|
||||
* **Race:**
|
||||
* **Age:**
|
||||
* **How old does he appear:**
|
||||
- **Height:**
|
||||
- **Weight:**
|
||||
- **Hair Color:**
|
||||
- **Type of hair:**
|
||||
- **Hairstyle:**
|
||||
- **Eye Color:**
|
||||
- **Glasses or contacts:**
|
||||
- **Face shape:**
|
||||
- **Skin tone:**
|
||||
- **Distinguishing marks:**
|
||||
- **Predominant features:**
|
||||
- **Voice:**
|
||||
- **Overall attractiveness:**
|
||||
- **Physical disabilities:**
|
||||
- **Usual fashion of dress:**
|
||||
- **Favorite outfit:**
|
||||
- **Jewelry or accessories:**
|
||||
- **Appearance:**
|
||||
|
||||
## Personality
|
||||
* **Traits:**
|
||||
* **Strengths:**
|
||||
* **Weaknesses:**
|
||||
* **Hobbies:**
|
||||
* **Fears:**
|
||||
* **Quirks:**
|
||||
* **Flaws:**
|
||||
* **Life Motto:**
|
||||
* **Sense of humor:**
|
||||
* **Character's greatest joy in life:**
|
||||
* **Character's greatest fear, why?**
|
||||
* **What single event would throw this character's life into turmoil?**
|
||||
* **Character is most at ease when:**
|
||||
* **Most ill at ease when:**
|
||||
* **Enraged when:**
|
||||
* **Depressed or sad when:**
|
||||
* **Priorities:**
|
||||
- **Life philosophy:**
|
||||
- **If granted one wish, it would be: Why?**
|
||||
- **Character’s soft spot:**
|
||||
- **Is this soft spot obvious to others?**
|
||||
- **Greatest strength:**
|
||||
- **Greatest vulnerability or weakness:**
|
||||
- **Biggest regret:**
|
||||
- **Minor regret:**
|
||||
- **Biggest accomplishment:**
|
||||
- **Minor accomplishment:**
|
||||
- **Past failures he/she would be embarrassed to have people know about: Why?**
|
||||
- **Character’s darkest secret:**
|
||||
- **Does anyone else know?**
|
||||
|
||||
## Characteristics
|
||||
### Charistmatic & Persuasive
|
||||
|
||||
### Ambitious & Driven
|
||||
|
||||
|
||||
## Skills and Abilities
|
||||
- **Skills:**
|
||||
- **Abilities:**
|
||||
- **Training:**
|
||||
|
||||
## Relationships
|
||||
- **Family:**
|
||||
- **Friends:**
|
||||
- **Enemies:**
|
||||
- **Love Interests:**
|
||||
|
||||
# Arc
|
||||
|
||||
# Motivations
|
||||
|
||||
# **Character Development**
|
||||
|
||||
# Goals
|
||||
|
||||
- **Drives and motivations:**
|
||||
- **Immediate goals:**
|
||||
- **Long term goals:**
|
||||
- **How the character plans to accomplish these goals:**
|
||||
- **How other characters will be affected:**
|
||||
|
||||
# Favorites
|
||||
- **Color**:
|
||||
- **Least favorite color:**
|
||||
- **Music:**
|
||||
- **Food**:
|
||||
- **Literature**:
|
||||
- **Form of entertainment:**
|
||||
- **Expressions:**
|
||||
- **Mode of transportation:**
|
||||
- **Most prized possession:**
|
||||
|
||||
# Habits
|
||||
- **Hobbies**:
|
||||
- **Plays a musical instrument?**
|
||||
- **Plays a sport?**
|
||||
- **How he/she would spend a rainy day:**
|
||||
- **Spending habits:**
|
||||
- **Smokes:**
|
||||
- **Drinks:**
|
||||
- **Other drugs:**
|
||||
- **What does he/she do too much of?**
|
||||
- **What does he/she do too little of?**
|
||||
- **Extremely skilled at:**
|
||||
- **Extremely unskilled at:**
|
||||
- **Nervous tics:**
|
||||
- **Usual body posture:**
|
||||
- **Mannerisms:**
|
||||
- **Peculiarities:**
|
||||
|
||||
# Traits
|
||||
|
||||
- **Optimist or pessimist?**
|
||||
- **Introvert or extrovert?**
|
||||
- **Daredevil or cautious?**
|
||||
- **Logical or emotional?**
|
||||
- **Disorderly and messy or methodical and neat?**
|
||||
- **Prefers working or relaxing?**
|
||||
- **Confident or unsure of himself/herself?**
|
||||
- **Animal lover?**
|
||||
|
||||
# Self-perception
|
||||
|
||||
- **How he/she feels about himself/herself:**
|
||||
- **One word the character would use to describe self:**
|
||||
- **One paragraph description of how the character would describe self:**
|
||||
- **What does the character consider his/her best personality trait?**
|
||||
- **What does the character consider his/her worst personality trait?**
|
||||
- **What does the character consider his/her best physical characteristic?**
|
||||
- **What does the character consider his/her worst physical characteristic?**
|
||||
- **How does the character think others perceive him/her:**
|
||||
- **What would the character most like to change about himself/herself:**
|
||||
|
||||
# Relationships with others
|
||||
|
||||
- **Marital Status:**
|
||||
- **Friendships:**
|
||||
- **Relationship dynamics:**
|
||||
- **Opinion of other people in general:**
|
||||
- **Does the character hide his/her true opinions and emotions from others?**
|
||||
- **Person character most hates:**
|
||||
- **Best friend(s):**
|
||||
- **Love interest(s):**
|
||||
- **Person character goes to for advice:**
|
||||
- **Person character feels responsible for or takes care of:**
|
||||
- **Person character feels shy or awkward around:**
|
||||
- **Person character openly admires:**
|
||||
- **Person character secretly admires:**
|
||||
- **Most important person in character’s life before story starts:**
|
||||
- **After story starts:**
|
||||
|
||||
## Notes
|
||||
|
||||
|
||||
## Refrences
|
||||
* **Links:**
|
||||
|
||||
4
example character arc template
Normal file
4
example character arc template
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
## Character Arc for [Character]
|
||||
- **Beginning:** [Character] starts as a reluctant hero, unsure of their abilities.
|
||||
- **Middle:** They face significant challenges that test their resolve and skills.
|
||||
- **End:** [Character] emerges as a confident leader, having embraced their destiny.
|
||||
4
example character arc template 1
Normal file
4
example character arc template 1
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
## Character Arc for [Character]
|
||||
- **Beginning:** [Character] starts as a reluctant hero, unsure of their abilities.
|
||||
- **Middle:** They face significant challenges that test their resolve and skills.
|
||||
- **End:** [Character] emerges as a confident leader, having embraced their destiny.
|
||||
4
example character arc template 2
Normal file
4
example character arc template 2
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
## Character Arc for [Character]
|
||||
- **Beginning:** [Character] starts as a reluctant hero, unsure of their abilities.
|
||||
- **Middle:** They face significant challenges that test their resolve and skills.
|
||||
- **End:** [Character] emerges as a confident leader, having embraced their destiny.
|
||||
Loading…
Reference in a new issue