Playwright start

This commit is contained in:
2026-05-30 10:04:12 -04:00
parent 73f29cea08
commit 1f7a0819fc
108 changed files with 37445 additions and 62 deletions
+1
View File
@@ -0,0 +1 @@
{}
+3
View File
@@ -0,0 +1,3 @@
{
"theme": "obsidian"
}
+7
View File
@@ -0,0 +1,7 @@
[
"kanban-bases-view",
"code-styler",
"calendar",
"custom-font-loader",
"obsidian-note-autocreator"
]
+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
}
Binary file not shown.
+10
View File
@@ -0,0 +1,10 @@
{
"shouldConfirmBeforeCreate": true,
"weekStart": "locale",
"wordsPerDot": 250,
"showWeeklyNote": false,
"weeklyNoteFormat": "",
"weeklyNoteTemplate": "",
"weeklyNoteFolder": "",
"localeOverride": "system-default"
}
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
{
"id": "calendar",
"name": "Calendar",
"description": "Calendar view of your daily notes",
"version": "1.5.10",
"author": "Liam Cain",
"authorUrl": "https://github.com/liamcain/",
"isDesktopOnly": false,
"minAppVersion": "0.9.11"
}
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "code-styler",
"name": "Code Styler",
"version": "1.1.7",
"minAppVersion": "0.15.0",
"description": "Style and customize codeblocks and inline code in both editing mode and reading mode.",
"author": "Mayuran Visakan",
"authorUrl": "https://github.com/mayurankv",
"fundingUrl": "https://www.buymeacoffee.com/mayurankv2",
"isDesktopOnly": false
}
@@ -0,0 +1 @@
{}
File diff suppressed because it is too large Load Diff
+7
View File
@@ -0,0 +1,7 @@
{
"font_folder": ".obsidian/fonts/",
"font": "JetBrainsMono-Regular.ttf",
"force_mode": false,
"custom_css_mode": false,
"custom_css": ""
}
File diff suppressed because one or more lines are too long
+357
View File
@@ -0,0 +1,357 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => FontPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
var DEFAULT_SETTINGS = {
font_folder: "",
font: "None",
force_mode: false,
custom_css_mode: false,
custom_css: ""
};
function get_default_css(font_family_name, css_class = ":root *") {
return `${css_class} {
--font-default: '${font_family_name}';
--default-font: '${font_family_name}';
--font-family-editor: '${font_family_name}';
--font-monospace-default: '${font_family_name}';
--font-interface-override: '${font_family_name}';
--font-text-override: '${font_family_name}';
--font-monospace-override: '${font_family_name}';
}
`;
}
function get_custom_css(font_family_name, css_class = ":root *") {
return `${css_class} * {
font-family: '${font_family_name}' !important;
}`;
}
function arrayBufferToBase64(buffer) {
let binary = "";
const bytes = new Uint8Array(buffer);
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
function applyCss(css, css_id, appendMode = false) {
const existingStyle = document.getElementById(css_id);
if (existingStyle && appendMode) {
existingStyle.innerHTML += css;
} else {
const style = document.createElement("style");
style.innerHTML = css;
document.head.appendChild(style);
if (existingStyle) {
existingStyle.remove();
}
style.id = css_id;
}
}
var FontPlugin = class extends import_obsidian.Plugin {
constructor() {
super(...arguments);
this.config_dir = this.app.vault.configDir;
this.plugin_folder_path = `${this.config_dir}/plugins/custom-font-loader`;
}
async load_plugin() {
await this.loadSettings();
try {
const font_file_name = this.settings.font;
if (font_file_name && font_file_name.toLowerCase() != "none") {
if (font_file_name != "all") {
await this.process_and_load_font(font_file_name, false);
} else {
applyCss("", "custom_font_base64");
const files = await this.app.vault.adapter.list(
this.settings.font_folder
);
for (const file of files.files) {
const file_name = file.replace(
this.settings.font_folder,
""
);
await this.process_and_load_font(file_name, true);
}
}
} else {
applyCss("", "custom_font_base64");
applyCss("", "custom_font_general");
}
} catch (error) {
new import_obsidian.Notice(error);
}
}
async process_and_load_font(font_file_name, load_all_fonts) {
console.log("loading %s", font_file_name);
const css_font_path = `${this.plugin_folder_path}/${font_file_name.toLowerCase().replace(".", "_")}.css`;
if (!await this.app.vault.adapter.exists(css_font_path)) {
await this.convert_font_to_css(font_file_name, css_font_path);
} else {
await this.load_font(css_font_path, load_all_fonts);
await this.load_css(font_file_name);
}
}
async load_font(css_font_path, appendMode) {
const content = await this.app.vault.adapter.read(css_font_path);
applyCss(content, "custom_font_base64", appendMode);
}
async load_css(font_file_name) {
let css_string = "";
const font_family_name = font_file_name.split(".")[0].toLowerCase();
if (this.settings.custom_css_mode) {
css_string = this.settings.custom_css;
} else {
css_string = get_default_css(font_family_name);
}
if (this.settings.force_mode)
css_string += `
* {
font-family: '${font_family_name}' !important;
}
`;
applyCss(css_string, "custom_font_general");
}
async convert_font_to_css(font_file_name, css_font_path) {
new import_obsidian.Notice("Processing Font files");
const file = `${this.settings.font_folder}/${font_file_name}`;
const arrayBuffer = await this.app.vault.adapter.readBinary(file);
const base64 = arrayBufferToBase64(arrayBuffer);
const font_family_name = font_file_name.split(".")[0].toLowerCase();
const font_extension_name = font_file_name.split(".")[1].toLowerCase();
let css_type = "";
switch (font_extension_name) {
case "woff":
css_type = "font/woff";
break;
case "ttf":
css_type = "font/truetype";
break;
case "woff2":
css_type = "font/woff2";
break;
case "otf":
css_type = "font/opentype";
break;
default:
css_type = "font";
}
const base64_css = `@font-face{
font-family: '${font_family_name}';
src: url(data:${css_type};base64,${base64});
}`;
this.app.vault.adapter.write(css_font_path, base64_css);
console.log("saved font %s into %s", font_family_name, css_font_path);
console.log("Font CSS Saved into %s", css_font_path);
await this.load_plugin();
}
async onload() {
this.load_plugin();
this.addSettingTab(new FontSettingTab(this.app, this));
}
async onunload() {
applyCss("", "custom_font_base64");
applyCss("", "custom_font_general");
}
async loadSettings() {
this.settings = Object.assign(
{},
DEFAULT_SETTINGS,
await this.loadData()
);
}
async saveSettings() {
await this.saveData(this.settings);
}
};
var FontSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
async display() {
const { containerEl } = this;
containerEl.empty();
const infoContainer = containerEl.createDiv();
infoContainer.setText(
"In Order to set the font, copy your font into fonts directory that you set"
);
new import_obsidian.Setting(containerEl).setName("Fonts Folder").setDesc("Folder to look for your custom fonts").addText((text) => {
text.onChange(async (value) => {
this.plugin.settings.font_folder = value;
await this.plugin.saveSettings();
await this.plugin.loadSettings();
});
if (this.plugin.settings.font_folder.trim() == "") {
this.plugin.settings.font_folder = `${this.app.vault.configDir}/fonts`;
}
if (!this.plugin.settings.font_folder.endsWith("/"))
this.plugin.settings.font_folder = this.plugin.settings.font_folder + "/";
text.setValue(this.plugin.settings.font_folder);
});
const font_folder_path = this.plugin.settings.font_folder;
const options = [{ name: "none", value: "None" }];
try {
if (!await this.app.vault.adapter.exists(font_folder_path)) {
await this.app.vault.adapter.mkdir(font_folder_path);
}
if (await this.app.vault.adapter.exists(font_folder_path)) {
const files = await this.app.vault.adapter.list(
font_folder_path
);
for (const file of files.files) {
const file_name = file.replace(font_folder_path, "");
if (file_name.startsWith("."))
continue;
options.push({ name: file_name, value: file_name });
}
}
options.push({ name: "all", value: "Multiple fonts" });
} catch (error) {
console.log(error);
}
new import_obsidian.Setting(containerEl).setName("Reload fonts from folder").setDesc(
"This button reloades from the folder you specified (it also creates the folder for you)"
).addButton((button) => {
button.setButtonText("Reload");
button.onClick((callback) => {
this.plugin.saveSettings();
this.plugin.load_plugin();
this.display();
});
});
this.containerEl.createDiv();
new import_obsidian.Setting(containerEl).setName("Font").setDesc(
`Choose font (If you can't see your fonts, make sure your fonts are in the folder you specified and hit reload.
Also if you choose multiple fonts option, we will load and process all fonts in the folder for you. In that Case, enable Custom CSS Mode)`
).addDropdown((dropdown) => {
for (const opt of options) {
dropdown.addOption(opt.name, opt.value);
}
dropdown.setValue(this.plugin.settings.font).onChange(async (value) => {
this.plugin.settings.font = value;
await this.plugin.saveSettings();
await this.plugin.load_plugin();
this.display();
});
});
if (this.plugin.settings.font.toLowerCase() != "none") {
new import_obsidian.Setting(containerEl).setName("Force Style").setDesc(
"This option should only be used if you have installed a community theme and normal mode doesn't work"
).addToggle((toggle) => {
toggle.setValue(this.plugin.settings.force_mode);
toggle.onChange(async (value) => {
this.plugin.settings.force_mode = value;
await this.plugin.saveSettings();
await this.plugin.load_plugin();
});
});
new import_obsidian.Setting(containerEl).setName("Custom CSS Mode").setDesc(
"If you want to apply a custom css style rather than default style, choose this."
).addToggle((toggle) => {
toggle.setValue(this.plugin.settings.custom_css_mode);
toggle.onChange(async (value) => {
if (this.plugin.settings.custom_css_mode == false) {
this.plugin.settings.custom_css = "";
}
this.plugin.settings.custom_css_mode = value;
this.plugin.saveSettings();
this.plugin.load_plugin();
this.display();
});
});
if (this.plugin.settings.custom_css_mode) {
new import_obsidian.Setting(containerEl).setName("Custom CSS Style").setDesc("Input your custom css style. Use the font filename without extension (in lowercase) as the font-family name. For example, if your font file is 'MyFont.ttf', use 'myfont' in your CSS.").addTextArea(async (text) => {
text.onChange(async (new_value) => {
this.plugin.settings.custom_css = new_value;
await this.plugin.saveSettings();
await this.plugin.load_plugin();
});
text.setDisabled(!this.plugin.settings.custom_css_mode);
if (this.plugin.settings.custom_css == "") {
let font_family_name = "";
try {
font_family_name = this.plugin.settings.font.split(".")[0].toLowerCase();
} catch (error) {
console.log(error);
}
if (font_family_name == "all") {
if (await this.app.vault.adapter.exists(
font_folder_path
)) {
const files = await this.app.vault.adapter.list(
font_folder_path
);
let final_str = "";
for (const file of files.files) {
const file_name = file.split("/")[2];
const font_family = file_name.split(".")[0].toLowerCase();
final_str += "\n" + get_custom_css(
font_family,
"." + font_family
);
}
text.setValue(final_str);
}
} else {
const template = `/* Example CSS for your font: ${font_family_name} */
/* Apply to all text */
:root * {
--font-default: '${font_family_name}';
--default-font: '${font_family_name}';
--font-family-editor: '${font_family_name}';
--font-interface-override: '${font_family_name}';
--font-text-override: '${font_family_name}';
}
/* Example: Apply to custom CSS class */
.custom-font * {
font-family: '${font_family_name}' !important;
}
/* Example: Apply to specific elements only */
.custom-font h1, .custom-font h2, .custom-font h3 {
font-family: '${font_family_name}' !important;
}`;
text.setValue(template);
}
} else {
text.setValue(this.plugin.settings.custom_css);
}
text.onChanged();
text.inputEl.style.width = "100%";
text.inputEl.style.height = "100px";
});
}
}
}
};
/* nosourcemap */
+10
View File
@@ -0,0 +1,10 @@
{
"id": "custom-font-loader",
"name": "Custom Font Loader",
"version": "1.8.0",
"minAppVersion": "0.15.0",
"description": "Customize your Obsidian vault with any font you want (+ Support for Android and IOS)",
"author": "Amir Pourmand",
"authorUrl": "https://amirpourmand.ir",
"isDesktopOnly": false
}
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;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,10 @@
{
"id": "obsidian-note-autocreator",
"name": "Note Auto Creator",
"version": "1.6.0",
"minAppVersion": "0.14.2",
"description": "Automatically create notes when links are created to them.",
"author": "Simon T. Clement",
"authorUrl": "https://github.com/SimonTC",
"isDesktopOnly": false
}
@@ -0,0 +1,3 @@
.setting-item-control.setting-warning input {
border-color: yellow;
}
+8
View File
@@ -0,0 +1,8 @@
{
"types": {
"aliases": "aliases",
"cssclasses": "multitext",
"tags": "tags",
"test": "checkbox"
}
}
+285
View File
@@ -0,0 +1,285 @@
{
"main": {
"id": "74c83563dd55f321",
"type": "split",
"children": [
{
"id": "0e5588b193ba3ee1",
"type": "tabs",
"children": [
{
"id": "57c7753ac9b7e484",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "_Tasks Kanban.base",
"viewName": "View"
},
"pinned": true,
"icon": "columns",
"title": "_Tasks Kanban"
}
},
{
"id": "35f91346f6b29f75",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "WebAssembly back to Azure.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "WebAssembly back to Azure"
}
},
{
"id": "bc1064252754f309",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Fully Test the Build Calculator.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Fully Test the Build Calculator"
}
},
{
"id": "91e064bf6d50d3fb",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Nice looking map refrence.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Nice looking map refrence"
}
},
{
"id": "19394d1656ec83b7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "AI Gen Docs/test-blazor-hydration-timing.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "test-blazor-hydration-timing"
}
}
],
"currentTab": 4
}
],
"direction": "vertical"
},
"left": {
"id": "de5329d9cda83306",
"type": "split",
"children": [
{
"id": "812749044d0e88b4",
"type": "tabs",
"children": [
{
"id": "e1f279c107051222",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "861082434268040e",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "70d3dbf9b35be2f6",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 200
},
"right": {
"id": "dd7c1dc4bd54d927",
"type": "split",
"children": [
{
"id": "95fd9fcedb0a127d",
"type": "tabs",
"children": [
{
"id": "4822f1c518db08a5",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "_Tasks Kanban.base",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for _Tasks Kanban"
}
},
{
"id": "0647707c5f4e6cc0",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "_Tasks Kanban.base",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from _Tasks Kanban"
}
},
{
"id": "244210bbd68c3d20",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "e34266da7cd941b7",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "8bb961a0412cb3dd",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "_Tasks Kanban.base",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of _Tasks Kanban"
}
},
{
"id": "522176d80c764e53",
"type": "leaf",
"state": {
"type": "calendar",
"state": {},
"icon": "calendar-with-checkmark",
"title": "Calendar"
}
}
]
}
],
"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
}
},
"active": "19394d1656ec83b7",
"lastOpenFiles": [
"_Tasks Kanban.base",
"AI Gen Docs/test-blazor-hydration-timing.md",
"AI Gen Docs/test-toast-timing-interactions.md",
"AI Gen Docs/test-accessibility-keyboard-nav.md",
"AI Gen Docs/test-multi-context-entity-comparison.md",
"AI Gen Docs/test-mobile-responsive.md",
"AI Gen Docs/test-network-resilience.md",
"Get AI to Add easy Test Tasks.md",
"AI Gen Docs/test-visual-regression.md",
"AI Gen Docs/test-storage-persistence.md",
"AI Gen Tasks",
"Nice looking map refrence.md",
"Add some cooldown reference.md",
"Language Support.md",
"Improve your SEO.md",
"Add Co-op objective reference.md",
"Auto Build consideration in Calculator.md",
"Fully Test the Build Calculator.md",
"WebAssembly back to Azure.md",
"Change Ctrl + K Hotkey to something that doesn't conflict with Edge or other browsers.md",
"Make Tests for the Build Calculator.md",
"Make Examples be based on Database Information.md",
"Fix Entity Recursion Error - Parent.md",
"Create Automated Tests.md",
"Basic Build Order Sheet.md",
"Add an Ability to Favourite Data.md",
"AI Gen Docs/architecture.md",
"AI Gen Docs"
]
}