import vault

This commit is contained in:
Marcel Arndt
2026-07-16 14:04:45 +02:00
commit a2ad5f5c6d
90 changed files with 31429 additions and 0 deletions
BIN
View File
Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
{
"newFileLocation": "folder",
"newFileFolderPath": "00-inbox",
"attachmentFolderPath": "_attachments"
}
+9
View File
@@ -0,0 +1,9 @@
{
"enabledCssSnippets": [
"MCL Wide Views",
"MCL Multi Column",
"MCL Gallery Cards",
"Colored Sidebar Items"
],
"theme": "moonstone"
}
+7
View File
@@ -0,0 +1,7 @@
[
"dataview",
"templater-obsidian",
"kanban-bases-view",
"quickadd",
"obsidian-linter"
]
+33
View File
@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}
+22
View File
@@ -0,0 +1,22 @@
{
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 0.5649432319816575,
"close": false
}
+10
View File
@@ -0,0 +1,10 @@
{
"templater-obsidian:insert-templater": [
{
"modifiers": [
"Ctrl"
],
"key": "N"
}
]
}
+27
View File
@@ -0,0 +1,27 @@
{
"renderNullAs": "\\-",
"taskCompletionTracking": false,
"taskCompletionUseEmojiShorthand": false,
"taskCompletionText": "completion",
"taskCompletionDateFormat": "yyyy-MM-dd",
"recursiveSubTaskCompletion": false,
"warnOnEmptyResult": true,
"refreshEnabled": true,
"refreshInterval": 2500,
"defaultDateFormat": "MMMM dd, yyyy",
"defaultDateTimeFormat": "h:mm a - MMMM dd, yyyy",
"maxRecursiveRenderDepth": 4,
"tableIdColumnName": "File",
"tableGroupColumnName": "Group",
"showResultCount": true,
"allowHtml": true,
"inlineQueryPrefix": "=",
"inlineJsQueryPrefix": "$=",
"inlineQueriesInCodeblocks": true,
"enableInlineDataview": true,
"enableDataviewJs": true,
"enableInlineDataviewJs": true,
"prettyRenderInlineFields": true,
"prettyRenderInlineFieldsInLivePreview": true,
"dataviewJsKeyword": "dataviewjs"
}
+20876
View File
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "dataview",
"name": "Dataview",
"version": "0.5.68",
"minAppVersion": "0.13.11",
"description": "Complex data views for the data-obsessed.",
"author": "Michael Brenan <blacksmithgu@gmail.com>",
"authorUrl": "https://github.com/blacksmithgu",
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
"isDesktopOnly": false
}
+141
View File
@@ -0,0 +1,141 @@
.block-language-dataview {
overflow-y: auto;
}
/*****************/
/** Table Views **/
/*****************/
/* List View Default Styling; rendered internally as a table. */
.table-view-table {
width: 100%;
}
.table-view-table > thead > tr, .table-view-table > tbody > tr {
margin-top: 1em;
margin-bottom: 1em;
text-align: left;
}
.table-view-table > tbody > tr:hover {
background-color: var(--table-row-background-hover);
}
.table-view-table > thead > tr > th {
font-weight: 700;
font-size: larger;
border-top: none;
border-left: none;
border-right: none;
border-bottom: solid;
max-width: 100%;
}
.table-view-table > tbody > tr > td {
text-align: left;
border: none;
font-weight: 400;
max-width: 100%;
}
.table-view-table ul, .table-view-table ol {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Rendered value styling for any view. */
.dataview-result-list-root-ul {
padding: 0em !important;
margin: 0em !important;
}
.dataview-result-list-ul {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Generic grouping styling. */
.dataview.result-group {
padding-left: 8px;
}
/*******************/
/** Inline Fields **/
/*******************/
.dataview.inline-field-key {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-primary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-standalone-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
/***************/
/** Task View **/
/***************/
.dataview.task-list-item, .dataview.task-list-basic-item {
margin-top: 3px;
margin-bottom: 3px;
transition: 0.4s;
}
.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
background-color: var(--text-selection);
box-shadow: -40px 0 0 var(--text-selection);
cursor: pointer;
}
/*****************/
/** Error Views **/
/*****************/
div.dataview-error-box {
width: 100%;
min-height: 150px;
display: flex;
align-items: center;
justify-content: center;
border: 4px dashed var(--background-secondary);
}
.dataview-error-message {
color: var(--text-muted);
text-align: center;
}
/*************************/
/** Additional Metadata **/
/*************************/
.dataview.small-text {
font-size: smaller;
color: var(--text-muted);
margin-left: 3px;
}
.dataview.small-text::before {
content: "(";
}
.dataview.small-text::after {
content: ")";
}
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
{
"id": "kanban-bases-view",
"name": "Kanban Bases View",
"version": "0.10.1",
"minAppVersion": "1.10.2",
"description": "A kanban-style drag-and-drop custom view for Bases.",
"author": "I. Welch Canavan",
"authorUrl": "https://welchcanavan.com",
"isDesktopOnly": false
}
+617
View File
@@ -0,0 +1,617 @@
/* Kanban View Container */
.obk-view-container {
container-type: inline-size;
height: 100%;
display: flex;
flex-direction: column;
padding: 10px;
overflow: hidden;
}
/* Property Selector */
.obk-property-selector {
margin-bottom: 15px;
padding: 10px;
background: var(--background-secondary);
border-radius: 6px;
display: flex;
align-items: center;
gap: 10px;
}
.obk-property-label {
font-weight: 500;
color: var(--text-normal);
}
.obk-property-select {
padding: 6px 12px;
border: 1px solid var(--background-modifier-border);
border-radius: 4px;
background: var(--background-primary);
color: var(--text-normal);
font-size: 14px;
cursor: pointer;
}
.obk-property-select:hover {
border-color: var(--interactive-hover);
}
.obk-property-select:focus {
outline: 2px solid var(--interactive-accent);
outline-offset: 2px;
}
/* Empty State */
.obk-empty-state {
padding: 40px 20px;
text-align: center;
color: var(--text-muted);
font-style: italic;
}
/* Kanban Board */
.obk-board {
display: flex;
gap: 15px;
overflow-x: auto;
overflow-y: hidden;
flex: 1;
padding-bottom: 10px;
}
.obk-board::-webkit-scrollbar {
height: 8px;
}
.obk-board::-webkit-scrollbar-track {
background: var(--background-secondary);
border-radius: 4px;
}
.obk-board::-webkit-scrollbar-thumb {
background: var(--background-modifier-border);
border-radius: 4px;
}
.obk-board::-webkit-scrollbar-thumb:hover {
background: var(--background-modifier-border-hover);
}
/* Swimlane mode: stack lanes vertically. The lane body becomes the
horizontal column flex (replacing what .obk-board does in flat mode). */
.obk-board--with-swimlanes {
flex-direction: column;
overflow-x: hidden;
overflow-y: auto;
gap: 12px;
}
.obk-swimlane {
display: flex;
flex-direction: column;
background: var(--background-secondary-alt);
border-radius: 8px;
border: 1px solid var(--background-modifier-border);
overflow: hidden;
}
.obk-swimlane-header {
padding: 8px 14px;
background: var(--background-primary-alt);
border-bottom: 1px solid var(--background-modifier-border);
display: flex;
align-items: center;
gap: 10px;
font-weight: 600;
font-size: 13px;
color: var(--text-normal);
text-transform: capitalize;
flex-shrink: 0;
}
.obk-swimlane-count {
font-size: 12px;
color: var(--text-muted);
background: var(--background-modifier-border);
padding: 2px 8px;
border-radius: 12px;
font-weight: 500;
}
.obk-swimlane-body {
display: flex;
align-items: stretch;
gap: 12px;
overflow-x: auto;
overflow-y: visible;
padding: 12px;
min-height: 140px;
}
/* In swimlane mode, each lane grows tall enough to fit the fullest column,
and shorter column bodies stretch to that height so their Sortable drop
target spans the whole lane row. */
.obk-board--with-swimlanes .obk-column {
min-height: 0;
max-height: none;
height: auto;
overflow: visible;
align-self: stretch;
}
.obk-board--with-swimlanes .obk-column-body {
flex: 1 1 auto;
max-height: none;
overflow-y: visible;
min-height: 0;
}
/* The outer container caps height in flat mode; release it in swimlane mode
so the board grows to fit all lanes and the parent scroll-area scrolls. */
.obk-view-container--with-swimlanes {
overflow: visible;
height: auto;
}
/* Collapsed lane: cap the column body at about 30% less than the original
420px height and scroll within the
column. The lane and column themselves stay flexible — only the card
container is capped. */
.obk-swimlane--collapsed .obk-column-body {
max-height: 294px;
overflow-y: auto;
}
.obk-swimlane-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
padding: 0;
color: var(--text-muted);
background: var(--background-modifier-border);
border: 0;
border-radius: 4px;
cursor: pointer;
user-select: none;
--icon-size: var(--icon-xs);
transition:
background 0.1s ease,
color 0.1s ease;
}
.obk-swimlane-toggle:hover {
color: var(--text-normal);
background: var(--background-modifier-border-hover);
}
.obk-swimlane-toggle:focus-visible {
outline: 2px solid var(--background-modifier-border-focus);
outline-offset: 2px;
}
.obk-swimlane-drag-handle {
cursor: grab;
padding: 2px 4px;
opacity: 0.5;
user-select: none;
font-size: 14px;
line-height: 1;
color: var(--text-muted);
display: flex;
align-items: center;
flex-shrink: 0;
}
.obk-swimlane-drag-handle:hover {
opacity: 1;
color: var(--text-normal);
}
.obk-swimlane-drag-handle:active {
cursor: grabbing;
}
.obk-swimlane-dragging {
opacity: 0.5;
}
.obk-swimlane-ghost {
opacity: 0.3;
background: var(--background-modifier-border);
}
.obk-swimlane-body::-webkit-scrollbar {
height: 8px;
}
.obk-swimlane-body::-webkit-scrollbar-track {
background: transparent;
}
.obk-swimlane-body::-webkit-scrollbar-thumb {
background: var(--background-modifier-border);
border-radius: 4px;
}
.obk-swimlane-body::-webkit-scrollbar-thumb:hover {
background: var(--background-modifier-border-hover);
}
/* Kanban Column */
.obk-column {
--obk-column-accent-color: transparent;
flex: 0 0 clamp(200px, 60cqw, 280px);
display: flex;
flex-direction: column;
background: var(--background-secondary);
border-radius: 8px;
border: 1px solid var(--background-modifier-border);
min-height: 200px;
max-height: 100%;
overflow: hidden;
}
.obk-column-header {
padding: 12px 16px;
background: color-mix(in srgb, var(--obk-column-accent-color, transparent) 15%, var(--background-primary-alt));
border-bottom: 1px solid var(--background-modifier-border);
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
gap: 8px;
}
/* Column color picker button */
.obk-column-color-btn {
width: 16px;
height: 16px;
border-radius: 50%;
border: 2px solid var(--background-modifier-border);
background: var(--obk-column-accent-color, transparent);
cursor: pointer;
flex-shrink: 0;
transition:
transform 0.1s ease,
border-color 0.1s ease;
}
.obk-column-color-btn:hover {
border-color: var(--text-muted);
transform: scale(1.15);
}
/* Color picker popover */
.obk-column-color-popover {
position: fixed;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
padding: 8px;
display: flex;
gap: 6px;
flex-wrap: wrap;
width: 164px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
z-index: 100;
}
.obk-column-color-swatch {
width: 20px;
height: 20px;
border-radius: 50%;
cursor: pointer;
border: 2px solid transparent;
transition:
transform 0.1s ease,
border-color 0.1s ease;
}
.obk-column-color-swatch:hover {
transform: scale(1.2);
}
.obk-column-color-swatch--active {
border-color: var(--text-normal);
}
.obk-column-color-none {
background: var(--background-modifier-border);
position: relative;
}
.obk-column-color-none::before,
.obk-column-color-none::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
width: 10px;
height: 1.5px;
background: var(--text-muted);
border-radius: 1px;
transform-origin: center;
}
.obk-column-color-none::before {
transform: translate(-50%, -50%) rotate(45deg);
}
.obk-column-color-none::after {
transform: translate(-50%, -50%) rotate(-45deg);
}
.obk-column-drag-handle {
cursor: grab;
padding: 4px;
opacity: 0.5;
user-select: none;
font-size: 16px;
line-height: 1;
color: var(--text-muted);
display: flex;
align-items: center;
}
.obk-column-drag-handle:hover {
opacity: 1;
color: var(--text-normal);
}
.obk-column-drag-handle:active {
cursor: grabbing;
}
.obk-column-title {
flex: 1;
font-weight: 600;
font-size: 14px;
color: var(--text-normal);
text-transform: capitalize;
}
.obk-column-count {
font-size: 12px;
color: var(--text-muted);
background: color-mix(in srgb, var(--obk-column-accent-color, transparent) 15%, var(--background-modifier-border));
padding: 2px 8px;
border-radius: 12px;
}
.obk-column-add-btn,
.obk-column-remove-btn {
width: 24px;
height: 24px;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
color: var(--text-muted);
cursor: pointer;
flex-shrink: 0;
transition:
background 0.1s ease,
color 0.1s ease,
opacity 0.1s ease;
}
.obk-column-add-btn {
opacity: 0.55;
}
.obk-column:hover .obk-column-add-btn,
.obk-column-add-btn:focus-visible {
opacity: 1;
}
.obk-column-add-btn:hover,
.obk-column-remove-btn:hover {
color: var(--text-normal);
background: var(--background-modifier-hover);
}
.obk-column-add-btn .svg-icon {
width: 16px;
height: 16px;
}
.obk-column-remove-btn {
font-size: 18px;
line-height: 1;
}
.obk-column-body {
flex: 1;
overflow-y: auto;
padding: 10px;
display: flex;
flex-direction: column;
gap: 10px;
min-height: 0;
}
.obk-column-body::-webkit-scrollbar {
width: 6px;
}
.obk-column-body::-webkit-scrollbar-track {
background: transparent;
}
.obk-column-body::-webkit-scrollbar-thumb {
background: var(--background-modifier-border);
border-radius: 3px;
}
.obk-column-body::-webkit-scrollbar-thumb:hover {
background: var(--background-modifier-border-hover);
}
/* Kanban Card */
.obk-card {
background: var(--background-primary);
border: 1px solid
color-mix(in srgb, var(--obk-column-accent-color, transparent) 15%, var(--background-modifier-border));
border-radius: 6px;
padding: 12px;
cursor: pointer;
transition: all 0.2s ease;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
/* targets touch-first devices (tablets, phones) to make the kanban genuinely usable on
touch screens — any-pointer: coarse alone would also match hybrid devices (e.g.
touchscreen laptops) where the primary pointer is still a mouse */
@media (any-pointer: coarse) and (hover: none) {
.obk-card {
user-select: none;
-webkit-user-select: none;
}
}
.obk-card--hover {
border-color: var(--interactive-accent);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transform: translateY(-1px);
}
.obk-card--active {
border-color: var(--interactive-accent);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--interactive-accent) 25%, transparent);
}
.obk-card-cover {
display: block;
/* Bleed the cover to the card's inner border edge. Card has padding: 12px,
so we expand the width by 24px and pull the box out with negative margins.
width: 100% alone only fills the content box and leaves a 12px gap on each side. */
width: calc(100% + 24px);
margin: -12px -12px 8px -12px;
/* aspect-ratio is set inline from the imageAspectRatio config */
overflow: hidden;
border-top-left-radius: inherit;
border-top-right-radius: inherit;
}
.obk-card-cover img {
width: 100%;
height: 100%;
display: block;
}
.obk-card-cover--fit-cover img {
object-fit: cover;
}
.obk-card-cover--fit-contain img {
object-fit: contain;
background: var(--background-secondary);
}
.obk-card-title {
font-weight: 500;
font-size: 14px;
color: var(--text-normal);
line-height: 1.4;
word-wrap: break-word;
}
.obk-card-preview {
font-size: 12px;
color: var(--text-muted);
line-height: 1.4;
margin-top: 6px;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.obk-card-property {
font-size: var(--font-ui-smaller);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
display: flex;
gap: 6px;
margin-top: 4px;
}
.obk-card-property-wrap {
white-space: normal;
text-overflow: initial;
}
.obk-card-property-wrap .obk-card-property-value {
white-space: normal;
text-overflow: initial;
}
.obk-card-property-label {
color: var(--text-muted);
flex-shrink: 0;
}
.obk-card-property-value {
overflow: hidden;
text-overflow: ellipsis;
}
.obk-card-property-value p {
display: inline;
margin: 0;
}
.obk-quick-add-form {
display: flex;
flex-direction: column;
gap: 14px;
}
.obk-quick-add-input {
width: 100%;
}
.obk-quick-add-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
}
/* Drag and Drop States */
.obk-card-dragging {
opacity: 0.5;
transform: rotate(2deg);
}
.obk-card-ghost {
opacity: 0.3;
background: var(--interactive-accent);
border-color: var(--interactive-accent);
}
.obk-card-chosen {
cursor: grabbing;
transform: rotate(2deg);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
}
/* Column Drag and Drop States */
.obk-column-dragging {
opacity: 0.5;
}
.obk-column-ghost {
opacity: 0.3;
background: var(--background-modifier-border);
}
/* Sortable placeholder */
.obk-sortable-ghost {
opacity: 0.4;
background: var(--interactive-accent);
border: 2px dashed var(--interactive-accent);
border-radius: 6px;
}
+295
View File
@@ -0,0 +1,295 @@
{
"ruleConfigs": {
"add-blank-line-after-yaml": {
"enabled": false
},
"dedupe-yaml-array-values": {
"enabled": false,
"dedupe-alias-key": true,
"dedupe-tag-key": true,
"dedupe-array-keys": true,
"ignore-keys": ""
},
"escape-yaml-special-characters": {
"enabled": false,
"try-to-escape-single-line-arrays": false
},
"force-yaml-escape": {
"enabled": false,
"force-yaml-escape-keys": ""
},
"format-tags-in-yaml": {
"enabled": false
},
"format-yaml-array": {
"enabled": false,
"alias-key": true,
"tag-key": true,
"default-array-style": "single-line",
"default-array-keys": true,
"force-single-line-array-style": "",
"force-multi-line-array-style": ""
},
"insert-yaml-attributes": {
"enabled": false,
"text-to-insert": "aliases: \ntags: "
},
"move-tags-to-yaml": {
"enabled": false,
"how-to-handle-existing-tags": "Nothing",
"tags-to-ignore": ""
},
"remove-yaml-keys": {
"enabled": false,
"yaml-keys-to-remove": ""
},
"sort-yaml-array-values": {
"enabled": false,
"sort-alias-key": true,
"sort-tag-key": true,
"sort-array-keys": true,
"ignore-keys": "",
"sort-order": "Ascending Alphabetical"
},
"yaml-key-sort": {
"enabled": false,
"yaml-key-priority-sort-order": "",
"priority-keys-at-start-of-yaml": true,
"yaml-sort-order-for-other-keys": "None"
},
"yaml-timestamp": {
"enabled": true,
"date-created": true,
"date-created-key": "base_created",
"date-created-source-of-truth": "file system",
"date-modified": true,
"date-modified-key": "base_modified",
"date-modified-source-of-truth": "file system",
"format": "YYYY-MM-DDTHH:mm",
"convert-to-utc": false,
"update-on-file-contents-updated": "never"
},
"yaml-title": {
"enabled": false,
"title-key": "title",
"mode": "first-h1-or-filename-if-h1-missing"
},
"yaml-title-alias": {
"enabled": false,
"preserve-existing-alias-section-style": true,
"keep-alias-that-matches-the-filename": false,
"use-yaml-key-to-keep-track-of-old-filename-or-heading": true,
"alias-helper-key": "linter-yaml-title-alias"
},
"capitalize-headings": {
"enabled": false,
"style": "Title Case",
"ignore-case-words": true,
"ignore-words": "macOS, iOS, iPhone, iPad, JavaScript, TypeScript, AppleScript, I",
"lowercase-words": "a, an, the, aboard, about, abt., above, abreast, absent, across, after, against, along, aloft, alongside, amid, amidst, mid, midst, among, amongst, anti, apropos, around, round, as, aslant, astride, at, atop, ontop, bar, barring, before, B4, behind, below, beneath, neath, beside, besides, between, 'tween, beyond, but, by, chez, circa, c., ca., come, concerning, contra, counting, cum, despite, spite, down, during, effective, ere, except, excepting, excluding, failing, following, for, from, in, including, inside, into, less, like, minus, modulo, mod, near, nearer, nearest, next, notwithstanding, of, o', off, offshore, on, onto, opposite, out, outside, over, o'er, pace, past, pending, per, plus, post, pre, pro, qua, re, regarding, respecting, sans, save, saving, short, since, sub, than, through, thru, throughout, thruout, till, times, to, t', touching, toward, towards, under, underneath, unlike, until, unto, up, upon, versus, vs., v., via, vice, vis-à-vis, wanting, with, w/, w., c̄, within, w/i, without, 'thout, w/o, abroad, adrift, aft, afterward, afterwards, ahead, apart, ashore, aside, away, back, backward, backwards, beforehand, downhill, downstage, downstairs, downstream, downward, downwards, downwind, east, eastward, eastwards, forth, forward, forwards, heavenward, heavenwards, hence, henceforth, here, hereby, herein, hereof, hereto, herewith, home, homeward, homewards, indoors, inward, inwards, leftward, leftwards, north, northeast, northward, northwards, northwest, now, onward, onwards, outdoors, outward, outwards, overboard, overhead, overland, overseas, rightward, rightwards, seaward, seawards, skywards, skyward, south, southeast, southwards, southward, southwest, then, thence, thenceforth, there, thereby, therein, thereof, thereto, therewith, together, underfoot, underground, uphill, upstage, upstairs, upstream, upward, upwards, upwind, west, westward, westwards, when, whence, where, whereby, wherein, whereto, wherewith, although, because, considering, given, granted, if, lest, once, provided, providing, seeing, so, supposing, though, unless, whenever, whereas, wherever, while, whilst, ago, inasmuch, even, whether, whose, whoever, why, how, whatever, what, both, and, or, either, neither, nor, just, rather, such, that, yet, is, it"
},
"file-name-heading": {
"enabled": false
},
"header-increment": {
"enabled": false,
"start-at-h2": false
},
"headings-start-line": {
"enabled": false
},
"remove-trailing-punctuation-in-heading": {
"enabled": false,
"punctuation-to-remove": ".,;:!。,;:!"
},
"footnote-after-punctuation": {
"enabled": false
},
"move-footnotes-to-the-bottom": {
"enabled": false,
"include-blank-line-between-footnotes": false
},
"re-index-footnotes": {
"enabled": false
},
"auto-correct-common-misspellings": {
"enabled": false,
"ignore-words": "",
"skip-words-with-multiple-capitals": false,
"extra-auto-correct-files": []
},
"blockquote-style": {
"enabled": false,
"style": "space"
},
"convert-bullet-list-markers": {
"enabled": false
},
"default-language-for-code-fences": {
"enabled": false,
"default-language": ""
},
"emphasis-style": {
"enabled": false,
"style": "consistent"
},
"no-bare-urls": {
"enabled": false,
"no-bare-uris": false
},
"ordered-list-style": {
"enabled": false,
"number-style": "ascending",
"list-end-style": "."
},
"proper-ellipsis": {
"enabled": false
},
"quote-style": {
"enabled": false,
"single-quote-enabled": true,
"single-quote-style": "''",
"double-quote-enabled": true,
"double-quote-style": "\"\""
},
"remove-consecutive-list-markers": {
"enabled": false
},
"remove-empty-list-markers": {
"enabled": false
},
"remove-hyphenated-line-breaks": {
"enabled": false
},
"remove-multiple-spaces": {
"enabled": false
},
"strong-style": {
"enabled": false,
"style": "consistent"
},
"two-spaces-between-lines-with-content": {
"enabled": false,
"line-break-indicator": " "
},
"unordered-list-style": {
"enabled": false,
"list-style": "consistent"
},
"compact-yaml": {
"enabled": false,
"inner-new-lines": false
},
"consecutive-blank-lines": {
"enabled": false
},
"convert-spaces-to-tabs": {
"enabled": false,
"tabsize": 4
},
"empty-line-around-blockquotes": {
"enabled": false
},
"empty-line-around-code-fences": {
"enabled": false
},
"empty-line-around-horizontal-rules": {
"enabled": false
},
"empty-line-around-math-blocks": {
"enabled": false
},
"empty-line-around-tables": {
"enabled": false
},
"heading-blank-lines": {
"enabled": false,
"bottom": true,
"empty-line-after-yaml": true
},
"line-break-at-document-end": {
"enabled": false
},
"move-math-block-indicators-to-their-own-line": {
"enabled": false
},
"paragraph-blank-lines": {
"enabled": false
},
"remove-empty-lines-between-list-markers-and-checklists": {
"enabled": false
},
"remove-link-spacing": {
"enabled": false
},
"remove-space-around-characters": {
"enabled": false,
"include-fullwidth-forms": true,
"include-cjk-symbols-and-punctuation": true,
"include-dashes": true,
"other-symbols": ""
},
"remove-space-before-or-after-characters": {
"enabled": false,
"characters-to-remove-space-before": ",!?;:).’”]",
"characters-to-remove-space-after": "¿¡‘“(["
},
"space-after-list-markers": {
"enabled": false
},
"space-between-chinese-japanese-or-korean-and-english-or-numbers": {
"enabled": false,
"english-symbols-punctuation-before": "-+;:'\"°%$)]",
"english-symbols-punctuation-after": "-+'\"([¥$"
},
"trailing-spaces": {
"enabled": false,
"two-space-line-break": false
},
"add-blockquote-indentation-on-paste": {
"enabled": false
},
"prevent-double-checklist-indicator-on-paste": {
"enabled": false
},
"prevent-double-list-item-indicator-on-paste": {
"enabled": false
},
"proper-ellipsis-on-paste": {
"enabled": false
},
"remove-hyphens-on-paste": {
"enabled": false
},
"remove-leading-or-trailing-whitespace-on-paste": {
"enabled": false
},
"remove-leftover-footnotes-from-quote-on-paste": {
"enabled": false
},
"remove-multiple-blank-lines-on-paste": {
"enabled": false
}
},
"lintOnSave": true,
"recordLintOnSaveLogs": false,
"displayChanged": true,
"suppressMessageWhenNoChange": false,
"lintOnFileChange": false,
"displayLintOnFileChangeNotice": false,
"settingsConvertedToConfigKeyValues": true,
"additionalFileExtensions": [],
"foldersToIgnore": [],
"filesToIgnore": [],
"linterLocale": "system-default",
"logLevel": "ERROR",
"lintCommands": [],
"customRegexes": [],
"commonStyles": {
"aliasArrayStyle": "single-line",
"tagArrayStyle": "single-line",
"minimumNumberOfDollarSignsToBeAMathBlock": 2,
"escapeCharacter": "\"",
"removeUnnecessaryEscapeCharsForMultiLineArrays": false
}
}
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "obsidian-linter",
"name": "Linter",
"version": "1.31.2",
"minAppVersion": "1.12.0",
"description": "Formats and styles your notes. It can be used to format YAML tags, aliases, arrays, and metadata; footnotes; headings; spacing; math blocks; regular markdown contents like list, italics, and bold styles; and more with the use of custom rule options as well.",
"author": "Victor Tao",
"authorUrl": "https://github.com/platers",
"helpUrl": "https://platers.github.io/obsidian-linter/",
"isDesktopOnly": false
}
+1
View File
@@ -0,0 +1 @@
.linter-navigation-item{align-items:center;background-color:var(--background-primary-secondary-alt);border:1px solid var(--background-modifier-border);border-radius:100px;border-radius:8px 8px 2px 2px;cursor:pointer;display:flex;flex-direction:row;font-size:16px;font-weight:700;gap:4px;height:32px;overflow:hidden;padding:4px 6px;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .35s cubic-bezier(.57,.04,.58,1);white-space:nowrap}@media screen and (max-width:1325px){.linter-navigation-item.linter-desktop{max-width:32px}}@media screen and (max-width:800px){.linter-navigation-item.linter-mobile{max-width:32px}}.linter-navigation-item-icon,.linter-warning{padding-top:5px}.linter-navigation-item:hover{border-color:var(--interactive-accent-hover);border-bottom:0}.linter-navigation-item-selected{background-color:var(--interactive-accent)!important;border:1px solid var(--background-modifier-border);border-bottom:0;border-radius:8px 8px 2px 2px;color:var(--text-on-accent);max-width:100%!important;padding:4px 9px!important;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .45s cubic-bezier(.57,.04,.58,1) .2s}.linter{transition:transform .4s 0s}.linter-setting-title{align-items:baseline;display:flex;gap:30px;justify-content:space-between}.linter-setting-title.linter-mobile{justify-content:space-around}.linter-setting-title h1{font-weight:900;margin-bottom:12px;margin-top:6px}.linter-setting-header{margin-bottom:24px;overflow-x:auto;overflow-y:hidden}.linter-setting-header .linter-setting-tab-group{align-items:flex-end;display:flex;flex-wrap:wrap;width:100%}.linter-setting-tab-group{border-bottom:2px solid var(--background-modifier-border);margin-top:6px;padding-left:2px;padding-right:2px}.linter-setting-header .linter-tab-settings{border-left:2px solid transparent;border-right:2px solid transparent;cursor:pointer;font-weight:600;padding:6px 12px;white-space:nowrap}.linter-setting-header .linter-tab-settings:first-child{margin-left:6px}.linter-setting-header .linter-tab-settings.linter-tab-settings-active{border:2px solid var(--background-modifier-border);border-bottom-color:var(--background-primary);border-radius:2px;transform:translateY(2px)}.linter-navigation-item:not(.linter-navigation-item-selected)>span:nth-child(2),.linter-visually-hidden{border:0;clip:rect(0 0 0 0);clip-path:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}textarea.full-width{margin-bottom:.8em;margin-top:.8em;min-height:10em;width:100%}.full-width-textbox-input-wrapper{position:relative}.settings-copy-button{margin:0 0 0 auto;padding:4px;position:absolute;right:.8em;top:.8em}.settings-copy-button svg.linter-clipboard path{fill:var(--text-faint)}.settings-copy-button svg.linter-success path{fill:var(--interactive-success)}.settings-copy-button:active,.settings-copy-button:hover{cursor:pointer}.settings-copy-button:active svg path,.settings-copy-button:hover svg path{fill:var(--text-accent-hover);transition:all .3s ease}.settings-copy-button:focus{outline:0}.linter-custom-regex-replacement-container div:last-child{border:none}.linter-custom-regex-replacement{border:none;border-bottom:var(--hr-thickness) solid;border-color:var(--hr-color);margin-bottom:15px}.linter-custom-regex-replacement-row2{flex-wrap:wrap}.linter-custom-regex-replacement-normal-input{width:40%}.linter-custom-regex-replacement-flags{width:15%}.linter-custom-regex-replacement-label{flex-direction:row-reverse}.linter-custom-regex-replacement-label-input{width:50%}.linter-files-to-ignore-container div:last-child{border:none}.linter-files-to-ignore{border:none;border-bottom:var(--hr-thickness) solid;border-color:var(--hr-color);margin-bottom:15px}.linter-files-to-ignore-normal-input{width:40%}.linter-files-to-ignore-flags{width:15%}.linter-no-border{border:none}.linter-border-bottom{border-bottom:1px solid var(--background-modifier-border);border-top:0;margin-bottom:.75em}.linter-no-padding-top{padding-top:0}.custom-row-description{margin-top:0}.modal-warn,.search-zero-state{font-weight:700}.modal-heading,.search-zero-state{text-align:center}
+165
View File
@@ -0,0 +1,165 @@
{
"choices": [
{
"id": "b61de3ba-ced1-4fca-9dbf-bdc59ea8cd25",
"name": "Actionable",
"type": "Capture",
"command": false,
"appendLink": false,
"captureTo": "",
"captureToActiveFile": true,
"captureToCanvasNodeId": "",
"activeFileWritePosition": "top",
"createFileIfItDoesntExist": {
"enabled": false,
"createWithTemplate": false,
"template": ""
},
"format": {
"enabled": true,
"format": "{{VD:action_status: {{VALUE:\"open\"}}}}\n{{VD:action_effort_minutes: {{VALUE:0}}}}"
},
"insertAfter": {
"enabled": false,
"after": "",
"insertAtEnd": false,
"considerSubsections": false,
"createIfNotFound": false,
"createIfNotFoundLocation": "top",
"inline": false,
"replaceExisting": false,
"blankLineAfterMatchMode": "auto"
},
"newLineCapture": {
"enabled": false,
"direction": "below"
},
"prepend": false,
"task": false,
"openFile": false,
"fileOpening": {
"location": "tab",
"direction": "vertical",
"mode": "default",
"focus": true
},
"templater": {
"afterCapture": "none"
}
}
],
"inputPrompt": "single-line",
"persistInputPromptDrafts": true,
"useSelectionAsCaptureValue": true,
"devMode": false,
"templateFolderPath": "",
"announceUpdates": "major",
"version": "2.12.3",
"globalVariables": {},
"onePageInputEnabled": false,
"disableOnlineFeatures": true,
"enableRibbonIcon": false,
"showCaptureNotification": true,
"showInputCancellationNotification": false,
"enableTemplatePropertyTypes": false,
"dateAliases": {
"t": "today",
"tm": "tomorrow",
"yd": "yesterday",
"nw": "next week",
"nm": "next month",
"ny": "next year",
"lw": "last week",
"lm": "last month",
"ly": "last year"
},
"ai": {
"defaultModel": "Ask me",
"defaultSystemPrompt": "As an AI assistant within Obsidian, your primary goal is to help users manage their ideas and knowledge more effectively. Format your responses using Markdown syntax. Please use the [[Obsidian]] link format. You can write aliases for the links by writing [[Obsidian|the alias after the pipe symbol]]. To use mathematical notation, use LaTeX syntax. LaTeX syntax for larger equations should be on separate lines, surrounded with double dollar signs ($$). You can also inline math expressions by wrapping it in $ symbols. For example, use $$w_{ij}^{\\text{new}}:=w_{ij}^{\\text{current}}+\\eta\\cdot\\delta_j\\cdot x_{ij}$$ on a separate line, but you can write \"($\\eta$ = learning rate, $\\delta_j$ = error term, $x_{ij}$ = input)\" inline.",
"promptTemplatesFolderPath": "",
"showAssistant": true,
"providers": [
{
"name": "OpenAI",
"endpoint": "https://api.openai.com/v1",
"apiKey": "",
"models": [
{
"name": "gpt-3.5-turbo",
"maxTokens": 4096
},
{
"name": "gpt-3.5-turbo-16k",
"maxTokens": 16384
},
{
"name": "gpt-3.5-turbo-1106",
"maxTokens": 16385
},
{
"name": "gpt-4",
"maxTokens": 8192
},
{
"name": "gpt-4-32k",
"maxTokens": 32768
},
{
"name": "gpt-4-1106-preview",
"maxTokens": 128000
},
{
"name": "gpt-4-turbo",
"maxTokens": 128000
},
{
"name": "gpt-4o",
"maxTokens": 128000
},
{
"name": "gpt-4o-mini",
"maxTokens": 128000
}
],
"autoSyncModels": false,
"modelSource": "modelsDev"
},
{
"name": "Gemini",
"endpoint": "https://generativelanguage.googleapis.com",
"apiKey": "",
"models": [
{
"name": "gemini-1.5-pro",
"maxTokens": 1000000
},
{
"name": "gemini-1.5-flash",
"maxTokens": 1000000
},
{
"name": "gemini-1.5-flash-8b",
"maxTokens": 1000000
}
],
"autoSyncModels": false,
"modelSource": "modelsDev"
}
]
},
"migrations": {
"migrateToMacroIDFromEmbeddedMacro": true,
"useQuickAddTemplateFolder": true,
"incrementFileNameSettingMoveToDefaultBehavior": true,
"consolidateFileExistsBehavior": true,
"repairTemplateFileExistsBehavior": true,
"mutualExclusionInsertAfterAndWriteToBottomOfFile": true,
"setVersionAfterUpdateModalRelease": true,
"addDefaultAIProviders": true,
"removeMacroIndirection": true,
"migrateFileOpeningSettings": true,
"backfillFileOpeningDefaults": true,
"setProviderModelDiscoveryMode": true,
"migrateProviderApiKeysToSecretStorage": true
}
}
File diff suppressed because one or more lines are too long
+12
View File
@@ -0,0 +1,12 @@
{
"id": "quickadd",
"name": "QuickAdd",
"version": "2.12.3",
"minAppVersion": "1.11.4",
"description": "Quickly add new pages or content to your vault.",
"author": "Christian B. B. Houmann",
"authorUrl": "https://bagerbach.com",
"fundingUrl": "https://www.buymeacoffee.com/chhoumann",
"helpUrl": "https://quickadd.obsidian.guide/docs/",
"isDesktopOnly": false
}
File diff suppressed because one or more lines are too long
+47
View File
@@ -0,0 +1,47 @@
{
"command_timeout": 5,
"templates_folder": "_templates",
"templates_pairs": [
[
"",
""
]
],
"trigger_on_file_creation": true,
"auto_jump_to_cursor": false,
"enable_system_commands": false,
"shell_path": "",
"user_scripts_folder": "_templates/scripts",
"enable_folder_templates": true,
"folder_templates": [
{
"folder": "/",
"template": "_templates/Default Note.md"
},
{
"folder": "",
"template": ""
}
],
"enable_file_templates": false,
"file_templates": [
{
"regex": ".*",
"template": ""
}
],
"syntax_highlighting": true,
"syntax_highlighting_mobile": false,
"enabled_templates_hotkeys": [
""
],
"startup_templates": [
""
],
"intellisense_render": 1,
"ignore_folders_on_creation": [
{
"folder": ""
}
]
}
File diff suppressed because one or more lines are too long
+17
View File
@@ -0,0 +1,17 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.20.5",
"description": "Advanced templating and automation using handlebars-like syntax.",
"minAppVersion": "1.12.2",
"author": "SilentVoid",
"authorUrl": "https://github.com/SilentVoid13",
"fundingUrl": {
"GitHub Sponser (Zachatoo, maintainer)": "https://github.com/sponsors/Zachatoo",
"Ko-fi (Zachatoo, maintainer)": "https://ko-fi.com/zachatoo",
"GitHub Sponser (SilentVoid13, creator)": "https://github.com/sponsors/SilentVoid13",
"Paypal (SilentVoid13, creator)": "https://www.paypal.com/donate?hosted_button_id=U2SRGAFYXT32Q"
},
"helpUrl": "https://silentvoid13.github.io/Templater/",
"isDesktopOnly": false
}
+226
View File
@@ -0,0 +1,226 @@
.templater_search {
width: calc(100% - 20px);
}
.templater_div {
border-top: 1px solid var(--background-modifier-border);
}
.templater_div > .setting-item {
border-top: none !important;
align-self: center;
}
.templater_div > .setting-item > .setting-item-control {
justify-content: space-around;
padding: 0;
width: 100%;
}
.templater_div
> .setting-item
> .setting-item-control
> .setting-editor-extra-setting-button {
align-self: center;
}
.templater_donating {
margin: 10px;
}
.templater_title {
margin: 0;
padding: 0;
margin-top: 5px;
text-align: center;
}
.templater_template {
align-self: center;
margin-left: 5px;
margin-right: 5px;
width: 70%;
}
.templater_cmd {
margin-left: 5px;
margin-right: 5px;
font-size: 14px;
width: 100%;
}
.templater_div2 > .setting-item {
align-content: center;
justify-content: center;
}
.templater-prompt-div,
.templater-multisuggester-div {
display: flex;
}
.templater-prompt-form {
display: flex;
flex-grow: 1;
}
.templater-prompt-input,
.templater-multisuggester-input {
flex-grow: 1;
}
.templater-button-div {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1rem;
}
textarea.templater-prompt-input {
height: 10rem;
}
textarea.templater-prompt-input:focus {
border-color: var(--interactive-accent);
}
.templater-multisuggester-list {
margin: 1.5em 0;
}
.cm-s-obsidian .templater-command-bg {
left: 0px;
right: 0px;
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command {
font-size: 0.85em;
font-family: var(--font-monospace);
line-height: 1.3;
}
.cm-s-obsidian .templater-inline .cm-templater-command {
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
color: var(--code-property, #008bff);
}
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
color: var(--code-function, #c0d700);
}
.cm-s-obsidian .cm-templater-command.cm-keyword {
color: var(--code-keyword, #00a7aa);
font-weight: normal;
}
.cm-s-obsidian .cm-templater-command.cm-atom {
color: var(--code-normal, #f39b35);
}
.cm-s-obsidian .cm-templater-command.cm-value,
.cm-s-obsidian .cm-templater-command.cm-number,
.cm-s-obsidian .cm-templater-command.cm-type {
color: var(--code-value, #a06fca);
}
.cm-s-obsidian .cm-templater-command.cm-def,
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
color: var(--code-normal, var(--text-normal));
}
.cm-s-obsidian .cm-templater-command.cm-property,
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
.cm-s-obsidian .cm-templater-command.cm-attribute {
color: var(--code-function, #98e342);
}
.cm-s-obsidian .cm-templater-command.cm-variable,
.cm-s-obsidian .cm-templater-command.cm-variable-2,
.cm-s-obsidian .cm-templater-command.cm-variable-3,
.cm-s-obsidian .cm-templater-command.cm-meta {
color: var(--code-property, #d4d4d4);
}
.cm-s-obsidian .cm-templater-command.cm-callee,
.cm-s-obsidian .cm-templater-command.cm-operator,
.cm-s-obsidian .cm-templater-command.cm-qualifier,
.cm-s-obsidian .cm-templater-command.cm-builtin {
color: var(--code-operator, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-tag {
color: var(--code-tag, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-comment,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
color: var(--code-comment, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-string,
.cm-s-obsidian .cm-templater-command.cm-string-2 {
color: var(--code-string, #e6db74);
}
.cm-s-obsidian .cm-templater-command.cm-header,
.cm-s-obsidian .cm-templater-command.cm-hr {
color: var(--code-keyword, #da7dae);
}
.cm-s-obsidian .cm-templater-command.cm-link {
color: var(--code-normal, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-error {
border-bottom: 1px solid #c42412;
}
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
white-space: pre;
color: black;
cursor: pointer;
}
li.CodeMirror-hint-active {
background: #0088ff;
color: white;
}
+651
View File
@@ -0,0 +1,651 @@
/*------------------------------------------------------------------------------
Obsidian Colored Sidebar Items by CyanVoxel v2.0.0
A colored sidebar CSS snippet inspired by
the "Coloured Folders" snippet by Lithou.
This snippet targets folders beginning with numbered prefixes, and applies full
color formatting based on the root colors listed below. The prefixes are both
customizable and extensible; feel free to change, add, and remove them based on
your own titles and vault structure! By default I have a range of 8+1 colors,
however I've provided some other common colors as a starting point for your own
customization. Just swap out the color variable names in the prefix groups.
------------------------------------------------------------------------------*/
:root {
/* ================================ Colors ================================ */
--red: #e22c3c; /* Default Prefix: None */
--red-orange: #e9440b; /* Default Prefix: None */
--orange: #ee6748; /* Default Prefix: None */
--amber: #fa9f50; /* Default Prefix: None */
--yellow: #ffd85e; /* Default Prefix: None */
--lime: #97e768; /* Default Prefix: None */
--mint: #52eea3; /* Default Prefix: 00 */
--cyan: #51e1e9; /* Default Prefix: 10 */
--cool-cyan: #43cfea; /* Default Prefix: None */
--light-blue: #54b6f8; /* Default Prefix: 20 */
--blue: #437cf3; /* Default Prefix: 30 */
--blue-violet: #6f51f4; /* Default Prefix: None */
--violet: #9446f8; /* Default Prefix: 40 */
--purple: #c952ed; /* Default Prefix: 50 */
--magenta: #e54f9b; /* Default Prefix: 60 */
--hot-red: #e3365e; /* Default Prefix: 70 */
--cool-gray: #515768; /* Default Prefix: 99 */
--default-text-color: #d0d0d0;
--highlight: #fff;
--shadow: #0b0c2c;
--nav-item-weight-hover: bold;
}
/* Light Theme Specific Properties */
.theme-light {
--contrast-color: var(--shadow);
--default-text-color: var(--shadow);
--bg-contrast-amount: 70%;
--fg-contrast-amount: 30%;
--medium-contrast-amount: 60%;
--active-contrast-amount: 30%;
/* Darker Versions of Bright Colors for Light Theme */
--yellow: color-mix(in srgb, #ffd85e 90%, var(--shadow));
--lime: color-mix(in srgb, #97e768 90%, var(--shadow));
--mint: color-mix(in srgb, #52eea3 85%, var(--shadow));
--cyan: color-mix(in srgb, #51e1e9 85%, var(--shadow));
--cool-cyan: color-mix(in srgb, #43cfea 85%, var(--shadow));
--light-blue: color-mix(in srgb, #54b6f8 90%, var(--shadow));
}
/* Dark Theme Specific Properties */
.theme-dark {
--contrast-color: var(--highlight);
--bg-contrast-amount: 15%;
--fg-contrast-amount: 40%;
--medium-contrast-amount: 20%;
--active-contrast-amount: 10%;
}
/* All Folder Titles */
.nav-folder-title {
font-weight: bold;
border-radius: 5px;
}
/* Narrower Padding on Desktop*/
@media only screen and (min-width: 768px) {
.nav-file-title,
.nav-folder-title {
/* padding: 3px 5px 2px 4px !important; */
padding-top: 3px !important;
padding-right: 5px !important;
padding-bottom: 2px !important;
padding-left: 15px;
}
}
/*
============================ Folder Title Prefixes =============================
The following groups of prefixes are divided by the numbering prefix that they
target. For example, prefix '00' targets any folder titles beginning with '00',
such as '00 - Maps of Content'. The only other piece of information that changes
between the prefix groups are the color variables. Change or expand on any of
these to suit your own folder structure and vault theme!
*/
/* ------------------------------- 00 Prefix -------------------------------- */
.nav-folder-title[data-path^="00"] {
color: var(--mint);
--nav-item-color-hover: color-mix(
in srgb,
var(--mint) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--mint) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--mint) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(in srgb, var(--mint) 60%, transparent);
}
.nav-folder-title[data-path^="00"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--mint) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="00"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--mint) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="00"])
.nav-file-title {
color: color-mix(
in srgb,
var(--mint) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--mint) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--mint) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--mint) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 10 Prefix -------------------------------- */
.nav-folder-title[data-path^="10"] {
color: var(--cyan);
--nav-item-color-hover: color-mix(
in srgb,
var(--cyan) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--cyan) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--cyan) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(in srgb, var(--cyan) 60%, transparent);
}
.nav-folder-title[data-path^="10"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--cyan) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="10"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--cyan) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="10"])
.nav-file-title {
color: color-mix(
in srgb,
var(--cyan) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--cyan) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--cyan) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--cyan) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 20 Prefix -------------------------------- */
.nav-folder-title[data-path^="20"] {
color: var(--light-blue);
--nav-item-color-hover: color-mix(
in srgb,
var(--light-blue) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--light-blue) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--light-blue) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(
in srgb,
var(--light-blue) 60%,
transparent
);
}
.nav-folder-title[data-path^="20"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--light-blue) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="20"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--light-blue) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="20"])
.nav-file-title {
color: color-mix(
in srgb,
var(--light-blue) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--light-blue) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--light-blue) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--light-blue) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 30 Prefix -------------------------------- */
.nav-folder-title[data-path^="30"] {
color: var(--blue);
--nav-item-color-hover: color-mix(
in srgb,
var(--blue) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--blue) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--blue) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(in srgb, var(--blue) 60%, transparent);
}
.nav-folder-title[data-path^="30"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--blue) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="30"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--blue) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="30"])
.nav-file-title {
color: color-mix(
in srgb,
var(--blue) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--blue) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--blue) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--blue) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 40 Prefix -------------------------------- */
.nav-folder-title[data-path^="40"] {
color: var(--violet);
--nav-item-color-hover: color-mix(
in srgb,
var(--violet) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--violet) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--violet) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(in srgb, var(--violet) 60%, transparent);
}
.nav-folder-title[data-path^="40"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--violet) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="40"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--violet) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="40"])
.nav-file-title {
color: color-mix(
in srgb,
var(--violet) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--violet) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--violet) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--violet) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 50 Prefix -------------------------------- */
.nav-folder-title[data-path^="50"] {
color: var(--purple);
--nav-item-color-hover: color-mix(
in srgb,
var(--purple) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--purple) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--purple) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(in srgb, var(--purple) 60%, transparent);
}
.nav-folder-title[data-path^="50"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--purple) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="50"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--purple) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="50"])
.nav-file-title {
color: color-mix(
in srgb,
var(--purple) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--purple) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--purple) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--purple) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 60 Prefix -------------------------------- */
.nav-folder-title[data-path^="60"] {
color: var(--magenta);
--nav-item-color-hover: color-mix(
in srgb,
var(--magenta) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--magenta) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--magenta) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(
in srgb,
var(--magenta) 60%,
transparent
);
}
.nav-folder-title[data-path^="60"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--magenta) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="60"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--magenta) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="60"])
.nav-file-title {
color: color-mix(
in srgb,
var(--magenta) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--magenta) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--magenta) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--magenta) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 70 Prefix -------------------------------- */
.nav-folder-title[data-path^="70"] {
color: var(--hot-red);
--nav-item-color-hover: color-mix(
in srgb,
var(--hot-red) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--hot-red) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--hot-red) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(
in srgb,
var(--hot-red) 60%,
transparent
);
}
.nav-folder-title[data-path^="70"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--hot-red) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="70"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--hot-red) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="70"])
.nav-file-title {
color: color-mix(
in srgb,
var(--hot-red) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--hot-red) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--hot-red) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--hot-red) var(--active-contrast-amount),
transparent
);
}
/* ------------------------------- 99 Prefix -------------------------------- */
.nav-folder-title[data-path^="99"] {
color: var(--cool-gray);
--nav-item-color-hover: color-mix(
in srgb,
var(--cool-gray) var(--fg-contrast-amount),
var(--contrast-color)
);
--nav-item-background-hover: color-mix(
in srgb,
var(--cool-gray) var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--cool-gray) 40%,
transparent
);
--nav-collapse-icon-color: color-mix(
in srgb,
var(--cool-gray) 60%,
transparent
);
}
.nav-folder-title[data-path^="99"]:hover {
--nav-collapse-icon-color: color-mix(
in srgb,
var(--cool-gray) 60%,
var(--contrast-color)
);
}
.tree-item-children .nav-folder:has(.nav-folder-title[data-path^="99"]) {
--nav-indentation-guide-color: color-mix(
in srgb,
var(--cool-gray) var(--medium-contrast-amount),
transparent
);
}
.tree-item-children
.nav-folder:has(.nav-folder-title[data-path^="99"])
.nav-file-title {
color: color-mix(
in srgb,
var(--cool-gray) var(--medium-contrast-amount),
var(--default-text-color)
);
--nav-item-background-hover: color-mix(
in srgb,
color-mix(in srgb, var(--cool-gray) 50%, var(--highlight))
var(--bg-contrast-amount),
transparent
);
--background-modifier-border-focus: color-mix(
in srgb,
var(--cool-gray) 40%,
transparent
);
--nav-item-background-active: color-mix(
in srgb,
var(--cool-gray) var(--active-contrast-amount),
transparent
);
}
+527
View File
@@ -0,0 +1,527 @@
/* === README ===
Snippet: MCL Gallery Cards / Author: Faiz Khuzaimah / twitter: @faizkhuzaimah / github: https://github.com/efemkay
ver 0.9.9 (draft upd 2024-01-14)
- minor performance improvement by reducing image gallery has() scope, focusing on editing view
ver 0.9.8 (updated 2023-11-03)
- re-fixes #50
v0.9.7 (updated 2023-10-13)
- fixes #50 i.e. Gallery Card not working with Minimal due to Minimal max-width specificity
Ver 0.9.5 (updated 2023-07-30)
- fixes on minimal float affecting Minimal own wide table feature
- fixes on properties padding affecting Minimal
- fixes Mermaid zoom in Editing View
Ver 0.9.4 (updated 2023-07-06)
- improve Float Image for editing text in Editing View
- fix for Float Image for Minimal (and respect width settings). No longer require cssClass "minimal-float" but require Style Settings
- improve Image Gallery especially for use in Live Preview without callout
Ver 0.9.2 (updated 2023-05-27)
- fix div width for float image also affecting normal image embed
Ver 0.9.0 (updated 2023-04-01)
- image float
- banner background
- card view for dataview table
This snippet is part of MCL collection of snippets for customising layout, and it provides the following
- "gallery" callout-metadata i.e. [!<any-callout>|gallery] for flex/grid layout
- use together with MCL Multi Column [!blank-container] for invisible container
- YAML `cssClass: image-gallery` to achieve similar to callout but using only Contextual Typography plugin & <p>
- Image Zoom via css
- Dimension control for images in lists <ul>
Credits to @kepano Minimal Theme and @SlRvb ITS Theme for inspiration
*/
/* === Master Setting === */
/* set the defaults */
body{
--img-border-radius: 15px;
--img-max-height: 300px;
--img-max-width: 350px;
--img-max-height-list: 270px;
--img-max-width-list: 300px;
--callout-gallery-gap: 5px;
--gallery-snw-display: none;
}
img {border-radius: var(--img-border-radius);}
/* === Image Gallery using <p> and Callout === */
/* Editing and Reading View - Gallery using <p> and Callout. Using <p> (in Reading View) to contain and format as gallery view using metadata="gallery" to contain and format as gallery view */
/* Create display: flex and key adjustment on margin and gap */
.image-gallery .markdown-rendered div:has(> p .image-embed) > p,
div[data-callout-metadata*="gallery"].callout > .callout-content > p
{ display: flex; gap: var(--callout-gallery-gap); margin-top: calc( var(--callout-gallery-gap) ); margin-bottom: 0; }
.image-gallery .markdown-rendered div:has(> p .image-embed) { margin-top: var(--callout-gallery-gap); }
div[data-callout-metadata*="gallery"].callout > .callout-content { --callout-content-padding: 0.5rem 0 0 0; }
/* Introduce subtle border and make the gallery as object-fit: cover */
.image-gallery .markdown-rendered div:has(> p .image-embed) > p img,
div[data-callout-metadata*="gallery"].callout > .callout-content > p img
{ max-height: var(--img-max-height); border: 1px solid var(--background-modifier-border); object-fit: cover; display: block;}
/* display: block for img is important to control the hidden margin-bottom but for Minimal, it uses display: flex for top level divs which pose another "margin" issues no plan to solve yet as this is not critical */
/* Hack to emulate Reading View masonry in Editing View (for use without callout) - there's no <p> tag to be container but we can hack to use .cm-line with the help of :has() */
/* improved the css performance */
.image-gallery div.cm-line:not(.HyperMD-list-line):not(.cm-active):has(> .image-embed:not(.cm-callout)) { display: flex; gap: var(--callout-gallery-gap); --img-gallery__buffer-display: none; }
.image-gallery div.cm-line > :is(img.cm-widgetBuffer,span[contenteditable]) { display: var(--img-gallery__buffer-display) !important; }
.image-gallery div:not(.cm-callout):not(.HyperMD-list-line).image-embed img { max-height: calc(var(--img-max-height)/1); display: unset; object-fit: cover; }
/* -- Adjustment for Themes -- */
/* Special Adjustment for Shimmering Focus. Reading View. Overriding max-width */
body:not(.is-mobile) .app-container.app-container .image-gallery p img[src],
body:not(.is-mobile) .app-container.app-container div[data-callout-metadata*="gallery"].callout img[src]
{ max-width: 100%; width: unset; margin-block: unset;}
/* Minimal. Editing View. Left margin. */
.markdown-source-view.mod-cm6 div[data-callout-metadata*="gallery"] .internal-embed.image-embed { margin-left: 0 !important; width: unset;}
/* Minimal. Editing View. Revert img max width */
body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer.cm-contentContainer>.cm-content>div:has(.image-embed) img { max-width: 100%; }
/* Minimal. Disable Max Width */
body[class*="minimal-tab-title"] {
&.full-width-media .markdown-preview-view .image-embed img:not(.link-favicon):not(.emoji):not([width]),
&.full-width-media .markdown-preview-view img:not(.link-favicon):not(.emoji):not([width]) {
/* max-width: 100%; */
}
}
/* -- Adjustment for Plugins -- */
/* Special Adjustment - for SNW plugin */
.image-gallery div[data-embed-type="image"] > p .snw-embed-preview,
.image-gallery .internal-embed.image-embed ~ .snw-reference.snw-embed,
div[data-callout-metadata*="gallery"].callout > .callout-content > p .snw-embed-preview
{ display: var(--gallery-snw-display); width: min-content; height: min-content; }
div[data-callout-metadata*="gallery"].callout > .callout-content > p .internal-embed.image-embed ~ br {display: none;}
/* === Images in Lists === */
/* limit the width when in a list (ul only) */
body:not(.list-image-control-off) :is(.HyperMD-list-line,ul) .image-embed.image-embed img:not([width])
{ max-height: var(--img-max-height-list); max-width: var(--img-max-width-list); margin-inline: 0; display: unset; object-fit: cover; }
/* clamping max width to viewport when in mobile. possibly can adopt for desktop as well */
body.is-mobile:not(.list-image-control-off) :is(.HyperMD-list-line,ul) .image-embed.image-embed img:not([width])
{ max-width: clamp(calc(var(--img-max-width-list)/2), var(--img-max-width-list), 100%);}
/*
div:not(.cm-callout).image-embed img { max-height: 200px; max-width: 300px; height: 200px; object-fit: cover;}
*/
/* === Image Float === */
/* variables */
body {
--float-left-margin: 4px 12px 4px 0;
--float-right-margin: 4px 0 4px 12px;
--float-snw-display: none;
}
/* float in both Live Preview and Reading View */
img[alt^="left"], img[alt^="float-left"] { float: left; margin: var(--float-left-margin); }
img[alt^="right"], img[alt^="float-right"] { float: right; margin: var(--float-right-margin); }
/* disable box control for parent div to the float */
.internal-embed.image-embed[alt*="float-left"],
.internal-embed.image-embed[alt*="float-right"]
{display: contents; }
/* provide a float "escape" by allowing user to to add <div class="no-float"></div> */
div.no-float {clear: both; display: inline-grid; height: 1px; width: 100%; background-color: var(--background-secondary);}
/* remove the br between image and paragraph in Reading View */
p > :is(.image-embed[alt*="left"],.image-embed[alt*="right"]) + br {display: none;}
/* -- Adjustment for Plugins */
/* Breadcrumbs with Minimal. Fix to support plugin */
body[class*="minimal-tab-title"].contextual-typography .minimal-float.markdown-preview-view.markdown-preview-view .BC-trail.markdown-preview-sizer { display: flex; }
/* SNW plugin */
.internal-embed.image-embed:is([alt="left"],[alt*="|left"],[alt*="left|"],[alt*="float-left"],[alt="right"],[alt*="|right"],[alt*="right|"],[alt*="float-right"]) + .snw-reference.snw-embed { display: var(--float-snw-display); }
.internal-embed.image-embed:is([alt="left"],[alt*="|left"],[alt*="left|"],[alt*="float-left"],[alt="right"],[alt*="|right"],[alt*="right|"],[alt*="float-right"]) + .snw-reference.snw-embed + br { display: none;}
/* -- Adjustment for Themes -- */
/* Blue Topaz. uses body[class*="notebook-liked-markdown-page"] as identifier */
body[class*="notebook-liked-markdown-page"] .view-content .internal-embed.is-loaded img[alt*="left"]:not([class*="emoji"]) { margin: var(--float-left-margin) !important; }
body[class*="notebook-liked-markdown-page"] .view-content .internal-embed.is-loaded img[alt*="right"]:not([class*="emoji"]) { margin: var(--float-right-margin) !important; }
/* Minimal. Uses body[class*="minimal-tab-title"] as identifier */
body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6 .internal-embed.image-embed[alt*="float"] {width: auto !important; max-width: unset; margin-left: 0 !important;}
/* Minimal. Minimal Float. (duplicate from Multi Column. Redid "minimal-float" for Minimal V7.0 */
/* minimal own wide table will not work together with float */
/* undo the Minimal "cm-line" sizing */
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-contentContainer.cm-contentContainer>.cm-content>div,
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer>.embedded-backlinks,
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer>.inline-title,
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer>.metadata-container
{ max-width: none; width: auto; }
/* Re-set the default "cm-sizer" width but respect Minimal Settings */
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer { max-width: var(--max-width); width: var(--line-width); }
/* to be deleted by 30 Sep 2023 */
/* Duplicate from Multi Column, in case users don't enable that snippet (row 426-437) */
/* Special Adjustment for Minimal theme. Undo the theme flex layout by default. To apply per note basis */
/* .contextual-typography .minimal-float.markdown-preview-view.markdown-preview-view .markdown-preview-sizer { display: unset; } */
/* Special Adjustment for Minimal theme Live Preview float support. Need to revert cm-content width to default theme but cm-embed to auto */
/* body[class*="minimal-tab-title"] .minimal-float:not([class*="wide-"]).markdown-source-view.mod-cm6.is-readable-line-width .cm-contentContainer { width: calc(var(--line-width-adaptive) - var(--folding-offset)); max-width: calc(var(--max-width) - var(--folding-offset)); margin-right: auto; margin-left: max(calc(50% + var(--folding-offset) - var(--line-width-adaptive)/ 2), calc(50% + var(--folding-offset) - var(--max-width)/ 2))!important; } */
/* .minimal-float:not([class*="wide-"]).markdown-source-view.mod-cm6.is-readable-line-width .cm-line { width: auto; max-width: 100%; margin-left: 0 !important; } */
/* .minimal-float:not([class*="wide-"]).markdown-source-view.mod-cm6.is-readable-line-width .cm-embed-block.cm-callout> :is(.callout[data-callout-metadata*="left"], .callout[data-callout-metadata*="right"]) { max-width: 98%; } */
/* .minimal-float:not([class*="wide-"]).markdown-source-view.mod-cm6 .cm-embed-block.cm-callout > .callout { width: auto; } */
/* Special Adjustment for Minimal theme Live Preview float support. Undo margin-left for Image */
/* .minimal-float:not([class*="wide-"]).markdown-source-view.mod-cm6 .cm-embed-block.cm-callout :is(.callout[data-callout-metadata*="left"], .callout[data-callout-metadata*="right"]) .internal-embed.image-embed { margin-left: auto !important; } */
/* === Image Zoom === */
/* must check "Enable Image Zoom via CSS" via Style Settings */
/* set scale to 100% for images */
.image-zoom .view-content :is(.cm-editor, .markdown-preview-view) img { max-width: 100%; cursor: zoom-in; }
/* css zoom for images */
body.image-zoom:not(.is-mobile) .view-content :is(.cm-editor,.markdown-preview-view) img:active,
body.image-zoom:not(.is-mobile) .view-content .image-embed:active,
.image-zoom :is(.HyperMD-list-line,ul) .image-embed.image-embed img:active {
cursor: zoom-out; display: block; background: rgba(0,0,0,0.5);
max-height: calc(100% + 1px); max-width: calc(100% - 20px); height: calc(100% + 1px); width: 100%;
object-fit: contain; margin: -0.5px auto 0; padding: 0; text-align: center;
position: fixed; left: 0; right: 0; bottom: 0; z-index: 100;
}
/* === Mermaid SVG max-width 100% and zoom on click === */
/* for Mermaid SVG zoom, must check "Enable Mermaid Zoom via CSS" via Style Settings */
/* set scale to 100% for mermaid diagram */
body:not(.mermaid-scale-off) .view-content :is(.cm-editor, .markdown-preview-view) .mermaid svg { max-width: 100%; height: 100%}
body.mermaid-scale-off .mermaid { overflow-x: auto; }
.mermaid-zoom .view-content .mermaid svg { cursor: zoom-in; }
/* css zoom for mermaid diagram */
body.mermaid-zoom:not(.is-mobile) .view-content .markdown-reading-view .mermaid svg:active {
cursor: zoom-out; display: block; object-fit:contain; margin: -0.5px auto 0; padding: 0;
max-height: calc(100% + 1px); max-width: calc(100% - 20px); height: calc(100% + 1px); width: 100%;
text-align: center; z-index: 100; position: fixed; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.8);
}
/* editing view */
body.mermaid-zoom:not(.is-mobile) .markdown-source-view .cm-embed-block:has(.mermaid svg:active) {
text-align: center;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 100;
position: fixed;
background: rgba(0,0,0,0.8)
}
body.mermaid-zoom:not(.is-mobile) .markdown-source-view. .cm-embed-block:has(.mermaid svg:active) .mermaid { overflow-x: hidden; }
body.mermaid-zoom:not(.is-mobile) .markdown-source-view .mermaid svg:active {
cursor: zoom-out;
position: fixed;
width: 100%; height: 100%;
top: 0; left: 0;
}
/* === Dataview related ===*/
/* Change Dataview table into card view
- no style settings option yet
*/
body {
--bg-color-dv-card: var(--background-modifier-backlinks);
--border-color-dv-card: var(--background-modifier-border);
}
.dv-card table.dataview { position: relative; display: flex; flex-direction: column; font-size: 0.9em; }
/* convert the thead */
.dv-card table.dataview thead { display: flex; flex-flow: row-reverse; border-radius: var(--size-4-2); position: relative; padding-bottom: 0.4em; }
.dv-card table.dataview thead tr { margin: 0; }
.dv-card:is(*,.markdown-source-view.mod-cm6) table.dataview.table-view-table thead th { padding-left: 0; padding: 0.2em 1.3em 0 0.3em; border-width: 0; font-size: 0.9rem; color: var(--text-faint); font-family: var(--h3-font);}
/* convert the tbody into card like structure */
.dv-card table.dataview tbody { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); grid-gap: var(--size-4-2); }
.dv-card table.dataview tbody tr { background-color: var(--bg-color-dv-card); display: flex; flex-direction: column; border: 1px solid var(--border-color-dv-card); border-radius: var(--size-4-2); margin-top: 0; margin-bottom: 0; }
.dv-card table.dataview tbody tr:hover { background-color: var(--background-secondary) !important; }
.dv-card table.dataview tbody td { display: flex; padding-block: 0; }
.dv-card table.dataview tbody td:first-child { font-weight: var(--bold-weight); }
.dv-card table.dataview tbody td:not(:first-child) { color: var(--text-muted); font-size: 0.9em; }
.dv-card table.dataview tbody td:last-child { padding-bottom: 0.5em; }
.dv-card table.dataview tbody td:not(:last-child):not(:first-child)>.el-p:not(.el-embed-image) { border-bottom: 1px solid var(--border-color-dv-card); width: 100%; }
.dv-card table.dataview tbody td > * { padding-block: 0.5em; }
.dv-card table.dataview tbody td > ul { padding-block: 0.2em; }
/* Remove the li indent and other cosmetics */
.dv-card table.dataview :is(ul,ol) { padding-inline-start: 0; margin-block: 0 !important; }
.dv-card table.dataview li:not(:last-of-type).dataview-result-list-li {border-bottom: 1px dashed DarkSlateGray;}
.dv-card table.dataview li.dataview-result-list-li::marker { color: transparent; }
/* Special Adjustment for Stardust's Table Enhancer plugin */
table.dataview .table-height-adjust th, .table-height-adjust tr { height: revert !important; }
/* Special Adjustment for Listive theme */
.dv-card .table-view-table li:not(.cards li.dataview-result-list-li) {margin-left: revert; }
/* Special Adjustment for thead background for most themes */
.dv-card thead :is(tr, th.table-view-th) {background-color: transparent;}
.dv-card thead :is(tr, th) {border-width: 0;}
/*=== MCL Banner ===*/
/* banner using css only -- https://forum.obsidian.md/t/css-how-to-style-the-first-image-in-a-note/52839/ */
body {
--mcl-banner-height-normal: 200px;
--mcl-banner-height-tall: 300px;
--mcl-banner-overlap-title-adj: 0px;
--mcl-banner-no-title-adj: 0px;
}
body:not(.show-inline-title) .markdown-reading-view {
--mcl-banner-no-title-adj: 25px; /* reading view bigger to adjust for minor overlap */
}
body:not(.show-inline-title) .markdown-source-view {
--mcl-banner-no-title-adj: 15px;
}
/* make the div (in LP) containing the image doesn't control the css box-sizing */
.markdown-source-view .cm-line:has(> .internal-embed.image-embed > img[alt*="mcl-banner"]),
.markdown-source-view :is(.internal-embed.image-embed, .cm-line):has(> img[alt*="mcl-banner"]) { display: contents; }
/* original forum post snippet with minor tweak */
img[alt*="mcl-banner"] {
position: absolute;
top: 0; left: 0;
height: var(--mcl-banner-height-normal); width: 100%;
margin-right: auto; margin-left: auto;
object-fit: cover; object-position: 50% 50%;
overflow: hidden;
user-select: none;
/* z-index: -1; */
}
img[alt*="mcl-banner"][alt*="gradient"] {
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, color-stop(80%, rgba(0,0,0,1)), color-stop(100%, rgba(0,0,0,0)) );
mask-image: linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0));
}
/* padding to distance text content from banner V1 *//*
.view-content:has(img[alt*="mcl-banner"]) .inline-title
{ position: relative; padding-top: calc(var(--mcl-banner-height-normal) - 50px + var(--mcl-banner-overlap-title-adj) + var(--mcl-banner-no-title-adj)); z-index: 30; }
.view-content:has(img[alt*="mcl-banner"][alt*="-tall"]) :is(.cm-content > div:first-child, .mod-header)
{ padding-top: calc(var(--mcl-banner-height-tall) - 50px + var(--mcl-banner-overlap-title-adj) + var(--mcl-banner-no-title-adj) ); }
/* padding to distance text content from banner V2 */
.view-content:has(img[alt*="mcl-banner"]) :is(.cm-sizer, .markdown-preview-section)
{ padding-top: calc(var(--mcl-banner-height-normal) - 50px + var(--mcl-banner-overlap-title-adj) + var(--mcl-banner-no-title-adj)); }
.view-content:has(img[alt*="mcl-banner"][alt*="-tall"]) :is(.cm-sizer, .markdown-preview-section)
{ padding-top: calc(var(--mcl-banner-height-tall) - 50px + var(--mcl-banner-overlap-title-adj) + var(--mcl-banner-no-title-adj) ); }
.view-content:has(img[alt*="mcl-banner"]) .inline-title
{ position: relative; z-index: 30; }
/* add option to adjust vertical position by adding the alt metadata "higher" or "lower" */
img[alt*="mcl-banner"][alt*="y-30"] { object-position: 50% 20%; }
img[alt*="mcl-banner"][alt*="y-20"] { object-position: 50% 30%; }
img[alt*="mcl-banner"][alt*="y-10"] { object-position: 50% 40%; }
img[alt*="mcl-banner"][alt*="y+10"] { object-position: 50% 60%; }
img[alt*="mcl-banner"][alt*="y+20"] { object-position: 50% 70%; }
img[alt*="mcl-banner"][alt*="y+30"] { object-position: 50% 80%; }
/* tall adjustment */
img[alt*="mcl-banner"][alt*="-tall"] { height: var(--mcl-banner-height-tall); }
/* minor tweak for me, since i have snippet to make image has rounded corner */
img[alt*="mcl-banner"] { border-radius: revert; }
/* minor tweak for me, to hide snw block reference counter for the banner */
.internal-embed.media-embed.image-embed.is-loaded + .snw-reference.snw-embed {display: none;}
/* === Image Aspect Ratio === */
/* Apply to any images using either hashtag after image url or image alt-text */
.internal-embed.image-embed[src*="1-1"] > img,
img[src*="1-1"],
img[alt*="1-1"]
{ aspect-ratio: 1/1; object-fit: cover; }
.internal-embed.image-embed[src*="4-3"] > img,
img[src*="4-3"],
img[alt*="4-3"]
{ aspect-ratio: 4/3; object-fit: cover; }
.internal-embed.image-embed[src*="16-9"] > img,
img[src*="16-9"],
img[alt*="16-9"]
{ aspect-ratio: 16/9; object-fit: cover; }
/* === Image Caption === */
/* This will only works with local images, web images cannot be supported
mainly because obsidian doesn't render a parent div for the image.
Local images with md link still works. */
:is(.markdown-source-view.mod-cm6, .markdown-reading-view) .internal-embed.image-embed[src*="caption"] { display: inline-block; width: fit-content; }
.image-embed[src*="caption"]::after { content: attr(alt); display: block; text-align: center; font-style: italic; }
/* === ALPHA VERSION testing Timeline in lists === */
/*
.tag-mcltimeline > ul > li > *:not(ul) { text-align: center; align-self: baseline; }
.tag-mcltimeline > ul > li {
display: grid;
grid-template-columns: 0 3fr 7fr;
grid-template-rows: auto;
grid-template-areas:
"indicator timeline details"
"indicator . details";
grid-column-gap: 1em;
}
.tag-mcltimeline > ul > li > ul { grid-area: details; text-align: left; }
.tag-mcltimeline > ul > li > .collapse-indicator { grid-area: indicator; }
.tag-mcltimeline > ul ul { margin-left: 0.5em; }
*/
/* @settings
name: Modular CSS Layout - Gallery Cards
id: modular-css-layout-gc
settings:
-
id: gc-general-title
title: General Image Settings
type: heading
level: 2
collapsed: true
-
id: image-zoom
title: Enable Image Zoom via CSS
type: class-toggle
-
id: img-border-radius
title: Image Border Radius (any unit, no space)
type: variable-text
default: 15px
-
id: gc-callout-title
title: Image Gallery Settings
description: For image gallery using `gallery` callout-metadata and `image-gallery` YAML
type: heading
level: 2
collapsed: true
-
id: gallery-snw-display
title: Hide Strange New World Indicators in Image Gallery
type: variable-select
default: none
options:
-
label: Show
value: inline-block
-
label: Hide
value: none
-
id: callout-gallery-gap
title: Gallery Callout Gap (any unit, no space)
type: variable-text
default: 5px
-
id: img-max-height
title: Max Height for Images (any unit, no space)
type: variable-text
default: 300px
-
id: img-max-width
title: Max Width for Images (any unit, no space)
type: variable-text
default: 350px
-
id: gc-float-title
title: Image Float / Aside
type: heading
level: 2
collapsed: true
-
id: float-left-margin
title: Margin for Image Float Right (any unit, no space)
description: Enter in following order - "top right bottom left"
type: variable-text
default: 4px 12px 4px 0px
-
id: float-right-margin
title: Margin for Image Float Right (any unit, no space)
description: Enter in following order - "top right bottom left"
type: variable-text
default: 4px 0px 4px 12px
-
id: float-snw-display
title: Hide SNW indicator in Image Float / Aside
type: variable-select
default: none
options:
-
label: Show
value: inline-block
-
label: Hide
value: none
-
id: gc-list-title
title: Image in List Settings
type: heading
level: 2
collapsed: true
-
id: list-image-control-off
title: Disable Control for Image in List
description: Disabling will revert image dimension to Obsidian default behaviour
type: class-toggle
-
id: img-max-height-list
title: Max Height for Images (any unit, no space)
type: variable-text
default: 270px
-
id: img-max-width-list
title: Max Width for Images (any unit, no space)
type: variable-text
default: 300px
-
id: gc-mermaid-title
title: Mermaid SVG Settings
type: heading
level: 2
collapsed: true
-
id: mermaid-scale-off
title: Disable scaling for Mermaid diagram
description: Disabling will revert Mermaid diagram dimension to Obsidian default behaviour
type: class-toggle
-
id: mermaid-zoom
title: Enable Image Zoom via CSS
type: class-toggle
*/
+879
View File
@@ -0,0 +1,879 @@
/* === README ===
Snippet: MCL Multi Column / Author: Faiz Khuzaimah / twitter: @faizkhuzaimah / github: https://github.com/efemkay
Ver 0.10.0 (updated 2024-09-01)
- introduce fw dw and pw
- added left-right margin for Float Callout
- refactor List Column code to improve performance
Ver 0.9.10 (updated 2024-06-26)
- fix issues #81 and #89
Ver 0.9.9 (updated 2024-01-25)
- code cleanup (including -small -medium -large)
- improve css performance on float but require cssclass use again
Ver 0.9.8 (updated 2023-11-03)
- fixes on sub-callout becomes flexible height (and introduce option for such)
Ver 0.9.7 (updated 2023-10-13)
- GH FR issue #41, #42 and fixed GH issue #35. MC Callout now supports sub-blockquote and sub-paragraph
- GH FR issue #43. MC Callout now supports Multi Column within Multi Column
Ver 0.9.5 (updated 2023-07-30)
- fixes on minimal float affecting Minimal own wide table feature
- fixes on properties padding affecting Minimal
Ver 0.9.4 (updated 2023-07-06)
- improved MC Callout compatibility with Minimal theme V7.0
- improved MC Callout compatibility with Blue Topaz
Ver 0.9.3 (updated 2023-06-24)
- add support for List Column for li that's also a header
- fixes on column ruler to apply properly only for List Column on first ul only
- fixes on Float Callout in LP not floating due to additional div layer
Ver 0.9.2 (updated 2023-05-27)
- fix MC List Card mistakenly affect non List Card bullet list padding in same note
- fix obsidian default bullet "draw" not rendered properly in List Column (for the ones using tag and contextual typography plugin)
Ver 0.9.1 (updated 2023-04-06)
- fix MC "fixed center" option not properly coded
- fix MC List Grid previous not support sublist
- fix MC List Column margin top for first column
- fix MC List Grid for first bullet header
Ver 0.9.0 (updated 2023-04-01)
- MC - add option to hide SNW block ref for images in MC Callout
- MC - added wide option for List Grid/Card
- MC - added option to adjust float callout top margin
- MC - added fixed width option
- fix support minimal Callout style Outlined
- List Column/Grid/Card fully support :has()
What is this snippet for?
- to allow Obsidian users to change the layout with preset css by just specifying
the cssClass in the frontmatter (YAML) or naming the Callout block
- available cssClass
- cssClass: two-column-list
- cssClass: {.two-column-list-block}
- cssClass: three-column-list
- cssClass: {.three-column-list-block}
- cssClass: multi-column-list
- available Callout format
- [!multi-column]
- [!blank] / [!blank-container]
Compatibility
- tested to work fine with the following Community Theme
- Default Theme
- Big Sur / Blue Topaz / California Cost / Notation / Pisum / Prism / Things / Typewriter (with minor issue on title color)
- known to be not working
- Primary (due to the theme heaving theming, box-shadow and so on)
Credits
- Kevin Powell Youtube channel
- https://css-tricks.com/
- discord OMG members @Cáo thoát tục (Cáo thoát tục#6993), @mulfok (mulfok#6931) and @Rainbell (Rainbell#3617)
- kepano for accomodating my snippets adjustment
- trainbuffer for numerous help and assisted css snippets
*/
body{
/* for list column, grid and card */
--list-min-width: 200px;
--col-rule-color: var(--background-modifier-border); /* #b3b3b3; */
--col-rule-width: 1px;
--list-grid-min-width: 250px;
--list-grid-wide-min-width: 350px;
}
.theme-dark {
/* --background-mcl-card: hsl(300, 5%, 15%); */
}
.theme-light {
/* --background-mcl-card: hsl(300, 5%, 90%); */
}
/* === General === */
/* -- Fixed Width definition -- */
/* quadruple the last .callout to win specificity with main multi-column callout */
div[data-callout-metadata*="fw"].callout.callout.callout { flex-grow: 0; flex-shrink: 0;}
div[data-callout-metadata*="fw1"].callout.callout.callout.callout { flex-basis: 100px; width: 100px; }
div[data-callout-metadata*="fw2"].callout.callout.callout.callout { flex-basis: 200px; width: 200px; }
div[data-callout-metadata*="fw3"].callout.callout.callout.callout { flex-basis: 300px; width: 300px; }
div[data-callout-metadata*="fw4"].callout.callout.callout.callout { flex-basis: 400px; width: 400px; }
div[data-callout-metadata*="fw5"].callout.callout.callout.callout { flex-basis: 500px; width: 500px; }
div[data-callout-metadata*="fw6"].callout.callout.callout.callout { flex-basis: 600px; width: 600px; }
div[data-callout-metadata*="fw7"].callout.callout.callout.callout { flex-basis: 700px; width: 700px; }
div[data-callout-metadata*="fw8"].callout.callout.callout.callout { flex-basis: 800px; width: 800px; }
div[data-callout-metadata*="fw9"].callout.callout.callout.callout { flex-basis: 900px; width: 900px; }
div[data-callout-metadata*="pw1"].callout.callout.callout.callout { flex-basis: 10%; width: 10%; }
div[data-callout-metadata*="pw2"].callout.callout.callout.callout { flex-basis: 18%; width: 18%; }
div[data-callout-metadata*="pw3"].callout.callout.callout.callout { flex-basis: 28%; width: 28%; }
div[data-callout-metadata*="pw4"].callout.callout.callout.callout { flex-basis: 38%; width: 38%; }
div[data-callout-metadata*="pw5"].callout.callout.callout.callout { flex-basis: 48%; width: 48%; }
div[data-callout-metadata*="pw6"].callout.callout.callout.callout { flex-basis: 58%; width: 58%; }
div[data-callout-metadata*="pw7"].callout.callout.callout.callout { flex-basis: 68%; width: 68%; }
div[data-callout-metadata*="pw8"].callout.callout.callout.callout { flex-basis: 78%; width: 78%; }
div[data-callout-metadata*="pw9"].callout.callout.callout.callout { flex-basis: 88%; width: 88%; }
/* metadata "wide-x" to control subcallout flexible max width. only discrete 2,4,8,16 */
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="mw0"].callout.callout { flex-basis: 0; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw1"].callout { flex: 1 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw2"].callout { flex: 2 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw3"].callout { flex: 3 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw4"].callout { flex: 4 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw5"].callout { flex: 5 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw6"].callout { flex: 6 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw7"].callout { flex: 7 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw8"].callout { flex: 8 0 auto; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="dw9"].callout { flex: 9 0 auto; }
/* === Multi Column Callout (MCC) === */
/* some issues still persists
(2) some theme uses transparency to affect .callout-title */
/* common MCC variables */
body {
--mcc-img-snw-display: none;
--callout-min-width: 200px;
--callout-nowrap-min-width: 250px;
--callout-gap: 1em;
--callout-margin: 0px;
}
[data-callout="multi-column"].callout {
--callout-blend-mode: normal;
}
/* -- Main MCC Code -- */
/* remove callout-title and make callout-content as part of main callout for box formatting */
div[data-callout="multi-column"].callout > .callout-title { display: none; }
div[data-callout="multi-column"].callout > .callout-content { display: contents; }
/* make the main callout a flex and remove box formatting */
/* --columns: unset to undo Sanctum's mod */
div[data-callout="multi-column"].callout
{ display: flex; flex-wrap: wrap; gap: var(--callout-gap); background: unset; border: unset; margin: unset; padding: unset; clear: both; --columns: unset; }
/* make the subcallout in flex column to allow growing vertically */
div[data-callout="multi-column"].callout .callout:not([data-callout="multi-column"]) { display: flex; flex-direction: column; }
div[data-callout="multi-column"].callout:not(.is-collapsed) .callout { margin-inline: var(--callout-margin); margin-block: var(--callout-margin); } /* to allow spacing for box shadow */
div[data-callout="multi-column"].callout .callout .callout-content { flex-grow: 1}
div[data-callout="multi-column"].callout > .callout-content > *:is(div,ul,blockquote,p) { flex: 1 1 var(--callout-min-width); margin: 0;}
/* metadata "wide-x" to control subcallout flexible max width. only discrete 2,4,8,16 */
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="min-0"] { flex-basis: 0; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="wide-2"] { flex-grow: 2; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="wide-3"] { flex-grow: 3; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="wide-4"] { flex-grow: 4; }
div[data-callout="multi-column"].callout > .callout-content > div[data-callout-metadata*="wide-5"] { flex-grow: 5; }
@media (min-width: 500px) {
/* .is-collapsed is used to draw the border-left only when it's collapsed */
div[data-callout="multi-column"].callout > div.callout-content .callout.is-collapsed { box-shadow: unset; height: min-content;}
}
/* -- MCC Variant - Flexible Height for Subcallout / Children -- */
/* also useful if one wants to have non callout children like table and don't want to fill the height */
div[data-callout="multi-column"].callout {}
div[data-callout="multi-column"][data-callout-metadata*="flex-h"].callout { align-items: flex-start; }
/* -- MCC Variation - Fixed Columns -- */
div[data-callout="multi-column"][data-callout-metadata*="col3"]:not([data-callout-metadata*="icons"]).callout {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
/* -- MCC Variation - Icons -- */
/* Main code */
div[data-callout="multi-column"][data-callout-metadata*="icons"] {
&.callout { justify-content: center; }
&.callout .callout { display: flex; flex-direction: row; flex-wrap: wrap; }
&.callout.callout .callout-content > p { flex-grow: 1; text-align: center; }
/* Options for number of columns */
&[data-callout-metadata*="col2"].callout.callout .callout-content > p { flex-basis: 40%; }
&[data-callout-metadata*="col3"].callout.callout .callout-content > p { flex-basis: 30%; }
&[data-callout-metadata*="col4"].callout.callout .callout-content > p { flex-basis: 22%; }
&[data-callout-metadata*="col5"].callout.callout .callout-content > p { flex-basis: 18%; }
/* listive theme */
&.callout p:first-child { margin-top: revert; }
}
/* -- MCC Variation - Fixed Width Option -- */
/* Fixed Width Option (using callout-metadata) */
div[data-callout="multi-column"][data-callout-metadata*="center-fixed"].callout { justify-content: center; }
div[data-callout="multi-column"][data-callout-metadata*="left-fixed"].callout { justify-content: flex-start; }
div[data-callout="multi-column"][data-callout-metadata*="right-fixed"].callout { justify-content: flex-end; }
div[data-callout="multi-column"][data-callout-metadata*="fixed"].callout > .callout-content > *:is(div,ul) { flex-grow: 0; }
/* Callout size for Fixed Width Option */
div[data-callout="multi-column"][data-callout-metadata*="fixed"][data-callout-metadata*="small"].callout > .callout-content > *:is(div,ul) { flex-basis: calc( var(--float-small-width) * 0.5 ); }
div[data-callout="multi-column"][data-callout-metadata*="fixed"][data-callout-metadata*="medium"].callout > .callout-content > *:is(div,ul) { flex-basis: calc( var(--float-medium-width) * 0.65); }
div[data-callout="multi-column"][data-callout-metadata*="fixed"][data-callout-metadata*="large"].callout > .callout-content > *:is(div,ul) { flex-basis: calc( var(--float-large-width) * 0.8); }
/* -- MCC Variation - No Wrap Option -- */
/* No-Wrap Option (using callout-metadata) - for single row with horizontal scrollbar */
div[data-callout="multi-column"][data-callout-metadata*="no-wrap"].callout {
flex-wrap: nowrap; overflow-x: scroll;
& > .callout-content > *:is(div,ul) { flex-shrink: 0; }
}
/* No-Wrap Option, Width Options. Legacy width option. better to dw, pw and fw options at the top */
.callout[data-callout="multi-column"][data-callout-metadata*="no-wrap"] .callout[data-callout-metadata*="small"] { flex-basis: 300px; }
.callout[data-callout="multi-column"][data-callout-metadata*="no-wrap"] .callout[data-callout-metadata*="medium"] { flex-basis: 400px; }
.callout[data-callout="multi-column"][data-callout-metadata*="no-wrap"] .callout[data-callout-metadata*="large"] { flex-basis: 600px; }
/* Align center for items in callout */
div[data-callout="multi-column"] .callout[data-callout-metadata*="center"] { text-align: center; }
/* -- Special Adjustment for Community Themes -- */
/* Special Adjustment -- for theme with negative margin & box shadow. (e.g. Prism) */
div[data-callout="multi-column"].callout > .callout-content { margin-top: unset;}
div[data-callout="multi-column"].callout:not(.is-collapsed) { box-shadow: unset;}
/* Blue Topaz - remove box shadow from main [!multi-column] */
body[class*="notebook-liked-markdown-page"].shade-callout-style .callout[data-callout="multi-column"] { box-shadow: unset !important; }
/* Special Adjustment -- for minimal left margin *//*
.markdown-source-view.mod-cm6.is-readable-line-width .cm-embed-block.cm-callout > div[data-callout="multi-column"].callout
{ width: 100%; max-width: 100%; margin-inline: 0 !important; }
/* Minimal - .dataview.list-view-ul width - Minimal set the width with --line-width-adaptive (40rem by default) */
body:not(.table-100):not(.table-max):not(.table-wide) .markdown-preview-view.is-readable-line-width:not(.table-100):not(.table-max):not(.table-wide) div[data-callout="multi-column"].callout .dataview.list-view-ul {width: auto;}
/* Minimal -- Callout Outline, to ensure sub-callout not overlapped and hidden */
.callouts-outlined div[data-callout="multi-column"].callout:not(.is-collapsed) .callout:not([data-callout="multi-column"]) {
margin-top: 1em;
}
/* -- Special Adjustment for Plugins / Markdown Elements -- */
/* SNW plugin */
div[data-callout*="multi-column"].callout .callout-content span.image-embed + .snw-reference { display: var(--mcc-img-snw-display); }
/* === Blank Container "DIV"'s - can be used with Main Multi-Column layout above === */
/* "blank-container" - no bg, no border, no title, no nothing, and remove the ligthen effect */
div[data-callout*="blank"].callout {--callout-blend-mode: normal;}
div[data-callout*="blank"].callout > .callout-title { display: none; }
div[data-callout*="blank"].callout > .callout-content {display: contents;}
div[data-callout*="blank"].callout { border: 0; padding-top: 0; padding-inline: 5px; background: unset; box-shadow: unset; }
/* -- No Margin -- */
/* issues still persists
- headers font size not same
- "no-margin" not fully workable in editing view due to wide-page override for Minimal theme
*/
div[data-callout-metadata*="no-margin"]:is(.cm-callout, .callout.callout, .callout.callout .callout-content) {margin: 0; padding: 0;}
/* -- No Margin for only child -- */
div[data-callout*="blank"].callout .callout-content > p:only-child {
margin-block: 0;
}
/* -- Special Adjustment for Themes -- */
/* Mado. Remove theme's pseudo left border */
div[data-callout*="blank"] .callout-content::before { display: none; }
/* === Text Justify === */
.text-justify :is(.markdown-preview-view p,.markdown-source-view .cm-line) { text-align: justify; }
/* === Floating Callout - Base === */
/* float uses callout-metadata to control the layout. can apply to any callout */
/* variables */
body {
--float-small-width: 300px;
--float-medium-width: 400px;
--float-large-width: 600px;
--float-left-callout-margin: 0 15px 0 0;
--float-right-callout-margin: 0 0 0 15px;
--float-callout-top-margin: 0em;
--float-callout-bottom-margin: 0em;
--float-callout-snw-display: none;
}
/* variables */
body {
--float-left-callout-margin-inline: 0 12px;
--float-right-callout-margin-inline: 12px 0;
--float-snw-display: none;
}
/* -- Main Code. Use media query so that floats only works when there's enough width */
@media (min-width: 500px){
.markdown-source-view .cm-embed-block.cm-callout:has(> div.markdown-rendered > [data-callout-metadata*="float-left"]) { display: inline; z-index: 30;}
.markdown-source-view .cm-embed-block.cm-callout:has(> div.markdown-rendered > [data-callout-metadata*="float-left"]) > div > .callout { float: left; z-index: 30; }
.markdown-source-view .cm-embed-block.cm-callout:has(> div.markdown-rendered > [data-callout-metadata*="float-left"]) > .edit-block-button { display: none; }
.markdown-reading-view div[data-callout-metadata*="left"].callout {float: left;}
.markdown-source-view .cm-embed-block.cm-callout:has(> div.markdown-rendered > [data-callout-metadata*="float-right"]) { display: inline; z-index: 30;}
.markdown-source-view .cm-embed-block.cm-callout:has(> div.markdown-rendered > [data-callout-metadata*="float-right"]) > div > .callout { float: right; z-index: 30; }
.markdown-source-view .cm-embed-block.cm-callout:has(> div.markdown-rendered > [data-callout-metadata*="float-right"]) > .edit-block-button { display: none; }
.markdown-reading-view div[data-callout-metadata*="right"].callout {float: right; }
.markdown-source-view.mod-cm6 .cm-embed-block.cm-callout :is(.callout[data-callout-metadata*="left"], .callout[data-callout-metadata*="right"]) .callout-content > p:last-of-type { margin-bottom: auto;}
[data-callout-metadata*="float-right"].cm-embed-block.cm-callout {width: auto !important;}
/* remove margin from first para in the float callout */
.callout:is(div[data-callout-metadata*="left"],div[data-callout-metadata*="right"]) .callout-content > :is(p:first-child,ul:first-child,ol:first-child) {margin-top: 0;}
/* Adjustable Gap */
/* 26Mar2023 only top for now, to work on left-right later */
.markdown-source-view.mod-cm6 .callout:is(div[data-callout-metadata*="left"]),
.markdown-source-view.mod-cm6 .callout:is(div[data-callout-metadata*="right"])
{ margin-top: calc(1em * var(--line-height-normal) + var(--float-callout-top-margin)); }
/**/
.markdown-source-view.mod-cm6 .callout:is(div[data-callout-metadata*="left"]),
.markdown-reading-view div[data-callout-metadata*="left"].callout {
margin-inline: var(--float-left-callout-margin-inline);
}
.markdown-source-view.mod-cm6 .callout:is(div[data-callout-metadata*="right"]),
.markdown-reading-view div[data-callout-metadata*="right"].callout {
margin-inline: var(--float-right-callout-margin-inline);
}
}
/* -- FC Size Options -- */
/* legacy width option. better to dw, pw and fw options at the top */
[data-callout-metadata*="-small"].callout {width: var(--float-small-width);}
[data-callout-metadata*="-medium"].callout {width: var(--float-medium-width);}
[data-callout-metadata*="-large"].callout {width: var(--float-large-width);}
/* -- Special Adjustment for Plugins / Markdown Elements -- */
/* Option for Caption */
div:is([data-callout-metadata*="caption"]).callout > .callout-content > p .image-embed[alt]:not([alt$=".png"], [alt$=".jpg"], [alt$=".jpeg"], [alt$=".tiff"])::after {content: attr(alt); text-align: center; display: block; font-style: italic; color: var(--text-muted); }
div:is([data-callout-metadata*="caption"]).callout > .callout-content > p img:not(.emoji) { display: block; margin-right: auto; margin-left: auto;}
/* Introduce clear to break the float */
/* .markdown-preview-view h2, *//* remove this as it has weird spacing effect */
.embedded-backlinks { clear: both; }
/* for Blockquote underlap the float layout -- to remove by 30Jun2024, no longer needed */
/* .markdown-preview-view :is(blockquote) { overflow-x: auto; } /* fix for blockquote underlap */
/* .markdown-preview-view :is(p) { overflow: unset; } /* fix for para not wrapping around float. applicable for Willemstad */
/* for SNW plugin */
div:is([data-callout-metadata*="caption"],[data-callout-metadata*="left"],[data-callout-metadata*="right"]).callout > .callout-content > p .snw-embed-preview { display: var(--float-callout-snw-display); width: min-content; height: min-content; }
div:is([data-callout-metadata*="caption"],[data-callout-metadata*="left"],[data-callout-metadata*="right"]).callout > .callout-content > p .internal-embed.image-embed ~ br {display: none;}
/* -- Special Adjustment for Themes -- */
/* Minimal. Minimal Float. Updated for Minimal V7.4.7 */
/* "Reset" the default "cm-sizer" width but respect Minimal Settings, and require cssclass ".minimal-float" as Minimal own wide table will not work together with float i.e. removing :not(:has(table)) from .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)) */
.minimal-float.markdown-source-view.mod-cm6 {
.cm-sizer {
max-width: var(--max-width); width: var(--line-width);
}
.cm-contentContainer.cm-contentContainer > .cm-content > div,
.cm-sizer > .embedded-backlinks,
.cm-sizer > .inline-title,
.cm-sizer > .metadata-container {
max-width: none; width: auto;
}
}
/* Minimal. Previous Minimal Float but with performance issue. Kept for reference until 30 June 2024 */ /*
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer { max-width: var(--max-width); width: var(--line-width); }
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-contentContainer.cm-contentContainer>.cm-content>div,
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer>.embedded-backlinks,
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer>.inline-title,
:is(body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width:not(:has(table)), .minimal-float.markdown-source-view.mod-cm6) .cm-sizer>.metadata-container
{ max-width: none; width: auto; }
/* Minimal - fix to support Breadcrumbs plugin. Sub to the above LP float fix for Minimal */
body[class*="minimal-tab-title"].contextual-typography .minimal-float.markdown-preview-view.markdown-preview-view .BC-trail.markdown-preview-sizer { display: flex; }
/* Minimal - Size Option fix due to !important */
/* Minimal. Uses body[class*="minimal-tab-title"] as identifier. To override (have higher specificity) the width param. Can be merged to main code later on */
@media (min-width: 500px){
body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width .cm-embed-block.cm-callout > div[data-callout-metadata$="small"].callout { width: var(--float-small-width) !important; margin-left: 0 !important; }
body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width .cm-embed-block.cm-callout > div[data-callout-metadata$="medium"].callout { width: var(--float-medium-width) !important; margin-left: 0 !important; }
}
@media (min-width: 750px){
body[class*="minimal-tab-title"] .markdown-source-view.mod-cm6.is-readable-line-width .cm-embed-block.cm-callout > div[data-callout-metadata$="large"].callout { width: var(--float-large-width); margin-left: 0 !important; }
}
/* === List Column ===*/
/* supported for (1) css :has(), (2) yaml cssclass, (3) CT plugin, and (4) MA plugin
- CSS :has() can be applied to sublists, so no column rule. CT plugin apply to div that houses the ul, so column gap is different
- xx-column-list for first level only list, but apply anywhere but xx-column-list-block apply at block level. Both require JV's Markdown Attributes plugin
*/
/* -- List Column/Grid/Card general styling -- */
/* hide tag in rendered view, dim it in edit mode and small size */
:is(div[class*="mcl"].markdown-rendered, .markdown-rendered) a[href*="#mcl"] {display: none;}
/* :is(div[class*="mcl"].markdown-rendered, .markdown-rendered div[class*="mcl"]) a[href*="#mcl"] {display: none;} */
.cm-s-obsidian .HyperMD-list-line span[class*="mcl"] {background-color: var(--background-primary) !important; color: var(--text-faint); font-size: 0.9rem; }
/* -- List Column using YAML cssclass and Markdown Attributes i.e. {.three-column-list-block} -- */
/* define the column gap and column rule */
.two-column-list div > ul, .two-column-list-block,
.three-column-list div > ul, .three-column-list-block,
.four-column-list div > ul, .four-column-list-block,
.multi-column-list div > ul, .multi-column-list-block
{ column-gap: 3rem; column-rule: var(--col-rule-width) solid var(--col-rule-color); }
/* define the column count, for fixed number of columns, to subject it to note's width (in future can use @container when installer v1.2.7 widely used ) */
@media (min-width: 500px ){
.two-column-list div > ul, .two-column-list-block {columns: 2; }
.three-column-list div > ul, .three-column-list-block {columns: 3; }
.four-column-list div > ul, .four-column-list-block {columns: 4; }
}
.multi-column-list div > ul, .multi-column-list-block { column-width: var(--list-min-width); }
/* Special adjustment for footnotes applied with -colum-list-block -- obsidian creates a <br> tag at the last <li> */
.footnotes [class$="-column-list-block"] li:last-of-type br:last-of-type {display: none;}
/* -- List Column Using Tag (using CSS has) -- */
/* set the column rules at ul level and adjust the margin */
ul:has(> li > [data-heading] > [href*="#mcl/list-column"]),
ul:has(> li > [href*="#mcl/list-column"]) {
margin-top: 0;
column-width: var(--list-min-width); column-gap: 1rem;
column-rule: var(--col-rule-width) solid var(--col-rule-color);
}
/* give some margin for the div, for first ul only */
div:has(> ul > li > [href*="#mcl/list-column"]),
div:has(> ul > li > [data-heading] > [href*="#mcl/list-column"])
{ margin-top: 0.8em; }
/* readjust [!blank] display contents */
div[data-callout*="blank"] > .callout-content:has(li [href*="#mcl/list-column"]) {display: block; margin: 0; padding: 0; }
/* -- General Adjustment for List Column -- */
/* Adjustment for misaligned bullets (this is a hack, need to find better solution later) */
ul:has([href="#mcl/list-column"]) li > .list-bullet::after, /* :has() */
.markdown-preview-view[class*="column-list"] li > .list-bullet::after, /* yaml cssclass */
.tag-mcllist-column ul li > .list-bullet::after, /* contextual typography */
ul[class*="column-list"] li > .list-bullet::after /* markdown attributes */
{ position: relative; }
/* -- Special Adjustment for Plugins for List Column -- */
/* for Custom Classes */
div.cc-container:has(li > [href="#mcl/list-column"]) { width: 100%; }
/* === List Grid (using hashtag) === */
/* supported (1) :has() and (2) Contextual Typography plugin */
/* -- Main Code -- */
ul:has(> li > [data-heading] > [href*="#mcl/list-grid"]),
ul:has(> li > [href*="#mcl/list-grid"]),
div[class*="mcllist-grid"] ul:first-child
{ display: grid; grid-template-columns: repeat(auto-fit,minmax(var(--list-grid-min-width),1fr)); }
ul:has(> li > [data-heading] > [href*="#mcl/list-grid-wide"]),
ul:has(> li > [href*="#mcl/list-grid-wide"]),
div[class*="mcllist-grid-wide"] ul:first-child
{ grid-template-columns: repeat(auto-fit,minmax(var(--list-grid-wide-min-width),1fr)); }
ul:has(> li > [data-heading] > [href*="#mcl/list-grid"]) > li:not(:last-of-type),
ul:has(> li > [href*="#mcl/list-grid"]) > li:not(:last-of-type),
div[class*="mcllist-grid"] ul:first-child > li:not(:last-of-type)
{ padding-right: 1.6em; }
ul:has(> li > [data-heading] > [href*="#mcl/list-grid-sm"]),
ul:has(> li > [href*="#mcl/list-grid-sm"]),
div[class*="mcllist-grid-sm"] ul:first-child
{ --list-grid-min-width: 20%; }
/* - dashboard style, page level only, apply to any first level */
/* -- applicable only when width > 400pt, else just single column */
/* grid list block level cannot be done, it breaks formatting */
@media (min-width: 500px) {
.two-column-grid-list div > ul { display: grid; grid-column-gap:3em; grid-template-columns:repeat(2,1fr);}
}
@media (min-width: 600px) {
.three-column-grid-list div > ul { display: grid; grid-column-gap:3em; grid-template-columns:repeat(3,1fr);}
}
/* === List Card (using hashtag) === */
/* supported (1) :has() and (2) Contextual Typography plugin */
body {
--mcl-card-header-border-width: 1px;
--mcl-card-bg-color: var(--background-secondary);
--mcl-card-gap: 0.2em;
--mcl-card-border-width: 1px;
--mcl-card-border-color: var(--background-modifier-border);
}
/* -- Main Code -- */
/* make the list grid, remove some ul padding */
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), [class*="mcllist-card"]) ul:first-child { display: grid; grid-template-columns: repeat(auto-fit,minmax(var(--list-grid-min-width),1fr)); margin-block-start: 0.5em; }
:is(div:has(> ul [data-heading*="#mcl/list-card-wide"]), [class*="mcllist-card-wide"]) ul:first-child { grid-template-columns: repeat(auto-fit, minmax(var(--list-grid-wide-min-width),1fr));}
/* unindent first level bullet */
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) ul ul:not(ul ul ul) { padding-left: 0.1em; } /* with v1.6 this is somewhat redundant */
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) ul ul:not(ul ul ul) > li { margin-inline-start: 0; }
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), div:has(> ul [data-heading*="#mcl/list-card"]) .callout-content, .tag-mcllist-card, .tag-mcllist-card .callout-content) > ul { padding-left: 0; }
:is(.is-mobile .markdown-preview-section) :is(div:has([data-heading*="#mcl/list-card"]), .tag-mcllist-card) :is(ol:not(ol ol ol), ul:not(ul ul ul)) {padding-left: 0;}
/* reposition the collapse indicator and hover behaviour */
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), div:has(> ul [data-heading*="#mcl/list-card"]) .callout-content, .tag-mcllist-card, .tag-mcllist-card .callout-content) > ul > li {position: relative;}
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), div:has(> ul [data-heading*="#mcl/list-card"]) .callout-content, .tag-mcllist-card, .tag-mcllist-card .callout-content) > ul > li:hover > .collapse-indicator,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), div:has(> ul [data-heading*="#mcl/list-card"]) .callout-content, .tag-mcllist-card, .tag-mcllist-card .callout-content) > ul > li > ul > li:hover > .collapse-indicator {opacity: 1;}
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), div:has(> ul [data-heading*="#mcl/list-card"]) .callout-content, .tag-mcllist-card, .tag-mcllist-card .callout-content) > ul > li > .collapse-indicator,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), div:has(> ul [data-heading*="#mcl/list-card"]) .callout-content, .tag-mcllist-card, .tag-mcllist-card .callout-content) > ul > li > ul > li > .collapse-indicator {position: absolute; right: 0.7em; padding-right: 0;}
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) ul::before {display: none;}
/* decorate the first heading for cards */
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [data-heading*="#mcl/list-card"]) .callout-content, .tag-mcllist-card, .tag-mcllist-card .callout-content) > ul > li:not(.is-collapsed) > [data-heading] {border-bottom: var(--mcl-card-header-border-width) solid var(--mcl-card-border-color); margin-bottom: 0.2em;}
/* hide the list bullet for list-card for first and second level */
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) > div > div > ul > li > .list-bullet::after,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) > div > div > ul > li > ul > li > .list-bullet::after,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) > ul > li::before,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) > ul > li > ul > li::before,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) > ul > li > .list-bullet::after,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) > ul > li > ul > li > .list-bullet::after {visibility: hidden;}
/* remove the indentation guide */
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) ul:not(ul ul ul ul)::before {--indentation-guide-width: 0;}
.markdown-rendered.show-indentation-guide :is(div:has(> ul [data-heading*="#mcl/list-card"]), .tag-mcllist-card) li > ul::before,
.markdown-rendered.show-indentation-guide :is(div:has(> ul [data-heading*="#mcl/list-card"]), .tag-mcllist-card) li > ol::before {border-right: 0; border-left: 0; }
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) li {list-style: none;}
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) li li li {list-style: circle;}
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) .callout ul:not(ul ul) > li,
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) ul:not(ul ul) > li
{ margin-inline: var(--mcl-card-gap); margin-bottom: calc(var(--mcl-card-gap)*2); padding: 0.3em 0.5em; outline: var(--mcl-card-border-width) solid var(--mcl-card-border-color); border-radius: 0.5em; background-color: var(--mcl-card-bg-color);}
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) ul:not(ul ul) > li img {width: 100%;}
:is(div:has(> ul [data-heading*="#mcl/list-card"]), div:has(> ul [href*="#mcl/list-card"]), .tag-mcllist-card) ul img {margin: 0; float: none;}
/* -- Special Adjustment for Themes -- */
/* Sanctum */
.markdown-rendered .tag-mcllist-card ul img[alt*=right] {margin: 0;}
/* === Style Settings === */
/* @settings
name: Modular CSS Layout - Multi Column
id: modular-css-layout-mc
settings:
-
id: multi-column-title
title: Multi Column Callout Settings
type: heading
level: 1
collapsed: true
-
id: mc-callout-general-title
title: MCC -- General
type: heading
level: 2
collapsed: false
-
id: mcc-img-snw-display
title: Hide SNW indicator for images in MC Callout
type: variable-select
default: none
options:
-
label: Show
value: inline
-
label: Hide
value: none
-
id: mc-callout-width-title
title: MCC -- Width
type: heading
level: 2
collapsed: false
-
id: callout-min-width
title: Minimum Sub-Callout Width
description: for sub-callout in [!multi-column]. in px units
type: variable-number-slider
default: 200
min: 100
max: 500
step: 50
format: px
-
id: callout-nowrap-min-width
title: Minimum NO-WRAP Sub-Callout Width
description: for sub-callout in [!multi-column|no-wrap]. in px units
type: variable-number-slider
default: 250
min: 100
max: 500
step: 50
format: px
-
id: mc-callout-gap-title
title: MCC -- Gap & Margin
type: heading
level: 2
collapsed: false
-
id: callout-gap
title: Sub-Callout Gap (any unit)
description: NO spacing between figure and unit
type: variable-text
default: 1em
-
id: callout-margin
title: Sub-Callout Margin (any unit)
description: to allow some spacing for box-shadow
type: variable-text
default: 0px
-
id: float-callout-title
title: Float Callout Settings
type: heading
level: 1
collapsed: true
-
id: float-callout-general-title
title: FC -- General
type: heading
level: 2
collapsed: false
-
id: float-callout-snw-display
title: Hide SNW indicator in Callout Float / Aside
type: variable-select
default: none
options:
-
label: Show
value: inline-block
-
label: Hide
value: none
-
id: float-width-title
title: FC -- Width
type: heading
level: 2
collapsed: false
-
id: float-small-width
title: Floating Callout Width - Small (in px)
type: variable-number-slider
default: 300
min: 200
max: 450
step: 50
format: px
-
id: float-medium-width
title: Floating Callout Width - Medium (in px)
type: variable-number-slider
default: 400
min: 300
max: 550
step: 50
format: px
-
id: float-large-width
title: Floating Callout Width - Large (in px)
type: variable-number-slider
default: 600
min: 500
max: 750
step: 50
format: px
-
id: float-gap-title
title: FC -- Gap & Margin
type: heading
level: 2
collapsed: false
-
id: float-callout-top-margin
title: Adjust top margin for Float Left and Float Right
description: Can use em or px unit
type: variable-text
default: 0em
-
id: float-left-callout-margin-inline
title: Adjust left-right margin for Float Left Callout
description: Enter in this order - "left right". Can use em or px unit
type: variable-text
default: 0px 12px
-
id: float-right-callout-margin-inline
title: Adjust left-right margin for Float Right Callout
description: Enter in this order - "left right". Can use em or px unit
type: variable-text
default: 12px 0px
-
id: mc-list-column-title
title: List Column
description: using `{.xxx-column-list-xxx}` and `#mcl/list-column`
type: heading
level: 1
collapsed: true
-
id: list-column-width-title
title: Width control for List Column
type: heading
level: 2
collapsed: false
-
id: list-min-width
title: Minimum Column Width (in px)
type: variable-number-slider
default: 200
min: 100
max: 500
step: 50
format: px
-
id: list-column-deco-title
title: Decoratives control for List Column
type: heading
level: 2
collapsed: false
-
id: col-rule-width
title: Ruler (vertical line between columns) width for List Column
description: in px unit. Set to 0 to disable ruler
type: variable-number-slider
default: 1
min: 0
max: 4
step: 1
format: px
-
id: col-rule-color
title: Ruler (vertical line between columns) color for List Column
type: variable-themed-color
format: hsl
opacity: true
default-light: '#'
default-dark: '#'
-
id: mc-list-grid-title
title: List Grid and List Card
description: using `#mcl/list-grid` and `#mcl/list-card`
type: heading
level: 1
collapsed: true
-
id: list-grid-card-width-title
title: Width control for List Grid and List Card
type: heading
level: 2
collapsed: false
-
id: list-grid-min-width
title: Minimum width for normal List Grid/Card
description: For `#mcl-list-grid` or `#mcl-list-card`. Can use em or px unit
type: variable-text
default: 250px
-
id: list-grid-wide-min-width
title: Minimum width for Wide List Grid/Card
description: For `#mcl/list-grid-wide` or `#mcl/list-card-wide`. Can use em or px unit
type: variable-text
default: 350px
-
id: list-card-deco-title
title: Decoratives control for List Card
type: heading
level: 2
collapsed: false
-
id: mcl-card-header-border-width
title: Bottom border for first header in List Card
description: Can use em or px unit. Set to 0 to disable the border
type: variable-text
default: 1px
-
id: mcl-card-bg-color
title: Background color for List Card
type: variable-themed-color
format: hsl
opacity: true
default-light: '#'
default-dark: '#'
-
id: mcl-card-gap
title: Gap between cards for List Card
description: Can use em or px unit
type: variable-text
default: 0.2em
-
id: mcl-card-border-width
title: Border width for each card in List Card
description: Can use em or px unit. Set to 0 to disable the border
type: variable-text
default: 1px
-
id: mcl-card-border-color
title: Border color for each card in List Card
type: variable-themed-color
format: hsl
opacity: true
default-light: '#'
default-dark: '#'
*/
+396
View File
@@ -0,0 +1,396 @@
/* === README for MCL Wide Views snippet / Author: Faiz Khuzaimah / twitter: @faizkhuzaimah / github: https://github.com/efemkay
Ver 0.9.6 (updated 2023-09-09) - Code refactor to make use predefined variables and more efficient code base
- refactor all wide views features. require Obsidian installer v1.1.9.
- fixed all issues from previous codebase
Version 0.9.4 (updated 2023-07-05)
- fixed wide-backlinks not working since Obsidian V1
- improved support for Minimal V7
What is this snippet for?
- for any users to use with any theme to complement any missing page/block width control
- available cssClass:
- wide-page
- wide-table
- wide-dataview
- wide-callout
- wide-backlinks
- narrow-page
- style settings toggle
- is-adj-rll with adj-rll-max-width input
Important Notice
- this snippet requires Obsidian installer version (not app version) of 1.1.9 or higher as it requires Electron v21
Credits
- Kevin Powell Youtube channel
*/
/* === Wide Page === */
/* -- Main Code - EV & RV -- */
body .wide-page { --file-line-width: 100%; }
/* -- Special adjustment for Community Themes */
/* Minimal */
body[class*="minimal-tab-title"] .wide-page {
--line-width: 100%;
--max-width: 95%;
--container-table-width: var(--line-width);
--container-table-max-width: var(--max-width);
}
/* AnuPpuccin */
/* body .wide-page { --anp-preview-width-pct: 100%; } */
/* === Adjustable RLL === */
/* cssClass toggle to allow users to adjust the RLL via Style Settings.
Obsidian v1.0.0 makes it easier to do adjustable RLL ;) */
/* -- Main Code - Editing and Reading View -- */
body.is-adj-rll .view-content { --file-line-width: var(--adj-rll-max-width); }
/* === Narrow Page === */
/* cssClass YAML to allow users with disabled RLL to introduce RLL per
page/note basis. width is following obsidian default setting, or you
can change it via MCL's Adjustable RLL */
/* -- Main Code - Editing and Reading View -- */
.narrow-page.markdown-source-view .cm-sizer,
.narrow-page.markdown-preview-view .markdown-preview-sizer {
max-width: var(--file-line-width);
margin-inline: auto;
}
/* === General Setups for Wide Blocks === */
/* -- Setup for @container -- */
:is(.wide-table-global, .wide-dataview-global, .wide-callout-global, .wide-backlinks-global) .markdown-source-view.is-readable-line-width,
:is(.wide-table-global, .wide-dataview-global, .wide-callout-global, .wide-backlinks-global) .markdown-preview-view.is-readable-line-width,
:is(.wide-table, .wide-dataview, .wide-callout, .wide-backlinks).markdown-source-view.is-readable-line-width,
:is(.wide-table, .wide-dataview, .wide-callout, .wide-backlinks).markdown-preview-view.is-readable-line-width {
container-name: content-view;
container-type: inline-size;
}
/* === Wide Blocks - Wide Table === */
/* -- Mai.n Code - EV & RV -- */
body {
--wide-tbl-left-ev-adj: -4rem;
--wide-tbl-min-left-ev: 0.5rem;
--wide-tbl-width-ev: calc( var(--file-line-width) - var(--wide-tbl-left-ev-adj) );
}
body:has(.cm-gutters) {
--wide-tbl-left-ev-adj: 1rem;
--wide-tbl-min-left-ev: 6rem;
}
@container content-view (width > 50px) {
/* editing view */
:is(.wide-table-global, .wide-table) .cm-embed-block.cm-table-widget {
width: calc(100cqi - 4rem);
margin-left: calc( max( 100cqi - var(--wide-tbl-width-ev), var(--wide-tbl-min-left-ev) ) / 2 * -1 ) !important;
}
/* reading view */
:is(.wide-table-global .markdown-preview-view, .wide-table.markdown-preview-view) div:has(> table) {
width: 100cqi;
margin-left: calc( max( 100cqi - var(--file-line-width), 1rem ) / 2 * -1 ) !important;
}
/* centering the table a bit */
:is(.wide-table-global, .wide-table) .cm-embed-block.cm-table-widget table,
:is(.wide-table-global .markdown-preview-view, .wide-table.markdown-preview-view) div > table
{ margin-inline: auto; }
}
/* -- Special adjustment for Community Themes */
/* Minimal, complete re-write for the theme due to many !important used by the theme */
body[class*="minimal-tab-title"] {
--wide-tbl-left-adj: -4rem;
--wide-tbl-width-adj: 2rem;
}
body[class*="minimal-tab-title"]:has(.cm-gutters) {
--wide-tbl-left-adj: -4rem;
--wide-tbl-width-adj: 0rem;
}
body[class*="minimal-tab-title"]:has(.cm-gutters).minimal-theme {
--wide-tbl-left-adj: 0rem;
}
@container content-view (width > 50px) {
body[class*="minimal-tab-title"][class*="wide-table-global"] .markdown-source-view .cm-contentContainer.cm-contentContainer .cm-embed-block.cm-table-widget,
body[class*="minimal-tab-title"] .wide-table.markdown-source-view .cm-contentContainer.cm-contentContainer .cm-embed-block.cm-table-widget {
width: calc(100cqi - 4rem) !important;
max-width: 100%;
margin-left: calc( var(--wide-tbl-left-adj) / 2 * -1 ) !important;
}
body[class*="minimal-tab-title"][class*="wide-table-global"] .markdown-preview-view .markdown-preview-sizer div:has(> table),
body[class*="minimal-tab-title"] .wide-table.markdown-preview-view .markdown-preview-sizer div:has(> table) {
width: calc(100cqi - 2rem - var(--wide-tbl-width-adj) ) !important;
max-width: 100%;
margin-left: calc( var(--wide-tbl-left-adj) / 2 * -1 ) !important;
}
/* centering the table a bit */
body[class*="minimal-tab-title"][class*="wide-table-global"] .markdown-source-view .cm-contentContainer.cm-contentContainer .cm-embed-block.cm-table-widget table,
body[class*="minimal-tab-title"] .wide-table.markdown-source-view .cm-contentContainer.cm-contentContainer .cm-embed-block.cm-table-widget table,
body[class*="minimal-tab-title"][class*="wide-table-global"] .markdown-preview-view .markdown-preview-sizer div > table,
body[class*="minimal-tab-title"] .wide-table.markdown-preview-view .markdown-preview-sizer div > table
{ margin-inline: auto; }
}
/* Catppuccin */
body[class*="ctp-"].is-adj-rll:not([class*="anp-default"]) { --wide-tbl-left-ev-adj: -8rem; }
/* === Wide Blocks - Wide Dataview === */
/* there are options to enable it (a) per page basis and (b) globally
however, editing view is a hackaround */
/* -- Main Code - EV & RV -- */
body {
--wide-dv-left-ev-adj: -4rem;
--wide-dv-min-left-ev: 0.5rem;
--wide-dv-width-ev: calc( var(--file-line-width) - var(--wide-dv-left-ev-adj) );
}
body:has(.cm-gutters) {
--wide-dv-left-ev-adj: 1.7rem;
--wide-dv-min-left-ev: 6.5rem;
}
@container content-view (width > 50px) {
:is(.wide-dataview-global, .wide-dataview) .cm-preview-code-block:has(> .block-language-dataview),
:is(.wide-dataview-global, .wide-dataview) .cm-preview-code-block:has(> .block-language-dataviewjs) {
width: calc(100cqi - 4rem );
margin-left: calc( max( 100cqi - var(--wide-dv-width-ev), var(--wide-dv-min-left-ev) ) / 2 * -1 ) !important;
}
:is(.wide-dataview-global, .wide-dataview) div:has(> .block-language-dataview),
:is(.wide-dataview-global, .wide-dataview) div:has(> .block-language-dataviewjs) {
width: 100cqi;
margin-left: calc( max( 100cqi - var(--file-line-width), 1rem ) / 2 * -1 ) !important;
}
}
/* -- Special adjustment for Community Themes */
/* Minimal, complete re-write for the theme */
body[class*="minimal-tab-title"] {
--wide-dv-width-adj: 2rem;
}
body[class*="minimal-tab-title"]:has(.cm-gutters) {
--wide-dv-left-ev-adj: -4rem;
--wide-dv-width-adj: 0rem;
}
body[class*="minimal-tab-title"]:has(.cm-gutters).minimal-theme {
--wide-dv-left-ev-adj: 0rem;
}
@container content-view (width > 50px) {
body[class*="minimal-tab-title"][class*="wide-dataview-global"] .markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content .cm-preview-code-block:has(> .block-language-dataview),
body[class*="minimal-tab-title"] .wide-dataview.markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content .cm-preview-code-block:has(> .block-language-dataview),
body[class*="minimal-tab-title"][class*="wide-dataview-global"] .markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content .cm-preview-code-block:has(> .block-language-dataviewjs),
body[class*="minimal-tab-title"] .wide-dataview.markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content .cm-preview-code-block:has(> .block-language-dataviewjs) {
width: calc(100cqi - 4rem);
max-width: 100%;
margin-left: calc( var(--wide-dv-left-ev-adj) / 2 * -1 ) !important;
}
body[class*="minimal-tab-title"][class*="wide-dataview-global"] .markdown-preview-view div:has(> .block-language-dataview),
body[class*="minimal-tab-title"] .wide-dataview.markdown-preview-view div:has(> .block-language-dataview),
body[class*="minimal-tab-title"][class*="wide-dataview-global"] .markdown-preview-view div:has(> .block-language-dataviewjs),
body[class*="minimal-tab-title"] .wide-dataview.markdown-preview-view div:has(> .block-language-dataviewjs) {
width: calc(100cqi - 2rem - var(--wide-dv-width-adj) );
max-width: 100%;
margin-left: calc( var(--wide-dv-left-ev-adj) / 2 * -1 ) !important;
}
/* centering the table a bit */
body[class*="minimal-tab-title"][class*="wide-dataview-global"] .markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content table,
body[class*="minimal-tab-title"] .wide-dataview.markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content table,
body[class*="minimal-tab-title"] .wide-dataview.markdown-preview-view .markdown-preview-sizer div > table {
width: calc( 100% );
}
}
/* Catppuccin */
body[class*="ctp-"].is-adj-rll:not([class*="anp-default"]) { --wide-dv-left-ev-adj: -8rem; }
/* === Wide Blocks - Wide Callout === */
/* there are options to enable it (a) per page basis and (b) globally
however, editing view is a hackaround
!important needed because app's default uses it `.markdown-source-view.mod-cm6 .cm-content > *` */
/* -- Main Code - EV & RV -- */
body {
--wide-co-left-ev-adj: -3.8rem;
--wide-co-min-left-ev: 0.5rem;
--wide-co-width-ev-adj: 4rem;
--wide-co-width-ev: calc(var(--file-line-width) - var(--wide-co-left-ev-adj) );
}
body:has(.cm-gutters) {
--wide-co-left-ev-adj: 1.7rem;
--wide-co-min-left-ev: 6.5rem;
}
@container content-view (width > 50px) {
:is(.wide-callout-global, .wide-callout) .cm-embed-block.cm-callout {
width: calc( 100cqi - var(--wide-co-width-ev-adj) );
margin-left: calc( max( 100cqi - var(--wide-co-width-ev), var(--wide-co-min-left-ev) ) / 2 * -1 ) !important;
}
:is(.wide-callout-global, .wide-callout) .markdown-preview-sizer > div:has(> .callout) {
width: 100cqi;
margin-left: calc( max( 100cqi - var(--file-line-width), 1rem ) / 2 * -1 ) !important;
}
}
/* -- Special adjustment for Community Themes */
/* Minimal, complete re-write for the theme */
body[class*="minimal-tab-title"] { --folding-toggle: 1; }
body.minimal-theme { --folding-toggle: 0; }
body.minimal-theme:not(:has(.cm-gutters)) { --folding-toggle: 1; }
@container content-view (width > 50px) {
body[class*="minimal-tab-title"][class*="wide-callout-global"] .markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content .cm-embed-block.cm-callout,
body[class*="minimal-tab-title"] .wide-callout.markdown-source-view .cm-contentContainer.cm-contentContainer .cm-content .cm-embed-block.cm-callout {
width: calc(100cqi - 4rem);
max-width: 100%;
margin-left: calc( var(--folding-offset) * var(--folding-toggle) ) !important;
}
body[class*="minimal-tab-title"][class*="wide-callout-global"] .markdown-preview-view .markdown-preview-sizer > div:has(> .callout),
body[class*="minimal-tab-title"] .wide-callout.markdown-preview-view .markdown-preview-sizer > div:has(> .callout) {
width: calc(100cqi - 2rem - 2rem * var(--folding-toggle) );
max-width: calc(100% - 0rem);
margin-left: calc( var(--folding-offset) * var(--folding-toggle) ) !important;
}
}
/* AnuPpuccin */
body[class*="anp-"] { --wide-co-width-ev-adj: 3.5rem; }
/* Catppuccin */
body[class*="ctp-"].is-adj-rll:not([class*="anp-default"]) { --wide-co-left-ev-adj: -7.8rem; }
/* === Wide Blocks - Wide Backlinks === */
/* -- Main Code - EV & RV -- */
body {
--wide-bl-left-ev-adj: 4rem;
--wide-bl-width-ev: calc(var(--file-line-width) + var(--wide-bl-left-ev-adj) );
}
@container content-view (width > 50px) {
:is(.wide-backlinks-global .markdown-source-view, .wide-backlinks.markdown-source-view) .embedded-backlinks {
width: calc(100cqi - 3.5rem);
margin-left: calc( max( 100cqi - var(--wide-bl-width-ev), 1rem ) / 2 * -1 );
}
:is(.wide-backlinks-global .markdown-preview-view, .wide-backlinks.markdown-preview-view) .embedded-backlinks {
width: calc(100cqi - 0rem);
margin-left: calc( max( 100cqi - var(--file-line-width), 1rem ) / 2 * -1 );
}
}
/* -- Special adjustment for Community Themes */
/* Minimal, complete re-write for the theme */
body[class*="minimal-tab-title"] {
--wide-bl-width-adj: 4rem;
}
body[class*="minimal-tab-title"]:has(.cm-gutters) {
--wide-bl-width-adj: 0rem;
}
@container content-view (width > 50px) {
body[class*="minimal-tab-title"][class*="wide-backlinks-global"] .markdown-source-view .cm-sizer .embedded-backlinks,
body[class*="minimal-tab-title"] .wide-backlinks.markdown-source-view .cm-sizer .embedded-backlinks {
width: calc(100cqi - 4.5rem);
max-width: unset;
margin-left: calc( var(--wide-bl-width-adj) / 2 * 1 ) !important;
}
body[class*="minimal-tab-title"][class*="wide-backlinks-global"] .markdown-preview-view .embedded-backlinks,
body[class*="minimal-tab-title"] .wide-backlinks.markdown-preview-view .embedded-backlinks {
width: calc( 100cqi - 2rem - var(--wide-bl-width-adj)/2 );
margin-left: calc( max( 100cqi - var(--line-width) - var(--wide-bl-width-adj) , 4rem ) / 2 * -1 ) !important;
}
}
/* Catppuccin */
body[class*="ctp-"].is-adj-rll:not([class*="anp-default"]) { --wide-bl-left-ev-adj: 13.5rem; }
/* @settings
name: Modular CSS Layout - Wide Views
id: modular-css-layout-wv
settings:
-
id: adj-rll-title
title: Adjustable RLL Settings
description: Control max-width for all page/note by default. RLL must be **enabled**
type: heading
level: 2
collapsed: true
-
id: is-adj-rll
title: Enable Adjustable RLL
description: Add is-adj-rll class to the body element
type: class-toggle
-
id: adj-rll-max-width
title: Max Width for Normal Width page
description: Can use any unit e.g. px, em, ch
type: variable-text
default: 700px
-
id: wide-view-title
title: Vault-wide toggle for Wide Blocks
description: For wide -table/-dataview/-callout/-backlinks. RLL must be **enabled**
type: heading
level: 2
collapsed: true
-
id: wide-dataview-global
title: Enable `wide-dataview` vault-wide
description: use `wide-dataview` in yaml to enable only for selected note/page
type: class-toggle
-
id: wide-table-global
title: Enable `wide-table` vault-wide
description: use `wide-table` in yaml to enable only for selected note/page
type: class-toggle
-
id: wide-callout-global
title: Enable `wide-callout` vault-wide
description: use `wide-callout` in yaml to enable only for selected note/page
type: class-toggle
-
id: wide-backlinks-global
title: Enable `wide-backlinks` vault-wide
description: use `wide-backlinks` in yaml to enable only for selected note/page
type: class-toggle
-
id: narrow-view-title
title: Narrow Page Settings
description: Control max-width page/note with cssClass `narrow-page`. RLL must be **disabled**
type: heading
level: 2
collapsed: true
-
id: narrow-max-width
title: Max Width for Narrow View page (any unit e.g. px, em, ch)
type: variable-text
default: 750px
*/
+9
View File
@@ -0,0 +1,9 @@
.two-columns {
display: flex;
flex-direction: row;
gap: 20px;
}
.column {
flex: 1;
}
+19
View File
@@ -0,0 +1,19 @@
{
"types": {
"aliases": "aliases",
"cssclasses": "multitext",
"tags": "tags",
"created": "datetime",
"event_date": "datetime",
"event_duration": "number",
"event.date": "datetime",
"bug_recorded": "datetime",
"context_role": "text",
"iteration_end": "datetime",
"iteration_start": "datetime",
"iterdef_start": "datetime",
"iterdef_end": "datetime",
"base_created": "datetime",
"base_updated": "datetime"
}
}
+253
View File
@@ -0,0 +1,253 @@
{
"main": {
"id": "e7657f07a517ef91",
"type": "split",
"children": [
{
"id": "7d67a6c0245aeef2",
"type": "tabs",
"children": [
{
"id": "10dd868efe437d0d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "_templates/Default Note.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Default Note"
}
},
{
"id": "4c9cbec55e399ce4",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "_templates/Add-Work.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Add-Work"
}
},
{
"id": "8a8673d1d65a8d04",
"type": "leaf",
"state": {
"type": "bases",
"state": {
"file": "50-Aufgabenplanung/Taskliste.base",
"viewName": "Table"
},
"icon": "lucide-table",
"title": "Taskliste"
}
}
],
"currentTab": 2
}
],
"direction": "vertical"
},
"left": {
"id": "5511791727ef5375",
"type": "split",
"children": [
{
"id": "7debd1fb2c0dacbe",
"type": "tabs",
"children": [
{
"id": "3b234dede123cd0c",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "0f2414cbc0900ae9",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "17979cf4c0f2512e",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "3580347cbf61afa4",
"type": "split",
"children": [
{
"id": "30a17088b7a811a3",
"type": "tabs",
"children": [
{
"id": "98a926a8e591ce81",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "_templates/Add-Iteration.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Add-Iteration"
}
},
{
"id": "7b12dda901ff8aad",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "_templates/Add-Iteration.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Add-Iteration"
}
},
{
"id": "12065cab735be01b",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "4f635faa913baf7f",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "4fb0fa1a25f1fa77",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "_templates/Add-Iteration.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Add-Iteration"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false,
"templater-obsidian:Templater": false
}
},
"active": "8a8673d1d65a8d04",
"lastOpenFiles": [
"50-Aufgabenplanung/Erste Schritte der Aufgabenplanung.md",
"50-Aufgabenplanung/Backup Konfiguration evaluieren.md",
"50-Aufgabenplanung/Taskliste.base",
"50-Aufgabenplanung/Die Angebotssynchronisation muss sicherstellen, dass eine passende Kalkulation existiert.md",
"50-Aufgabenplanung/Docker Repository Service im Cluster bereitstellen.md",
"Juli Notes.base",
"Personal OS.md",
"20-projects/JULI.md",
"50-Aufgabenplanung",
"20-projects/Juli",
"00-inbox/Ein neuer Arbeitszeitplan überschreibt den aktuellen Plan.md",
"00-inbox/Julius landet mit seiner E-Mail in einer Login Schleife.md",
"90-dashboards/Hygiene.md",
"00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen.md",
"30-tasks/Arbeitszeit aufteilen.md",
"90-dashboards/Hygiene Migration.md",
"30-tasks/Review erfasster Mehraufwände.md",
"40-notes/Iteration 3.md",
"40-notes/Demo Iteration 2.md",
"40-notes/Iteration 1.md",
"40-notes/Iteration 2.md",
"40-notes/Backlog.md",
"40-notes/Austausch Dashboard Painpoints.md",
"20-projects/Avicenna.md",
"10-contexts/health.md",
"10-contexts/Genius.ceo.md",
"20-projects/medmix Deutschland GmbH.md",
"30-tasks/Projektpositionen können abgeschlossen werden.md",
"30-tasks/Liste der Mehraufwände am Projekt.md",
"30-tasks/Personalstamm implementieren.md",
"00-inbox/Untitled.base",
"_attachments",
"_templates/scripts/auto_increment.js",
"_templates/scripts",
"_templates"
]
}
@@ -0,0 +1,25 @@
---
components:
- contextual
- iterbind
- actionable
context_target: "[[JULI]]"
context_role: project
context_relation: belongs_to
iterbind_target: "[[Backlog]]"
iterbind_status: planned
iterbind_role: primary
iterbind_order: 0
action_status: open
action_effort_minutes: 360
action_impact: 3
action_result: ""
base_created: 2026-06-17T17:40
base_modified: 2026-06-19T17:48
---
## Action
- Next step:
- Definition of done: Der Kontingentverbrauch ist an allen Positionen und Subpositionen visualisierbar.
## Result
@@ -0,0 +1,4 @@
---
context_target: "[[JULI]]"
iterbind_target: "[[Backlog]]"
---
@@ -0,0 +1,16 @@
---
components:
- contextual
context_target: "[[JULI]]"
context_role: project
context_relation: belongs_to
iterbind_target: "[[Backlog]]"
base_created: 2026-06-17T17:41
base_modified: 2026-06-19T17:48
action_status: open
action_effort_minutes: 360
action_impact: 5
---
Ähnlich zu der Arbeitszeitzuordnung muss auch die Materialerfassung die häppchenweise Erfassung unterstützen.
Es wird der Artikel abgefragt und anschließend ein passendes Formular dargestellt. Die Einheit ist vorgefüllt und eine Menge kann angegeben werden.
@@ -0,0 +1,13 @@
---
components:
- contextual
context_target: "[[JULI]]"
context_role: project
context_relation: belongs_to
iterbind_target: "[[Iteration 3]]"
base_created: 2026-06-17T17:35
base_modified: 2026-06-19T17:49
action_status: open
action_effort_minutes: 240
action_impact: 3
---
@@ -0,0 +1,4 @@
---
context_target: "[[JULI]]"
iterbind_target: "[[Backlog]]"
---
@@ -0,0 +1,13 @@
---
components:
- contextual
- actionable
- iterbind
context_target: "[[JULI]]"
iterbind_target: "[[Iteration 3]]"
base_created: 2026-06-17T18:12
base_modified: 2026-06-24T16:23
action_status: open
action_effort_minutes: 240
action_impact: 4
---
+53
View File
@@ -0,0 +1,53 @@
filters:
and:
- file.hasLink("Iteration 2")
formulas:
Aufwand (ET: action_effort_minutes / 60 / 8
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: table
name: Table
order:
- file.name
- action_status
- formula.Aufwand (ET
- action_impact
- action_effort_minutes
sort: []
columnSize:
formula.Aufwand (ET: 138
- type: kanban-view
name: View
filters:
and:
- "!action_status.isEmpty()"
columnOrders:
file.file:
- 00-inbox/Arbeitszeit Sonstiges nur mit Kommentar.md
- 00-inbox/Arbeitszeit aufteilen.md
- 00-inbox/Arbeitszeit taggen.md
- 00-inbox/Personalstamm implementieren.md
- 00-inbox/Werkstatt als Systemprojekt aufnehmen.md
- 30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden.md
- 30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt.md
note.action_status:
- open
- done
cardOrders:
file.file: {}
note.action_status: {}
"file.file\x1fnote.action_status": {}
columnColors:
file.file: {}
note.action_status: {}
groupByProperty: note.action_status
swimlaneByProperty: note.action_status
swimlaneOrders:
"file.file\x1fnote.action_status":
- done
- open
- Uncategorized
collapsedLanes:
"file.file\x1fnote.action_status": []
+5
View File
@@ -0,0 +1,5 @@
---
container: true
created: 2026-05-27T16:37:00
tags:
---
+9
View File
@@ -0,0 +1,9 @@
---
container: true
created: 2026-05-26T00:00:00
tags: []
---
# Health
Ongoing area of responsibility — physical and mental wellbeing.
+11
View File
@@ -0,0 +1,11 @@
---
container: true
created: 2026-05-26
tags: []
---
# Work
Ongoing area of responsibility — professional commitments.
Signature: `container` + no `parent` → context archetype (SPEC §2.3).
+10
View File
@@ -0,0 +1,10 @@
---
container: true
status: open
parent: "[[Genius.ceo]]"
created: 2026-05-27T16:00:00
tags:
- customer-project
---
# Avicenna Dashboard Entwicklung
+102
View File
@@ -0,0 +1,102 @@
---
components:
- contextual
context_target: "[[Genius.ceo]]"
context_role: customer
status: open
created: 2026-05-27T16:00:00
tags:
- customer-project
cssclasses:
- wide-page
---
# JULI Dashboard Entwicklung
> [!multi-column]
>> [!summary]+ Kalender
>> ```dataview
>> Calendar time_at AS "Datum"
>> FROM ""
>> WHERE time_at AND parent = this.file.link
>> SORT time_at ASC
>> ```
>
>> [!summary|min-0]+ Iterationen
> > ```dataview
> > TABLE
> > iterdef_status AS "Status",
> > iterdef_start AS "Start"
> > WHERE context_target = this.file.link AND context_role = "Iteration"
> > SORT iterdef_id DESC
> > ```
## Workspace
```base
filters:
and:
- file.hasLink(this.file.path)
formulas:
Aufwand (ET: action_effort_minutes / 60 / 8
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: kanban-view
name: Planning Board
filters:
and:
- context_target == link("JULI")
- "!iterbind_target.isEmpty()"
order:
- formula.Aufwand (ET
columnOrders:
file.file:
- 00-inbox/Daten Eintragungsfortschritt sichtbar machen.md
- 00-inbox/Einzelpositionserfassung für die Materialliste.md
- 00-inbox/Export der abrechenbaren Mehraufwände.md
- 30-tasks/Arbeitszeit Sonstiges nur mit Kommentar.md
- 30-tasks/Arbeitszeit aufteilen.md
- 30-tasks/Arbeitszeit taggen.md
- 30-tasks/Liste der Mehraufwände am Projekt.md
- 30-tasks/Passwort ändern.md
- 30-tasks/Personalstamm implementieren.md
- 30-tasks/Projektpositionen können abgeschlossen werden.md
- 30-tasks/Review erfasster Mehraufwände.md
- 30-tasks/Werkstatt als Systemprojekt aufnehmen.md
- 30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden.md
- 30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt.md
- 40-notes/Austausch Dashboard Painpoints.md
- 40-notes/Backlog.md
- 40-notes/Demo Iteration 2.md
- 40-notes/Iteration 1.md
- 40-notes/Iteration 2.md
- 40-notes/Iteration 3.md
- 40-notes/Onboarding von Philipp Töbelmann.md
note.iterbind_target:
- "[[Backlog]]"
- "[[Iteration 3]]"
- "[[Iteration 2]]"
- "[[Iteration 1]]"
cardOrders:
file.file: {}
note.iterbind_target:
"[[Iteration 3]]":
- 30-tasks/Review erfasster Mehraufwände.md
- 30-tasks/Liste der Mehraufwände am Projekt.md
- 30-tasks/Projektpositionen können abgeschlossen werden.md
- 00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen.md
columnColors:
file.file: {}
note.iterbind_target: {}
groupByProperty: note.iterbind_target
swimlaneByProperty: note.iterbind_target
quickAddFolder: 00-inbox
cardTitleProperty: file.name
```
## Events
```dataview
Calendar event_date AS "Datum"
FROM ""
WHERE event_date AND parent = this.file.link
SORT event_date ASC
```
+6
View File
@@ -0,0 +1,6 @@
---
components:
- contextual
context_target: "[[Genius.ceo]]"
context_role: customer
---
@@ -0,0 +1,14 @@
---
components:
- contextual
- actionable
- iterbind
action_status: done
action_effort_minutes: 120
action_impact: 4
context_target: "[[JULI]]"
context_role: Feature
iterbind_target: "[[Iteration 2]]"
base_created: 2026-06-09T14:31
base_updated: 2026-06-09T15:33
---
+14
View File
@@ -0,0 +1,14 @@
---
components:
- contextual
- actionable
- iterbind
action_status: done
action_effort_minutes: 480
action_impact: 5
context_target: "[[JULI]]"
context_role: feature
iterbind_target: "[[Iteration 2]]"
base_created: 2026-06-09T14:29
base_updated: 2026-06-09T15:33
---
+14
View File
@@ -0,0 +1,14 @@
---
components:
- contextual
- actionable
- iterbind
action_status: done
action_effort_minutes: 240
action_impact: 4
context_target: "[[JULI]]"
context_role: Feature
iterbind_target: "[[Iteration 2]]"
base_created: 2026-06-09T14:30
base_updated: 2026-06-09T15:33
---
@@ -0,0 +1,18 @@
---
components:
- contextual
- actionable
- iterbind
context_target: "[[JULI]]"
iterbind_target: "[[Iteration 3]]"
base_created: 2026-06-17T17:22
base_modified: 2026-06-24T16:42
action_status: open
action_effort_minutes: 240
action_impact: 1
---
- Sammelcontainer aller Mehraufwände
- Mitarbeiter-Tag (Kürzel) muss an jedem Zeiteintrag hängen
- Zuordnung zu "Abrechenbar", "Nicht abrechenbar"
- Innerhalb einer Kategorie ("Abrechenbar") können Gruppen angelegt werden.
+13
View File
@@ -0,0 +1,13 @@
---
components:
- contextual
- actionable
- iterbind
context_target: "[[JULI]]"
context_role: Feature
iterbind_target: "[[Backlog]]"
action_status: open
action_effort_minutes: 240
action_impact: 3
---
User sollen ihr Passwort fuer das Dashboard aendern koennen.
+18
View File
@@ -0,0 +1,18 @@
---
components:
- contextual
- actionable
- iterbind
context_target: "[[JULI]]"
context_role: Feature
action_status: done
action_effort_minutes: 1200
action_impact: 4
iterbind_target: "[[Iteration 2]]"
base_created: 2026-06-09T14:19
base_modified: 2026-06-24T16:41
---
- Import aller Mitarbeiter
- Mitarbeiter mit Arbeitszeitplan verbinden
- Import der Abwesenheiten und Feiertage
- Tagesbetrachtung der benoetigten Arbeitszeit implementieren
@@ -0,0 +1,15 @@
---
components:
- contextual
- actionable
- iterbind
base_created: 2026-06-10T13:13
base_modified: 2026-06-24T16:42
context_target: "[[JULI]]"
context_role: Feature
iterbind_target: "[[Iteration 3]]"
action_status: open
action_effort_minutes: 360
action_impact: 3
---
- Abgeschlossene Positionen können von Mitarbeitern nicht mehr bebucht werden
@@ -0,0 +1,19 @@
---
components:
- contextual
- actionable
- iterbind
context_target: "[[JULI]]"
iterbind_target: "[[Iteration 3]]"
base_created: 2026-06-17T15:49
base_modified: 2026-06-24T16:42
action_status: done
action_effort_minutes: 840
action_impact: 1
---
Mehraufwände der Mitarbeiter werden in abrechenbare Zeiten überführt.
Jeder Mehraufwand wird in einem Review Prozess geprüft und:
- Übernommen
- Angepasst
- Verworfen
@@ -0,0 +1,17 @@
---
components:
- contextual
- actionable
- iterbind
context_target: "[[JULI]]"
context_role: Feature
action_status: done
action_effort_minutes: 45
action_impact: 1
iterbind_target: "[[Iteration 2]]"
base_created: 2026-05-29T15:24
base_updated: 2026-06-09T15:33
---
> Philipp Töbelmann:
> Kannst du wenn du Kapazitäten hast zusätzlich zu dem Projekt "ALLG -Allgemein Sammelcontainer" einen ein Projekt "Werkstatt - Unproduktiv" kurzfristig mit einführen. Pfade gerne genauso wie bei "ALLG"-Projekt und Arbeitsschritte die immer vorkommen sind: Heizung, Aufräumen, Lackraum reinigen, Sonstiges. Dies Projekt wird häufig benutzt werden und ist von Grund auf schon Unproduktiv. Ich würde diese Zeiten gern direkt in der Testphase schon mit sichtbar machen. Gib mir gerne kurz feedback, ob du das schnell implementieren könntest.
@@ -0,0 +1,16 @@
---
components:
- contextual
- actionable
- iterbind
bug_severity: critical
bug_recorded: 2026-05-28T08:01:00
action_status: done
action_effort_minutes: 0
action_impact: 5
context_target: "[[JULI]]"
context_role: Bug
iterbind_target: "[[Iteration 2]]"
---
Zeit mit Projekt kann nicht auf Allgemein gebucht werden
@@ -0,0 +1,18 @@
---
components:
- contextual
- actionable
- iterbind
bug_severity: critical
bug_recorded: 2026-05-28T08:04:00
action_status: done
action_impact: 5
action_effort_minutes: 0
context_target: "[[JULI]]"
context_role: Bug
iterbind_target: "[[Iteration 1]]"
base_created: 2026-05-28T16:04
base_updated: 2026-06-09T17:02
---
Zeitzuordnung wird durch Sync zurückgesetzt
@@ -0,0 +1,20 @@
---
components:
- temporal
- event
- contextual
time_at: 2026-05-28T11:00:00
event_duration: 45
parent: "[[JULI]]"
tags: []
status:
base_created: 2026-05-27T16:53
base_modified: 2026-06-24T16:53
context_target: "[[JULI]]"
context_role: meeting
context_relation: belongs_to
---
# Austausch Dashboard Painpoints
## Bugs
- [x] [[Zeit mit Projekt kann nicht auf Allgemein gebucht werden]]
- [x] [[Zeitzuordnung wird durch Sync zurückgesetzt]]
+91
View File
@@ -0,0 +1,91 @@
---
components:
- iterdef
context_target: "[[JULI]]"
context_role: Iteration
iterdef_id: 0
iterdef_status: closed
iterdef_start: 2026-06-19T00:00:00
iterdef_end: 2026-06-19T00:00:00
iterdef_goal: ""
base_created: 2026-06-09T16:59
base_modified: 2026-06-24T16:42
cssclasses: wide-page
iterdef_capacity_minutes: 0
---
## Goal
## Workspace
```base
filters:
and:
- file.hasLink(this.file.path)
formulas:
Aufwand (ET: action_effort_minutes / 60 / 8
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: table
name: Table
order:
- file.name
- action_status
- formula.Aufwand (ET
- action_impact
- action_effort_minutes
sort:
- property: action_status
direction: ASC
```
## Bound Work
```dataview
TABLE
action_status as "Action",
work_status as "Work",
round(action_effort_minutes / 60 / 8, 1) as "Aufwand (ET)",
action_impact as "Impact"
FROM ""
WHERE iterbind_target = this.file.link
SORT action_impact DESC, action_effort_minutes ASC
```
## Workspace
```base
filters:
and:
- file.hasLink(this.file.path)
formulas:
Aufwand (ET: action_effort_minutes / 60 / 8
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: table
name: Table
order:
- file.name
- action_status
- formula.Aufwand (ET
- action_impact
- action_effort_minutes
sort:
- property: action_status
direction: ASC
```
## Features
```dataview
TABLE
action_status as "Status",
round(action_effort_minutes / 60 / 8, 1) as "Aufwand (ET)",
action_impact as "Auswirkung"
FROM ""
WHERE iterbind_target = this.file.link
SORT priority DESC, effort ASC
```
+12
View File
@@ -0,0 +1,12 @@
---
components:
- contextual
- temporal
- event
time_at: 2026-06-04T14:00:00
event_duration: 60
context_target: "[[JULI]]"
context_role: Meeting
---
Demo Iteration 2
+77
View File
@@ -0,0 +1,77 @@
---
components:
- contextual
- iterdef
iterdef_id: 1
iterdef_start: 2026-04-15T08:00:00
iterdef_end: 2026-04-28T18:00:00
iterdef_status: closed
context_target: "[[JULI]]"
context_role: project
---
```dataview
TABLE
action_status as "Status",
round(action_effort_minutes / 60 / 8, 1) as "Aufwand (ET)",
action_impact as "Auswirkung"
FROM ""
WHERE iterbind_target = this.file.link
SORT priority DESC, effort ASC
```
```base
filters:
and:
- file.hasLink(this.file.path)
formulas:
Aufwand (ET: action_effort_minutes / 60 / 8
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: table
name: Table
order:
- file.name
- action_status
- formula.Aufwand (ET
- action_impact
- action_effort_minutes
sort: []
columnSize:
formula.Aufwand (ET: 138
- type: kanban-view
name: View
filters:
and:
- "!action_status.isEmpty()"
columnOrders:
file.file:
- 00-inbox/Arbeitszeit Sonstiges nur mit Kommentar.md
- 00-inbox/Arbeitszeit aufteilen.md
- 00-inbox/Arbeitszeit taggen.md
- 00-inbox/Personalstamm implementieren.md
- 00-inbox/Werkstatt als Systemprojekt aufnehmen.md
- 30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden.md
- 30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt.md
note.action_status:
- open
- done
cardOrders:
file.file: {}
note.action_status: {}
"file.file\x1fnote.action_status": {}
columnColors:
file.file: {}
note.action_status: {}
groupByProperty: note.action_status
swimlaneByProperty: note.action_status
swimlaneOrders:
"file.file\x1fnote.action_status":
- done
- open
- Uncategorized
collapsedLanes:
"file.file\x1fnote.action_status": []
```
+76
View File
@@ -0,0 +1,76 @@
---
components:
- contextual
- iterdef
iterdef_id: 2
iterdef_start: 2026-05-11T08:00:00
iterdef_end: 2026-06-03T18:00:00
iterdef_status: closed
context_target: "[[JULI]]"
context_role: project
cssclasses:
- wide-page
---
## Workspace
```base
filters:
and:
- file.hasLink(this.file.path)
formulas:
Aufwand (ET: (action_effort_minutes / 60 / 8).round(2)
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: table
name: Table
order:
- file.name
- action_status
- formula.Aufwand (ET
- action_impact
- action_effort_minutes
sort:
- property: action_impact
direction: ASC
- type: kanban-view
name: View
columnOrders:
file.file:
- 30-tasks/Arbeitszeit Sonstiges nur mit Kommentar.md
- 30-tasks/Arbeitszeit aufteilen.md
- 30-tasks/Arbeitszeit taggen.md
- 30-tasks/Personalstamm implementieren.md
- 30-tasks/Werkstatt als Systemprojekt aufnehmen.md
- 30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden.md
note.action_status:
- open
- done
cardOrders:
file.file: {}
note.action_status:
open: []
done:
- 30-tasks/Personalstamm implementieren.md
- 30-tasks/Arbeitszeit aufteilen.md
- 30-tasks/Arbeitszeit Sonstiges nur mit Kommentar.md
- 30-tasks/Arbeitszeit taggen.md
- 30-tasks/Werkstatt als Systemprojekt aufnehmen.md
- 30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden.md
columnColors:
file.file: {}
note.action_status: {}
groupByProperty: note.action_status
swimlaneByProperty: note.action_status
```
```dataview
TABLE
action_status as "Status",
round(action_effort_minutes / 60 / 8, 1) as "Aufwand (ET)",
action_impact as "Auswirkung"
FROM ""
WHERE iterbind_target = this.file.link
SORT priority DESC, effort ASC
```
+42
View File
@@ -0,0 +1,42 @@
---
components:
- contextual
- iterdef
context_target: "[[JULI]]"
context_role: project
iterdef_id: 3
iterdef_status: active
iterdef_start: 2026-06-15T08:00:00
iterdef_end: 2026-06-26T18:00:00
base_created: 2026-06-09T14:55
base_updated: 2026-06-10T13:19
cssclasses:
- wide-page
---
## Workspace
```base
filters:
and:
- file.hasLink(this.file.path)
formulas:
Aufwand (ET: action_effort_minutes / 60 / 8
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: table
name: Table
order:
- file.name
- action_status
- formula.Aufwand (ET
- action_impact
- action_effort_minutes
sort:
- property: action_status
direction: ASC
```
@@ -0,0 +1,12 @@
---
components:
- temporal
- event
time_at: 2026-05-27T14:00:00
event_duration: 60
parent: "[[JULI]]"
created: 2026-05-27T16:51:40
tags: []
---
Onboarding von Philipp Töbelmann
@@ -0,0 +1,14 @@
---
status: open
variant: Projekt
---
Ziel ist eine vollwertige Datensicherung aller gefährdeter Daten von Coach Hamburg nach der 3-2-1 Regel.
3-2-1 Regel
3 Kopien der wichtigsten Daten auf 2 Medien mit einer Kopie Off-Site.
## Zu klären
- Vorgängerversionen möglich?
- Kosten?
- Wie Laptops anbinden?
- Software?
@@ -0,0 +1,5 @@
---
status: open
variant: Task
---
TA-191 Angebot weicht von der Kalkulation ab.
@@ -0,0 +1,4 @@
---
status: open
variant: Task
---
@@ -0,0 +1,6 @@
---
status: open
variant: Task
---
## Nächste Schritte
- Terminierung Zeitblock "Korrespondenz + Task Planung"
+12
View File
@@ -0,0 +1,12 @@
filters:
and:
- file.inFolder("50-Aufgabenplanung")
- file.hasProperty("status")
views:
- type: table
name: Table
order:
- file.name
- variant
columnSize:
file.name: 340
+37
View File
@@ -0,0 +1,37 @@
# By Context
All assigned entities (`parent` set), grouped by their **root context** — the topmost ancestor reached by walking the `parent` chain.
```dataviewjs
const ALL = dv.pages('""').where(p =>
p.parent && !p.file.path.startsWith("_templates/")
);
function rootContext(page, depth = 0) {
if (depth > 16) return "(cycle)";
if (!page.parent) return page.file.name;
const link = page.parent;
const path = (link && link.path) || (typeof link === "string" ? link : null);
if (!path) return "(unresolved)";
const parent = dv.page(path);
if (!parent) return path;
if (!parent.parent) return parent.file.name;
return rootContext(parent, depth + 1);
}
const groups = {};
for (const p of ALL) {
const ctx = rootContext(p);
(groups[ctx] = groups[ctx] || []).push(p);
}
for (const ctx of Object.keys(groups).sort()) {
dv.header(2, ctx);
dv.table(
["Entity", "Direct parent", "Status"],
groups[ctx]
.sort((a, b) => (a.file.name > b.file.name ? 1 : -1))
.map(p => [p.file.link, p.parent, p.status ?? ""])
);
}
```
+85
View File
@@ -0,0 +1,85 @@
---
components:
- reviewable
review_status: needs_review
review_reason: "Cluster fuer Hygiene-Migration"
---
# Hygiene Migration
Quelle: [[90-dashboards/Hygiene|Hygiene Report]] vom 2026-06-24.
## Zusammenfassung
| Cluster | Befund | Anzahl | Migrationsart |
| --- | --- | ---: | --- |
| C1 | `components` fehlt | 24 Notes | Komponenten deklarieren |
| C2 | `contextual` fehlt oder ist nicht deklariert | 25 Notes, 26 Warnungen | `components` um `contextual` ergaenzen und Kontextfelder pruefen |
| C3 | `context_role` hat alte Werte | 16 Notes | Werte auf neues Enum migrieren |
| C4 | `base_created` wurde bisher gegen ein zu strenges Format geprueft | 5 Notes | Pruefung auf Obsidian-Format umstellen |
| C5 | Iterationsdefinitionen haben alte Feldwerte/Formate | 3 Notes plus Backlog-Hinweis | `iterdef` + Datum/Status normalisieren |
| C6 | Root-Note ohne Frontmatter | 1 Note | Minimal-Frontmatter fuer Root festlegen |
## C1 Components Fehlen
Diese Notes haben gar kein `components`-Array. Minimal muss `components` angelegt werden; fachlich vermutlich mindestens `contextual`.
| Bereich | Notes |
| --- | --- |
| Inbox | [[00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen|Tagesabschluss in der Zeiterfassung ermöglichen]] |
| Contexts | [[10-contexts/Genius.ceo|Genius.ceo]], [[10-contexts/health|health]], [[10-contexts/work|work]] |
| Projects | [[20-projects/Avicenna|Avicenna]], [[20-projects/JULI|JULI]], [[20-projects/medmix Deutschland GmbH|medmix Deutschland GmbH]] |
| Tasks | [[30-tasks/Arbeitszeit aufteilen|Arbeitszeit aufteilen]], [[30-tasks/Arbeitszeit Sonstiges nur mit Kommentar|Arbeitszeit Sonstiges nur mit Kommentar]], [[30-tasks/Arbeitszeit taggen|Arbeitszeit taggen]], [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]], [[30-tasks/Passwort ändern|Passwort ändern]], [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]], [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]], [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]], [[30-tasks/Werkstatt als Systemprojekt aufnehmen|Werkstatt als Systemprojekt aufnehmen]], [[30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden|Zeit mit Projekt kann nicht auf Allgemein gebucht werden]], [[30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt|Zeitzuordnung wird durch Sync zurückgesetzt]] |
| Notes | [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]], [[40-notes/Demo Iteration 2|Demo Iteration 2]], [[40-notes/Iteration 1|Iteration 1]], [[40-notes/Iteration 2|Iteration 2]], [[40-notes/Iteration 3|Iteration 3]], [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] |
## C2 Contextual Migration
Regel: Jede Nicht-Root-Note soll mittelfristig `contextual` in `components` tragen. Wenn `contextual` gesetzt ist, ist `context_target` Pflicht; `context_role` ist empfohlen.
Betroffen sind alle Notes aus C1 plus [[40-notes/Backlog|Backlog]]. Backlog hat bereits `components: [iterdef]`, braucht aber zusaetzlich `contextual`.
## C3 Context Role Werte
Erlaubt sind: `root`, `area`, `customer`, `project`, `product`, `person`, `topic`, `technology`, `organization`.
| Alter Wert | Anzahl | Notes | Vorschlag |
| --- | ---: | --- | --- |
| `Customer` | 2 | [[20-projects/JULI|JULI]], [[20-projects/medmix Deutschland GmbH|medmix Deutschland GmbH]] | wahrscheinlich `project` oder `customer` fachlich entscheiden |
| `Feature` | 7 | [[30-tasks/Arbeitszeit aufteilen|Arbeitszeit aufteilen]], [[30-tasks/Arbeitszeit Sonstiges nur mit Kommentar|Arbeitszeit Sonstiges nur mit Kommentar]], [[30-tasks/Arbeitszeit taggen|Arbeitszeit taggen]], [[30-tasks/Passwort ändern|Passwort ändern]], [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]], [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]], [[30-tasks/Werkstatt als Systemprojekt aufnehmen|Werkstatt als Systemprojekt aufnehmen]] | `context_role: project` ist nicht passend; Feature-Typ gehoert eher nach `work_kind: feature`, Kontextrolle eher `topic` oder weglassen/neu entscheiden |
| `Bug` | 2 | [[30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden|Zeit mit Projekt kann nicht auf Allgemein gebucht werden]], [[30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt|Zeitzuordnung wird durch Sync zurückgesetzt]] | Bug-Typ nach `work_kind: bug`, Kontextrolle eher `topic` oder neu entscheiden |
| `Iteration` | 4 | [[40-notes/Backlog|Backlog]], [[40-notes/Iteration 1|Iteration 1]], [[40-notes/Iteration 2|Iteration 2]], [[40-notes/Iteration 3|Iteration 3]] | Iteration ist Komponente `iterdef`; Kontextrolle vermutlich `project` oder `topic` |
| `Meeting` | 1 | [[40-notes/Demo Iteration 2|Demo Iteration 2]] | Meeting-Typ nach `event_kind: meeting`; Kontextrolle vermutlich `project` oder `topic` |
## C4 Base Created Format
Sollformat fuer `base_created` und `base_modified`: `YYYY-MM-DDTHH:mm`. Diese Felder werden von Obsidian automatisch gesetzt.
| Note | Aktuelles Muster | Migration |
| --- | --- | --- |
| [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]] | `2026-06-17 17:22` | Leerzeichen durch `T` ersetzen |
| [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]] | `2026-06-09T14:19:55` | Sekunden entfernen |
| [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]] | `2026-06-10 13:13` | Leerzeichen durch `T` ersetzen |
| [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]] | `2026-06-17 15:49` | Leerzeichen durch `T` ersetzen |
| [[40-notes/Backlog|Backlog]] | `2026-06-09 16:59` | Leerzeichen durch `T` ersetzen |
## C5 Iterdef Migration
Sollwerte: `iterdef_status` ist `planned`, `active`, `closed` oder `cancelled`; `iterdef_start` und `iterdef_end` sind reine Datumswerte `YYYY-MM-DD`.
| Note | Befunde | Migration |
| --- | --- | --- |
| [[40-notes/Iteration 1|Iteration 1]] | `completed`, DateTime in Start/Ende, keine `components` | `closed`, Datum kuerzen, `components: [iterdef, contextual]` |
| [[40-notes/Iteration 2|Iteration 2]] | `completed`, DateTime in Start/Ende, keine `components` | `closed`, Datum kuerzen, `components: [iterdef, contextual]` |
| [[40-notes/Iteration 3|Iteration 3]] | `started`, DateTime in Start/Ende, keine `components` | `active`, Datum kuerzen, `components: [iterdef, contextual]` |
| [[40-notes/Backlog|Backlog]] | `iterdef` ohne `contextual` | `components` um `contextual` ergaenzen |
## C6 Root Frontmatter
[[Personal OS|Personal OS]] hat kein Frontmatter. Da Root in `context-hygiene` fachlich ausgenommen ist, sollte hier ein minimales Frontmatter mit `components` und `context_role: root` festgelegt werden oder die Hygiene-Regel muss Root ohne Frontmatter tolerieren.
## Empfohlene Reihenfolge
1. C4 nach Schema-Anpassung neu bewerten und verbleibende Leerzeichen-Datumswerte korrigieren.
2. C1/C2 fuer eindeutige Typen: Contexts, Projects, Iterationen, Backlog.
3. C3 fuer Tasks: alte `Feature`/`Bug`-Rollen in `work_kind` migrieren und passende Kontextrolle entscheiden.
4. C6 Root-Note entscheiden: Frontmatter einfuehren oder Hygiene-Ausnahme erweitern.
+57
View File
@@ -0,0 +1,57 @@
---
components:
- reviewable
review_status: needs_review
review_reason: "Automatisch erzeugter Hygiene-Report"
---
# Hygiene Report
Generated: 2026-06-24T15:08:54.455Z
Checked notes: 29
Errors: 11
Warnings: 26
## Errors
- [[10-contexts/Genius.ceo|Genius.ceo]]: missing required property components
- [[10-contexts/health|health]]: missing required property components
- [[10-contexts/work|work]]: missing required property components
- [[20-projects/Avicenna|Avicenna]]: missing required property components
- [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]]: / must match "then" schema
- [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]]: missing required property event_kind
- [[40-notes/Demo Iteration 2|Demo Iteration 2]]: / must match "then" schema
- [[40-notes/Demo Iteration 2|Demo Iteration 2]]: missing required property event_kind
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]]: / must match "then" schema
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]]: missing required property event_kind
- [[Personal OS|Personal OS]]: missing frontmatter
## Warnings
- [[00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen|Tagesabschluss in der Zeiterfassung ermöglichen]] `/context_role`: contextual should define context_role
- [[00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen|Tagesabschluss in der Zeiterfassung ermöglichen]] `/iterbind_status`: iterbind should define iterbind_status
- [[10-contexts/Genius.ceo|Genius.ceo]] `/components` `context.required`: note should eventually include component contextual
- [[10-contexts/health|health]] `/components` `context.required`: note should eventually include component contextual
- [[10-contexts/work|work]] `/components` `context.required`: note should eventually include component contextual
- [[20-projects/Avicenna|Avicenna]] `/components` `context.required`: note should eventually include component contextual
- [[30-tasks/Arbeitszeit aufteilen|Arbeitszeit aufteilen]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Arbeitszeit Sonstiges nur mit Kommentar|Arbeitszeit Sonstiges nur mit Kommentar]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Arbeitszeit taggen|Arbeitszeit taggen]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]] `/context_role`: contextual should define context_role
- [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Passwort ändern|Passwort ändern]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]] `/context_role`: contextual should define context_role
- [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Werkstatt als Systemprojekt aufnehmen|Werkstatt als Systemprojekt aufnehmen]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden|Zeit mit Projekt kann nicht auf Allgemein gebucht werden]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt|Zeitzuordnung wird durch Sync zurückgesetzt]] `/iterbind_status`: iterbind should define iterbind_status
- [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]] `/event_status`: event should define event_status
- [[40-notes/Backlog|Backlog]] `/components`: iterdef should also include component contextual
- [[40-notes/Backlog|Backlog]] `/components` `context.required`: note should eventually include component contextual
- [[40-notes/Demo Iteration 2|Demo Iteration 2]] `/event_status`: event should define event_status
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] `/components`: event should also include component contextual
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] `/event_status`: event should define event_status
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] `/components` `context.required`: note should eventually include component contextual
+13
View File
@@ -0,0 +1,13 @@
# Inbox
Entities without a `parent` — captured but not yet assigned to a context or project.
```dataview
TABLE WITHOUT ID
file.link AS "Entity",
status,
dateformat(date(created), "yyyy-MM-dd HH:mm") AS "Captured"
FROM "" AND !"90-dashboards" AND !"_templates"
WHERE !parent OR parent = "" AND !container
SORT created DESC
```
+38
View File
@@ -0,0 +1,38 @@
# Open Tasks
Tasks (signature: has `status`, no `container`) with `status = "open"`, grouped by their immediate parent. Null-parent tasks appear under "Inbox (unassigned)".
```dataviewjs
const ALL = dv.pages('""').where(p =>
p.status === "open" &&
!p.container &&
!p.file.path.startsWith("_templates/")
);
const groups = {};
for (const p of ALL) {
const key = p.parent ? p.parent.path : "__inbox__";
(groups[key] = groups[key] || []).push(p);
}
const renderGroup = (header, items) => {
dv.header(2, header);
dv.table(
["Task", "Captured"],
items
.sort((a, b) => (a.file.name > b.file.name ? 1 : -1))
.map(p => [p.file.link, p.created])
);
};
// Assigned groups, alphabetical by parent basename
for (const key of Object.keys(groups).filter(k => k !== "__inbox__").sort()) {
const header = key.split("/").pop().replace(/\.md$/, "");
renderGroup(header, groups[key]);
}
// Inbox bucket last
if (groups["__inbox__"]) {
renderGroup("Inbox (unassigned)", groups["__inbox__"]);
}
```
+67
View File
@@ -0,0 +1,67 @@
filters:
and:
- context_target == link("JULI")
views:
- type: cards
name: Tasks
filters:
and:
- "!status.isEmpty()"
order:
- file.name
- status
- created
cardSize: 200
- type: kanban-view
name: Planning
filters:
and:
- "!iterbind_target.isEmpty()"
order:
- status
columnOrders:
file.file:
- 00-inbox/2026-05-26-1730-juli-passwort-ndern.md
- 30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden.md
- 30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt.md
- 40-notes/Austausch Dashboard Painpoints.md
- 40-notes/Demo Iteration 2.md
- 40-notes/Onboarding von Philipp Töbelmann.md
note.iteration:
- Backlog
- "[[Iteration 2]]"
- Uncategorized
note.iterbind_target:
- "[[Backlog]]"
- "[[Iteration 3]]"
- "[[Iteration 2]]"
- "[[Iteration 1]]"
cardOrders:
file.file: {}
note.iteration:
Backlog:
- 00-inbox/Werkstatt als Systemprojekt aufnehmen.md
- 30-tasks/Passwort ändern.md
Iteration 2: []
"[[Iteration 2]]":
- 30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden.md
- 30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt.md
"note.iterbind_target\x1fnote.iteration": {}
note.iterbind_target: {}
columnColors:
file.file: {}
note.iteration:
Backlog: red
Iteration 2: green
note.iterbind_target: {}
groupByProperty: note.iterbind_target
swimlaneByProperty: note.iterbind_target
quickAddFolder: 00-inbox
cardTitleProperty: file.name
swimlaneOrders:
"note.iterbind_target\x1fnote.iteration":
- Uncategorized
collapsedLanes:
"note.iterbind_target\x1fnote.iteration": []
- type: table
name: View
View File
+25
View File
@@ -0,0 +1,25 @@
<%*
// actionable: makes a note executable by adding status, impact and effort fields.
const componentName = "actionable";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["action_status"] = frontmatter["action_status"] ?? "open";
frontmatter["action_impact"] = frontmatter["action_impact"] ?? 1;
frontmatter["action_effort_minutes"] = frontmatter["action_effort_minutes"] ?? 30;
frontmatter["action_result"] = frontmatter["action_result"] ?? "";
});
}, 300)
-%>
## Action
- Next step:
- Definition of done:
## Result
+21
View File
@@ -0,0 +1,21 @@
<%*
// billable: marks a note as relevant for billing, invoicing or non-billable review.
const componentName = "billable";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["bill_status"] = frontmatter["bill_status"] ?? "unreviewed";
frontmatter["bill_minutes"] = frontmatter["bill_minutes"] ?? 0;
frontmatter["bill_rate"] = frontmatter["bill_rate"] ?? 0;
frontmatter["bill_amount"] = frontmatter["bill_amount"] ?? 0;
frontmatter["bill_currency"] = frontmatter["bill_currency"] ?? "EUR";
frontmatter["bill_invoice"] = frontmatter["bill_invoice"] ?? "";
frontmatter["bill_note"] = frontmatter["bill_note"] ?? "";
});
}, 300)
-%>
+17
View File
@@ -0,0 +1,17 @@
<%*
// contextual: binds this note to the closest known context, e.g. project, customer or topic.
const componentName = "contextual";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["context_target"] = frontmatter["context_target"] ?? "[[]]";
frontmatter["context_role"] = frontmatter["context_role"] ?? "project";
frontmatter["context_relation"] = frontmatter["context_relation"] ?? "belongs_to";
});
}, 300)
-%>
+29
View File
@@ -0,0 +1,29 @@
<%*
// event: makes this note a timeline event such as a meeting, decision, incident or worklog.
const componentName = "event";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["event_kind"] = frontmatter["event_kind"] ?? "note";
frontmatter["event_status"] = frontmatter["event_status"] ?? "occurred";
frontmatter["event_location"] = frontmatter["event_location"] ?? "";
frontmatter["event_participants"] = frontmatter["event_participants"] ?? [];
frontmatter["event_outcome"] = frontmatter["event_outcome"] ?? "";
});
}, 300)
-%>
## Event
### Participants
### Notes
### Outcome
+18
View File
@@ -0,0 +1,18 @@
<%*
// iterbind: binds this note to an iteration note that carries the iterdef component.
const componentName = "iterbind";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["iterbind_target"] = frontmatter["iterbind_target"] ?? "[[]]";
frontmatter["iterbind_status"] = frontmatter["iterbind_status"] ?? "planned";
frontmatter["iterbind_role"] = frontmatter["iterbind_role"] ?? "primary";
frontmatter["iterbind_order"] = frontmatter["iterbind_order"] ?? 0;
});
}, 300)
-%>
+63
View File
@@ -0,0 +1,63 @@
<%*
// iterdef: defines a planning iteration with sequence id, status, start/end and optional goal.
const componentName = "iterdef";
const newId = tp.user.auto_increment("iterdef_id");
const today = tp.date.now("YYYY-MM-DD");
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["iterdef_id"] = frontmatter["iterdef_id"] ?? newId;
frontmatter["iterdef_status"] = frontmatter["iterdef_status"] ?? "planned";
frontmatter["iterdef_start"] = frontmatter["iterdef_start"] ?? today;
frontmatter["iterdef_end"] = frontmatter["iterdef_end"] ?? today;
frontmatter["iterdef_goal"] = frontmatter["iterdef_goal"] ?? "";
frontmatter["iterdef_capacity_minutes"] = frontmatter["iterdef_capacity_minutes"] ?? 0;
frontmatter["cssclasses"] = frontmatter["cssclasses"] ?? "wide-page";
});
}, 300)
-%>
## Goal
## Workspace
```base
filters:
and:
- file.hasLink(this.file.path)
formulas:
Aufwand (ET: action_effort_minutes / 60 / 8
properties:
formula.Aufwand (ET:
displayName: Aufwand (ET)
views:
- type: table
name: Table
order:
- file.name
- action_status
- formula.Aufwand (ET
- action_impact
- action_effort_minutes
sort:
- property: action_status
direction: ASC
```
## Bound Work
```dataview
TABLE
action_status as "Action",
work_status as "Work",
round(action_effort_minutes / 60 / 8, 1) as "Aufwand (ET)",
action_impact as "Impact"
FROM ""
WHERE iterbind_target = this.file.link
SORT action_impact DESC, action_effort_minutes ASC
```
+18
View File
@@ -0,0 +1,18 @@
<%*
// reviewable: marks this note for review, follow-up or data hygiene.
const componentName = "reviewable";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["review_status"] = frontmatter["review_status"] ?? "needs_review";
frontmatter["review_reason"] = frontmatter["review_reason"] ?? "initial review required";
frontmatter["review_next"] = frontmatter["review_next"] ?? "";
frontmatter["review_by"] = frontmatter["review_by"] ?? "";
});
}, 300)
-%>
+17
View File
@@ -0,0 +1,17 @@
<%*
// source: records where this note or information came from.
const componentName = "source";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["source_target"] = frontmatter["source_target"] ?? "[[]]";
frontmatter["source_relation"] = frontmatter["source_relation"] ?? "derived_from";
frontmatter["source_excerpt"] = frontmatter["source_excerpt"] ?? "";
});
}, 300)
-%>
+11
View File
@@ -0,0 +1,11 @@
<%*
// base: keeps the note system-ready. File timestamps are managed by Obsidian/plugin metadata.
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
frontmatter["components"] = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
frontmatter["base_archived"] = frontmatter["base_archived"] ?? false;
});
}, 300)
-%>
+19
View File
@@ -0,0 +1,19 @@
<%*
// temporal: gives this note a date, deadline, reminder or time range.
const componentName = "temporal";
const today = tp.date.now("YYYY-MM-DD");
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["time_at"] = frontmatter["time_at"] ?? today;
frontmatter["time_timezone"] = frontmatter["time_timezone"] ?? "Europe/Berlin";
frontmatter["time_recurrence"] = frontmatter["time_recurrence"] ?? "";
frontmatter["time_precision"] = frontmatter["time_precision"] ?? "date";
});
}, 300)
-%>
+31
View File
@@ -0,0 +1,31 @@
<%*
// work: describes a feature, bug, change, refactor, support item or other work artifact.
const componentName = "work";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
if (!components.includes(componentName)) components.push(componentName);
frontmatter["components"] = components;
frontmatter["work_kind"] = frontmatter["work_kind"] ?? "feature";
frontmatter["work_status"] = frontmatter["work_status"] ?? "backlog";
frontmatter["work_value"] = frontmatter["work_value"] ?? 3;
frontmatter["work_risk"] = frontmatter["work_risk"] ?? 3;
frontmatter["work_size"] = frontmatter["work_size"] ?? 1;
frontmatter["work_acceptance"] = frontmatter["work_acceptance"] ?? "";
});
}, 300)
-%>
## Work
### Problem
### Acceptance
- [ ]
### Notes
View File
+19
View File
@@ -0,0 +1,19 @@
<%*
// actionable removal: removes action fields and the actionable component marker.
const componentName = "actionable";
const file = tp.file.find_tfile(tp.file.path(true));
setTimeout(async () => {
await tp.app.fileManager.processFrontMatter(file, (frontmatter) => {
const components = Array.isArray(frontmatter["components"]) ? frontmatter["components"] : [];
frontmatter["components"] = components.filter((component) => component !== componentName);
delete frontmatter["action_status"];
delete frontmatter["action_impact"];
delete frontmatter["action_effort_minutes"];
delete frontmatter["action_blocked_by"];
delete frontmatter["action_waiting_for"];
delete frontmatter["action_result"];
});
}, 300)
-%>
+12
View File
@@ -0,0 +1,12 @@
module.exports = function(prop_name) {
let max = -1;
for (const f of app.vault.getMarkdownFiles()) {
const fm = app.metadataCache.getFileCache(f)?.frontmatter;
if(typeof fm?.[prop_name] === "number") {
max = Math.max(max, fm[prop_name])
}
}
return max + 1
}