Compare commits

...

8 Commits

Author SHA1 Message Date
Anton Pogrebnjak
cc87dde39f Adapted restart policy 2026-04-11 00:44:36 +02:00
Anton Pogrebnjak
31cae670c4 Things are a changing 2026-04-11 00:41:28 +02:00
Anton Pogrebnjak
7e4f1acbf1 Delete .github/workflows directory 2026-04-06 23:03:48 +02:00
Anton Pogrebnjak
fcb52ebdc9 Fixed gallery link 2026-04-06 23:00:56 +02:00
Anton Pogrebnjak
c0a7f193db Also added photo types 2026-04-06 22:56:43 +02:00
Anton Pogrebnjak
da9d256b71 Added phtography section 2026-04-06 22:56:12 +02:00
Anton Pogrebnjak
d03478f81a Fixed showcase and home page 2026-04-06 20:37:32 +02:00
Anton Pogrebnjak
120ce7726f Updated dependencies 2026-04-06 19:56:05 +02:00
173 changed files with 97551 additions and 2608 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
public/images/photos/*.jpg filter=lfs diff=lfs merge=lfs -text

View File

@@ -1,39 +0,0 @@
name: Deploy to GitHub Pages
on:
# Trigger the workflow every time you push to the `main` branch
# Using a different branch name? Replace `main` with your branchs name
push:
branches: [ main ]
# Allows you to run this workflow manually from the Actions tab on GitHub.
workflow_dispatch:
# Allow this job to clone the repo and create a page deployment
permissions:
contents: read
pages: write
id-token: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout your repository using git
uses: actions/checkout@v4
- name: Install, build, and upload your site
uses: withastro/action@v3
# with:
# path: . # The root location of your Astro project inside the repository. (optional)
# node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 20. (optional)
# package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional)
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

5
.gitignore vendored
View File

@@ -22,3 +22,8 @@ pnpm-debug.log*
# jetbrains setting folder # jetbrains setting folder
.idea/ .idea/
# Vault CMS / Obsidian
.obsidian/workspace.json
.obsidian/workspace-mobile.json
.ref/

View File

@@ -4,10 +4,12 @@ import mdx from '@astrojs/mdx';
import remarkMath from 'remark-math' import remarkMath from 'remark-math'
import rehypeKatex from 'rehype-katex' import rehypeKatex from 'rehype-katex'
import sitemap from '@astrojs/sitemap'; import sitemap from '@astrojs/sitemap';
import { typst } from 'astro-typst';
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
vite: {
assetsInclude: ['**/*.base', '**/.obsidian/**', '**/_bases/**'],
},
site: 'https://pantonius.dev', site: 'https://pantonius.dev',
markdown: { markdown: {
remarkPlugins: [remarkMath], remarkPlugins: [remarkMath],
@@ -16,5 +18,5 @@ export default defineConfig({
integrations: [mdx({ integrations: [mdx({
syntaxHighlight: 'shiki', syntaxHighlight: 'shiki',
shikiConfig: { theme: "dracula" }, shikiConfig: { theme: "dracula" },
}), sitemap(), typst()], }), sitemap()],
}); });

View File

@@ -3,4 +3,5 @@ services:
build: . build: .
ports: ports:
- "4443:80" - "4443:80"
restart: unless-stopped

14423
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,12 +9,10 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"@astrojs/mdx": "^4.3.13", "@astrojs/mdx": "^5.0.3",
"@astrojs/rss": "^4.0.15", "@astrojs/rss": "^4.0.18",
"@astrojs/sitemap": "^3.7.0", "@astrojs/sitemap": "^3.7.2",
"@astrojs/vue": "^5.1.4", "astro": "^6.1.4",
"astro": "^5.17.3",
"astro-typst": "^0.12.1",
"rehype-katex": "^7.0.1", "rehype-katex": "^7.0.1",
"remark-math": "^6.0.0" "remark-math": "^6.0.0"
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 MiB

View File

@@ -0,0 +1,22 @@
---
import { getCollection } from 'astro:content';
import BlogPost from '../../layouts/BlogPost.astro';
import { render } from 'astro:content';
import { convertCollectionPost, convertPost, type Post } from '../../models/Post';
export async function getStaticPaths() {
const posts: Post[] = (await getCollection('blog')).map(convertPost);
return posts.map((post) => ({
params: { slug: post.id },
props: post,
}));
}
type Props = Post;
const post: Post = Astro.props;
const { Content } = await render(convertCollectionPost(post));
---
<BlogPost {...post}>
<Content />
</BlogPost>

32
src/bachelor/index.astro Normal file
View File

@@ -0,0 +1,32 @@
---
import BaseHead from '../../components/BaseHead.astro';
import Header from '../../components/Header.astro';
import Main from '../../components/Main.astro';
import Footer from '../../components/Footer.astro';
import { SITE_TITLE, SITE_DESCRIPTION } from '../../consts';
import { getCollection } from 'astro:content';
import Showcase from '../../components/Showcase.astro';
import { convertPost } from '../../models/Post';
const posts: Post[] = (await getCollection('blog')).map(convertPost).sort(
(a, b) => b.pubDate.valueOf() - a.pubDate.valueOf(),
);
---
<!doctype html>
<html lang="en">
<head>
<BaseHead title={SITE_TITLE} description={SITE_DESCRIPTION} />
</head>
<body>
<Header />
<Main>
{posts.length === 0 ? (
<h1 style="opacity: .5; user-select: none;">No posts yet &#128539;</h1>
) : (
<Showcase collection="blog" posts={posts} />
)}
</Main>
<Footer />
</body>
</html>

View File

@@ -0,0 +1,49 @@
---
import type { Photo } from '../models/Photo.ts';
const photos: Photo[] = Astro.props.photos;
const collection: string = Astro.props.collection;
const color = Astro.props.color || 'var(--text)';
---
<section>
{
photos.map((photo) => (
<a href={"/photography/" + photo.id}>
<img src={photo.src} />
</a>
))
}
</section>
<style define:vars={{ color }}>
section {
width: 100%;
overflow: hidden;
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 2px;
}
a {
overflow: hidden;
min-height: 200px;
max-height: 12.5rem;
min-width: 200px;
max-width: 12.5rem;
flex: 1;
}
img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 0;
transition: transform .2s;
}
img:hover {
transform: scale(1.2);
cursor: pointer;
}
</style>

View File

@@ -5,16 +5,16 @@ import Socials from "./Socials.astro";
--- ---
<header> <header>
<nav> <nav class="head">
<a class="logo" href="/"> <a class="logo" href="/">
<img src="/logo.svg" alt="ಠ_ಠ" /> <img src="/logo.svg" alt="ಠ_ಠ" />
</a> </a>
<div class="internal-links"> <Socials/>
<HeaderLink href="/">Home</HeaderLink> </nav>
<nav class="internal-links">
<HeaderLink href="/projects">Projects</HeaderLink> <HeaderLink href="/projects">Projects</HeaderLink>
<HeaderLink href="/photography">Photography</HeaderLink>
<HeaderLink href="/blog">Blog</HeaderLink> <HeaderLink href="/blog">Blog</HeaderLink>
</div>
<Socials />
</nav> </nav>
</header> </header>
@@ -23,9 +23,21 @@ import Socials from "./Socials.astro";
<style> <style>
header { header {
margin: 0; margin: 0;
padding: 0 1em; padding: .5em 1em;
width: 100%; width: 100%;
background-color: var(--background-soft); background-color: var(--background-soft);
display: flex;
flex-direction: row;
align-items: center;
}
nav {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
} }
header .logo { header .logo {
@@ -41,32 +53,46 @@ import Socials from "./Socials.astro";
height: 24pt; height: 24pt;
} }
nav { .internal-links {
position: absolute;
display: flex; display: flex;
align-items: center; flex-direction: row;
justify-content: space-between; justify-content: center;
width: 100%;
left: 0;
right: 0;
} }
nav a { .internal-links a {
padding: .4em 0.5em; padding: .4em 0.5em;
color: var(--text); color: var(--text);
border-bottom: 4px solid transparent; border-bottom: 4px solid transparent;
text-decoration: none; text-decoration: none;
} }
nav a.active { .internal-links a.active {
text-decoration: none; text-decoration: none;
border-bottom-color: var(--primary); border-bottom-color: var(--primary);
} }
@media (max-width: 720px) { @media (max-width: 720px) {
header {
flex-direction: column;
padding: 0;
}
header .logo img { header .logo img {
height: 18pt; height: 18pt;
} }
nav { nav.head {
font-size: 16px; padding: .5em 1em;
}
.internal-links {
border-top: var(--background) 1px solid;
position: relative;
} }
} }
</style> </style>

View File

@@ -16,6 +16,7 @@ const isActive = href === pathname || href === '/' + (subpath?.[0] || '');
a { a {
display: inline-block; display: inline-block;
text-decoration: none; text-decoration: none;
font-variant-caps: small-caps;
} }
a.active { a.active {
font-weight: bolder; font-weight: bolder;

View File

@@ -15,7 +15,7 @@ const color = Astro.props.color || 'var(--text)';
<a href={`/${collection}/${post.id}/`}> <a href={`/${collection}/${post.id}/`}>
{ {
post.heroImage && ( post.heroImage && (
<img class="heroImage" src={post.heroImage} alt="" /> <img class="heroImage" src={post.heroImage.src} alt="" />
) )
} }
{ {
@@ -78,6 +78,7 @@ const color = Astro.props.color || 'var(--text)';
margin: 0; margin: 0;
color: var(--color); color: var(--color);
line-height: 1; line-height: 1;
font-size: 1em;
font-variant-caps: small-caps; font-variant-caps: small-caps;
} }
.date { .date {
@@ -102,8 +103,8 @@ const color = Astro.props.color || 'var(--text)';
ul li:first-child { ul li:first-child {
margin-bottom: 0; margin-bottom: 0;
} }
ul li:first-child .title { ul li:first-child .title, ul li .title {
font-size: 1.563em; font-size: 1.2em;
} }
} }
</style> </style>

View File

@@ -1,19 +1,15 @@
<div class="social-links"> <div class="social-links">
<a href="https://github.com/Pantonius" target="_blank"> <a href="https://github.com/Pantonius" target="_blank">
<span class="sr-only">Go to my GitHub repo</span> <span class="sr-only">Go to my GitHub repo</span>
<svg <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="42" height="42"><!--!Font Awesome Free v7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M237.9 461.4C237.9 463.4 235.6 465 232.7 465C229.4 465.3 227.1 463.7 227.1 461.4C227.1 459.4 229.4 457.8 232.3 457.8C235.3 457.5 237.9 459.1 237.9 461.4zM206.8 456.9C206.1 458.9 208.1 461.2 211.1 461.8C213.7 462.8 216.7 461.8 217.3 459.8C217.9 457.8 216 455.5 213 454.6C210.4 453.9 207.5 454.9 206.8 456.9zM251 455.2C248.1 455.9 246.1 457.8 246.4 460.1C246.7 462.1 249.3 463.4 252.3 462.7C255.2 462 257.2 460.1 256.9 458.1C256.6 456.2 253.9 454.9 251 455.2zM316.8 72C178.1 72 72 177.3 72 316C72 426.9 141.8 521.8 241.5 555.2C254.3 557.5 258.8 549.6 258.8 543.1C258.8 536.9 258.5 502.7 258.5 481.7C258.5 481.7 188.5 496.7 173.8 451.9C173.8 451.9 162.4 422.8 146 415.3C146 415.3 123.1 399.6 147.6 399.9C147.6 399.9 172.5 401.9 186.2 425.7C208.1 464.3 244.8 453.2 259.1 446.6C261.4 430.6 267.9 419.5 275.1 412.9C219.2 406.7 162.8 398.6 162.8 302.4C162.8 274.9 170.4 261.1 186.4 243.5C183.8 237 175.3 210.2 189 175.6C209.9 169.1 258 202.6 258 202.6C278 197 299.5 194.1 320.8 194.1C342.1 194.1 363.6 197 383.6 202.6C383.6 202.6 431.7 169 452.6 175.6C466.3 210.3 457.8 237 455.2 243.5C471.2 261.2 481 275 481 302.4C481 398.9 422.1 406.6 366.2 412.9C375.4 420.8 383.2 435.8 383.2 459.3C383.2 493 382.9 534.7 382.9 542.9C382.9 549.4 387.5 557.3 400.2 555C500.2 521.8 568 426.9 568 316C568 177.3 455.5 72 316.8 72zM169.2 416.9C167.9 417.9 168.2 420.2 169.9 422.1C171.5 423.7 173.8 424.4 175.1 423.1C176.4 422.1 176.1 419.8 174.4 417.9C172.8 416.3 170.5 415.6 169.2 416.9zM158.4 408.8C157.7 410.1 158.7 411.7 160.7 412.7C162.3 413.7 164.3 413.4 165 412C165.7 410.7 164.7 409.1 162.7 408.1C160.7 407.5 159.1 407.8 158.4 408.8zM190.8 444.4C189.2 445.7 189.8 448.7 192.1 450.6C194.4 452.9 197.3 453.2 198.6 451.6C199.9 450.3 199.3 447.3 197.3 445.4C195.1 443.1 192.1 442.8 190.8 444.4zM179.4 429.7C177.8 430.7 177.8 433.3 179.4 435.6C181 437.9 183.7 438.9 185 437.9C186.6 436.6 186.6 434 185 431.7C183.6 429.4 181 428.4 179.4 429.7z"/></svg>
viewBox="0 0 16 16"
aria-hidden="true"
width="32"
height="32"
><path
fill="currentColor"
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"
></path></svg>
</a> </a>
<a href="https://mastodon.social/@pantonius" target="_blank"> <a href="https://mastodon.social/@pantonius" target="_blank">
<span class="sr-only">Go to my Mastodon profile</span> <span class="sr-only">Go to my Mastodon profile</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="46" height="46"><!--!Font Awesome Free v7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M529 243.1C529 145.9 465.3 117.4 465.3 117.4C402.8 88.7 236.7 89 174.8 117.4C174.8 117.4 111.1 145.9 111.1 243.1C111.1 358.8 104.5 502.5 216.7 532.2C257.2 542.9 292 545.2 320 543.6C370.8 540.8 399.3 525.5 399.3 525.5L397.6 488.6C397.6 488.6 361.3 500 320.5 498.7C280.1 497.3 237.5 494.3 230.9 444.7C230.3 440.1 230 435.4 230 430.8C315.6 451.7 388.7 439.9 408.7 437.5C464.8 430.8 513.7 396.2 519.9 364.6C529.7 314.8 528.9 243.1 528.9 243.1zM453.9 368.3L407.3 368.3L407.3 254.1C407.3 204.4 343.3 202.5 343.3 261L343.3 323.5L297 323.5L297 261C297 202.5 233 204.4 233 254.1L233 368.3L186.3 368.3C186.3 246.2 181.1 220.4 204.7 193.3C230.6 164.4 284.5 162.5 308.5 199.4L320.1 218.9L331.7 199.4C355.8 162.3 409.8 164.6 435.5 193.3C459.2 220.6 453.9 246.3 453.9 368.3L453.9 368.3z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="42" height="42"><!--!Font Awesome Free v7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M529 243.1C529 145.9 465.3 117.4 465.3 117.4C402.8 88.7 236.7 89 174.8 117.4C174.8 117.4 111.1 145.9 111.1 243.1C111.1 358.8 104.5 502.5 216.7 532.2C257.2 542.9 292 545.2 320 543.6C370.8 540.8 399.3 525.5 399.3 525.5L397.6 488.6C397.6 488.6 361.3 500 320.5 498.7C280.1 497.3 237.5 494.3 230.9 444.7C230.3 440.1 230 435.4 230 430.8C315.6 451.7 388.7 439.9 408.7 437.5C464.8 430.8 513.7 396.2 519.9 364.6C529.7 314.8 528.9 243.1 528.9 243.1zM453.9 368.3L407.3 368.3L407.3 254.1C407.3 204.4 343.3 202.5 343.3 261L343.3 323.5L297 323.5L297 261C297 202.5 233 204.4 233 254.1L233 368.3L186.3 368.3C186.3 246.2 181.1 220.4 204.7 193.3C230.6 164.4 284.5 162.5 308.5 199.4L320.1 218.9L331.7 199.4C355.8 162.3 409.8 164.6 435.5 193.3C459.2 220.6 453.9 246.3 453.9 368.3L453.9 368.3z"/></svg>
</a>
<a href="https://instagram.com/kindpanto" target="_blank">
<span class="sr-only">Go to my Instgram profile</span>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640" width="42" height="42"><!--!Font Awesome Free v7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill="currentColor" d="M320.3 205C256.8 204.8 205.2 256.2 205 319.7C204.8 383.2 256.2 434.8 319.7 435C383.2 435.2 434.8 383.8 435 320.3C435.2 256.8 383.8 205.2 320.3 205zM319.7 245.4C360.9 245.2 394.4 278.5 394.6 319.7C394.8 360.9 361.5 394.4 320.3 394.6C279.1 394.8 245.6 361.5 245.4 320.3C245.2 279.1 278.5 245.6 319.7 245.4zM413.1 200.3C413.1 185.5 425.1 173.5 439.9 173.5C454.7 173.5 466.7 185.5 466.7 200.3C466.7 215.1 454.7 227.1 439.9 227.1C425.1 227.1 413.1 215.1 413.1 200.3zM542.8 227.5C541.1 191.6 532.9 159.8 506.6 133.6C480.4 107.4 448.6 99.2 412.7 97.4C375.7 95.3 264.8 95.3 227.8 97.4C192 99.1 160.2 107.3 133.9 133.5C107.6 159.7 99.5 191.5 97.7 227.4C95.6 264.4 95.6 375.3 97.7 412.3C99.4 448.2 107.6 480 133.9 506.2C160.2 532.4 191.9 540.6 227.8 542.4C264.8 544.5 375.7 544.5 412.7 542.4C448.6 540.7 480.4 532.5 506.6 506.2C532.8 480 541 448.2 542.8 412.3C544.9 375.3 544.9 264.5 542.8 227.5zM495 452C487.2 471.6 472.1 486.7 452.4 494.6C422.9 506.3 352.9 503.6 320.3 503.6C287.7 503.6 217.6 506.2 188.2 494.6C168.6 486.8 153.5 471.7 145.6 452C133.9 422.5 136.6 352.5 136.6 319.9C136.6 287.3 134 217.2 145.6 187.8C153.4 168.2 168.5 153.1 188.2 145.2C217.7 133.5 287.7 136.2 320.3 136.2C352.9 136.2 423 133.6 452.4 145.2C472 153 487.1 168.1 495 187.8C506.7 217.3 504 287.3 504 319.9C504 352.5 506.7 422.6 495 452z"/></svg>
</a> </a>
</div> </div>

View File

@@ -1,18 +1,18 @@
import { glob } from 'astro/loaders'; import { glob, file } from 'astro/loaders';
import { defineCollection, z } from 'astro:content'; import { defineCollection, z } from 'astro:content';
const bachelor = defineCollection({ const bachelor = defineCollection({
// Load Markdown and MDX files in the `src/content/blog/` directory. // Load Markdown and MDX files in the `src/content/blog/` directory.
loader: glob({ base: './src/content/bachelor', pattern: '**/*.{md,mdx}' }), loader: glob({ base: './src/content/bachelor', pattern: '**/*.{md,mdx}' }),
// Type-check frontmatter using a schema // Type-check frontmatter using a schema
schema: z.object({ schema: ({ image }) => z.object({
title: z.string(), title: z.string(),
description: z.string(), description: z.string(),
part: z.number(), part: z.number(),
// Transform string to Date object // Transform string to Date object
pubDate: z.coerce.date(), pubDate: z.coerce.date(),
updatedDate: z.coerce.date().optional(), updatedDate: z.coerce.date().optional(),
heroImage: z.string().optional(), heroImage: image().optional(),
}), }),
}); });
@@ -20,13 +20,29 @@ const blog = defineCollection({
// Load Markdown and MDX files in the `src/content/blog/` directory. // Load Markdown and MDX files in the `src/content/blog/` directory.
loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }), loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
// Type-check frontmatter using a schema // Type-check frontmatter using a schema
schema: z.object({ schema: ({ image }) => z.object({
title: z.string(), title: z.string(),
description: z.string(), description: z.string(),
// Transform string to Date object // Transform string to Date object
pubDate: z.coerce.date(), pubDate: z.coerce.date(),
updatedDate: z.coerce.date().optional(), updatedDate: z.coerce.date().optional(),
heroImage: z.string().optional(), heroImage: image().optional(),
}),
}
);
const photography = defineCollection({
// Load Markdown and MDX files in the `src/content/projects/` directory.
loader: file(
'./src/content/photography/index.json'
),
// Type-check frontmatter using a schema
schema: z.object({
title: z.string(),
description: z.string(),
src: z.string(),
// Transform string to Date object
pubDate: z.coerce.date(),
}), }),
}); });
@@ -36,14 +52,14 @@ const projects = defineCollection({
base: './src/content/projects', pattern: '**/*.{md,mdx}' base: './src/content/projects', pattern: '**/*.{md,mdx}'
}), }),
// Type-check frontmatter using a schema // Type-check frontmatter using a schema
schema: z.object({ schema: ({ image }) => z.object({
title: z.string(), title: z.string(),
description: z.string(), description: z.string(),
// Transform string to Date object // Transform string to Date object
pubDate: z.coerce.date(), pubDate: z.coerce.date(),
updatedDate: z.coerce.date().optional(), updatedDate: z.coerce.date().optional(),
heroImage: z.string().optional(), heroImage: image().optional(),
}), }),
}); });
export const collections = { bachelor, blog, projects }; export const collections = { bachelor, blog, photography, projects };

47
src/content/.obsidian/app.json vendored Normal file
View File

@@ -0,0 +1,47 @@
{
"showInlineTitle": false,
"promptDelete": true,
"showIndentGuide": false,
"attachmentFolderPath": "attachments",
"userIgnoreFilters": [
"dist",
"node_modules/"
],
"focusNewTab": false,
"mobilePullAction": "command-palette:open",
"trashOption": "system",
"alwaysUpdateLinks": true,
"useMarkdownLinks": true,
"mobileToolbarCommands": [
"editor:undo",
"editor:redo",
"editor:insert-wikilink",
"editor:insert-embed",
"editor:insert-tag",
"editor:attach-file",
"editor:set-heading",
"editor:toggle-bold",
"editor:toggle-italics",
"editor:toggle-strikethrough",
"editor:toggle-highlight",
"editor:toggle-code",
"editor:toggle-blockquote",
"editor:insert-link",
"editor:toggle-bullet-list",
"editor:toggle-numbered-list",
"editor:toggle-checklist-status",
"editor:indent-list",
"editor:unindent-list",
"astro-composer:standardize-properties",
"astro-composer:convert-wikilinks-astro",
"seo:seo-run-current",
"editor:configure-toolbar"
],
"newFileLocation": "folder",
"newFileFolderPath": "blog",
"newLinkFormat": "relative",
"mobileQuickRibbonItem": "",
"vimMode": false,
"readableLineLength": true,
"defaultViewMode": "source"
}

10
src/content/.obsidian/appearance.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
"cssTheme": "Oxygen",
"showViewHeader": true,
"showRibbon": false,
"enabledCssSnippets": [
"astro-modular-styling"
],
"theme": "moonstone",
"accentColor": ""
}

3
src/content/.obsidian/backlink.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"backlinkInDocument": true
}

10
src/content/.obsidian/bookmarks.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
"items": [
{
"type": "file",
"ctime": 1755331588238,
"path": "_formatting-reference.md",
"title": "Formatting Reference"
}
]
}

View File

@@ -0,0 +1,25 @@
[
"seo",
"property-over-file-name",
"oxygen-settings",
"vault-cms",
"astro-composer",
"settings-search",
"editing-toolbar",
"image-manager",
"bases-cms",
"home-base",
"obsidian-git",
"zenmode",
"tag-wrangler",
"explorer-focus",
"ui-tweaker",
"obsidian42-brat",
"omnisearch",
"data-files-editor",
"file-name-history",
"nested-properties",
"paste-image-into-property",
"homepage",
"obsidian-paste-image-rename"
]

33
src/content/.obsidian/core-plugins.json vendored Normal file
View File

@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": false,
"backlink": false,
"canvas": false,
"outgoing-link": false,
"tag-pane": true,
"footnotes": false,
"properties": false,
"page-preview": false,
"daily-notes": false,
"templates": false,
"note-composer": false,
"command-palette": true,
"slash-command": true,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": false,
"bases": true,
"webviewer": false
}

30
src/content/.obsidian/graph.json vendored Normal file
View File

@@ -0,0 +1,30 @@
{
"collapse-filter": true,
"search": "path:posts/",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [
{
"query": "",
"color": {
"a": 1,
"rgb": 14701138
}
}
],
"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.0147822288211785,
"close": true
}

274
src/content/.obsidian/hotkeys.json vendored Normal file
View File

@@ -0,0 +1,274 @@
{
"app:go-back": [
{
"modifiers": [
"Mod",
"Alt"
],
"key": "ArrowLeft"
},
{
"modifiers": [
"Alt"
],
"key": "ArrowLeft"
}
],
"app:go-forward": [
{
"modifiers": [
"Mod",
"Alt"
],
"key": "ArrowRight"
},
{
"modifiers": [
"Alt"
],
"key": "ArrowRight"
}
],
"homepage:open-homepage": [
{
"modifiers": [
"Mod"
],
"key": "M"
}
],
"app:toggle-left-sidebar": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "Z"
}
],
"app:toggle-right-sidebar": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "X"
}
],
"obsidian-git:push": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "S"
}
],
"insert-unsplash-image:insert": [
{
"modifiers": [
"Mod"
],
"key": "'"
}
],
"custom-save:save": [],
"editor:insert-callout": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "C"
}
],
"astro-composer:rename-note": [
{
"modifiers": [
"Mod"
],
"key": "R"
}
],
"astro-composer:rename-content": [
{
"modifiers": [
"Mod"
],
"key": "R"
}
],
"editor:toggle-fold-properties": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "P"
}
],
"seo:seo-open-global": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "A"
}
],
"insert-unsplash-image:insert-in-frontmatter": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "'"
}
],
"astro-modular-settings:open-settings": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": ","
}
],
"seo:open-global": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "A"
}
],
"oxygen-settings:toggle-minimal-focus-mode": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "F"
}
],
"zenmode:exit-zen-mode": [],
"oxygen-settings:toggle-zen-mode": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "Z"
}
],
"oxygen-settings:toggle-tab-containers": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "S"
}
],
"app:toggle-ribbon": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "A"
}
],
"zenmode:toggle-zen-mode": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "Z"
}
],
"app:reload": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "R"
}
],
"theme:toggle-light-dark": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "M"
}
],
"astro-composer:open-project-terminal": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "D"
}
],
"editing-toolbar:workplace-fullscreen-focus": [],
"editing-toolbar:fullscreen-focus": [],
"editing-toolbar:hide-show-menu": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "E"
}
],
"astro-composer:edit-astro-config": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": ","
}
],
"image-manager:search-image": [
{
"modifiers": [
"Mod"
],
"key": "'"
}
],
"image-manager:insert-remote-image-to-property": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "'"
}
],
"ui-tweaker:toggle-tab-bar": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "S"
}
],
"omnisearch:show-modal": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "O"
}
]
}

View File

@@ -0,0 +1,70 @@
{
"defaultTemplate": "---\ntitle: \"{{title}}\"\npubDate: {{date}}\ndescription: \"\"\nheroImage: \"\"\n---\n",
"autoInsertProperties": true,
"dateFormat": "YYYY-MM-DD",
"enableCopyHeadingLink": true,
"copyHeadingLinkFormat": "astro",
"addTrailingSlashToLinks": true,
"enableOpenTerminalCommand": true,
"terminalProjectRootPath": "../..",
"terminalApplicationName": "",
"enableTerminalDebugLogging": false,
"enableTerminalRibbonIcon": true,
"enableOpenConfigFileCommand": true,
"configFilePath": "../../astro.config.mjs",
"enableConfigRibbonIcon": true,
"contentTypes": [
{
"id": "content-type-1775852991942-ai56rw2lw",
"name": "Blog",
"folder": "blog",
"linkBasePath": "/blog/",
"template": "---\ntitle: \"{{title}}\"\npubDate: {{date}}\ndescription: \"\"\nheroImage: \"\"\n---\n",
"enabled": true,
"creationMode": "file",
"indexFileName": "index",
"ignoreSubfolders": false,
"enableUnderscorePrefix": false
},
{
"id": "content-type-1775852991942-7eiqfk6yj",
"name": "Bachelor",
"folder": "bachelor",
"linkBasePath": "/bachelor/",
"template": "---\ntitle: \"{{title}}\"\npubDate: {{date}}\ndescription: \"\"\nheroImage: \"\"\npart: 1\n---\n",
"enabled": true,
"creationMode": "file",
"indexFileName": "index",
"ignoreSubfolders": false,
"enableUnderscorePrefix": false
},
{
"id": "content-type-1775852991942-gvtf8m5h6",
"name": "Projects",
"folder": "projects",
"linkBasePath": "/projects/",
"template": "---\ntitle: \"{{title}}\"\npubDate: {{date}}\ndescription: \"\"\nheroImage: \"\"\n---\n",
"enabled": true,
"creationMode": "file",
"indexFileName": "index",
"ignoreSubfolders": false,
"enableUnderscorePrefix": false
}
],
"migrationCompleted": true,
"helpButtonReplacement": {
"enabled": true,
"commandId": "astro-composer:edit-astro-config",
"iconId": "rocket"
},
"showMdxFilesInExplorer": true,
"processBackgroundFileChanges": true,
"syncDraftDate": false,
"draftDetectionMode": "property",
"draftProperty": "",
"draftLogic": "true-is-draft",
"publishDateField": "pubDate",
"renameOnTitleClick": false,
"updateModifiedDate": false,
"modifiedDateField": ""
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"id":"astro-composer","name":"Astro Composer","version":"0.12.0","minAppVersion":"1.11.0","description":"Turn your notes into posts and pages for your Astro blog with automated content management features.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false}

View File

@@ -0,0 +1,372 @@
.astro-composer-title-input {
width: 100%;
margin-bottom: 16px;
padding: 8px;
}
.astro-composer-button-container {
display: flex;
gap: 8px;
justify-content: flex-end;
margin-top: 16px;
}
/* Ensure all buttons in the button container use default cursor */
.astro-composer-button-container button {
cursor: default !important;
}
.astro-composer-button-container button:hover {
cursor: default !important;
}
.astro-composer-cancel-button,
.astro-composer-create-button {
padding: 6px 12px;
border-radius: 4px;
cursor: default !important;
}
.astro-composer-cancel-button:hover,
.astro-composer-create-button:hover {
cursor: default !important;
}
.astro-composer-create-button.mod-cta {
background-color: var(--interactive-accent);
color: var(--text-on-accent);
cursor: default !important;
}
.astro-composer-create-button.mod-cta:hover {
background-color: var(--interactive-accent-hover);
cursor: default !important;
}
.astro-composer-template-textarea {
height: 300px; /* Adjusted for 5-10 lines of properties */
width: 100%;
padding: 8px;
resize: vertical; /* Allow vertical resizing */
margin-bottom: 16px;
}
.astro-composer-modal {
padding: 20px;
max-width: 500px;
margin: 0 auto;
}
.astro-composer-modal h2 {
margin-top: 0;
}
/* Custom Content Types Styling */
.custom-content-types-container {
margin-top: 0;
}
.custom-content-type-item {
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
padding: 16px;
margin-bottom: 16px;
background-color: var(--background-secondary);
}
.custom-content-type-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.custom-content-type-header .setting-item {
margin-bottom: 0;
}
.custom-content-type-header .setting-item-name {
font-weight: 600;
color: var(--text-normal);
}
.custom-content-type-item .setting-item {
margin-bottom: 12px;
}
.custom-content-type-item .setting-item:last-child {
margin-bottom: 0;
}
/* Add spacing between settings in custom content types since we removed dividers */
.custom-content-type-settings > div {
margin-bottom: 16px;
}
.custom-content-type-settings > div:last-child {
margin-bottom: 0;
}
.custom-content-type-settings {
transition: all 0.2s ease-in-out;
padding-top: 12px;
}
.custom-content-type-settings[style*="none"] {
opacity: 0;
transform: translateY(-10px);
}
/* Mobile-specific improvements for Astro Composer modal */
@media (max-width: 768px) {
/* Force mobile positioning for all modals containing our content */
.modal:has(.astro-composer-title-input) {
position: fixed !important;
top: 10% !important;
left: 50% !important;
transform: translateX(-50%) !important;
max-height: 50vh !important;
overflow-y: auto !important;
width: 90vw !important;
max-width: 500px !important;
}
/* Only target our specific modal content, not all modals */
.modal .astro-composer-title-input {
font-size: 16px; /* Prevents zoom on iOS */
padding: 12px;
border: 1px solid var(--background-modifier-border);
border-radius: 4px;
}
/* Ensure our modal content is properly sized on mobile */
.modal .astro-composer-button-container {
flex-direction: column;
gap: 12px;
}
.modal .astro-composer-cancel-button,
.modal .astro-composer-create-button {
width: 100%;
padding: 12px;
font-size: 16px;
cursor: default !important;
}
.modal .astro-composer-cancel-button:hover,
.modal .astro-composer-create-button:hover {
cursor: default !important;
}
}
/* Fallback for browsers that don't support :has() */
.astro-composer-mobile-modal {
position: fixed !important;
top: 10% !important;
left: 50% !important;
transform: translateX(-50%) !important;
max-height: 50vh !important;
overflow-y: auto !important;
width: 90vw !important;
max-width: 500px !important;
}
/* Settings UI utility classes */
.astro-composer-setting-container-visible {
display: block;
}
.astro-composer-setting-container-hidden {
display: none;
}
.astro-composer-custom-type-header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 8px;
}
.astro-composer-header-name {
flex: 1;
min-width: 0;
}
/* Collapse button */
.astro-composer-collapse-button {
background: transparent !important;
border: none !important;
padding: 4px;
margin-right: 4px;
cursor: default;
color: var(--text-muted);
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
transition: background-color 0.2s ease, color 0.2s ease;
box-shadow: none !important;
}
.astro-composer-collapse-button:hover {
background-color: var(--background-modifier-hover);
color: var(--text-normal);
}
.astro-composer-collapse-button:active {
background-color: var(--background-modifier-active);
}
.astro-composer-collapse-button svg {
transition: transform 0.2s ease;
}
.astro-composer-collapse-button.is-collapsed svg {
transform: rotate(-90deg);
}
/* Reorder buttons container */
.astro-composer-reorder-buttons {
display: flex;
flex-direction: row;
gap: 4px;
margin-right: 8px;
align-items: center;
}
/* Reorder buttons - minimal icon-only style */
.astro-composer-reorder-button {
background: transparent !important;
border: none !important;
padding: 4px;
cursor: default;
color: var(--text-muted);
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
transition: background-color 0.2s ease, color 0.2s ease;
line-height: 1;
opacity: 0.6;
box-shadow: none !important;
}
.astro-composer-reorder-button:hover:not(:disabled) {
background-color: var(--background-modifier-hover);
color: var(--text-normal);
opacity: 1;
}
.astro-composer-reorder-button:active:not(:disabled) {
background-color: var(--background-modifier-active);
}
.astro-composer-reorder-button:disabled {
opacity: 0.2;
cursor: default;
}
.astro-composer-reorder-button svg {
width: 16px;
height: 16px;
}
.astro-composer-remove-setting {
border-top: none;
}
.astro-composer-add-button {
border-top: none;
}
/* Floating button container - no settings background, right-aligned */
.astro-composer-add-button-container {
display: flex;
justify-content: flex-end;
margin-top: 16px;
margin-bottom: 0;
padding: 0;
background: transparent;
border: none;
}
.astro-composer-add-button-container button {
margin: 0;
}
/* Settings tab - hidden setting elements */
/* Only hide the setting item info elements, not nested ones inside content types */
.astro-composer-setting-hidden-elements > .setting-item-info > .setting-item-name,
.astro-composer-setting-hidden-elements > .setting-item-info > .setting-item-description,
.astro-composer-setting-hidden-elements > .setting-item-control {
display: none;
}
.astro-composer-setting-hidden-elements {
border-top: none;
padding-top: 0;
padding-bottom: 0;
}
.astro-composer-setting-container-full-width {
display: block;
width: 100%;
}
.astro-composer-custom-types-container-visible {
display: block !important;
width: 100% !important;
visibility: visible !important;
}
/* Ensure custom content types container is always visible even when parent has hidden elements */
.astro-composer-setting-hidden-elements .custom-content-types-container {
display: block !important;
visibility: visible !important;
}
/* Ensure content type items inside the container are visible */
.custom-content-types-container .custom-content-type-item {
display: block !important;
visibility: visible !important;
}
/* Conflict warning styles */
.astro-composer-conflict-warning {
color: var(--text-warning);
font-size: 0.9em;
margin-top: 0.5em;
}
.astro-composer-conflict-warning.hidden {
display: none;
}
/* Help button replacement */
/* No special display needed - inherits from parent flex container */
/* Ribbon context menu hiding - these will be applied via classes */
.astro-composer-hide-terminal-icon .menu-item:has(svg[data-lucide="terminal-square"]),
.astro-composer-hide-terminal-icon .menu-item:has(.lucide-terminal-square),
.astro-composer-hide-terminal-icon .menu-item .menu-item-icon:has(svg[data-lucide="terminal-square"]),
.astro-composer-hide-terminal-icon .menu-item .menu-item-icon:has(.lucide-terminal-square) {
display: none !important;
}
.astro-composer-hide-config-icon .menu-item:has(svg[data-lucide="wrench"]),
.astro-composer-hide-config-icon .menu-item:has(svg[data-lucide="rocket"]),
.astro-composer-hide-config-icon .menu-item:has(.lucide-wrench),
.astro-composer-hide-config-icon .menu-item:has(.lucide-rocket),
.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(svg[data-lucide="wrench"]),
.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(svg[data-lucide="rocket"]),
.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(.lucide-wrench),
.astro-composer-hide-config-icon .menu-item .menu-item-icon:has(.lucide-rocket) {
display: none !important;
}
/* Help button hiding */
.astro-composer-hide-help-button .workspace-drawer-vault-actions .clickable-icon:has(svg.help) {
display: none !important;
}
/* Scoped to only this plugin's settings container to avoid affecting other plugins */

View File

@@ -0,0 +1,28 @@
{
"confirmBulkOperations": true,
"deleteParentFolder": true,
"deleteParentFolderFilename": "index",
"deleteUniqueAttachments": true,
"confirmDeletions": true,
"useHomeIcon": true,
"enableQuickEdit": true,
"quickEditCommand": "astro-composer:rename-content",
"quickEditCommandName": "Astro Composer: Rename current content",
"quickEditIcon": "lucide-pencil-line",
"quickEditOpenFile": false,
"showToolbarSelectAll": true,
"showToolbarClear": true,
"showToolbarDraft": true,
"showToolbarPublish": true,
"showToolbarTags": true,
"showToolbarSet": true,
"showToolbarRemove": true,
"showToolbarDelete": true,
"forceStaticGifImages": false,
"embeddedViewRefreshDebounceMs": 250,
"virtualScrollThreshold": 100,
"virtualScrollBuffer": 20,
"migrationBasesCmsToCmsDone": true,
"showPropertiesInfoModal": true,
"thumbnailCacheSize": "balanced"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"id": "bases-cms",
"name": "Bases CMS",
"version": "0.4.9",
"minAppVersion": "1.11.0",
"description": "Manage your notes in bases like a content management system.",
"author": "David V. Kimball",
"authorUrl": "https://davidvkimball.com",
"fundingUrl": "https://patreon.com/davidvkimball",
"isDesktopOnly": false
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
{
"doLoadTxt": false,
"doCreateTxt": false,
"doLoadXml": false,
"doCreateXml": false,
"doLoadJson": true,
"doCreateJson": true,
"doLoadYaml": false,
"doCreateYaml": false,
"doLoadAstro": true,
"doCreateAstro": true,
"doLoadTs": false,
"doCreateTs": false,
"doLoadCss": false,
"doCreateCss": false,
"doLoadHtml": false,
"doCreateHtml": false,
"doLoadJs": false,
"doCreateJs": false,
"doLoadMjs": false,
"doCreateMjs": false,
"doAutosaveFiles": true,
"lineWrapping": true
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"id": "data-files-editor",
"name": "Data Files Editor",
"version": "1.4.1",
"minAppVersion": "0.15.0",
"description": "Plugin to edit data files like txt, xml, json, and yaml",
"author": "ZukTol",
"authorUrl": "https://github.com/ZukTol",
"fundingUrl": "",
"isDesktopOnly": false
}

View File

@@ -0,0 +1,23 @@
/*
This CSS file will be included with your plugin, and
available in the app when your plugin is enabled.
If your plugin does not need CSS, delete this file.
*/
.datafile-source-view.mod-cm6 .cm-gutters {
flex: 0 0 auto;
background-color: transparent;
color: var(--text-faint) !important;
border-right: none !important;
margin-inline-end: var(--file-folding-offset);
font-size: var(--font-ui-smaller);
z-index: 1;
font-variant: tabular-nums;
}
.cm-gutterElement.cm-activeLineGutter {
background-color: #aaeeff44;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"id":"disable-tabs","name":"Disable Tabs","version":"1.0.10","minAppVersion":"1.11.0","description":"Disables having more than one tab open at a time.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false}

View File

@@ -0,0 +1,7 @@
/* Hide mobile new tab icon when the plugin setting is enabled */
body.disable-tabs-hide-mobile-icon .mobile-navbar-action-tabs {
display: none;
}
/* Scoped to only this plugin's settings container to avoid affecting other plugins */

View File

@@ -0,0 +1,441 @@
{
"lastVersion": "3.2.7",
"aestheticStyle": "glass",
"positionStyle": "top",
"menuCommands": [
{
"id": "editing-toolbar:editor-undo",
"name": "Undo editor",
"icon": "undo-glyph"
},
{
"id": "editing-toolbar:editor-redo",
"name": "Redo editor",
"icon": "redo-glyph"
},
{
"id": "SubmenuCommands-header",
"name": "submenu",
"icon": "heading-glyph",
"SubmenuCommands": [
{
"id": "editing-toolbar:header2-text",
"name": "Header 2",
"icon": "header-2"
},
{
"id": "editing-toolbar:header3-text",
"name": "Header 3",
"icon": "header-3"
},
{
"id": "editing-toolbar:header4-text",
"name": "Header 4",
"icon": "header-4"
},
{
"id": "editing-toolbar:header5-text",
"name": "Header 5",
"icon": "header-5"
},
{
"id": "editing-toolbar:header6-text",
"name": "Header 6",
"icon": "header-6"
}
]
},
{
"id": "editing-toolbar:toggle-bold",
"name": "Bold",
"icon": "bold-glyph"
},
{
"id": "editing-toolbar:toggle-italics",
"name": "Italics",
"icon": "italic-glyph"
},
{
"id": "editing-toolbar:toggle-strikethrough",
"name": "Strikethrough",
"icon": "strikethrough-glyph"
},
{
"id": "editing-toolbar:underline",
"name": "Underline",
"icon": "underline-glyph"
},
{
"id": "editing-toolbar:toggle-highlight",
"name": "==Highlight==",
"icon": "highlight-glyph"
},
{
"id": "editing-toolbar:toggle-format-brush",
"name": "Format Painter",
"icon": "paintbrush"
},
{
"id": "editing-toolbar:format-eraser",
"name": "Clear text formatting",
"icon": "eraser"
},
{
"id": "editing-toolbar:editor:swap-line-down",
"name": "Swap line down",
"icon": "lucide-corner-right-down"
},
{
"id": "SubmenuCommands-text-tools",
"name": "Text Tools",
"icon": "box",
"menuType": "dropdown",
"SubmenuCommands": [
{
"id": "editing-toolbar:get-plain-text",
"name": "Get Plain Text",
"icon": "lucide-file-text"
},
{
"id": "editing-toolbar:smart-symbols",
"name": "Full Half Converter",
"icon": "lucide-at-sign"
},
{
"id": "editingToolbar-Divider-Line",
"name": "Line Operations",
"icon": "vertical-split"
},
{
"id": "editing-toolbar:insert-blank-lines",
"name": "Insert Blank Lines",
"icon": "lucide-space"
},
{
"id": "editing-toolbar:remove-blank-lines",
"name": "Remove Blank Lines",
"icon": "lucide-minimize-2"
},
{
"id": "editing-toolbar:split-lines",
"name": "Split Lines",
"icon": "lucide-split"
},
{
"id": "editing-toolbar:merge-lines",
"name": "Merge Lines",
"icon": "lucide-merge"
},
{
"id": "editing-toolbar:dedupe-lines",
"name": "Dedupe Lines",
"icon": "lucide-filter"
},
{
"id": "editingToolbar-Divider-Line",
"name": "Text Processing",
"icon": "vertical-split"
},
{
"id": "editing-toolbar:add-wrap",
"name": "Add Prefix/Suffix",
"icon": "lucide-wrap-text"
},
{
"id": "editing-toolbar:number-lines",
"name": "Number Lines (Custom)",
"icon": "lucide-list-ordered"
},
{
"id": "editing-toolbar:remove-whitespace-trim",
"name": "Trim Line Ends",
"icon": "lucide-scissors"
},
{
"id": "editing-toolbar:remove-whitespace-compress",
"name": "Shrink Extra Spaces",
"icon": "lucide-minimize"
},
{
"id": "editing-toolbar:remove-whitespace-all",
"name": "Remove All Whitespace",
"icon": "lucide-eraser"
},
{
"id": "editingToolbar-Divider-Line",
"name": "Advanced Tools",
"icon": "vertical-split"
},
{
"id": "editing-toolbar:list-to-table",
"name": "List to Table",
"icon": "lucide-table"
},
{
"id": "editing-toolbar:table-to-list",
"name": "Table to List",
"icon": "lucide-list"
},
{
"id": "editing-toolbar:extract-between",
"name": "Extract Between Strings",
"icon": "lucide-brackets"
}
]
},
{
"id": "editing-toolbar:editor:swap-line-up",
"name": "Swap line up",
"icon": "lucide-corner-right-up"
},
{
"id": "editing-toolbar:editor:attach-file",
"name": "Attach file",
"icon": "lucide-paperclip"
},
{
"id": "editing-toolbar:editor:insert-table",
"name": "Insert Table",
"icon": "lucide-table"
},
{
"id": "editing-toolbar:editor:toggle-blockquote",
"name": "Blockquote",
"icon": "quote"
},
{
"id": "editing-toolbar:insert-callout",
"name": "Insert Callout ",
"icon": "alert-triangle"
},
{
"id": "SubmenuCommands-list",
"name": "submenu-list",
"icon": "bullet-list-glyph",
"SubmenuCommands": [
{
"id": "editing-toolbar:toggle-bullet-list",
"name": "Bullet list",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M860 424 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM860 756 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM860 92 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM176 716 l0 0 ZM112 716 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 ZM176 384 l0 0 ZM112 384 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 ZM176 52 l0 0 ZM112 52 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:toggle-numbered-list",
"name": "Numbered list",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M860 424 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM860 756 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM860 92 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM264 136 l-3 -3 l-51 -57 l56 0 q14 0 24.5 -10 q10.5 -10 11.5 -25 l0 -1 q0 -15 -10.5 -25.5 q-10.5 -10.5 -24.5 -10.5 l-137 0 q-15 0 -25 10 q-10 10 -11 24.5 q-1 14.5 9 25.5 l63 70 l49 54 q7 7 7 16.5 q0 9.5 -7.5 16.5 q-7.5 7 -18.5 7 q-11 0 -18.5 -6.5 q-7.5 -6.5 -8.5 -16.5 l0 0 q0 -15 -10.5 -25.5 q-10.5 -10.5 -25.5 -10.5 q-15 0 -25.5 10.5 q-10.5 10.5 -10.5 25.5 q0 26 13.5 47.5 q13.5 21.5 36 34.5 q22.5 13 49 13 q26.5 0 49.5 -13 q23 -13 36 -34.5 q13 -21.5 13 -47.5 q0 -20 -7.5 -37.5 q-7.5 -17.5 -21.5 -30.5 l-1 -1 ZM173 794 q11 11 25 10.5 q14 -0.5 24.5 -10.5 q10.5 -10 10.5 -25 l0 -293 q0 -15 -10 -25.5 q-10 -10.5 -25 -10.5 q-15 0 -25.5 10 q-10.5 10 -11.5 25 l0 211 q-10 -8 -23.5 -7 q-13.5 1 -22.5 11 l-1 0 q-10 11 -9.5 25.5 q0.5 14.5 10.5 24.5 l58 54 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:editor:toggle-checklist-status",
"name": "Checklist",
"icon": "checkbox-glyph"
},
{
"id": "editing-toolbar:undent-list",
"name": "Unindent-list",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 302 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 542 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 784 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 62 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM244 534 l-123 -122 q-8 -7 -8 -18 q0 -11 8 -18 l123 -122 q8 -7 19 -7 q11 0 18.5 7.5 q7.5 7.5 7.5 18.5 l0 242 q0 11 -7.5 18.5 q-7.5 7.5 -18.5 7.5 q-11 0 -19 -7 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:indent-list",
"name": "Indent list",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 302 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 542 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 784 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 62 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM158 534 l124 -122 q7 -7 7 -18 q0 -11 -7 -18 l-124 -122 q-7 -7 -18 -7 q-11 0 -19 7.5 q-8 7.5 -8 18.5 l0 242 q0 11 8 18.5 q8 7.5 19 7.5 q11 0 18 -7 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:renumber-ordered-list",
"name": "Reorder numbered list",
"icon": "list-restart"
}
]
},
{
"id": "SubmenuCommands-mdcmder",
"name": "submenu",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M464 608 l0 -568 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-80 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 568 l-232 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 80 q0 3 2.5 5.5 q2.5 2.5 5.5 2.5 l560 0 q3 0 5.5 -2.5 q2.5 -2.5 2.5 -5.5 l0 -80 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-232 0 ZM864 696 q17 0 28.5 11.5 q11.5 11.5 11.5 28.5 q0 17 -11.5 28.5 q-11.5 11.5 -28.5 11.5 q-17 0 -28.5 -11.5 q-11.5 -11.5 -11.5 -28.5 q0 -17 11.5 -28.5 q11.5 -11.5 28.5 -11.5 ZM864 640 q-40 0 -68 28 q-28 28 -28 68 q0 40 28 68 q28 28 68 28 q40 0 68 -28 q28 -28 28 -68 q0 -40 -28 -68 q-28 -28 -68 -28 ZM576 322 l0 -63 q0 -3 2 -5 l89 -70 l-89 -70 q-2 -2 -2 -5 l0 -63 q0 -4 3.5 -5.5 q3.5 -1.5 6.5 0.5 l170 133 q4 3 4.5 8.5 q0.5 5.5 -2.5 9.5 l-2 2 l-170 133 q-3 2 -6.5 0.5 q-3.5 -1.5 -3.5 -5.5 ZM256 322 l0 -63 q0 -3 -2 -5 l-89 -70 l89 -70 q2 -2 2 -5 l0 -63 q0 -4 -3.5 -5.5 q-3.5 -1.5 -6.5 0.5 l-170 133 q-4 3 -4.5 8.5 q-0.5 5.5 2.5 9.5 l2 2 l170 133 q3 2 6.5 0.5 q3.5 -1.5 3.5 -5.5 Z\"></path></g></svg>",
"SubmenuCommands": [
{
"id": "editing-toolbar:editor:toggle-code",
"name": "Inline code",
"icon": "code-glyph"
},
{
"id": "editing-toolbar:codeblock",
"name": "Code block",
"icon": "codeblock-glyph"
},
{
"id": "editing-toolbar:editor:insert-wikilink",
"name": "Insert wikilink [[]]",
"icon": "<svg width=\"15\" height=\"15\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M306 134 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 7 q0 -8 -5 -8 l-45 0 q-5 0 -5 8 l0 784 q0 8 5 8 l45 0 q5 0 5 -8 q0 8 1 8 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 -623 q0 8 1 8 ZM139 134 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 7 q0 -8 -5 -8 l-45 0 q-5 0 -5 8 l0 784 q0 8 5 8 l45 0 q5 0 5 -8 q0 8 1 8 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 -623 q0 8 1 8 ZM711 134 q1 0 1 -8 l0 623 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 q1 0 1 -8 q0 8 4 8 l46 0 q4 0 4 -8 l0 -784 q0 -8 -4 -8 l-46 0 q-4 0 -4 8 q0 -7 -1 -7 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 ZM878 134 q1 0 1 -8 l0 623 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 q1 0 1 -8 q0 8 5 8 l45 0 q4 0 4 -8 l0 -784 q0 -8 -4 -8 l-45 0 q-5 0 -5 8 q0 -7 -1 -7 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:editor:insert-embed",
"name": "Insert embed ![[]]",
"icon": "note-glyph"
},
{
"id": "editing-toolbar:insert-link",
"name": "Insert link []()",
"icon": "link-glyph"
},
{
"id": "editing-toolbar:hrline",
"name": "Horizontal divider",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M912 424 l0 -80 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-784 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 80 q0 3 2.5 5.5 q2.5 2.5 5.5 2.5 l784 0 q3 0 5.5 -2.5 q2.5 -2.5 2.5 -5.5 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:custom-summary",
"name": "Summary",
"icon": "chat-bubbles-filled"
},
{
"id": "editing-toolbar:custom-small",
"name": "Small text",
"icon": "header-n"
},
{
"id": "editing-toolbar:superscript",
"name": "Superscript",
"icon": "superscript-glyph"
},
{
"id": "editing-toolbar:subscript",
"name": "Subscript",
"icon": "subscript-glyph"
},
{
"id": "editing-toolbar:toggle-inline-math",
"name": "Inline math",
"icon": "lucide-sigma"
},
{
"id": "editing-toolbar:editor:insert-mathblock",
"name": "MathBlock",
"icon": "lucide-sigma-square"
}
]
},
{
"id": "SubmenuCommands-aligin",
"name": "submenu-aligin",
"icon": "align-left",
"SubmenuCommands": [
{
"id": "editing-toolbar:left",
"name": "<p aligin=\"left\"></p>",
"icon": "align-left"
},
{
"id": "editing-toolbar:center",
"name": "<center>",
"icon": "align-center"
},
{
"id": "editing-toolbar:right",
"name": "<p aligin=\"right\"></p>",
"icon": "align-right"
},
{
"id": "editing-toolbar:justify",
"name": "<p aligin=\"justify\"></p>",
"icon": "align-justify"
}
]
},
{
"id": "editing-toolbar:change-font-color",
"name": "Change font color[html]",
"icon": "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" focusable=\"false\" fill=\"currentColor\"><g fill-rule=\"evenodd\"><path id=\"change-font-color-icon\" d=\"M3 18h18v3H3z\" style=\"fill:#2DC26B\"></path><path d=\"M8.7 16h-.8a.5.5 0 01-.5-.6l2.7-9c.1-.3.3-.4.5-.4h2.8c.2 0 .4.1.5.4l2.7 9a.5.5 0 01-.5.6h-.8a.5.5 0 01-.4-.4l-.7-2.2c0-.3-.3-.4-.5-.4h-3.4c-.2 0-.4.1-.5.4l-.7 2.2c0 .3-.2.4-.4.4zm2.6-7.6l-.6 2a.5.5 0 00.5.6h1.6a.5.5 0 00.5-.6l-.6-2c0-.3-.3-.4-.5-.4h-.4c-.2 0-.4.1-.5.4z\"></path></g></svg>"
},
{
"id": "zenmode:toggle-zen-mode",
"name": "Zen Mode: Toggle",
"icon": "expand"
}
],
"followingCommands": [],
"topCommands": [],
"fixedCommands": [],
"mobileCommands": [],
"enableMultipleConfig": false,
"enableTopToolbar": true,
"enableFollowingToolbar": false,
"enableFixedToolbar": false,
"appendMethod": "workspace",
"shouldShowMenuOnSelect": false,
"cMenuVisibility": false,
"cMenuBottomValue": 4.25,
"cMenuNumRows": 12,
"cMenuWidth": 610,
"cMenuFontColor": "#2DC26B",
"cMenuBackgroundColor": "#d3f8b6",
"autohide": false,
"Iscentered": false,
"custom_bg1": "#FFB78B8C",
"custom_bg2": "#CDF4698C",
"custom_bg3": "#A0CCF68C",
"custom_bg4": "#F0A7D88C",
"custom_bg5": "#ADEFEF8C",
"custom_fc1": "#D83931",
"custom_fc2": "#DE7802",
"custom_fc3": "#245BDB",
"custom_fc4": "#6425D0",
"custom_fc5": "#646A73",
"isLoadOnMobile": false,
"horizontalPosition": 0,
"verticalPosition": 0,
"formatBrushes": {},
"customCommands": [
{
"id": "custom-summary",
"name": "Summary",
"prefix": "<details> \n<summary>",
"suffix": "</summary> \nInclude details here.\n</details>",
"char": 0,
"line": 0,
"islinehead": false,
"icon": "chat-bubbles-filled"
},
{
"id": "custom-small",
"name": "Small text",
"prefix": "<small>",
"suffix": "</small>",
"char": 0,
"line": 0,
"islinehead": false,
"icon": "header-n"
}
],
"viewTypeSettings": {
"bases": false
},
"appearanceByStyle": {
"top": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "glass"
},
"following": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "default"
},
"fixed": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "default"
},
"mobile": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "default"
}
},
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"useCurrentLineForRegex": false,
"commandIdsFixed": true
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
{
"id": "editing-toolbar",
"name": "Editing Toolbar",
"version": "3.2.7",
"minAppVersion": "0.14.0",
"description": "The Obsidian Editing Toolbar is modified from cmenu, which provides more powerful customization settings and has many built-in editing commands to be a MS Word-like toolbar editing experience.",
"author": "Cuman",
"authorUrl": "https://github.com/cumany/obsidian-editing-toolbar",
"isDesktopOnly": false
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
{
"showRightClickMenu": true,
"showFileExplorerIcon": true,
"focusLevel": "parent",
"customFolderPath": "src/content",
"hideAncestorFolders": false,
"autoHidePaths": [
"node_modules",
"dist"
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"id":"explorer-focus","name":"Explorer Focus","version":"0.1.9","minAppVersion":"1.11.0","description":"Focus on a specific file or folder in the file explorer.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false}

View File

@@ -0,0 +1 @@
/* No custom styles needed - using native Obsidian classes */

View File

@@ -0,0 +1,19 @@
{
"historyPropertyName": "aliases",
"ignoreRegexes": [
"^_",
"^Untitled$",
"^Untitled \\d+$"
],
"timeoutSeconds": 5,
"caseSensitive": false,
"autoCreateFrontmatter": true,
"includeFolders": [],
"excludeFolders": [],
"fileExtensions": [
"md",
"mdx"
],
"trackFolderRenames": "index",
"excludePropertyName": ""
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"id":"file-name-history","name":"File Name History","version":"0.2.7","minAppVersion":"1.11.0","description":"Store file name or folder name change history into note properties.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false}

View File

@@ -0,0 +1 @@
/* Scoped to only this plugin's settings container to avoid affecting other plugins */

View File

@@ -0,0 +1,129 @@
{
"syncFolderName": true,
"ctrlKey": true,
"altKey": false,
"hideFolderNote": true,
"templatePath": "",
"autoCreate": false,
"autoCreateFocusFiles": true,
"autoCreateForAttachmentFolder": false,
"autoCreateForFiles": false,
"enableCollapsing": false,
"excludeFolders": [],
"whitelistFolders": [],
"showDeleteConfirmation": true,
"underlineFolder": true,
"stopWhitespaceCollapsing": true,
"underlineFolderInPath": true,
"openFolderNoteOnClickInPath": true,
"openInNewTab": false,
"focusExistingTab": false,
"oldFolderNoteName": "{{folder_name}}",
"folderNoteName": "index",
"folderNoteType": ".md",
"disableFolderHighlighting": false,
"newFolderNoteName": "{{folder_name}}",
"storageLocation": "insideFolder",
"syncDelete": false,
"showRenameConfirmation": true,
"defaultOverview": {
"id": "",
"folderPath": "",
"title": "{{folderName}} overview",
"showTitle": false,
"depth": 3,
"includeTypes": [
"folder",
"markdown"
],
"style": "list",
"disableFileTag": false,
"sortBy": "name",
"sortByAsc": true,
"showEmptyFolders": false,
"onlyIncludeSubfolders": false,
"storeFolderCondition": true,
"showFolderNotes": false,
"disableCollapseIcon": true,
"alwaysCollapse": false,
"autoSync": true,
"allowDragAndDrop": true,
"hideLinkList": true,
"hideFolderOverview": false,
"useActualLinks": false,
"fmtpIntegration": false,
"titleSize": 1,
"isInCallout": false
},
"useSubmenus": true,
"syncMove": true,
"frontMatterTitle": {
"enabled": false,
"explorer": true,
"path": true
},
"settingsTab": "general",
"supportedFileTypes": [
"md",
"canvas",
"base"
],
"boldName": false,
"boldNameInPath": false,
"cursiveName": false,
"cursiveNameInPath": false,
"disableOpenFolderNoteOnClick": false,
"openByClick": true,
"openWithCtrl": false,
"openWithAlt": false,
"excludeFolderDefaultSettings": {
"type": "folder",
"path": "",
"id": "a8a3086d-f63b-409f-be17-9e5676db13b5",
"subFolders": true,
"disableSync": true,
"disableAutoCreate": true,
"disableFolderNote": false,
"enableCollapsing": false,
"position": 0,
"excludeFromFolderOverview": false,
"string": "",
"hideInSettings": false,
"detached": false,
"showFolderNote": false
},
"excludePatternDefaultSettings": {
"type": "pattern",
"path": "",
"id": "d97ab7fb-3b20-49e7-8128-666bf4985a2c",
"subFolders": true,
"disableSync": true,
"disableAutoCreate": true,
"disableFolderNote": false,
"enableCollapsing": false,
"position": 0,
"excludeFromFolderOverview": false,
"string": "",
"hideInSettings": false,
"detached": false,
"showFolderNote": false
},
"hideCollapsingIcon": false,
"hideCollapsingIconForEmptyFolders": false,
"tabManagerEnabled": true,
"ignoreAttachmentFolder": true,
"deleteFilesAction": "trash",
"openSidebar": {
"mobile": false,
"desktop": true
},
"highlightFolder": true,
"persistentSettingsTab": {
"afterRestart": true,
"afterChangingTab": true
},
"firstTimeInsertOverview": true,
"fvGlobalSettings": {
"autoUpdateLinks": false
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
{
"id": "folder-notes",
"name": "Folder notes",
"version": "1.8.18",
"minAppVersion": "0.15.0",
"description": "Create notes within folders that can be accessed without collapsing the folder, similar to the functionality offered in Notion.",
"author": "Lost Paul",
"authorUrl": "https://github.com/LostPaul",
"fundingUrl": "https://ko-fi.com/paul305844",
"helpUrl": "https://lostpaul.github.io/obsidian-folder-notes/",
"isDesktopOnly": false
}

View File

@@ -0,0 +1,349 @@
/* ==========================================================================
General States & Utilities
========================================================================== */
.hide,
.hide-folder .folder-name,
.hide-folder-note .is-folder-note {
display: none;
}
/* make.md plugin integration */
.hide-folder-note .mk-tree-node > .mk-tree-wrapper > .dropzone > .mk-tree-item.is-folder-note {
opacity: 40%;
display: flex;
}
.pointer-cursor,
.has-folder-note .nav-folder-title-content:hover,
.has-folder-note.view-header-breadcrumb:hover,
.nav-folder-collapse-indicator:hover,
.fn-delete-confirmation-modal-buttons span:hover,
.fn-delete-confirmation-modal-buttons input:hover {
cursor: pointer !important;
}
.hide-folder-note :not(.show-folder-note-in-explorer).only-has-folder-note .nav-folder-children {
display: none !important;
}
/* ==========================================================================
Tree Items
========================================================================== */
body:not(.is-grabbing) .tree-item-self.fn-is-active:hover,
body:not(.disable-folder-highlight) .tree-item-self.fn-is-active {
color: var(--nav-item-color-active);
background-color: var(--nav-item-background-active);
font-weight: var(--nav-item-weight-active);
}
/* ==========================================================================
Exclude Folder Settings
========================================================================== */
.fn-excluded-folder-heading {
margin-top: 0 !important;
border-top: 1px solid var(--background-modifier-border);
}
.add-exclude-folder-item,
.fn-exclude-folder-list {
padding-bottom: 0 !important;
}
.fn-exclude-folder-list.setting-item {
border-top: 0 !important;
border-bottom: 0 !important;
}
.fn-exclude-folder-list .setting-item-control {
display: flex;
justify-content: flex-start !important;
}
.fn-exclude-folder-list .setting-item-info {
display: none !important;
}
.fn-exclude-folder-list .search-input-container {
width: 100%;
}
/* ==========================================================================
Modal Styles
========================================================================== */
.fn-backup-warning-modal .fn-modal-button-container {
display: flex;
gap: 0.5rem;
justify-content: flex-end;
}
.fn-confirmation-modal {
padding-bottom: 0;
}
.fn-confirmation-modal .setting-item {
border-top: 0 !important;
padding-top: 0 !important;
}
:not(.is-phone) .fn-confirmation-modal-button {
margin-right: 0.7rem;
}
:not(.is-phone) .fn-delete-confirmation-modal-buttons {
display: flex;
align-items: center;
margin-top: 10px;
}
:not(.is-phone) .fn-delete-confirmation-modal-buttons .fn-confirmation-modal-button {
margin-left: auto;
}
:not(.is-phone) .fn-delete-confirmation-modal-buttons input[type="checkbox"] {
margin-right: 5px;
}
.is-phone .fn-delete-confirmation-modal-buttons {
display: flex;
flex-direction: column;
align-items: center;
}
.is-phone .fn-delete-confirmation-modal-buttons .fn-confirmation-modal-button {
margin-top: 10px;
}
/* ==========================================================================
Folder Overview
========================================================================== */
.folder-overview-container.fv-remove-edit-button .folder-overview-edit-button {
display: none;
}
.cm-line:has(.fv-link-list-item),
li:has(.fv-link-list-item),
.el-ul:has(.fv-link-list-item),
.cm-line:has(.fv-link-list-start),
.cm-line:has(.fv-link-list-end),
.fv-hide-overview {
display: none !important;
}
.folder-overview-list {
margin-top: 0 !important;
margin-bottom: 0 !important;
padding-bottom: 1.200 !important;
padding-top: 1.200 !important;
}
.folder-overview-list-item {
display: flex;
}
.folder-overview-list::marker {
color: var(--text-faint);
}
.folder-list::marker {
color: var(--text-normal) !important;
}
.folder-overview-grid {
display: grid;
grid-gap: 20px;
grid-template-columns: repeat(3, 1fr);
}
.folder-overview-grid-item {
flex: 1 1 auto;
margin: 0 1.2rem 1.2rem 0;
}
.folder-overview-grid-item-article article {
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 15px;
flex: 1;
}
.folder-overview-grid-item-article a {
text-decoration: none !important;
}
.folder-overview-grid-item-article h1 {
font-size: 1.2rem;
}
.overview-setting-item-fv {
border-top: 1px solid var(--background-modifier-border);
padding: 0.75em 0;
align-items: center;
}
.overview-setting-item-fv .setting-item {
padding: 0;
}
/* ==========================================================================
File Explorer & Path Styling
========================================================================== */
.folder-note-underline .has-folder-note .nav-folder-title-content {
text-decoration-line: underline;
text-decoration-color: var(--text-faint);
text-decoration-thickness: 2px;
text-underline-offset: 1px;
}
.folder-note-underline-path .has-folder-note.view-header-breadcrumb {
text-decoration-line: underline;
text-decoration-color: var(--text-faint);
text-decoration-thickness: 1px;
text-underline-offset: 2px;
}
.folder-note-bold .has-folder-note .nav-folder-title-content,
.folder-note-bold-path .has-folder-note.view-header-breadcrumb {
font-weight: bold;
}
.folder-note-cursive .has-folder-note .nav-folder-title-content,
.folder-note-cursive-path .has-folder-note.view-header-breadcrumb {
font-style: italic;
}
/* Collapse Icon Handling */
.fn-folder-overview-collapse-icon {
display: block !important;
}
.fn-has-no-files .collapse-icon,
.fn-hide-collapse-icon .has-folder-note.only-has-folder-note .tree-item-icon,
body.fn-ignore-attachment-folder.fn-hide-collapse-icon .only-has-folder-note .fn-empty-folder.fn-has-attachment-folder .tree-item-icon,
body.fn-hide-collapse-icon .only-has-folder-note .fn-empty-folder:not(.fn-has-attachment-folder) .tree-item-icon,
body.fn-hide-empty-collapse-icon :not(.only-has-folder-note) > .fn-empty-folder:not(.fn-has-attachment-folder) .tree-item-icon,
body.fn-hide-collapse-icon.only-has-folder-note:not(.is-collapsed):not(.show-folder-note-in-explorer)>.nav-folder-children {
display: none;
}
/* ==========================================================================
Settings Tabs
========================================================================== */
.fn-settings-tab-bar {
display: flex;
flex-direction: row;
padding-bottom: 1rem;
}
.fn-settings-tab {
display: flex;
flex-direction: row;
align-items: center;
gap: var(--size-4-2);
padding: 10px;
border: 1px solid var(--background-modifier-border);
}
.fn-settings-tab-active {
background-color: var(--color-accent);
color: var(--text-on-accent);
}
.fn-settings-tab-name {
font-weight: bold;
}
.fn-settings-tab-icon {
display: flex;
}
/* ==========================================================================
Suggestion Container
========================================================================== */
.fn-suggestion-container {
position: absolute;
overflow: hidden;
display: flex;
flex-direction: column;
background-color: var(--background-primary);
max-width: 500px;
max-height: 300px;
border-radius: var(--radius-m);
border: 1px solid var(--background-modifier-border);
box-shadow: var(--shadow-s);
z-index: var(--layer-notice);
}
/* ==========================================================================
Whitelist Folder Input (Desktop & Mobile)
========================================================================== */
/* Default Desktop Layout */
.fn-whitelist-folder-input-container {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
margin: 0;
}
.fn-whitelist-folder-input-container input {
flex-grow: 1;
width: auto;
margin-right: 8px;
height: 40px;
box-sizing: border-box;
}
.fn-whitelist-folder-buttons {
display: flex;
gap: 8px;
justify-content: flex-end;
align-items: center;
flex-grow: 0;
flex-shrink: 0;
}
/* Mobile Overrides */
@media (max-width: 768px) {
.fn-whitelist-folder-input-container {
display: block;
width: 100%;
text-align: center;
}
.fn-whitelist-folder-input-container input {
width: 100%;
margin-right: 0;
}
.fn-whitelist-folder-buttons {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
width: 100%;
}
.is-phone .fn-overview-folder-path .setting-item-control {
display: block;
}
}

View File

@@ -0,0 +1,31 @@
{
"homeBaseType": "File",
"homeBaseValue": "_bases/Home.base",
"openOnStartup": true,
"openViewMode": "default",
"openMode": "replace-all",
"manualOpenMode": "retain",
"replaceNewTab": false,
"newTabMode": "only-when-empty",
"openWhenAllTabsClosed": false,
"useDifferentFileForNewTab": false,
"newTabType": "File",
"newTabValue": "",
"newTabSeparateMobile": false,
"mobileNewTabType": "File",
"mobileNewTabValue": "",
"showStickyHomeIcon": true,
"stickyIconName": "home",
"hideHomeTabHeader": true,
"replaceMobileNewTab": false,
"separateMobile": false,
"mobileHomeBaseType": "File",
"mobileHomeBaseValue": "",
"commandOnOpen": "",
"waitForGitSync": false,
"gitSyncTimeout": 3,
"revertView": false,
"autoScroll": false,
"hideReleaseNotes": false,
"stickyIconReplaceTab": false
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"id":"home-base","name":"Home Base","version":"0.2.6","minAppVersion":"1.11.0","description":"Your dedicated home in your vault.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false}

View File

@@ -0,0 +1,217 @@
/**
* Home Base Plugin Styles
*/
/* ========================================
Icon Picker (matching iconic plugin)
======================================== */
.iconic-icon-picker .iconic-search-results {
overflow-x: scroll;
}
.iconic-icon-picker .iconic-search-results>.setting-item-info {
display: none;
}
.iconic-icon-picker .iconic-search-results>.setting-item-control {
justify-content: center;
}
.iconic-icon-picker .iconic-search-results:focus-visible {
box-shadow: 0 0 0 2px var(--background-modifier-border-focus);
}
/* Search result icons */
.iconic-icon-picker .iconic-search-result>* {
height: var(--icon-size);
--icon-size: calc(var(--icon-l) * 1.25);
--icon-stroke: calc(var(--icon-l-stroke-width) * 6/7);
}
.iconic-icon-picker .iconic-search-result.is-selected {
background-color: var(--background-modifier-hover);
}
.iconic-icon-picker .iconic-invisible {
visibility: hidden;
}
/* ========================================
Sticky Home Icon (Desktop)
======================================== */
/* Sticky home icon - part of tab bar structure, flows inline with tabs */
.workspace-tab-header-container-inner>.home-base-sticky-icon {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0;
margin: 0;
margin-left: 8px;
margin-right: 8px;
cursor: default;
color: var(--text-muted);
transition: color 150ms ease;
background: none;
height: var(--tab-height, 32px);
width: 24px;
min-width: 24px;
max-width: 24px;
flex-shrink: 0;
pointer-events: auto;
align-self: center;
margin-top: -8px;
}
/* Reduce left padding since icon is now inside the container */
/* Only apply to splits that actually have the sticky icon (not the other side of a split view) */
.workspace-split.mod-vertical.mod-root.home-base-sticky-icon-enabled .workspace-tab-header-container-inner:has(.home-base-sticky-icon) {
padding-left: 0;
/* Icon is inside, so no extra left padding needed */
}
.home-base-sticky-icon:hover {
background: none;
color: var(--text-normal);
}
.home-base-sticky-icon-active {
color: var(--text-accent);
}
.home-base-sticky-icon-active:hover {
color: var(--text-accent-hover);
}
.workspace-tab-header-container-inner>.home-base-sticky-icon svg {
width: 18px;
height: 18px;
min-width: 18px;
min-height: 18px;
max-width: 18px;
max-height: 18px;
flex-shrink: 0;
display: block;
/* Prevent any size changes */
box-sizing: border-box;
}
/* Hide home base tab header when sticky icon is enabled */
/* Completely remove from DOM flow to prevent tab counting */
.workspace-tab-header.is-home-base-tab,
.workspace-tab-header[data-home-base-ghost="true"] {
display: none !important;
/* Remove from accessibility tree */
visibility: hidden !important;
/* Remove from layout completely */
position: fixed !important;
left: -9999px !important;
top: -9999px !important;
width: 0 !important;
height: 0 !important;
overflow: hidden !important;
margin: 0 !important;
padding: 0 !important;
border: none !important;
/* Ensure it doesn't count for tab counting logic */
pointer-events: none !important;
/* Make it not count for :nth-child selectors */
order: -9999 !important;
}
/* Hide sticky icon when tab bar is hidden - general purpose rules */
/* These work automatically because the icon is inside the tab container */
/* Zen Mode */
body.zenmode-active .home-base-sticky-icon {
display: none !important;
}
/* UI Tweaker */
body.hider-tabs .home-base-sticky-icon {
display: none !important;
}
/* When tab header container is hidden via display:none, icon should also be hidden */
.workspace-tab-header-container[style*="display: none"] .home-base-sticky-icon,
.workspace-tab-header-container[style*="display:none"] .home-base-sticky-icon {
display: none !important;
}
/* When tab container inner is hidden via display:none */
.workspace-tab-header-container-inner[style*="display: none"] .home-base-sticky-icon,
.workspace-tab-header-container-inner[style*="display:none"] .home-base-sticky-icon {
display: none !important;
}
/* Oxygen theme auto-hide: When tab container has opacity 0 and pointer-events none, hide icon */
/* Only hide when opacity is 0 AND it's clearly meant to be hidden (not just a transition) */
.workspace-tab-header-container[style*="opacity: 0"][style*="pointer-events: none"] .home-base-sticky-icon,
.workspace-tab-header-container[style*="opacity:0"][style*="pointer-events:none"] .home-base-sticky-icon {
display: none !important;
}
/* Focus mode: REMOVED - was incorrectly hiding icon when window is focused */
/* Focus mode should be handled by the tab bar hiding, not by this rule */
/* Additional safety: Hide icon when parent workspace-tabs is hidden via display */
.workspace-tabs[style*="display: none"] .home-base-sticky-icon,
.workspace-tabs[style*="display:none"] .home-base-sticky-icon {
display: none !important;
}
/* JavaScript-controlled hiding removed - CSS handles all visibility automatically */
/* ========================================
Mobile New Tab Button Replacement
======================================== */
/* Hide the default SVG when mobile home is enabled */
.home-base-mobile-enabled .mobile-navbar-action-new-tab .clickable-icon svg {
display: none;
}
/* Add Lucide house icon as replacement */
.home-base-mobile-enabled .mobile-navbar-action-new-tab .clickable-icon::before {
content: '';
display: inline-block;
width: 24px;
height: 24px;
background-color: currentColor;
-webkit-mask: url("data:image/svg+xml,%3Csvg 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'%3E%3Cpath d='M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8'/%3E%3Cpath d='M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z'/%3E%3C/svg%3E") no-repeat center / contain;
mask: url("data:image/svg+xml,%3Csvg 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'%3E%3Cpath d='M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8'/%3E%3Cpath d='M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z'/%3E%3C/svg%3E") no-repeat center / contain;
}
/* ========================================
Settings Tab Styles
======================================== */
/* File suggester styling - scoped to home base suggestions */
.home-base-suggestion-item .suggestion-title {
font-weight: 500;
display: flex;
align-items: center;
}
.home-base-suggestion-item .suggestion-note {
color: var(--text-faint);
font-family: var(--font-monospace);
font-size: var(--font-smaller);
margin-top: 2px;
}
.home-base-suggestion-item .suggestion-flair {
display: inline-block;
padding: 1px 4px;
margin-left: 8px;
border-radius: var(--radius-s);
background-color: var(--background-modifier-border);
color: var(--text-muted);
font-size: var(--font-smallest);
font-weight: 500;
text-transform: uppercase;
}
/* Scoped to only this plugin's settings container to avoid affecting other plugins */

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,13 @@
{
"id": "homepage",
"name": "Homepage",
"version": "4.4.0",
"minAppVersion": "1.11.0",
"description": "Open a specified note, canvas, base, or workspace on startup, or set it for quick access later.",
"author": "novov",
"authorUrl": "https://novov.me",
"isDesktopOnly": false,
"fundingUrl": {
"Ko-fi": "https://ko-fi.com/novov"
}
}

View File

@@ -0,0 +1,231 @@
@keyframes nv-interstitial-destroy {
from { opacity: 1; }
to { opacity: 0; }
}
.setting-item[nv-greyed] {
opacity: .5;
pointer-events: none !important;
}
#nv-main-setting {
flex-wrap: wrap;
}
#nv-main-setting .setting-item-control {
padding-top: var(--size-4-1);
flex-basis: 100%;
align-items: stretch;
}
#nv-main-setting .setting-item-control input, #nv-main-setting .setting-item-control select {
font-size: var(--font-ui-medium);
font-weight: 600;
}
#nv-main-setting .setting-item-control select {
padding: var(--size-4-3) var(--size-4-4);
padding-right: var(--size-4-8);
height: auto;
}
#nv-main-setting .setting-item-control input {
flex-grow: 1;
padding: var(--size-4-5) var(--size-4-4);
}
#nv-main-setting .setting-item-control input[disabled] {
opacity: 0.3;
}
#nv-main-setting #nv-desc, #nv-main-setting #nv-info {
flex-basis: 100%;
}
#nv-main-setting #nv-desc {
font-weight: 500;
color: var(--text-normal);
font-size: var(--font-ui-small);
padding: 10px 0 0;
}
#nv-main-setting #nv-desc.mod-warning {
color: var(--text-error);
}
#nv-main-setting #nv-desc code {
font-family: var(--font-monospace);
font-size: var(--font-smaller);
border-radius: var(--radius-s);
}
#nv-main-setting #nv-desc small {
display: block;
font-weight: 400;
color: var(--text-muted);
font-size: calc(var(--font-ui-smaller) * 0.9);
padding: 5px 0 0;
}
.nv-homepage-file-tag {
display: inline-block;
vertical-align: middle;
margin-left: var(--size-2-2);
}
.nv-mobile-setting, .nv-command-setting {
flex-wrap: wrap;
row-gap: var(--size-2-2);
}
.nv-mobile-setting .nv-mobile-info {
font-size: var(--font-ui-smaller);
width: 100%;
margin-right: var(--size-4-18);
}
.nv-command-desc {
padding: 0;
}
.nv-command-box {
margin: 1em 0 0;
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
width: 100%;
}
.nv-command-pill {
background-color: var(--background-modifier-hover);
border-radius: var(--radius-s);
font-size: var(--font-ui-small);
padding: var(--size-2-1) var(--size-2-2) var(--size-2-1) var(--size-2-3) ;
}
.nv-command-pill.nv-command-invalid {
color: var(--text-faint);
}
.nv-command-pill button {
display: inline-block;
padding: 0;
margin: 0 0 0 3px;
vertical-align: bottom;
}
.nv-command-pill button:first-of-type {
margin-left: var(--size-4-2);
}
.nv-command-pill button.nv-command-selected {
margin-left: var(--size-2-2);
padding: 0 var(--size-2-1);
}
.nv-command-pill button.nv-command-selected span {
color: var(--text-accent);
display: inline-block;
font-size: 0.9em;
vertical-align: top;
position: relative;
top: -1px;
}
.nv-command-pill > .svg-icon, .nv-command-pill button .svg-icon {
height: 1em;
width: 1em;
opacity: 1;
}
.nv-command-pill > .svg-icon {
vertical-align: text-bottom;
position: relative;
margin: 0 var(--size-2-1) 0 0;
}
.nv-command-pill.nv-dragging {
background-color: transparent;
}
.nv-command-add-button {
font-size: var(--font-ui-small);
padding: var(--size-2-2) var(--size-4-2);
height: auto;
}
#nv-main-setting + .setting-item, .nv-command-desc + .setting-item {
padding-top: 20px;
border-top: none !important;
}
.nv-debug-button {
margin: 3em 0 -0.2em;
font-size: var(--font-ui-smaller);
padding: 0;
height: auto;
float: right;
box-shadow: none !important;
background: none !important;
color: var(--text-accent);
font-weight: 600;
cursor: pointer;
}
.nv-debug-button:hover, .nv-debug-button:active {
text-decoration: underline;
}
.is-phone #nv-main-setting .setting-item-control {
flex-wrap: wrap;
justify-content: flex-start;
}
.is-phone #nv-main-setting .setting-item-control select {
width: auto;
max-width: auto;
}
.is-phone .nv-mobile-setting {
row-gap: var(--size-4-2);
}
.is-phone .nv-mobile-setting .setting-item-info {
max-width: calc(100% - 100px);
}
.is-phone .nv-mobile-setting {
row-gap: var(--size-4-2);
}
.is-phone .nv-mobile-setting .setting-item-info {
max-width: calc(100% - 100px);
}
.is-phone .nv-command-pill {
width: 100%;
border: none;
background: none;
padding: 0 0 var(--size-4-2);
display: flex;
gap: var(--size-4-4);
align-items: baseline;
}
.is-phone .nv-command-pill .nv-command-text {
flex-grow: 1;
overflow: hidden;
text-overflow: ellipsis;
}
.is-phone .nv-command-pill, .is-phone .nv-command-add-button {
font-size: var(--font-ui-medium);
justify-content: space-between;
}
.is-phone .nv-command-pill button {
line-height: var(--font-ui-medium);
height: 100%;
margin: 0 !important;
}

View File

@@ -0,0 +1,118 @@
{
"enableRenameOnPaste": true,
"enableRenameOnDrop": true,
"imageNameTemplate": "{{DATE:YYYY-MM-DD}}_{{fileName}}",
"attachmentLocation": "obsidian",
"customAttachmentPath": "./assets",
"defaultProvider": "local",
"unsplashProxyServer": "",
"pexelsApiKey": "",
"pexelsApiKeySecretId": "",
"pixabayApiKey": "",
"pixabayApiKeySecretId": "",
"defaultOrientation": "any",
"defaultImageSize": "large",
"enablePropertyPaste": true,
"propertyLinkFormat": "obsidian",
"customPropertyLinkFormat": "{image-url}",
"defaultPropertyName": "heroImage",
"defaultIconPropertyName": "icon",
"altTextProperty": "",
"autoConvertRemoteImages": false,
"convertOnNoteOpen": false,
"convertOnNoteSave": false,
"processBackgroundChanges": true,
"showRenameDialog": true,
"autoRename": false,
"dupNumberDelimiter": "-",
"dupNumberAtStart": false,
"disableRenameNotice": false,
"enableDescriptiveImages": true,
"insertSize": "",
"insertReferral": true,
"insertBackLink": false,
"appendReferral": false,
"banner": {
"properties": {
"imageProperty": "heroImage",
"iconProperty": "icon"
},
"desktop": {
"enabled": true,
"height": 240,
"viewOffset": 0,
"noteOffset": -32,
"borderRadius": [
8,
8,
8,
8
],
"padding": 8,
"fade": true,
"iconEnabled": false,
"iconSize": 96,
"iconRadius": 8,
"iconBackground": true,
"iconBorder": 2,
"iconFrame": true,
"iconAlignmentH": "flex-start",
"iconAlignmentV": "flex-end",
"iconOffsetX": 0,
"iconOffsetY": -24
},
"tablet": {
"enabled": true,
"height": 190,
"viewOffset": 0,
"noteOffset": -32,
"borderRadius": [
8,
8,
8,
8
],
"padding": 8,
"fade": true,
"iconEnabled": false,
"iconSize": 96,
"iconRadius": 8,
"iconBackground": true,
"iconBorder": 2,
"iconFrame": true,
"iconAlignmentH": "flex-start",
"iconAlignmentV": "flex-end",
"iconOffsetX": 0,
"iconOffsetY": -24
},
"phone": {
"enabled": true,
"height": 160,
"viewOffset": 0,
"noteOffset": -32,
"borderRadius": [
8,
8,
8,
8
],
"padding": 8,
"fade": true,
"iconEnabled": false,
"iconSize": 56,
"iconRadius": 8,
"iconBackground": true,
"iconBorder": 2,
"iconFrame": true,
"iconAlignmentH": "flex-start",
"iconAlignmentV": "flex-end",
"iconOffsetX": 0,
"iconOffsetY": -24
}
},
"supportedExtensions": [
"md",
"mdx"
],
"debugMode": false
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"id":"image-manager","name":"Image Manager","version":"0.3.2","minAppVersion":"1.11.0","description":"Insert, rename, and sort images within your notes.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false}

View File

@@ -0,0 +1,530 @@
/* Image Manager Plugin Styles */
/* Rename Modal uses Obsidian's default modal sizing */
.image-manager-rename-modal .modal-content {
padding: 1rem;
}
.image-manager-preview {
display: flex;
justify-content: center;
margin-bottom: 1rem;
padding: 1rem;
background: var(--background-secondary);
border-radius: 8px;
}
.image-manager-preview img,
.image-manager-preview-img {
max-width: 100%;
max-height: 200px;
object-fit: contain;
border-radius: 4px;
}
.image-manager-info {
margin-bottom: 1rem;
}
.image-manager-info ul {
list-style: none;
padding: 0;
margin: 0;
}
.image-manager-info li {
padding: 0.25rem 0;
font-size: 0.875rem;
color: var(--text-muted);
}
.image-manager-info li strong {
color: var(--text-normal);
}
.image-manager-error {
color: var(--text-error);
margin-top: 0.5rem;
font-size: 0.875rem;
}
.image-manager-error-hidden {
display: none;
}
.image-manager-error-visible {
display: block;
}
.image-manager-hidden {
display: none;
}
/* Remote search modal styles */
.image-inserter-container .modal-close-button {
display: none;
}
.image-inserter-container .modal-content {
overflow-y: hidden;
}
.image-inserter-container .container {
z-index: 1;
position: relative;
max-width: 100%;
}
.image-inserter-container .container .input-group {
display: flex;
}
.image-inserter-container .container .query-input {
flex-grow: 1;
}
.image-inserter-container .container .selector {
margin-left: 8px;
}
.image-inserter-container .container .scroll-area {
overflow-x: hidden;
margin-top: 6px;
width: 100%;
max-height: 70vh;
}
.image-inserter-container .container .scroll-area.loading {
display: none;
}
.image-inserter-container .container .scroll-area .images-list {
display: grid;
grid-template-columns: repeat(1, 1fr);
}
@media only screen and (min-width: 600px) {
.image-inserter-container .container {
padding: 10px;
}
.image-inserter-container .container {
max-width: 80vw;
}
.image-inserter-container .container .scroll-area .images-list {
grid-template-columns: repeat(2, 1fr);
}
}
@media only screen and (min-width: 768px) {
.image-inserter-container .container .scroll-area .images-list {
grid-template-columns: repeat(3, 1fr);
}
}
@media only screen and (min-width: 1200px) {
.image-inserter-container .container .scroll-area .images-list {
grid-template-columns: repeat(4, 1fr);
}
}
.image-inserter-container .container .scroll-area .images-list .query-result {
padding: 5px 10px;
cursor: pointer;
border-radius: 6px;
}
.image-inserter-container .container .scroll-area .images-list .query-result img {
width: 100%;
height: 100%;
object-fit: contain;
box-shadow: none;
background-color: inherit;
}
.image-inserter-container .container .scroll-area .images-list .query-result.is-selected {
background-color: var(--background-tertiary);
box-shadow: 0 1px 3px rgb(0 0 0 / 12%), 0 1px 2px rgb(0 0 0 / 24%);
}
.image-inserter-container .container .scroll-area .pagination {
width: 100%;
margin-top: 24px;
margin-bottom: 24px;
display: flex;
justify-content: space-between;
}
.image-inserter-container .container .scroll-area .pagination .btn {
cursor: default;
}
/* Loading Animation */
.image-inserter-container .loading-container {
display: flex;
justify-content: center;
align-items: center;
padding: 2rem;
}
.image-inserter-container .loading-container .loader-icon {
display: inline-block;
width: 24px;
height: 24px;
color: var(--text-normal);
animation: loader-spin 1s linear infinite;
transform-origin: center;
}
.image-inserter-container .loading-container .loader-icon svg {
width: 24px;
height: 24px;
display: block;
}
@keyframes loader-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.image-inserter-container .container .scroll-area .no-result-container {
display: flex;
justify-content: center;
padding: 2rem;
}
.image-inserter-container .container .scroll-area .no-result-container.error-text {
color: var(--text-error);
}
/* Scoped to only this plugin's settings container to avoid affecting other plugins */
/* File Picker Modal (hidden) */
.image-manager-file-picker input[type="file"] {
display: none;
}
/* Confirmation Modal */
.image-manager-confirm-message {
margin-bottom: 1.5rem;
line-height: 1.6;
}
.image-manager-confirm-message p {
margin: 0.5rem 0;
white-space: pre-line;
}
.image-manager-confirm-buttons {
display: flex;
gap: 0.5rem;
justify-content: flex-end;
margin-top: 1rem;
}
.image-manager-confirm-buttons button {
min-width: 100px;
}
/* ==========================================
Banner Image Styles
========================================== */
/* Default CSS Variables for Banner */
body {
/* Banner Variables */
--im-banner-padding: 8px;
--im-banner-radius: 0px 0px 0px 0px;
--im-banner-height: 240px;
--im-banner-url: none;
--im-banner-repeat: no-repeat;
--im-banner-size: cover;
--im-banner-img-x: 0px;
--im-banner-img-y: 0px;
--im-banner-note-offset: -32px;
--im-banner-view-offset: 0px;
--im-banner-mask: linear-gradient(180deg, transparent 25%, var(--background-primary));
--im-banner-mask-webkit: -webkit-linear-gradient(270deg, transparent 25%, var(--background-primary));
/* Icon Variables */
--im-banner-icon-align-h: flex-start;
--im-banner-icon-align-v: flex-end;
--im-banner-icon-size-w: 96px;
--im-banner-icon-size-h: 96px;
--im-banner-icon-offset-x: 0px;
--im-banner-icon-offset-y: -24px;
--im-banner-icon-radius: 8px;
--im-banner-icon-value: '';
--im-banner-icon-fontsize: inherit;
--im-banner-icon-background: rgb(from var(--background-primary) r g b / 80%);
--im-banner-icon-border: 2px;
}
/* Banner Container */
div.image-manager-banner {
position: absolute;
inset: 0;
z-index: 1;
width: calc(100% - (var(--im-banner-padding) * 2));
height: 100%;
margin-left: var(--im-banner-padding);
max-height: var(--im-banner-height);
padding: var(--size-4-3) var(--size-4-3) 0 var(--size-4-3);
transform: translate3d(0, 0, 0);
user-select: none;
pointer-events: none;
}
/* Banner content wrapper (for rounding and clipping) */
div.image-manager-banner > div.banner-content {
position: absolute;
inset: 0;
z-index: 2;
overflow: hidden;
border-radius: var(--im-banner-radius);
transform: translate3d(0, 0, 0);
/* Hardware acceleration fix for jagged rounded corners */
-webkit-mask-image: -webkit-radial-gradient(white, black);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
pointer-events: auto;
}
/* Banner video element */
div.image-manager-banner > div.banner-content > video {
inset: 0;
position: absolute;
width: 100%;
height: 100%;
object-fit: cover;
z-index: 2;
animation: im-banner-fade-in 1s cubic-bezier(0.4, 0, 0.2, 1) forwards, im-banner-video-anim 1s cubic-bezier(0.4, 0, 0.2, 1) forwards;
object-position: calc(50% + var(--im-banner-img-x)) calc(50% + var(--im-banner-img-y));
border-radius: var(--im-banner-radius);
transition: object-position 0.5s ease-in-out;
will-change: object-position;
transform: translate3d(0, 0, 0);
}
/* Banner image background (::before pseudo-element) */
div.image-manager-banner > div.banner-content::before {
content: '';
position: absolute;
inset: 0;
z-index: 2;
box-shadow: inset 0 2px 4px 1px rgba(0, 0, 0, 0.1);
border-radius: var(--im-banner-radius);
background-color: rgba(0, 0, 0, 0.2);
background-image: var(--im-banner-url);
background-repeat: var(--im-banner-repeat);
background-size: var(--im-banner-size);
background-position-x: calc(50% + var(--im-banner-img-x));
background-position-y: calc(50% + var(--im-banner-img-y));
animation: im-banner-fade-in 1s cubic-bezier(0.4, 0, 0.2, 1) forwards, im-banner-anim 1s cubic-bezier(0.4, 0, 0.2, 1) forwards;
transition: background-position-x 0.5s ease-in-out;
will-change: background-position-x, background-position-y;
transform-style: preserve-3d;
backface-visibility: hidden;
transform: translate3d(0, 0, 0);
}
/* Banner fade overlay (::after pseudo-element) */
div.image-manager-banner > div.banner-content::after {
position: absolute;
inset: 0;
z-index: 3;
content: '';
border-radius: var(--im-banner-radius);
background: var(--im-banner-mask);
background: var(--im-banner-mask-webkit);
transform: translate3d(0, 0, 0);
}
/* Static state (no animation) */
div.image-manager-banner.static > div.banner-content::after {
animation: none;
}
div.image-manager-banner.static > div.banner-content::before {
animation: none !important;
opacity: 1 !important;
transition: background-position-x 0.5s ease-in-out, background-position-y 0.5s ease-in-out;
}
/* Static video */
div.image-manager-banner.static > div.banner-content > video {
animation: none !important;
opacity: 1 !important;
}
/* During animation, disable transition to prevent conflicts */
div.image-manager-banner:not(.static) > div.banner-content::before {
transition: background-position-x 0.5s ease-in-out;
}
/* Content after banner */
div.image-manager-banner + div {
position: relative;
z-index: 4;
}
/* Banner animations */
@keyframes im-banner-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes im-banner-anim {
from {
background-position-y: calc(50% + (var(--im-banner-img-y, 0px) - 10px));
}
to {
background-position-y: calc(50% + var(--im-banner-img-y, 0px));
}
}
@keyframes im-banner-video-anim {
from {
object-position: calc(50% + var(--im-banner-img-x, 0px)) calc(50% + (var(--im-banner-img-y, 0px) - 10px));
}
to {
object-position: calc(50% + var(--im-banner-img-x, 0px)) calc(50% + var(--im-banner-img-y, 0px));
}
}
@keyframes im-banner-icon-anim {
from {
transform: translate(var(--im-banner-icon-offset-x), calc(var(--im-banner-icon-offset-y) - 10px));
opacity: 0;
}
to {
transform: translate(var(--im-banner-icon-offset-x), var(--im-banner-icon-offset-y));
opacity: 1;
}
}
/* Icon Container */
div.image-manager-banner > div.banner-icon {
position: relative;
display: flex;
justify-content: var(--im-banner-icon-align-h);
align-items: var(--im-banner-icon-align-v);
width: inherit;
height: inherit;
z-index: 4;
margin: 0 auto;
max-width: var(--file-line-width);
transform: translate(0, 0);
animation: im-banner-fade-in 0.7s linear forwards, im-banner-icon-anim 0.8s ease-out;
will-change: transform, opacity;
}
div.image-manager-banner > div.banner-icon > div {
display: block;
position: relative;
width: var(--im-banner-icon-size-w);
height: var(--im-banner-icon-size-h);
background-color: var(--im-banner-icon-background);
transform: translate(var(--im-banner-icon-offset-x), var(--im-banner-icon-offset-y));
border-radius: var(--im-banner-icon-radius);
border: var(--im-banner-icon-border) solid var(--background-primary);
z-index: 2;
overflow: hidden;
}
/* Text icon */
div.image-manager-banner > div.banner-icon > div[data-type="text"]::after {
display: flex;
justify-content: center;
align-items: center;
position: absolute;
inset: 0;
width: 100%;
height: 100%;
z-index: 1;
text-transform: uppercase;
content: var(--im-banner-icon-value);
color: var(--text-normal);
line-height: 0;
font-size: var(--im-banner-icon-fontsize, inherit);
user-select: none;
}
/* Link/image icon */
div.image-manager-banner > div.banner-icon > div[data-type="link"]::after {
position: absolute;
text-transform: uppercase;
inset: 0;
width: 100%;
height: 100%;
z-index: 1;
transform: translate(0, 0);
content: '';
background-image: var(--im-banner-icon-value);
background-repeat: no-repeat;
background-size: cover;
background-position: center;
overflow: hidden;
}
/* Static icon (no animation) */
div.image-manager-banner.static > div.banner-icon {
animation: none;
}
/* Mobile adjustments */
body.is-tablet div.image-manager-banner {
width: calc(100% - (var(--im-banner-padding) * 2));
}
body.is-phone div.image-manager-banner {
width: calc(100% - (var(--im-banner-padding) * 2));
}
body.is-tablet div.image-manager-banner > div.banner-icon {
left: calc(var(--size-4-2) * -1);
}
body.is-phone div.image-manager-banner > div.banner-icon {
left: auto;
}
/* Frontmatter Overrides for views with banner */
.workspace-leaf-content[data-im-banner] .view-content > .markdown-source-view.mod-cm6 > .cm-editor > .cm-scroller,
.workspace-leaf-content[data-im-banner] .view-content .markdown-preview-view {
padding-top: var(--im-banner-height, 240px);
}
.workspace-leaf-content[data-im-banner] .view-content > .markdown-source-view.mod-cm6 > .cm-editor > .cm-scroller .inline-embed .el-pre.mod-frontmatter.mod-ui,
.workspace-leaf-content[data-im-banner] .view-content > .markdown-source-view.mod-cm6 > .cm-editor > .cm-scroller .inline-embed .markdown-preview-view,
.workspace-leaf-content[data-im-banner] .view-content .markdown-preview-view .inline-embed .el-pre.mod-frontmatter.mod-ui,
.workspace-leaf-content[data-im-banner] .view-content .markdown-preview-view .inline-embed .markdown-preview-view {
padding-top: initial;
}
.workspace-leaf-content[data-im-banner] .view-content > .markdown-source-view.mod-cm6 > .cm-editor > .cm-scroller .cm-sizer {
position: relative;
z-index: 1;
margin-top: var(--im-banner-note-offset, 0);
}
.workspace-leaf-content[data-im-banner][data-mode="source"] .view-content > .markdown-source-view.mod-cm6 > .cm-editor > .cm-scroller .cm-sizer {
margin-top: 0;
}
.workspace-leaf-content[data-im-banner] .view-content {
margin-top: var(--im-banner-view-offset, 0);
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"author":"mnaoumov","authorUrl":"https://github.com/mnaoumov/","description":"Allows to view/edit nested frontmatter properties.","fundingUrl":"https://www.buymeacoffee.com/mnaoumov","id":"nested-properties","isDesktopOnly":false,"name":"Nested Properties","version":"1.2.0","minAppVersion":"1.12.7"}

View File

@@ -0,0 +1 @@
.metadata-property:not(.nested-properties-container .metadata-property):has(>.metadata-property-value>.nested-properties-container){flex-wrap:wrap;overflow:auto}.metadata-property:not(.nested-properties-container .metadata-property):has(>.metadata-property-value>.nested-properties-container)>.metadata-property-warning-icon{display:none}.metadata-property:not(.nested-properties-container .metadata-property):has(>.metadata-property-value>.nested-properties-container)>.metadata-property-value{overflow:visible;width:100%;margin-left:144px}.metadata-property:not(.nested-properties-container .metadata-property):has(>.metadata-property-value>.nested-properties-container).is-collapsed{flex-wrap:nowrap;overflow:hidden}.metadata-property:not(.nested-properties-container .metadata-property):has(>.metadata-property-value>.nested-properties-container).is-collapsed>.metadata-property-value{flex-direction:row;overflow:hidden;width:auto;margin-left:0}.nested-properties-container{width:100%;display:flex;flex-direction:column}.nested-properties-container .metadata-property{width:100%;border-bottom:none;overflow:visible}.nested-properties-container .nested-properties-collapsible{flex-wrap:wrap}.nested-properties-container .nested-properties-collapsible>.metadata-property-value{flex-direction:column;overflow:visible;width:100%;margin-left:144px}.nested-properties-container .nested-properties-collapsible.is-collapsed>.metadata-property-value{flex-direction:row;overflow:hidden;width:auto;margin-left:0}.nested-properties-collapsible.is-collapsed{flex-wrap:nowrap}.nested-properties-collapsible.is-collapsed>.metadata-property-value>.nested-properties-container{display:none}.nested-properties-collapsible.is-collapsed>.metadata-property-key>.nested-properties-collapse-btn{transform:rotate(-90deg)}.nested-properties-summary{display:none;color:var(--text-muted);font-style:italic;cursor:var(--cursor);white-space:nowrap}.nested-properties-collapsible.is-collapsed>.metadata-property-value>.nested-properties-summary{display:inline}.metadata-container:not(:has(.nested-properties-collapsible)) .nested-properties-header-actions{display:none}.nested-properties-header-actions{display:inline-flex;align-items:center;margin-left:4px;vertical-align:middle}.nested-properties-add-item,.nested-properties-add-property{display:inline-flex;width:fit-content;align-items:center;gap:4px;padding:2px 4px;color:var(--text-muted);font-size:var(--metadata-label-font-size);cursor:var(--cursor);border-radius:var(--radius-s)}.nested-properties-add-item:hover,.nested-properties-add-property:hover{color:var(--text-normal);background:var(--background-modifier-hover)}.nested-properties-add-item svg,.nested-properties-add-property svg{width:16px;height:16px}.nested-properties-add-property input{background:transparent;border:none;outline:none;color:var(--text-normal);font-size:inherit;padding:0}.nested-properties-floating-scrollbar{display:none;position:fixed;left:var(--track-left);width:var(--track-width);bottom:var(--track-bottom);height:12px;z-index:10;cursor:ew-resize;background:var(--background-secondary);border-top:1px solid var(--background-modifier-border)}.nested-properties-floating-scrollbar.is-visible{display:block}.nested-properties-floating-scrollbar-thumb{position:absolute;left:var(--thumb-left);width:var(--thumb-width);top:2px;height:8px;border-radius:4px;background:var(--scrollbar-thumb-bg)}.nested-properties-floating-scrollbar-thumb:hover{background:var(--scrollbar-active-thumb-bg)}.nested-properties-ew-resize{cursor:ew-resize}.nested-properties-collapse-btn{display:inline-flex;align-items:center;justify-content:center;cursor:var(--cursor);color:var(--text-muted);flex-shrink:0;width:16px;height:16px;align-self:center;transition:transform .1s ease-in-out}.nested-properties-collapse-btn svg{width:10px;height:10px}

View File

@@ -0,0 +1,68 @@
{
"commitMessage": "Blog update {{date}}: {{numFiles}} file(s) changed.",
"autoCommitMessage": "Blog update {{date}}: {{numFiles}} file(s) changed.",
"commitMessageScript": "",
"commitDateFormat": "M/D/YYYY h:ma",
"autoSaveInterval": 0,
"autoPushInterval": 0,
"autoPullInterval": 0,
"autoPullOnBoot": true,
"autoCommitOnlyStaged": false,
"disablePush": false,
"pullBeforePush": true,
"disablePopups": false,
"showErrorNotices": true,
"disablePopupsForNoChanges": true,
"listChangedFilesInMessageBody": false,
"showStatusBar": true,
"updateSubmodules": false,
"syncMethod": "merge",
"mergeStrategy": "none",
"customMessageOnAutoBackup": false,
"autoBackupAfterFileChange": false,
"treeStructure": false,
"refreshSourceControl": true,
"basePath": "",
"differentIntervalCommitAndPush": false,
"changedFilesInStatusBar": true,
"showedMobileNotice": true,
"refreshSourceControlTimer": 7000,
"showBranchStatusBar": false,
"setLastSaveToLastCommit": false,
"submoduleRecurseCheckout": false,
"gitDir": "",
"showFileMenu": false,
"authorInHistoryView": "hide",
"dateInHistoryView": false,
"diffStyle": "split",
"hunks": {
"showSigns": false,
"hunkCommands": false,
"statusBar": "disabled"
},
"lineAuthor": {
"show": false,
"followMovement": "inactive",
"authorDisplay": "initials",
"showCommitHash": false,
"dateTimeFormatOptions": "date",
"dateTimeFormatCustomString": "YYYY-MM-DD HH:mm",
"dateTimeTimezone": "viewer-local",
"coloringMaxAge": "1y",
"colorNew": {
"r": 255,
"g": 150,
"b": 150
},
"colorOld": {
"r": 120,
"g": 160,
"b": 255
},
"textColorCss": "var(--text-muted)",
"ignoreWhitespace": false,
"gutterSpacingFallbackLength": 5,
"lastShownAuthorDisplay": "initials",
"lastShownDateTimeFormatOptions": "date"
}
}

File diff suppressed because one or more lines are too long

View 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.38.0"
}

View 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"

View File

@@ -0,0 +1,710 @@
@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%;
}
/* Re-enable wrapping of nav buttns to prevent overflow on smaller screens #*/
.workspace-drawer .git-view .nav-buttons-container {
flex-wrap: wrap;
}
.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;
}

View File

@@ -0,0 +1,10 @@
{
"imageNamePattern": "{{fileName}}_{{DATE:YYYY-MM-DD}}",
"dupNumberAtStart": false,
"dupNumberDelimiter": "-",
"dupNumberAlways": false,
"autoRename": false,
"handleAllAttachments": false,
"excludeExtensionPattern": "",
"disableRenameNotice": false
}

View 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 */

View 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
}

View 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%;
}

View File

@@ -0,0 +1,5 @@
{
"appliedMigrations": [
"tokens-to-secretstorage-v1"
]
}

View File

@@ -0,0 +1,84 @@
{
"pluginList": [
"mnaoumov/obsidian-nested-properties",
"davidvkimball/obsidian-property-over-file-name",
"davidvkimball/obsidian-file-name-history",
"davidvkimball/obsidian-explorer-focus",
"davidvkimball/obsidian-ui-tweaker",
"davidvkimball/obsidian-home-base",
"davidvkimball/obsidian-image-manager",
"davidvkimball/obsidian-vault-cms",
"davidvkimball/obsidian-bases-cms",
"davidvkimball/obsidian-oxygen-settings",
"davidvkimball/obsidian-seo",
"davidvkimball/obsidian-disable-tabs",
"davidvkimball/obsidian-astro-composer"
],
"pluginSubListFrozenVersion": [
{
"repo": "mnaoumov/obsidian-nested-properties",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-property-over-file-name",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-file-name-history",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-explorer-focus",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-ui-tweaker",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-home-base",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-image-manager",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-vault-cms",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-bases-cms",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-oxygen-settings",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-seo",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-disable-tabs",
"version": "latest"
},
{
"repo": "davidvkimball/obsidian-astro-composer",
"version": "latest"
}
],
"themesList": [],
"updateAtStartup": true,
"updateThemesAtStartup": true,
"enableAfterInstall": true,
"loggingEnabled": false,
"loggingPath": "BRAT-log",
"loggingVerboseEnabled": false,
"debuggingMode": false,
"notificationsEnabled": true,
"globalTokenName": "",
"personalAccessToken": "",
"selectLatestPluginVersionByDefault": false,
"allowIncompatiblePlugins": false
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
{
"id": "obsidian42-brat",
"name": "BRAT",
"version": "2.0.2",
"minAppVersion": "1.11.4",
"description": "Easily install a beta version of a plugin for testing.",
"author": "TfTHacker",
"authorUrl": "https://github.com/TfTHacker/obsidian42-brat",
"helpUrl": "https://tfthacker.com/BRAT",
"isDesktopOnly": false,
"fundingUrl": {
"Visit my site": "https://tfthacker.com"
}
}

View File

@@ -0,0 +1,152 @@
.brat-modal .modal-button-container {
margin-top: 5px;
}
.brat-modal .disabled-setting {
opacity: 0.5;
}
.brat-modal .disabled-setting:hover {
cursor: not-allowed;
}
/* Input validation styles */
.brat-settings .valid-input,
.brat-modal .valid-repository {
border-color: var(--color-green);
}
.brat-settings .invalid-input,
.brat-modal .invalid-repository {
border-color: var(--color-red);
}
.brat-settings .validation-error,
.brat-modal .validation-error {
border-color: var(--color-orange);
}
/* Version selector */
.brat-version-selector {
width: 100%;
max-width: 400px;
justify-content: left;
}
.brat-token-input {
min-width: 33%;
}
/* Token info container styles */
.brat-token-info {
margin-top: 8px;
font-size: 0.8em;
padding: 8px;
border-radius: 4px;
background-color: var(--background-secondary);
}
/* Token status indicators */
.brat-token-info.valid,
.brat-token-status.valid {
color: var(--color-green);
}
.brat-token-info.invalid,
.brat-token-status.invalid {
color: var(--color-red);
}
.brat-token-info.valid {
border-left: 3px solid var(--color-green);
}
.brat-token-info.invalid {
border-left: 3px solid var(--color-red);
}
/* Token details and status */
.brat-token-status {
margin-bottom: 4px;
}
.brat-token-details {
margin-top: 4px;
color: var(--text-muted);
}
/* Token warnings */
.brat-token-warning {
color: var(--color-orange);
margin-top: 4px;
}
/* Token additional info */
.brat-token-scopes,
.brat-token-rate {
color: var(--text-muted);
margin-top: 2px;
}
/* Flex break utility */
.brat-modal .break {
flex-basis: 100%;
height: 0;
}
/* Validation status */
.brat-modal .validation-status-error {
color: var(--text-error);
}
.brat-modal .validation-status {
margin-top: 0.5em;
margin-bottom: 0.5em;
font-size: 0.8em;
text-align: left;
}
.confirm-modal .ok-button {
margin-right: 10px;
margin-top: 20px;
}
/* Hide filtered plugin items */
.brat-plugin-item[hidden] {
display: none !important;
}
/* Hide filtered theme items */
.brat-theme-item[hidden] {
display: none !important;
}
/* Filter and button layout */
.brat-filter-and-button {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin: 0.75em 0;
}
.brat-filter-input {
max-width: 300px;
padding: 4px 8px;
border: 1px solid var(--background-modifier-border);
border-radius: 4px;
background-color: var(--background-secondary);
color: var(--text-normal);
}
.brat-filter-input:focus {
outline: none;
border-color: var(--interactive-accent);
}
.brat-filter-and-button .setting-item {
border: none;
padding: 0;
}
.brat-filter-and-button .setting-item-control {
justify-content: flex-end;
}

View File

@@ -0,0 +1,42 @@
{
"useCache": true,
"hideExcluded": true,
"recencyBoost": "0",
"downrankedFoldersFilters": [],
"ignoreDiacritics": true,
"ignoreArabicDiacritics": false,
"indexedFileTypes": [],
"displayTitle": "title",
"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
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
{
"id": "omnisearch",
"name": "Omnisearch",
"version": "1.28.2",
"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
}

View 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;
}

View File

@@ -0,0 +1,553 @@
{
"lightStyle": "oxygen-light",
"darkStyle": "oxygen-dark",
"lightScheme": "oxygen-oxygen-light",
"darkScheme": "oxygen-oxygen-dark",
"editorFont": "",
"lineHeight": 1.5,
"lineWidth": 40,
"lineWidthWide": 50,
"maxWidth": 88,
"textNormal": 16,
"textSmall": 13,
"imgGrid": true,
"imgWidth": "img-default-width",
"tableWidth": "table-default-width",
"iframeWidth": "iframe-default-width",
"mapWidth": "map-default-width",
"chartWidth": "chart-default-width",
"colorfulHeadings": false,
"colorfulFrame": false,
"colorfulActiveStates": false,
"trimNames": true,
"labeledNav": false,
"fullWidthMedia": true,
"workspaceBorders": "enhanced",
"minimalStatus": true,
"underlineInternal": true,
"underlineExternal": true,
"folding": true,
"lineNumbers": false,
"readableLineLength": true,
"devBlockWidth": false,
"customPresets": [
{
"id": "discord",
"name": "Discord",
"author": "David V. Kimball",
"version": "1.0.0",
"light": {
"base": {
"h": 0,
"s": 0,
"l": 98
},
"accent": {
"h": 235,
"s": 86,
"l": 65
},
"colors": {
"bg1": "#fbfbfb",
"bg2": "#f3f3f4",
"bg3": "#ffffff"
}
},
"dark": {
"base": {
"h": 240,
"s": 6,
"l": 7
},
"accent": {
"h": 235,
"s": 86,
"l": 65
},
"colors": {
"bg1": "#1a1a1e",
"bg2": "#121214",
"ui3": "#222327"
},
"frameLightnessOffset": -5
}
}
],
"enableCustomPresets": true,
"navIndentationGuideWidth": "0px",
"navIndentationGuideColor": "rgba(var(--mono-rgb-100), 0.12)",
"animationPersonality": "default",
"animationSpeed": 0.7,
"enableBlur": false,
"useDefaultFolderIcon": false,
"focusMode": false,
"deemphasizeProperties": false,
"autoHideTabBarWhenSingleTab": false,
"hideTitleBarOnHover": false,
"hideTabs": false,
"hideStatus": false,
"hideScroll": false,
"hideSidebarButtons": false,
"hideLeftSidebarButton": false,
"hideRightSidebarButton": false,
"hideTooltips": false,
"hideFileNavButtons": false,
"hideSearchSuggestions": false,
"hideSearchCounts": false,
"hideInstructions": false,
"hidePropertiesReading": true,
"hideVault": false,
"hidePropertiesHeading": true,
"hideAddPropertyButton": true,
"autoHideVaultSwitcher": true,
"autoHideVaultSwitcherBgTransparency": 1,
"hideHelpButton": false,
"autoHideSettingsButton": false,
"collapseFileExplorerButtons": true,
"autoHideFileExplorerNavHeader": false,
"autoHideOtherNavHeaders": false,
"autoHideLeftTabHeaders": false,
"autoHideRightTabHeaders": false,
"collapseOtherNavHeaders": false,
"autoCollapseRibbon": false,
"hideButtonNewNote": false,
"hideButtonNewFolder": false,
"hideButtonSortOrder": false,
"hideButtonAutoReveal": false,
"hideButtonCollapseAll": false,
"hideButtonReadingMode": false,
"hideButtonSearchSettings": false,
"hideTabListIcon": false,
"hideNewTabIcon": false,
"hideTabCloseButton": false,
"hideIconMobileChevrons": false,
"hideButtonMobileNavbarActionBack": false,
"hideButtonMobileNavbarActionForward": false,
"hideButtonMobileNavbarActionQuickSwitcher": false,
"hideButtonMobileNavbarActionNewTab": false,
"hideButtonMobileNavbarActionTabs": false,
"hideButtonMobileNavbarActionMenu": false,
"swapMobileNewTabIcon": false,
"orderNavbarButton1": "order-navbar-button-nth-child-1-1",
"orderNavbarButton2": "order-navbar-button-nth-child-2-2",
"orderNavbarButton3": "order-navbar-button-nth-child-3-3",
"orderNavbarButton4": "order-navbar-button-nth-child-4-4",
"orderNavbarButton5": "order-navbar-button-nth-child-5-5",
"orderNavbarButton6": "order-navbar-button-nth-child-6-6",
"helpButtonReplacement": {
"enabled": false,
"commandId": "oxygen-settings:oxygen-settings:open-settings",
"iconId": "lucide-settings-2"
},
"autoHideVaultSwitcherTransparency": 0,
"zenMode": false,
"zenModeFullscreen": false,
"zenModeLeftSidebar": true,
"zenModeRightSidebar": true,
"bordersToggle": false,
"workspaceBordersEnhanced": true,
"keepTabBorders": false,
"autoHideScrollbars": false,
"statusBarStyle": "status-bar-default",
"uiHoverReveal": false,
"uiHoverRevealViewHeaderLeft": false,
"uiHoverRevealViewActions": false,
"uiHoverRevealSidebarToggleLeft": false,
"uiHoverRevealSidebarToggleRight": false,
"uiHoverRevealOpacity": 50,
"focusModeEnhanced": false,
"focusModeOpacity": 50,
"focusViewHeaderOpacity": 50,
"focusHideViewHeaderLeft": false,
"focusHideViewActions": false,
"focusHideSidebarToggleButtons": false,
"scrollbarHide": false,
"interfaceFont": "",
"densityModifier": 1,
"radiusModifier": 1,
"iconStrokeModifier": 1,
"layoutStyle": "minimal",
"elementStyle": "minimal",
"mobileStyle": "stable",
"tabTitleFontSize": "0.9em",
"tabTitleFontWeight": 400,
"tabTitleAlignment": "center",
"headerHeight": "40px",
"fileHeaderVisibility": "minimal-tab-title-hover",
"sidebarActiveFileStyle": "subtle",
"sidebarColorfulFolders": "none",
"sidebarItemNameSize": "13px",
"sidebarLargeNewNoteButton": false,
"sidebarFullItemName": false,
"sidebarBoldFolders": false,
"sidebarAlwaysShowVaultSwitcher": false,
"indentationGuidesThickness": "thin",
"indentationGuidesColor": "subtle",
"windowFrameOpacity": 100,
"windowFrameInvertColors": false,
"windowTitleOff": false,
"frameBackgroundLight": "",
"frameBackgroundDark": "",
"frameIconColorLight": "",
"frameIconColorDark": "",
"titlebarTextColorFocusedLight": "",
"titlebarTextColorFocusedDark": "",
"titlebarTextColorLight": "",
"titlebarTextColorDark": "",
"titlebarTextWeight": 600,
"tabletLeftSidebarWidth": "",
"tabletRightSidebarWidth": "",
"tabletLeftSidebarWidthPinned": "",
"tabletRightSidebarWidthPinned": "",
"monospaceFont": "",
"boldTextModifier": 200,
"focusView": false,
"disableQuickModeSwitcher": false,
"activeLineStyle": "none",
"activeLineColor": "monochrome",
"activeLineBackgroundColorLight": "",
"activeLineBackgroundColorDark": "",
"normalLineWidth": "",
"wideLineWidth": "",
"basesWidth": "default",
"imageWidth": "default",
"mapWidthNew": "default",
"chartWidthNew": "default",
"editorIndentationThickness": "none",
"editorIndentationColor": "subtle",
"editorIndentationGuideColorLight": "",
"editorIndentationGuideColorDark": "",
"editorIndentationGuideColorActiveLight": "",
"editorIndentationGuideColorActiveDark": "",
"propertiesStyle": "default",
"propertiesHideHeading": false,
"propertiesHideAddButton": false,
"propertiesHideIcons": false,
"propertiesDisableLinkWrap": false,
"propertiesNameWidth": 1,
"headingSpacing": "",
"paragraphSpacing": "",
"readableSpacing": false,
"readableSpacingModifier": 0.25,
"pSpacing": "",
"inlineTitleDisableBackground": false,
"inlineTitleFont": "",
"inlineTitleFontSize": "",
"inlineTitleFontWeight": 600,
"inlineTitleColorLight": "",
"inlineTitleColorDark": "",
"h1ColorLight": "",
"h1ColorDark": "",
"h1Font": "",
"h1Size": "",
"h1Weight": 600,
"h1Variant": "normal",
"h1Style": "normal",
"h1Transform": "normal",
"h1DividerLine": false,
"h2ColorLight": "",
"h2ColorDark": "",
"h2Font": "",
"h2Size": "",
"h2Weight": 600,
"h2Variant": "normal",
"h2Style": "normal",
"h2Transform": "normal",
"h2DividerLine": false,
"h3ColorLight": "",
"h3ColorDark": "",
"h3Font": "",
"h3Size": "",
"h3Weight": 600,
"h3Variant": "normal",
"h3Style": "normal",
"h3Transform": "normal",
"h3DividerLine": false,
"h4ColorLight": "",
"h4ColorDark": "",
"h4Font": "",
"h4Size": "",
"h4Weight": 500,
"h4Variant": "normal",
"h4Style": "normal",
"h4Transform": "normal",
"h4DividerLine": false,
"h5ColorLight": "",
"h5ColorDark": "",
"h5Font": "",
"h5Size": "",
"h5Weight": 500,
"h5Variant": "normal",
"h5Style": "normal",
"h5Transform": "normal",
"h5DividerLine": false,
"h6ColorLight": "",
"h6ColorDark": "",
"h6Font": "",
"h6Size": "",
"h6Weight": 400,
"h6Variant": "normal",
"h6Style": "normal",
"h6Transform": "normal",
"h6DividerLine": false,
"headingsColorfulText": false,
"headingsColorfulIndicator": false,
"headingsColorfulBackground": false,
"headingsColorfulFullWidth": false,
"horizontalRuleWidth": "",
"horizontalRuleThickness": 2,
"horizontalRuleAlignment": "start",
"horizontalRuleDashed": false,
"horizontalRuleDashedLineSize": "",
"horizontalRuleDashedLineSpacing": "",
"bannerDisabled": false,
"bannerImageHeight": "",
"bannerImageHeightSmall": "",
"bannerImageSideSpacing": "",
"bannerImageRadius": 8,
"bannerImageFit": "cover",
"bannerImageFadeOffset": "",
"bannerIconSize": "",
"bannerToContentOffset": "",
"blockquotesStyle": "default",
"blockquotesBorderThickness": 1,
"blockquotesFontSize": "",
"blockquotesTextColorLight": "",
"blockquotesTextColorDark": "",
"blockquotesBackgroundColorLight": "",
"blockquotesBackgroundColorDark": "",
"blockquotesBorderColorLight": "",
"blockquotesBorderColorDark": "",
"calloutsStyle": "filled",
"calloutsBlendMode": "normal",
"calloutsFontSize": "",
"codeBlocksStyle": "filled",
"codeBlocksFontSize": "",
"codeBlocksLineNumbers": false,
"codeBlocksScrollLongLines": false,
"codeBackgroundColorLight": "",
"codeBackgroundColorDark": "",
"codeTextColorLight": "",
"codeTextColorDark": "",
"codeCommentColorLight": "",
"codeCommentColorDark": "",
"codeFunctionColorLight": "",
"codeFunctionColorDark": "",
"codeKeywordColorLight": "",
"codeKeywordColorDark": "",
"codeImportantColorLight": "",
"codeImportantColorDark": "",
"codeOperatorColorLight": "",
"codeOperatorColorDark": "",
"codePropertyColorLight": "",
"codePropertyColorDark": "",
"codePunctuationColorLight": "",
"codePunctuationColorDark": "",
"codeStringColorLight": "",
"codeStringColorDark": "",
"codeTagColorLight": "",
"codeTagColorDark": "",
"codeValueColorLight": "",
"codeValueColorDark": "",
"embedsStyle": "clean",
"embedsBorderThickness": 2,
"embedsHideTitles": false,
"embedsMaxHeight": "",
"embedsStrict": false,
"embedsUnderline": false,
"embedsDecorationStyle": "solid",
"embedsDecorationColorLight": "",
"embedsDecorationColorDark": "",
"embedsBackgroundLight": "",
"embedsBackgroundDark": "",
"mediaRadius": 8,
"mediaOpacityDark": 1,
"mediaDisableMaximized": false,
"mediaDisableZoom": false,
"imageBlendLight": false,
"imageGridFit": "cover",
"imageGridBackgroundLight": "",
"imageGridBackgroundDark": "",
"pdfsPageStyle": "seamless",
"pdfsOpacityDark": 1,
"pdfsInvertDark": false,
"basesToolbarLabel": "visible",
"basesToolbarOpacity": 1,
"basesTableRowHeight": 30,
"basesStripedRows": false,
"basesStripedColumns": false,
"basesTableHeaderIcons": "visible",
"basesTableVerticalAlignment": "top",
"canvasBackgroundColor": "",
"canvasDotPatternColor": "",
"iconMuted": 0.5,
"iconColorLight": "",
"iconColorDark": "",
"iconColorHoverLight": "",
"iconColorHoverDark": "",
"iconColorActiveLight": "",
"iconColorActiveDark": "",
"iconColorFocusedLight": "",
"iconColorFocusedDark": "",
"graphLineColorLight": "",
"graphLineColorDark": "",
"graphNodeColorLight": "",
"graphNodeColorDark": "",
"graphNodeFocusedColorLight": "",
"graphNodeFocusedColorDark": "",
"graphNodeTagColorLight": "",
"graphNodeTagColorDark": "",
"graphNodeAttachmentColorLight": "",
"graphNodeAttachmentColorDark": "",
"graphNodeUnresolvedColorLight": "",
"graphNodeUnresolvedColorDark": "",
"dataviewTrimCols": false,
"dataviewInlineLists": false,
"dataviewMaxColWidth": "",
"linksInternalUnderline": "underline",
"linksExternalUnderline": "underline",
"linkColorLight": "",
"linkColorDark": "",
"linkColorHoverLight": "",
"linkColorHoverDark": "",
"linkUnresolvedColorLight": "",
"linkUnresolvedColorDark": "",
"linkUnresolvedDecorationColorLight": "",
"linkUnresolvedDecorationColorDark": "",
"linkUnresolvedOpacity": 0.5,
"linkExternalColorLight": "",
"linkExternalColorDark": "",
"linkExternalColorHoverLight": "",
"linkExternalColorHoverDark": "",
"listsSpacing": 0.075,
"listsIndent": 2,
"listsBulletColorLight": "",
"listsBulletColorDark": "",
"listsOrderedStyle": "decimal",
"listsDisableStrikeTasks": false,
"tablesFontSize": "",
"tablesRowLines": false,
"tablesColumnLines": false,
"tablesFrame": false,
"tablesStripedRows": false,
"tablesStripedColumns": false,
"tablesTabularFigures": false,
"tablesRowNumbers": false,
"tablesFitContentWidth": false,
"tablesDisableLineWrap": false,
"tablesHeaderAlignment": "start",
"tablesBodyAlignment": "start",
"tablesHighlightActiveRow": false,
"tableColumnMinWidth": "",
"tableColumnMaxWidth": "",
"maximizeTables": "maximize-tables-off",
"tableCenter": false,
"tableRowBackgroundHoverLight": "",
"tableRowBackgroundHoverDark": "",
"tagsPlain": false,
"tagsShape": "pill",
"tagsBorderWidth": 0,
"tagColorLight": "",
"tagColorDark": "",
"tagBackgroundColorLight": "",
"tagBackgroundColorDark": "",
"tagBorderColorLight": "",
"tagBorderColorDark": "",
"tasksCheckboxColorLight": "",
"tasksCheckboxColorDark": "",
"tasksCheckboxShape": "rounded",
"ribbonStyle": "ribbon-hidden",
"tabsStyle": "tabs-default",
"tabTextColorLight": "",
"tabTextColorDark": "",
"tabTextColorActiveLight": "",
"tabTextColorActiveDark": "",
"tabStackedPaneWidth": 700,
"tabStackedHeaderWidth": 40,
"tabStackedSpineOrientation": "tab-stack-top",
"tabStackedSpineOrder": "row",
"textFormattingColorLight": "",
"textFormattingColorDark": "",
"italicColorLight": "",
"italicColorDark": "",
"boldColorLight": "",
"boldColorDark": "",
"titleColorLight": "",
"titleColorDark": "",
"titleColorInactiveLight": "",
"titleColorInactiveDark": "",
"workspaceBackgroundTranslucentLight": "",
"workspaceBackgroundTranslucentDark": "",
"cardsMinWidth": "",
"cardsMaxWidth": "",
"cardsMobileWidth": "",
"cardsPadding": "",
"cardsImageHeight": "",
"cardsBorderWidth": "",
"cardsBackgroundLight": "",
"cardsBackgroundDark": "",
"cardsBackgroundHoverLight": "",
"cardsBackgroundHoverDark": "",
"hideMarkdown": false,
"hideSettingsDesc": false,
"cursor": "default",
"baseColorLight": "",
"baseColorDark": "",
"bg1Light": "",
"bg1Dark": "",
"bg2Light": "",
"bg2Dark": "",
"bg3Light": "",
"bg3Dark": "",
"ui1Light": "",
"ui1Dark": "",
"ui2Light": "",
"ui2Dark": "",
"ui3Light": "",
"ui3Dark": "",
"ax1Light": "",
"ax1Dark": "",
"ax2Light": "",
"ax2Dark": "",
"ax3Light": "",
"ax3Dark": "",
"sp1Light": "",
"sp1Dark": "",
"tx1Light": "",
"tx1Dark": "",
"tx2Light": "",
"tx2Dark": "",
"tx3Light": "",
"tx3Dark": "",
"hl1Light": "",
"hl1Dark": "",
"hl2Light": "",
"hl2Dark": "",
"colorRedLight": "",
"colorRedDark": "",
"colorOrangeLight": "",
"colorOrangeDark": "",
"colorYellowLight": "",
"colorYellowDark": "",
"colorGreenLight": "",
"colorGreenDark": "",
"colorCyanLight": "",
"colorCyanDark": "",
"colorBlueLight": "",
"colorBlueDark": "",
"colorPurpleLight": "",
"colorPurpleDark": "",
"colorPinkLight": "",
"colorPinkDark": "",
"foldingOffset": 32,
"gutterBackgroundLight": "",
"gutterBackgroundDark": "",
"lineNumberColorLight": "",
"lineNumberColorDark": "",
"lineNumberColorActiveLight": "",
"lineNumberColorActiveDark": "",
"dashedUnderlineInternal": false,
"_migrationVersions": [
"minimal-to-oxygen-prefix-v1"
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"id":"oxygen-settings","name":"Oxygen Theme Settings","version":"0.3.8","minAppVersion":"1.11.0","description":"Configure advanced customization options in Oxygen Theme.","author":"David V. Kimball","authorUrl":"https://davidvkimball.com","fundingUrl":"https://patreon.com/davidvkimball","isDesktopOnly":false}

View File

@@ -0,0 +1,764 @@
/* ========================================
Oxygen Settings Plugin Styles
======================================== */
/* ========================================
Preset Editor Modal Styles
======================================== */
.preset-editor-modal .modal-content {
max-height: 70vh;
overflow-y: auto;
}
.modal-section {
margin-bottom: 1.5rem;
}
.mode-section {
margin-bottom: 2rem;
padding-bottom: 1.5rem;
border-bottom: 1px solid var(--background-modifier-border);
}
.mode-section:last-of-type {
border-bottom: none;
}
.mode-section h3 {
color: var(--text-normal);
margin-bottom: 1rem;
}
.color-section {
margin-bottom: 1.5rem;
}
.preset-editor-modal .color-section h3 {
color: var(--text-normal) !important;
margin-bottom: 0.75rem;
font-size: 0.95rem;
}
.color-group {
margin-bottom: 1rem;
}
.color-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
}
.collapsible-item {
padding-left: 0;
margin-top: 0.5rem;
}
.color-override {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 0.75rem;
padding-left: 0.5rem;
}
.override-header {
display: flex;
align-items: center;
gap: 0.5rem;
width: 100%;
}
.color-input-wrapper {
width: 2rem;
height: 2rem;
display: inline-block;
position: relative;
}
.color-preview-swatch {
transition: opacity 0.2s ease, border-color 0.2s ease;
}
.color-preview-swatch:hover {
border-color: var(--text-muted) !important;
}
/* Dim the color preview when the input is disabled */
.color-input-wrapper:has(input:disabled) .color-preview-swatch {
opacity: 0.5;
cursor: not-allowed !important;
}
.mode-tabs {
display: flex;
border-bottom: 1px solid var(--background-modifier-border);
margin-bottom: 1rem;
}
.mode-tab {
background: none;
border: none;
padding: 0.5rem 1rem;
cursor: pointer;
border-bottom: 2px solid transparent;
color: var(--text-muted);
font-size: 0.9rem;
transition: color 0.2s ease;
}
.mode-tab:hover {
color: var(--text-normal);
}
.mode-tab.active {
color: var(--text-normal);
border-bottom-color: var(--text-accent);
font-weight: 500;
}
.mode-content {
display: none;
}
.mode-content.active {
display: block;
}
.color-section {
margin-bottom: 1.5rem;
}
.color-group {
margin-bottom: 1rem;
}
.color-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
}
.hsl-controls {
display: grid;
grid-template-columns: 1fr 1fr 1fr auto;
gap: 1rem;
align-items: center;
}
.hsl-control {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.hsl-control label {
font-size: 0.8rem;
margin: 0;
}
.hsl-control input[type="range"] {
width: 100%;
}
.hsl-control span {
font-size: 0.8rem;
color: var(--text-muted);
min-width: 2rem;
text-align: center;
}
.preset-editor-modal .color-preview {
width: 2rem;
height: 2rem;
border-radius: 3px;
border: 1px solid var(--background-modifier-border);
}
.color-preview-section {
margin-bottom: 1.5rem;
}
.color-preview-section h4 {
margin: 0 0 1rem 0;
font-size: 1rem;
font-weight: 600;
}
.color-details-section {
margin-top: 1rem;
}
.color-details-section h4 {
margin: 0 0 1rem 0;
font-size: 1rem;
font-weight: 600;
}
.collapsible-header {
display: flex;
justify-content: space-between;
align-items: center;
cursor: default;
padding: 0.5rem 0;
margin-bottom: 0.5rem;
}
.collapsible-header h4 {
margin: 0;
font-size: 0.9rem;
font-weight: 500;
color: var(--text-normal);
}
.collapse-toggle {
background: none !important;
border: none !important;
box-shadow: none !important;
color: var(--text-muted);
cursor: default;
padding: 0 !important;
margin: 0 !important;
width: 20px !important;
height: 20px !important;
outline: none !important;
font-family: inherit;
display: flex !important;
align-items: center !important;
justify-content: center !important;
flex-shrink: 0;
}
.collapse-toggle:hover {
color: var(--text-normal);
box-shadow: none !important;
background: none !important;
border: none !important;
}
.collapse-toggle:focus {
outline: none !important;
box-shadow: none !important;
background: none !important;
border: none !important;
}
.collapse-toggle:active {
box-shadow: none !important;
background: none !important;
border: none !important;
}
.collapse-toggle svg {
width: 16px;
height: 16px;
stroke-width: 2;
}
.collapsible-content {
transition: max-height 0.3s ease;
overflow: hidden;
max-height: 0;
}
.collapsible-content:not(.collapsed) {
max-height: 400px;
}
.override-header {
display: flex;
align-items: center;
gap: 0.75rem;
width: 100%;
}
.preview-swatch {
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
padding: 1rem;
background: var(--background-primary);
}
.preview-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.5rem;
}
.preview-row:last-child {
margin-bottom: 0;
}
.preview-label {
font-weight: 500;
min-width: 5rem;
}
.preview-colors {
display: flex;
gap: 0.5rem;
}
.preview-color {
width: 2rem;
height: 2rem;
border-radius: 3px;
border: 1px solid var(--background-modifier-border);
}
.modal-footer {
display: flex;
justify-content: flex-end;
gap: 1rem;
margin-top: 1.5rem;
padding-top: 1rem;
border-top: 1px solid var(--background-modifier-border);
}
.modal-footer button {
min-width: 80px;
}
/* ========================================
Preset Import Modal Styles
======================================== */
.preset-import-modal .modal-content {
max-height: 80vh;
overflow-y: auto;
}
.preset-json-input {
height: 200px !important;
font-family: monospace !important;
font-size: 0.9rem !important;
}
.hidden {
display: none !important;
}
.preview-container {
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
padding: 1rem;
background: var(--background-primary);
min-height: 200px;
}
.preview-placeholder,
.preview-error {
color: var(--text-muted);
font-style: italic;
text-align: center;
margin: 2rem 0;
}
.preview-error {
color: var(--text-error);
}
.error-section {
background: var(--background-modifier-error);
border: 1px solid var(--text-error);
border-radius: 6px;
padding: 1rem;
margin-bottom: 1rem;
}
.error-message {
color: var(--text-error);
font-weight: 500;
}
.preset-info {
margin-bottom: 1rem;
}
.info-row {
margin-bottom: 0.5rem;
}
.preset-id {
font-family: monospace;
background: var(--background-secondary);
padding: 0.2rem 0.4rem;
border-radius: 3px;
font-size: 0.9rem;
}
.mode-toggle {
display: flex;
gap: 0.5rem;
margin-bottom: 1rem;
border-bottom: 1px solid var(--background-modifier-border);
}
.mode-btn {
background: none;
border: none;
padding: 0.5rem 1rem;
cursor: pointer;
border-bottom: 2px solid transparent;
color: var(--text-muted);
font-size: 0.9rem;
transition: color 0.2s ease;
}
.mode-btn:hover {
color: var(--text-normal);
}
.mode-btn.active {
color: var(--text-normal);
border-bottom-color: var(--text-accent);
font-weight: 500;
}
.swatch-container {
margin-top: 0.5rem;
}
.mode-swatches {
display: none;
gap: 1rem;
margin-top: 0.5rem;
}
.mode-swatches.active {
display: flex;
}
.color-swatch {
width: 3rem;
height: 3rem;
border-radius: 6px;
border: 1px solid var(--background-modifier-border);
cursor: pointer;
transition: transform 0.2s ease;
}
.color-swatch:hover {
transform: scale(1.05);
}
.mode-details {
margin-bottom: 1rem;
}
.mode-details h5 {
margin: 0 0 0.5rem 0;
color: var(--text-normal);
}
.color-detail {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.5rem;
font-family: monospace;
font-size: 0.9rem;
}
.detail-swatch {
width: 1.5rem;
height: 1.5rem;
border-radius: 3px;
border: 1px solid var(--background-modifier-border);
flex-shrink: 0;
}
.color-detail span:first-of-type {
color: var(--text-muted);
min-width: 3rem;
}
.overrides-info {
margin-top: 1rem;
padding: 0.5rem;
background: var(--background-secondary);
border-radius: 3px;
font-size: 0.9rem;
color: var(--text-muted);
}
/* ========================================
Settings Tab Styles
======================================== */
.custom-preset-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.75rem;
margin-bottom: 0.5rem;
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
background: var(--background-primary);
transition: background-color 0.2s ease;
}
.custom-preset-item:hover {
background: var(--background-secondary);
}
.preset-info {
display: flex;
align-items: center;
gap: 0.75rem;
flex: 1;
}
.preset-details {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.preset-name {
font-weight: 500;
color: var(--text-normal);
font-size: 0.9rem;
}
.preset-author {
font-size: 0.8rem;
color: var(--text-muted);
}
.custom-preset-item .setting-item {
margin: 0;
padding: 0;
border: none;
background: none;
}
.custom-preset-item .setting-item-info {
display: none;
}
.custom-preset-item .setting-item-control {
display: flex;
gap: 0.25rem;
align-items: center;
}
.custom-preset-item .clickable-icon {
padding: 0.25rem;
border-radius: 3px;
transition: background-color 0.2s ease;
}
.custom-preset-item .clickable-icon:hover {
background: var(--background-modifier-hover);
}
/* ========================================
Sidebar Indentation Guides
======================================== */
/* The theme already handles indentation guides using --nav-indentation-guide-width and --nav-indentation-guide-color */
/* We only need to override when "None" (0px) is selected - make it invisible but keep it for indentation */
body.oxygen-theme[style*="--nav-indentation-guide-width: 0px"] .nav-folder-children::before,
body.oxygen-theme[style*="--nav-indentation-guide-width:0px"] .nav-folder-children::before {
opacity: 0 !important;
visibility: hidden !important;
}
/* ========================================
Workspace Borders Enhancements
======================================== */
/* REMOVED: All border CSS has been moved to the theme */
/* The plugin should ONLY toggle classes (borders-on, borders-none, oxygen-theme) */
/* The theme handles all CSS styling based on these classes */
/* ========================================
Inline Style Replacements
======================================== */
/* Preset Editor Modal - Form Input Styles */
.frame-label {
font-size: 0.9em;
}
.frame-description {
font-size: 0.85em;
margin-bottom: 8px;
}
.frame-input {
width: 80px;
}
/* Collapsible Sections */
.collapsible-content-item {
display: none !important;
}
.collapsible-content-item.expanded {
display: flex !important;
}
/* Preview Color Swatches - use CSS custom properties for dynamic colors */
.preview-color {
width: 2rem;
height: 2rem;
border-radius: 3px;
border: 1px solid var(--background-modifier-border);
background-color: var(--preview-color);
}
/* Color Preview Wrapper */
.color-preview-wrapper {
position: relative;
display: inline-block;
}
.color-preview {
width: 2rem;
height: 2rem;
border-radius: 3px;
border: 1px solid var(--background-modifier-border);
cursor: pointer;
background-color: var(--preview-color);
}
/* HSL Color Input Overlay */
.hsl-color-input-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
}
/* Color Input Wrapper */
.color-input-wrapper {
position: relative;
}
.color-preview-swatch {
width: 2rem;
height: 2rem;
border-radius: 50%;
border: 2px solid var(--background-modifier-border);
cursor: pointer;
background-color: var(--preview-color);
}
/* Custom Preset ID Display */
.preset-id-display {
font-size: 0.8rem;
color: var(--text-muted);
font-family: monospace;
}
/* Confirmation Modal Button Container */
.modal-button-container {
display: flex;
gap: 10px;
justify-content: flex-end;
margin-top: 20px;
}
.modal-button-container .mod-cta.confirm-button {
background-color: var(--interactive-accent);
color: var(--text-on-accent);
}
/* Color Swatch with Dynamic Background */
.color-swatch {
background-color: hsl(var(--swatch-hsl));
}
/* Detail Swatch */
.detail-swatch {
background-color: hsl(var(--detail-hsl));
}
/* Custom Preset Swatch */
.custom-preset-swatch {
display: inline-block;
width: 20px;
height: 20px;
border-radius: 3px;
border: 1px solid var(--background-modifier-border);
margin-right: 8px;
vertical-align: middle;
background: linear-gradient(45deg,
var(--swatch-gradient-start) 0%,
var(--swatch-gradient-mid) 50%,
var(--swatch-gradient-end) 100%);
}
/* Ensure cmdr buttons are treated the same as nav-action-button */
/* This makes cmdr buttons first-class citizens alongside regular nav-action-button elements */
body .mod-sidedock .workspace-leaf-content > .nav-header .cmdr.clickable-icon,
body .mod-sidedock .workspace-leaf-content > .view-content > .nav-header .cmdr.clickable-icon {
/* Inherit nav-action-button styling */
display: inline-flex;
align-items: center;
justify-content: center;
}
/* Ensure cmdr buttons in view-actions are treated the same as regular view-action buttons */
/* This makes cmdr buttons in view headers match the normal color of other view-action buttons */
/* Override inline styles and ensure they use the same color/opacity as default view-action buttons */
body .view-header .view-actions .cmdr.clickable-icon.view-action,
body .view-header .view-actions .cmdr-page-header.clickable-icon.view-action {
opacity: var(--icon-opacity) !important;
color: var(--icon-color) !important;
}
/* Also target the SVG inside cmdr buttons to ensure stroke color matches */
body .view-header .view-actions .cmdr.clickable-icon.view-action svg,
body .view-header .view-actions .cmdr-page-header.clickable-icon.view-action svg {
color: var(--icon-color) !important;
stroke: currentColor !important;
}
/* ========================================
Background Blur Effect
======================================== */
/* Base modal-bg styling - use theme's cover color for proper dimming */
/* Opacity is set inline by Obsidian (0.85), we just need to ensure background color is applied */
body.oxygen-theme:not(.is-mobile) .modal-bg {
background-color: var(--background-modifier-cover) !important;
}
/* Apply blur effect to modal background only */
/* Only applies on desktop (not mobile) and when Oxygen theme is active */
body.oxygen-theme:not(.is-mobile).enable-blur .modal-bg {
backdrop-filter: blur(1px) brightness(0.98);
-moz-osx-font-smoothing: grayscale;
}
/* Scoped to only this plugin's settings container to avoid affecting other plugins */
/* ========================================
Colorful Frame Fixes
======================================== */
.colorful-frame .titlebar {
background-color: var(--frame-background) !important;
}
/* Ensure background applies even without border classes (Enhanced) */
body.colorful-frame:not(.borders-on):not(.borders-none) .titlebar {
background-color: var(--frame-background) !important;
}
/* Fix for "None" borders (removes weird line) */
body.colorful-frame.borders-none .workspace-tab-header-container {
border: none !important;
box-shadow: none !important;
}

View File

@@ -0,0 +1,108 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
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);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => PasteImageIntoProperty
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
var PasteImageIntoProperty = class extends import_obsidian.Plugin {
async onload() {
this.registerDomEvent(document, "paste", (evt) => this.handlePaste(evt), true);
}
handlePaste(evt) {
var _a;
const activeEl = document.activeElement;
if (!evt.clipboardData || evt.clipboardData.types[0] != "Files")
return false;
const isFrontmatterFieldSupported = this.isSupportedFrontmatterField(activeEl);
if (isFrontmatterFieldSupported)
this.handleImagePaste(evt, activeEl);
else if (this.isFrontmatterField(activeEl.parentElement) || this.isFrontmatterField((_a = activeEl.parentElement) == null ? void 0 : _a.parentElement))
new import_obsidian.Notice(`Pasting images is only supported in property type "Text"!`);
}
isFrontmatterField(element) {
if (!element)
return false;
return element.matches(".metadata-property-value");
}
isSupportedFrontmatterField(element) {
if (!element)
return false;
return element.matches(".metadata-input-longtext");
}
async handleImagePaste(evt, target) {
const items = evt.clipboardData.items;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (item.kind === "file" && item.type.startsWith("image/")) {
const file = item.getAsFile();
if (file) {
await this.saveImageAndWriteLink(file, target);
evt.preventDefault();
break;
}
}
}
}
async saveImageAndWriteLink(file, target) {
var _a;
const arrayBuffer = await file.arrayBuffer();
const fileExtension = file.type.split("/")[1] || "png";
const fileName = `Pasted image ${Date.now()}.${fileExtension}`;
const activeFile = this.app.workspace.getActiveFile();
if (!activeFile) {
new import_obsidian.Notice(`No active file!`);
return;
}
const savePath = await this.app.fileManager.getAvailablePathForAttachment(fileName, activeFile.path);
const activeEl = document.activeElement;
const propertyName = (_a = activeEl.closest(".metadata-property")) == null ? void 0 : _a.getAttribute("data-property-key");
const newFile = await this.app.vault.createBinary(savePath, arrayBuffer);
const linkName = savePath.split("/").last();
await this.writeLinkIntoFrontmatter(activeFile, `[[${linkName}]]`, activeEl, propertyName, newFile);
}
async writeLinkIntoFrontmatter(activeFile, filePath, activeEl, propertyName, newFile) {
if (document.activeElement == activeEl)
activeEl.blur();
await new Promise((resolve) => setTimeout(resolve, 50));
try {
if (!propertyName)
throw new Error("data-property-key attribute not found on the expected element.");
await this.app.fileManager.processFrontMatter(activeFile, (frontmatter) => {
frontmatter[propertyName] = filePath;
});
new import_obsidian.Notice(`Image added to frontmatter: ${filePath}`);
} catch (error) {
await this.app.vault.delete(newFile);
new import_obsidian.Notice(`Failed to update frontmatter!
${error}`);
console.error("Error updating frontmatter:", error);
}
}
};
/* nosourcemap */

View File

@@ -0,0 +1,10 @@
{
"id": "paste-image-into-property",
"name": "Paste Image Into Property",
"version": "1.0.6",
"minAppVersion": "0.15.0",
"description": "Paste images from the clipboard into frontmatter properties in live preview.",
"author": "Nito",
"authorUrl": "https://github.com/Nitero",
"isDesktopOnly": true
}

View File

@@ -0,0 +1,21 @@
{
"propertyKey": "title",
"enableForLinking": true,
"enableForQuickSwitcher": true,
"includeFilenameInSearch": true,
"includeAliasesInSearch": true,
"enableForDragDrop": true,
"useSimpleSearch": false,
"enableForGraphView": true,
"enableForBacklinks": true,
"hideUnlinkedMentionsInBacklinks": false,
"enableForTabs": true,
"enableForExplorer": false,
"folderNoteFilename": "index",
"enableForWindowFrame": true,
"enableForBookmarks": true,
"enableMdxSupport": true,
"quickSwitcherExcludedBehavior": "deemphasize",
"linkSuggesterExcludedBehavior": "deemphasize",
"enableForWindowTitle": true
}

File diff suppressed because one or more lines are too long

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