/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __publicField = (obj, key, value) => { __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); return value; }; // src/main.ts var main_exports = {}; __export(main_exports, { default: () => main_default }); module.exports = __toCommonJS(main_exports); // src/plugin.ts var import_obsidian6 = require("obsidian"); // node_modules/solid-js/dist/solid.js var sharedConfig = { context: void 0, registry: void 0 }; function setHydrateContext(context) { sharedConfig.context = context; } function nextHydrateContext() { return { ...sharedConfig.context, id: `${sharedConfig.context.id}${sharedConfig.context.count++}-`, count: 0 }; } var equalFn = (a, b) => a === b; var $PROXY = Symbol("solid-proxy"); var $TRACK = Symbol("solid-track"); var $DEVCOMP = Symbol("solid-dev-component"); var signalOptions = { equals: equalFn }; var ERROR = null; var runEffects = runQueue; var STALE = 1; var PENDING = 2; var UNOWNED = { owned: null, cleanups: null, context: null, owner: null }; var Owner = null; var Transition = null; var Scheduler = null; var ExternalSourceFactory = null; var Listener = null; var Updates = null; var Effects = null; var ExecCount = 0; var [transPending, setTransPending] = /* @__PURE__ */ createSignal(false); function createRoot(fn, detachedOwner) { const listener = Listener, owner = Owner, unowned = fn.length === 0, root = unowned ? UNOWNED : { owned: null, cleanups: null, context: null, owner: detachedOwner === void 0 ? owner : detachedOwner }, updateFn = unowned ? fn : () => fn(() => untrack(() => cleanNode(root))); Owner = root; Listener = null; try { return runUpdates(updateFn, true); } finally { Listener = listener; Owner = owner; } } function createSignal(value, options) { options = options ? Object.assign({}, signalOptions, options) : signalOptions; const s = { value, observers: null, observerSlots: null, comparator: options.equals || void 0 }; const setter = (value2) => { if (typeof value2 === "function") { if (Transition && Transition.running && Transition.sources.has(s)) value2 = value2(s.tValue); else value2 = value2(s.value); } return writeSignal(s, value2); }; return [readSignal.bind(s), setter]; } function createRenderEffect(fn, value, options) { const c = createComputation(fn, value, false, STALE); if (Scheduler && Transition && Transition.running) Updates.push(c); else updateComputation(c); } function createEffect(fn, value, options) { runEffects = runUserEffects; const c = createComputation(fn, value, false, STALE), s = SuspenseContext && lookup(Owner, SuspenseContext.id); if (s) c.suspense = s; if (!options || !options.render) c.user = true; Effects ? Effects.push(c) : updateComputation(c); } function createMemo(fn, value, options) { options = options ? Object.assign({}, signalOptions, options) : signalOptions; const c = createComputation(fn, value, true, 0); c.observers = null; c.observerSlots = null; c.comparator = options.equals || void 0; if (Scheduler && Transition && Transition.running) { c.tState = STALE; Updates.push(c); } else updateComputation(c); return readSignal.bind(c); } function untrack(fn) { if (Listener === null) return fn(); const listener = Listener; Listener = null; try { return fn(); } finally { Listener = listener; } } function onMount(fn) { createEffect(() => untrack(fn)); } function onCleanup(fn) { if (Owner === null) ; else if (Owner.cleanups === null) Owner.cleanups = [fn]; else Owner.cleanups.push(fn); return fn; } function catchError(fn, handler) { ERROR || (ERROR = Symbol("error")); Owner = createComputation(void 0, void 0, true); Owner.context = { [ERROR]: [handler] }; if (Transition && Transition.running) Transition.sources.add(Owner); try { return fn(); } catch (err) { handleError(err); } finally { Owner = Owner.owner; } } function startTransition(fn) { if (Transition && Transition.running) { fn(); return Transition.done; } const l = Listener; const o = Owner; return Promise.resolve().then(() => { Listener = l; Owner = o; let t; if (Scheduler || SuspenseContext) { t = Transition || (Transition = { sources: /* @__PURE__ */ new Set(), effects: [], promises: /* @__PURE__ */ new Set(), disposed: /* @__PURE__ */ new Set(), queue: /* @__PURE__ */ new Set(), running: true }); t.done || (t.done = new Promise((res) => t.resolve = res)); t.running = true; } runUpdates(fn, false); Listener = Owner = null; return t ? t.done : void 0; }); } function createContext(defaultValue, options) { const id = Symbol("context"); return { id, Provider: createProvider(id), defaultValue }; } function useContext(context) { let ctx; return (ctx = lookup(Owner, context.id)) !== void 0 ? ctx : context.defaultValue; } function children(fn) { const children2 = createMemo(fn); const memo = createMemo(() => resolveChildren(children2())); memo.toArray = () => { const c = memo(); return Array.isArray(c) ? c : c != null ? [c] : []; }; return memo; } var SuspenseContext; function readSignal() { const runningTransition = Transition && Transition.running; if (this.sources && (runningTransition ? this.tState : this.state)) { if ((runningTransition ? this.tState : this.state) === STALE) updateComputation(this); else { const updates = Updates; Updates = null; runUpdates(() => lookUpstream(this), false); Updates = updates; } } if (Listener) { const sSlot = this.observers ? this.observers.length : 0; if (!Listener.sources) { Listener.sources = [this]; Listener.sourceSlots = [sSlot]; } else { Listener.sources.push(this); Listener.sourceSlots.push(sSlot); } if (!this.observers) { this.observers = [Listener]; this.observerSlots = [Listener.sources.length - 1]; } else { this.observers.push(Listener); this.observerSlots.push(Listener.sources.length - 1); } } if (runningTransition && Transition.sources.has(this)) return this.tValue; return this.value; } function writeSignal(node, value, isComp) { let current = Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value; if (!node.comparator || !node.comparator(current, value)) { if (Transition) { const TransitionRunning = Transition.running; if (TransitionRunning || !isComp && Transition.sources.has(node)) { Transition.sources.add(node); node.tValue = value; } if (!TransitionRunning) node.value = value; } else node.value = value; if (node.observers && node.observers.length) { runUpdates(() => { for (let i = 0; i < node.observers.length; i += 1) { const o = node.observers[i]; const TransitionRunning = Transition && Transition.running; if (TransitionRunning && Transition.disposed.has(o)) continue; if (TransitionRunning ? !o.tState : !o.state) { if (o.pure) Updates.push(o); else Effects.push(o); if (o.observers) markDownstream(o); } if (!TransitionRunning) o.state = STALE; else o.tState = STALE; } if (Updates.length > 1e6) { Updates = []; if (false) ; throw new Error(); } }, false); } } return value; } function updateComputation(node) { if (!node.fn) return; cleanNode(node); const owner = Owner, listener = Listener, time = ExecCount; Listener = Owner = node; runComputation(node, Transition && Transition.running && Transition.sources.has(node) ? node.tValue : node.value, time); if (Transition && !Transition.running && Transition.sources.has(node)) { queueMicrotask(() => { runUpdates(() => { Transition && (Transition.running = true); Listener = Owner = node; runComputation(node, node.tValue, time); Listener = Owner = null; }, false); }); } Listener = listener; Owner = owner; } function runComputation(node, value, time) { let nextValue; try { nextValue = node.fn(value); } catch (err) { if (node.pure) { if (Transition && Transition.running) { node.tState = STALE; node.tOwned && node.tOwned.forEach(cleanNode); node.tOwned = void 0; } else { node.state = STALE; node.owned && node.owned.forEach(cleanNode); node.owned = null; } } node.updatedAt = time + 1; return handleError(err); } if (!node.updatedAt || node.updatedAt <= time) { if (node.updatedAt != null && "observers" in node) { writeSignal(node, nextValue, true); } else if (Transition && Transition.running && node.pure) { Transition.sources.add(node); node.tValue = nextValue; } else node.value = nextValue; node.updatedAt = time; } } function createComputation(fn, init, pure, state = STALE, options) { const c = { fn, state, updatedAt: null, owned: null, sources: null, sourceSlots: null, cleanups: null, value: init, owner: Owner, context: null, pure }; if (Transition && Transition.running) { c.state = 0; c.tState = state; } if (Owner === null) ; else if (Owner !== UNOWNED) { if (Transition && Transition.running && Owner.pure) { if (!Owner.tOwned) Owner.tOwned = [c]; else Owner.tOwned.push(c); } else { if (!Owner.owned) Owner.owned = [c]; else Owner.owned.push(c); } } if (ExternalSourceFactory) { const [track, trigger] = createSignal(void 0, { equals: false }); const ordinary = ExternalSourceFactory(c.fn, trigger); onCleanup(() => ordinary.dispose()); const triggerInTransition = () => startTransition(trigger).then(() => inTransition.dispose()); const inTransition = ExternalSourceFactory(c.fn, triggerInTransition); c.fn = (x) => { track(); return Transition && Transition.running ? inTransition.track(x) : ordinary.track(x); }; } return c; } function runTop(node) { const runningTransition = Transition && Transition.running; if ((runningTransition ? node.tState : node.state) === 0) return; if ((runningTransition ? node.tState : node.state) === PENDING) return lookUpstream(node); if (node.suspense && untrack(node.suspense.inFallback)) return node.suspense.effects.push(node); const ancestors = [node]; while ((node = node.owner) && (!node.updatedAt || node.updatedAt < ExecCount)) { if (runningTransition && Transition.disposed.has(node)) return; if (runningTransition ? node.tState : node.state) ancestors.push(node); } for (let i = ancestors.length - 1; i >= 0; i--) { node = ancestors[i]; if (runningTransition) { let top = node, prev = ancestors[i + 1]; while ((top = top.owner) && top !== prev) { if (Transition.disposed.has(top)) return; } } if ((runningTransition ? node.tState : node.state) === STALE) { updateComputation(node); } else if ((runningTransition ? node.tState : node.state) === PENDING) { const updates = Updates; Updates = null; runUpdates(() => lookUpstream(node, ancestors[0]), false); Updates = updates; } } } function runUpdates(fn, init) { if (Updates) return fn(); let wait = false; if (!init) Updates = []; if (Effects) wait = true; else Effects = []; ExecCount++; try { const res = fn(); completeUpdates(wait); return res; } catch (err) { if (!wait) Effects = null; Updates = null; handleError(err); } } function completeUpdates(wait) { if (Updates) { if (Scheduler && Transition && Transition.running) scheduleQueue(Updates); else runQueue(Updates); Updates = null; } if (wait) return; let res; if (Transition) { if (!Transition.promises.size && !Transition.queue.size) { const sources = Transition.sources; const disposed = Transition.disposed; Effects.push.apply(Effects, Transition.effects); res = Transition.resolve; for (const e2 of Effects) { "tState" in e2 && (e2.state = e2.tState); delete e2.tState; } Transition = null; runUpdates(() => { for (const d of disposed) cleanNode(d); for (const v of sources) { v.value = v.tValue; if (v.owned) { for (let i = 0, len = v.owned.length; i < len; i++) cleanNode(v.owned[i]); } if (v.tOwned) v.owned = v.tOwned; delete v.tValue; delete v.tOwned; v.tState = 0; } setTransPending(false); }, false); } else if (Transition.running) { Transition.running = false; Transition.effects.push.apply(Transition.effects, Effects); Effects = null; setTransPending(true); return; } } const e = Effects; Effects = null; if (e.length) runUpdates(() => runEffects(e), false); if (res) res(); } function runQueue(queue) { for (let i = 0; i < queue.length; i++) runTop(queue[i]); } function scheduleQueue(queue) { for (let i = 0; i < queue.length; i++) { const item = queue[i]; const tasks = Transition.queue; if (!tasks.has(item)) { tasks.add(item); Scheduler(() => { tasks.delete(item); runUpdates(() => { Transition.running = true; runTop(item); }, false); Transition && (Transition.running = false); }); } } } function runUserEffects(queue) { let i, userLength = 0; for (i = 0; i < queue.length; i++) { const e = queue[i]; if (!e.user) runTop(e); else queue[userLength++] = e; } if (sharedConfig.context) setHydrateContext(); for (i = 0; i < userLength; i++) runTop(queue[i]); } function lookUpstream(node, ignore) { const runningTransition = Transition && Transition.running; if (runningTransition) node.tState = 0; else node.state = 0; for (let i = 0; i < node.sources.length; i += 1) { const source = node.sources[i]; if (source.sources) { const state = runningTransition ? source.tState : source.state; if (state === STALE) { if (source !== ignore && (!source.updatedAt || source.updatedAt < ExecCount)) runTop(source); } else if (state === PENDING) lookUpstream(source, ignore); } } } function markDownstream(node) { const runningTransition = Transition && Transition.running; for (let i = 0; i < node.observers.length; i += 1) { const o = node.observers[i]; if (runningTransition ? !o.tState : !o.state) { if (runningTransition) o.tState = PENDING; else o.state = PENDING; if (o.pure) Updates.push(o); else Effects.push(o); o.observers && markDownstream(o); } } } function cleanNode(node) { let i; if (node.sources) { while (node.sources.length) { const source = node.sources.pop(), index = node.sourceSlots.pop(), obs = source.observers; if (obs && obs.length) { const n = obs.pop(), s = source.observerSlots.pop(); if (index < obs.length) { n.sourceSlots[s] = index; obs[index] = n; source.observerSlots[index] = s; } } } } if (Transition && Transition.running && node.pure) { if (node.tOwned) { for (i = node.tOwned.length - 1; i >= 0; i--) cleanNode(node.tOwned[i]); delete node.tOwned; } reset(node, true); } else if (node.owned) { for (i = node.owned.length - 1; i >= 0; i--) cleanNode(node.owned[i]); node.owned = null; } if (node.cleanups) { for (i = node.cleanups.length - 1; i >= 0; i--) node.cleanups[i](); node.cleanups = null; } if (Transition && Transition.running) node.tState = 0; else node.state = 0; node.context = null; } function reset(node, top) { if (!top) { node.tState = 0; Transition.disposed.add(node); } if (node.owned) { for (let i = 0; i < node.owned.length; i++) reset(node.owned[i]); } } function castError(err) { if (err instanceof Error) return err; return new Error(typeof err === "string" ? err : "Unknown error", { cause: err }); } function handleError(err, owner = Owner) { const fns = ERROR && lookup(owner, ERROR); const error = castError(err); if (!fns) throw error; if (Effects) Effects.push({ fn() { try { for (const f of fns) f(error); } catch (e) { handleError(e, (owner == null ? void 0 : owner.owner) || null); } }, state: STALE }); else { try { for (const f of fns) f(error); } catch (e) { handleError(e, (owner == null ? void 0 : owner.owner) || null); } } } function lookup(owner, key) { return owner ? owner.context && owner.context[key] !== void 0 ? owner.context[key] : lookup(owner.owner, key) : void 0; } function resolveChildren(children2) { if (typeof children2 === "function" && !children2.length) return resolveChildren(children2()); if (Array.isArray(children2)) { const results = []; for (let i = 0; i < children2.length; i++) { const result = resolveChildren(children2[i]); Array.isArray(result) ? results.push.apply(results, result) : results.push(result); } return results; } return children2; } function createProvider(id, options) { return function provider(props) { let res; createRenderEffect(() => res = untrack(() => { Owner.context = { [id]: props.value }; return children(() => props.children); }), void 0); return res; }; } var FALLBACK = Symbol("fallback"); function dispose(d) { for (let i = 0; i < d.length; i++) d[i](); } function mapArray(list, mapFn, options = {}) { let items = [], mapped = [], disposers = [], len = 0, indexes = mapFn.length > 1 ? [] : null; onCleanup(() => dispose(disposers)); return () => { let newItems = list() || [], i, j; newItems[$TRACK]; return untrack(() => { let newLen = newItems.length, newIndices, newIndicesNext, temp, tempdisposers, tempIndexes, start, end, newEnd, item; if (newLen === 0) { if (len !== 0) { dispose(disposers); disposers = []; items = []; mapped = []; len = 0; indexes && (indexes = []); } if (options.fallback) { items = [FALLBACK]; mapped[0] = createRoot((disposer) => { disposers[0] = disposer; return options.fallback(); }); len = 1; } } else if (len === 0) { mapped = new Array(newLen); for (j = 0; j < newLen; j++) { items[j] = newItems[j]; mapped[j] = createRoot(mapper); } len = newLen; } else { temp = new Array(newLen); tempdisposers = new Array(newLen); indexes && (tempIndexes = new Array(newLen)); for (start = 0, end = Math.min(len, newLen); start < end && items[start] === newItems[start]; start++) ; for (end = len - 1, newEnd = newLen - 1; end >= start && newEnd >= start && items[end] === newItems[newEnd]; end--, newEnd--) { temp[newEnd] = mapped[end]; tempdisposers[newEnd] = disposers[end]; indexes && (tempIndexes[newEnd] = indexes[end]); } newIndices = /* @__PURE__ */ new Map(); newIndicesNext = new Array(newEnd + 1); for (j = newEnd; j >= start; j--) { item = newItems[j]; i = newIndices.get(item); newIndicesNext[j] = i === void 0 ? -1 : i; newIndices.set(item, j); } for (i = start; i <= end; i++) { item = items[i]; j = newIndices.get(item); if (j !== void 0 && j !== -1) { temp[j] = mapped[i]; tempdisposers[j] = disposers[i]; indexes && (tempIndexes[j] = indexes[i]); j = newIndicesNext[j]; newIndices.set(item, j); } else disposers[i](); } for (j = start; j < newLen; j++) { if (j in temp) { mapped[j] = temp[j]; disposers[j] = tempdisposers[j]; if (indexes) { indexes[j] = tempIndexes[j]; indexes[j](j); } } else mapped[j] = createRoot(mapper); } mapped = mapped.slice(0, len = newLen); items = newItems.slice(0); } return mapped; }); function mapper(disposer) { disposers[j] = disposer; if (indexes) { const [s, set] = createSignal(j); indexes[j] = set; return mapFn(newItems[j], s); } return mapFn(newItems[j]); } }; } var hydrationEnabled = false; function createComponent(Comp, props) { if (hydrationEnabled) { if (sharedConfig.context) { const c = sharedConfig.context; setHydrateContext(nextHydrateContext()); const r = untrack(() => Comp(props || {})); setHydrateContext(c); return r; } } return untrack(() => Comp(props || {})); } var narrowedError = (name) => `Stale read from <${name}>.`; function For(props) { const fallback = "fallback" in props && { fallback: () => props.fallback }; return createMemo(mapArray(() => props.each, props.children, fallback || void 0)); } function Show(props) { const keyed = props.keyed; const condition = createMemo(() => props.when, void 0, { equals: (a, b) => keyed ? a === b : !a === !b }); return createMemo(() => { const c = condition(); if (c) { const child = props.children; const fn = typeof child === "function" && child.length > 0; return fn ? untrack(() => child(keyed ? c : () => { if (!untrack(condition)) throw narrowedError("Show"); return props.when; })) : child; } return props.fallback; }, void 0, void 0); } function Switch(props) { let keyed = false; const equals = (a, b) => a[0] === b[0] && (keyed ? a[1] === b[1] : !a[1] === !b[1]) && a[2] === b[2]; const conditions = children(() => props.children), evalConditions = createMemo(() => { let conds = conditions(); if (!Array.isArray(conds)) conds = [conds]; for (let i = 0; i < conds.length; i++) { const c = conds[i].when; if (c) { keyed = !!conds[i].keyed; return [i, c, conds[i]]; } } return [-1]; }, void 0, { equals }); return createMemo(() => { const [index, when, cond] = evalConditions(); if (index < 0) return props.fallback; const c = cond.children; const fn = typeof c === "function" && c.length > 0; return fn ? untrack(() => c(keyed ? when : () => { if (untrack(evalConditions)[0] !== index) throw narrowedError("Match"); return cond.when; })) : c; }, void 0, void 0); } function Match(props) { return props; } var Errors; function ErrorBoundary(props) { let err; let v; if (sharedConfig.context && sharedConfig.load && (v = sharedConfig.load(sharedConfig.context.id + sharedConfig.context.count))) err = v[0]; const [errored, setErrored] = createSignal(err, void 0); Errors || (Errors = /* @__PURE__ */ new Set()); Errors.add(setErrored); onCleanup(() => Errors.delete(setErrored)); return createMemo(() => { let e; if (e = errored()) { const f = props.fallback; return typeof f === "function" && f.length ? untrack(() => f(e, () => setErrored())) : f; } return catchError(() => props.children, setErrored); }, void 0, void 0); } var SuspenseListContext = createContext(); // node_modules/solid-js/web/dist/web.js var booleans = ["allowfullscreen", "async", "autofocus", "autoplay", "checked", "controls", "default", "disabled", "formnovalidate", "hidden", "indeterminate", "ismap", "loop", "multiple", "muted", "nomodule", "novalidate", "open", "playsinline", "readonly", "required", "reversed", "seamless", "selected"]; var Properties = /* @__PURE__ */ new Set(["className", "value", "readOnly", "formNoValidate", "isMap", "noModule", "playsInline", ...booleans]); function reconcileArrays(parentNode, a, b) { let bLength = b.length, aEnd = a.length, bEnd = bLength, aStart = 0, bStart = 0, after = a[aEnd - 1].nextSibling, map = null; while (aStart < aEnd || bStart < bEnd) { if (a[aStart] === b[bStart]) { aStart++; bStart++; continue; } while (a[aEnd - 1] === b[bEnd - 1]) { aEnd--; bEnd--; } if (aEnd === aStart) { const node = bEnd < bLength ? bStart ? b[bStart - 1].nextSibling : b[bEnd - bStart] : after; while (bStart < bEnd) parentNode.insertBefore(b[bStart++], node); } else if (bEnd === bStart) { while (aStart < aEnd) { if (!map || !map.has(a[aStart])) a[aStart].remove(); aStart++; } } else if (a[aStart] === b[bEnd - 1] && b[bStart] === a[aEnd - 1]) { const node = a[--aEnd].nextSibling; parentNode.insertBefore(b[bStart++], a[aStart++].nextSibling); parentNode.insertBefore(b[--bEnd], node); a[aEnd] = b[bEnd]; } else { if (!map) { map = /* @__PURE__ */ new Map(); let i = bStart; while (i < bEnd) map.set(b[i], i++); } const index = map.get(a[aStart]); if (index != null) { if (bStart < index && index < bEnd) { let i = aStart, sequence = 1, t; while (++i < aEnd && i < bEnd) { if ((t = map.get(a[i])) == null || t !== index + sequence) break; sequence++; } if (sequence > index - bStart) { const node = a[aStart]; while (bStart < index) parentNode.insertBefore(b[bStart++], node); } else parentNode.replaceChild(b[bStart++], a[aStart++]); } else aStart++; } else a[aStart++].remove(); } } } var $$EVENTS = "_$DX_DELEGATE"; function render(code, element, init, options = {}) { let disposer; createRoot((dispose2) => { disposer = dispose2; element === document ? code() : insert(element, code(), element.firstChild ? null : void 0, init); }, options.owner); return () => { disposer(); element.textContent = ""; }; } function template(html, isCE, isSVG) { let node; const create = () => { const t = document.createElement("template"); t.innerHTML = html; return isSVG ? t.content.firstChild.firstChild : t.content.firstChild; }; const fn = isCE ? () => untrack(() => document.importNode(node || (node = create()), true)) : () => (node || (node = create())).cloneNode(true); fn.cloneNode = fn; return fn; } function delegateEvents(eventNames, document2 = window.document) { const e = document2[$$EVENTS] || (document2[$$EVENTS] = /* @__PURE__ */ new Set()); for (let i = 0, l = eventNames.length; i < l; i++) { const name = eventNames[i]; if (!e.has(name)) { e.add(name); document2.addEventListener(name, eventHandler); } } } function setAttribute(node, name, value) { if (value == null) node.removeAttribute(name); else node.setAttribute(name, value); } function className(node, value) { if (value == null) node.removeAttribute("class"); else node.className = value; } function use(fn, element, arg) { return untrack(() => fn(element, arg)); } function insert(parent, accessor, marker, initial) { if (marker !== void 0 && !initial) initial = []; if (typeof accessor !== "function") return insertExpression(parent, accessor, initial, marker); createRenderEffect((current) => insertExpression(parent, accessor(), current, marker), initial); } function eventHandler(e) { const key = `$$${e.type}`; let node = e.composedPath && e.composedPath()[0] || e.target; if (e.target !== node) { Object.defineProperty(e, "target", { configurable: true, value: node }); } Object.defineProperty(e, "currentTarget", { configurable: true, get() { return node || document; } }); if (sharedConfig.registry && !sharedConfig.done) sharedConfig.done = _$HY.done = true; while (node) { const handler = node[key]; if (handler && !node.disabled) { const data = node[`${key}Data`]; data !== void 0 ? handler.call(node, data, e) : handler.call(node, e); if (e.cancelBubble) return; } node = node._$host || node.parentNode || node.host; } } function insertExpression(parent, value, current, marker, unwrapArray) { if (sharedConfig.context) { !current && (current = [...parent.childNodes]); let cleaned = []; for (let i = 0; i < current.length; i++) { const node = current[i]; if (node.nodeType === 8 && node.data.slice(0, 2) === "!$") node.remove(); else cleaned.push(node); } current = cleaned; } while (typeof current === "function") current = current(); if (value === current) return current; const t = typeof value, multi = marker !== void 0; parent = multi && current[0] && current[0].parentNode || parent; if (t === "string" || t === "number") { if (sharedConfig.context) return current; if (t === "number") value = value.toString(); if (multi) { let node = current[0]; if (node && node.nodeType === 3) { node.data = value; } else node = document.createTextNode(value); current = cleanChildren(parent, current, marker, node); } else { if (current !== "" && typeof current === "string") { current = parent.firstChild.data = value; } else current = parent.textContent = value; } } else if (value == null || t === "boolean") { if (sharedConfig.context) return current; current = cleanChildren(parent, current, marker); } else if (t === "function") { createRenderEffect(() => { let v = value(); while (typeof v === "function") v = v(); current = insertExpression(parent, v, current, marker); }); return () => current; } else if (Array.isArray(value)) { const array = []; const currentArray = current && Array.isArray(current); if (normalizeIncomingArray(array, value, current, unwrapArray)) { createRenderEffect(() => current = insertExpression(parent, array, current, marker, true)); return () => current; } if (sharedConfig.context) { if (!array.length) return current; for (let i = 0; i < array.length; i++) { if (array[i].parentNode) return current = array; } } if (array.length === 0) { current = cleanChildren(parent, current, marker); if (multi) return current; } else if (currentArray) { if (current.length === 0) { appendNodes(parent, array, marker); } else reconcileArrays(parent, current, array); } else { current && cleanChildren(parent); appendNodes(parent, array); } current = array; } else if (value.nodeType) { if (sharedConfig.context && value.parentNode) return current = multi ? [value] : value; if (Array.isArray(current)) { if (multi) return current = cleanChildren(parent, current, marker, value); cleanChildren(parent, current, null, value); } else if (current == null || current === "" || !parent.firstChild) { parent.appendChild(value); } else parent.replaceChild(value, parent.firstChild); current = value; } else console.warn(`Unrecognized value. Skipped inserting`, value); return current; } function normalizeIncomingArray(normalized, array, current, unwrap) { let dynamic = false; for (let i = 0, len = array.length; i < len; i++) { let item = array[i], prev = current && current[i], t; if (item == null || item === true || item === false) ; else if ((t = typeof item) === "object" && item.nodeType) { normalized.push(item); } else if (Array.isArray(item)) { dynamic = normalizeIncomingArray(normalized, item, prev) || dynamic; } else if (t === "function") { if (unwrap) { while (typeof item === "function") item = item(); dynamic = normalizeIncomingArray(normalized, Array.isArray(item) ? item : [item], Array.isArray(prev) ? prev : [prev]) || dynamic; } else { normalized.push(item); dynamic = true; } } else { const value = String(item); if (prev && prev.nodeType === 3 && prev.data === value) normalized.push(prev); else normalized.push(document.createTextNode(value)); } } return dynamic; } function appendNodes(parent, array, marker = null) { for (let i = 0, len = array.length; i < len; i++) parent.insertBefore(array[i], marker); } function cleanChildren(parent, current, marker, replacement) { if (marker === void 0) return parent.textContent = ""; const node = replacement || document.createTextNode(""); if (current.length) { let inserted = false; for (let i = current.length - 1; i >= 0; i--) { const el = current[i]; if (node !== el) { const isParent = el.parentNode === parent; if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker); else isParent && el.remove(); } else inserted = true; } } else parent.insertBefore(node, marker); return [node]; } // src/sidebarView.tsx var import_obsidian5 = require("obsidian"); // src/settings.ts var import_obsidian = require("obsidian"); function isOpen(depth, mode) { if (mode == "expanded") { return true; } if (mode == "leaf-collapsed" && depth == 0) { return true; } if (mode == "root-collapsed" && depth != 0) { return true; } return false; } var DEFAULT_SETTINGS = { expansionMode: "expanded", ignoreNulls: false, nullValue: "", skipKey: "metatable", filterKeys: ["metatable", "frontmatter"], filterMode: "ignore", autolinks: false, naked: false, theme: "light" }; var MetatableSettingTab = class extends import_obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); __publicField(this, "plugin"); this.plugin = plugin; } async display() { const { containerEl, plugin } = this; containerEl.empty(); containerEl.createEl("h2", { text: "Metatable Settings" }); new import_obsidian.Setting(containerEl).setName("Expansion level").setDesc("Level of expansion of the metatable tree").addDropdown((drop) => drop.addOption("expanded", "Fully expanded").addOption("leaf-collapsed", "Collapse leafs").addOption("all-collapsed", "Collapse all").addOption("root-collapsed", "Collapse root").setValue(plugin.settings.expansionMode).onChange(async (value) => { plugin.settings.expansionMode = value; await plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("Skip key").setDesc("When this key is found and `true`, the metatable will not be displayed").addText((text) => text.setValue(plugin.settings.skipKey).onChange(async (value) => { plugin.settings.skipKey = value; await plugin.saveSettings(); })); containerEl.createEl("h3", { text: "Nulls" }); new import_obsidian.Setting(containerEl).setName("Ignore null values").setDesc("Ignore any member with a null value.").addToggle((setting) => setting.setValue(plugin.settings.ignoreNulls).onChange(async (value) => { plugin.settings.ignoreNulls = value; await plugin.saveSettings(); this.display(); })); if (!plugin.settings.ignoreNulls) { new import_obsidian.Setting(containerEl).setName("Null value").setDesc("Text to show when a key has no value. Defaults to nothing").addText((text) => text.setValue(plugin.settings.nullValue).onChange(async (value) => { plugin.settings.nullValue = value; await plugin.saveSettings(); })); } containerEl.createEl("h3", { text: "Filter" }); new import_obsidian.Setting(containerEl).setName("Filter mode").setDesc("Either ignore or keep the filter keys").addDropdown((drop) => drop.addOption("ignore", "Ignore").addOption("keep", "Keep").setValue(plugin.settings.filterMode).onChange(async (value) => { plugin.settings.filterMode = value; await plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("Filter keys").setDesc("Any empty field will be ignored."); let keyset = plugin.settings.filterKeys; let filterKeys2 = containerEl.createEl("ol"); for (const [idx, originalValue] of [...keyset].entries()) { if (originalValue === "") { continue; } addFilterInput(originalValue, filterKeys2, keyset, plugin, idx); } new import_obsidian.Setting(containerEl).addButton((x) => x.setButtonText("Add key").onClick(async () => { addFilterInput("", filterKeys2, keyset, plugin, keyset.length); })); containerEl.createEl("h3", { text: "Experimental" }); new import_obsidian.Setting(containerEl).setName("Autolink").setDesc("Enables autolinks for wikilinks `[[target]]`, frontmatter links `%target%` and local links `./deep/target`").addToggle((setting) => setting.setValue(plugin.settings.autolinks).onChange(async (value) => { plugin.settings.autolinks = value; await plugin.saveSettings(); })); new import_obsidian.Setting(containerEl).setName("Naked").setDesc("Removes the Shadow DOM and the default CSS so you can bring your own via CSS snippets.").addToggle((setting) => setting.setValue(plugin.settings.naked).onChange(async (value) => { plugin.settings.naked = value; await plugin.saveSettings(); })); } }; function addFilterInput(originalValue, el, keyset, plugin, idx) { const item = el.createEl("li"); const input = item.createEl("input"); item.setAttribute("id", `filter-${idx}`); input.setAttribute("type", "text"); input.setAttribute("value", originalValue); input.setAttribute("data-prev", originalValue); input.addEventListener("input", async (e) => { let target = e.target; keyset[idx] = target.value; input.setAttribute("data-prev", target.value); plugin.settings.filterKeys = keyset; await plugin.saveSettings(); }); } // src/value.ts function isLeaf(value) { return value === null || ["string", "number", "boolean"].some((kind) => typeof value == kind); } function isSet(value) { return value !== null && typeof value == "object" && !Array.isArray(value); } function isEmptyValue(value) { if (typeof value == "string" || Array.isArray(value)) { return value.length == 0; } if (typeof value == "object" && value != null) { return Object.keys(value).length == 0; } return value == null; } // src/core.ts function observeTheme(el) { const observer = new MutationObserver((mutationList) => { mutationList.forEach((mutation) => { const target = mutation.target; if (target.hasClass("theme-light")) { el.classList.add("light"); el.classList.remove("dark"); } else { el.classList.add("dark"); el.classList.remove("light"); } }); }); const body = document.querySelector("body"); observer.observe(body, { attributes: true, attributeFilter: ["class"] }); return observer; } function queryTheme() { const body = document.querySelector("body"); return body.hasClass("theme-light") ? "light" : "dark"; } function cleanData(data, settings) { if (data === void 0 || data === null) { return; } if (typeof data == "string") { return; } if (data[settings.skipKey] === true) { return; } let entries = Object.entries(data); entries = filterKeys(entries, settings.filterKeys, settings.filterMode); if (settings.ignoreNulls) { entries = filterNulls(entries); } entries = normalise(entries); return entries.length == 0 ? void 0 : Object.fromEntries(entries); } function normalise(entries) { return entries.map(([key, value]) => { if (["tags", "aliases"].includes(key.toLocaleLowerCase())) { return [key, normaliseSpuriousArray(value)]; } return [key, value]; }); } function normaliseSpuriousArray(data) { if (data == null) { return []; } if (!Array.isArray(data) && typeof data != "string") { throw new Error("Tags must be an array or a string"); } const result = typeof data == "string" ? data.split(",").flatMap((x) => x.trim().split(" ")) : data; return result.filter((x) => x && x.length != 0); } function filterKeys(entries, keys, mode) { const predicate = mode == "ignore" ? (x) => !x : (x) => x; return entries.filter(([key, _value]) => predicate(keys.some((x) => x === key))); } function filterNulls(entries) { return entries.filter(([_key, value]) => !isEmptyValue(value)); } // src/mixture.tsx function useMixture() { return useContext(MixtureContext); } var MixtureContext = createContext(); function MixtureProvider(props) { const app = props.app; const settings = props.settings; const workspace = app.workspace; const searchFn = app.internalPlugins.getPluginById("global-search").instance.openGlobalSearch.bind(app.workspace); const openLinkFn = app.workspace.openLinkText.bind(app.workspace); onCleanup(() => { props.themeObserver.disconnect(); }); const mixture = { app, workspace, settings, search(term) { searchFn(term); }, isOpen(depth) { return isOpen(depth, settings.expansionMode); }, isNaked: settings.naked, openTag(tag) { searchFn(`tag:${tag}`); }, openNote(note) { openLinkFn(note, ""); }, cleanData: (data) => cleanData(data, settings) }; return createComponent(MixtureContext.Provider, { value: mixture, get children() { return props.children; } }); } // src/components/Sidebar.tsx var import_obsidian4 = require("obsidian"); // src/components/List.tsx var _tmpl$ = /* @__PURE__ */ template(`<ul>`); var _tmpl$2 = /* @__PURE__ */ template(`<li>`); function List(props) { const name = `list-${props.key}`; return createComponent(Show, { get when() { return props.value.length > 0; }, get children() { const _el$ = _tmpl$(); className(_el$, `list ${name}`); setAttribute(_el$, "part", `list ${name}`); insert(_el$, createComponent(For, { get each() { return props.value; }, children: (item, index) => (() => { const _el$2 = _tmpl$2(); insert(_el$2, () => createComponent(Value, { get key() { return props.key; }, get depth() { return props.depth; }, value: item })); createRenderEffect((_p$) => { const _v$ = `${props.key}-${index()}`, _v$2 = `list-item list-item-${props.key}`; _v$ !== _p$._v$ && setAttribute(_el$2, "id", _p$._v$ = _v$); _v$2 !== _p$._v$2 && setAttribute(_el$2, "part", _p$._v$2 = _v$2); return _p$; }, { _v$: void 0, _v$2: void 0 }); return _el$2; })() })); return _el$; } }); } // src/components/Member.tsx var _tmpl$3 = /* @__PURE__ */ template(`<td class="value" part="value">`); var _tmpl$22 = /* @__PURE__ */ template(`<th class="key" part="key">`); var _tmpl$32 = /* @__PURE__ */ template(`<tr class="member" part="member">`); var _tmpl$4 = /* @__PURE__ */ template(`<p class="parse-error">Error: `); var _tmpl$5 = /* @__PURE__ */ template(`<th class="key toggle" role="button" tabindex="0"><span>`); var _tmpl$6 = /* @__PURE__ */ template(`<div class="marker" part="marker">`); function Member(props) { const { cleanData: cleanData2, isOpen: isOpen2, settings } = useMixture(); const data = () => { var _a; return isSet(props.value) ? (_a = cleanData2(props.value)) != null ? _a : {} : props.value; }; const depth = () => props.depth + 1; return createComponent(ErrorBoundary, { fallback: (error) => (() => { const _el$5 = _tmpl$4(), _el$6 = _el$5.firstChild; insert(_el$5, error, null); return _el$5; })(), get children() { return createComponent(Show, { get when() { return !(isEmptyValue(data()) && settings.ignoreNulls); }, get children() { const _el$ = _tmpl$32(); insert(_el$, createComponent(Switch, { get children() { return [createComponent(Match, { get when() { return !isLeaf(props.value); }, get children() { return [createComponent(Key, { get target() { return props.id; }, get expanded() { return isOpen2(depth()); }, get children() { return props.key; } }), (() => { const _el$2 = _tmpl$3(); insert(_el$2, createComponent(Value, { get key() { return props.key; }, get depth() { return depth(); }, get value() { return data(); } }), null); insert(_el$2, createComponent(Marker, {}), null); createRenderEffect(() => setAttribute(_el$2, "id", props.id)); return _el$2; })()]; } }), createComponent(Match, { get when() { return isLeaf(props.value); }, get children() { return [(() => { const _el$3 = _tmpl$22(); insert(_el$3, () => props.key); createRenderEffect(() => setAttribute(_el$3, "title", props.key)); return _el$3; })(), (() => { const _el$4 = _tmpl$3(); insert(_el$4, createComponent(Value, { get key() { return props.key; }, get depth() { return props.depth; }, get value() { return data(); } })); createRenderEffect(() => setAttribute(_el$4, "id", props.id)); return _el$4; })()]; } })]; } })); return _el$; } }); } }); } function Key(props) { const [isExpanded, setIsExpanded] = createSignal(props.expanded); const togglePart = () => isExpanded() ? "expanded" : "collapsed"; const handler = (event) => { event.stopPropagation(); event.preventDefault(); setIsExpanded(!isExpanded()); }; const clickHandler = (event) => handler(event); const keyHandler = (event) => { if (event.code == "Space" || event.code == "Enter") { handler(event); } }; return (() => { const _el$7 = _tmpl$5(), _el$8 = _el$7.firstChild; _el$7.$$keydown = keyHandler; _el$7.$$click = clickHandler; insert(_el$8, () => props.children); createRenderEffect((_p$) => { const _v$ = `key toggle ${togglePart()}`, _v$2 = isExpanded(), _v$3 = props.target, _v$4 = props.children; _v$ !== _p$._v$ && setAttribute(_el$7, "part", _p$._v$ = _v$); _v$2 !== _p$._v$2 && setAttribute(_el$7, "aria-expanded", _p$._v$2 = _v$2); _v$3 !== _p$._v$3 && setAttribute(_el$7, "aria-controls", _p$._v$3 = _v$3); _v$4 !== _p$._v$4 && setAttribute(_el$7, "title", _p$._v$4 = _v$4); return _p$; }, { _v$: void 0, _v$2: void 0, _v$3: void 0, _v$4: void 0 }); return _el$7; })(); } function Marker() { return _tmpl$6(); } delegateEvents(["click", "keydown"]); // src/components/Set.tsx var _tmpl$7 = /* @__PURE__ */ template(`<table>`); function Set2(props) { const name = `set-${props.key}`; return (() => { const _el$ = _tmpl$7(); className(_el$, `set ${name}`); setAttribute(_el$, "part", `set ${name}`); insert(_el$, createComponent(For, { get each() { return Object.entries(props.value); }, children: ([key, value], index) => createComponent(Member, { get id() { return `${key}-${index()}`; }, get depth() { return props.depth; }, key, value }) })); return _el$; })(); } // src/components/Tag.tsx var _tmpl$8 = /* @__PURE__ */ template(`<a class="tag" target="_blank" rel="noopener">`); function Tag(props) { const { openTag } = useMixture(); const url = () => `#${props.value}`; const safeValue = () => props.value; const clickHandler = (event) => { const trigger = event.target; event.preventDefault(); openTag(trigger.getAttribute("href")); }; return (() => { const _el$ = _tmpl$8(); _el$.$$click = clickHandler; insert(_el$, () => props.value); createRenderEffect((_p$) => { const _v$ = url(), _v$2 = url(), _v$3 = `tag ${safeValue()}`; _v$ !== _p$._v$ && setAttribute(_el$, "href", _p$._v$ = _v$); _v$2 !== _p$._v$2 && setAttribute(_el$, "data-href", _p$._v$2 = _v$2); _v$3 !== _p$._v$3 && setAttribute(_el$, "part", _p$._v$3 = _v$3); return _p$; }, { _v$: void 0, _v$2: void 0, _v$3: void 0 }); return _el$; })(); } delegateEvents(["click"]); // src/components/InternalLink.tsx var import_obsidian2 = require("obsidian"); var _tmpl$9 = /* @__PURE__ */ template(`<a class="leaf link internal-link" part="leaf link internal-link" target="_blank" rel="noopener">`); function InternalLink(props) { const value = props.value; return createComponent(Switch, { get children() { return [createComponent(Match, { get when() { return isWikiLink(value); }, get children() { return createComponent(WikiLink, { value }); } }), createComponent(Match, { get when() { return isFrontmatterLink(value); }, get children() { return createComponent(FrontmatterLink, { value }); } }), createComponent(Match, { get when() { return isLocalLink(value); }, get children() { return createComponent(LocalLink, { value }); } }), createComponent(Match, { get when() { return isObsidianUrl(value); }, get children() { return createComponent(ObsidianLink, { value }); } })]; } }); } function isInternalLink(value) { return isWikiLink(value) || isFrontmatterLink(value) || isLocalLink(value) || isObsidianUrl(value); } function WikiLink(props) { let value = props.value.slice(2, -2); let url; let label; if (value.includes("|")) { const [urlValue, labelValue] = value.split("|"); url = urlValue.trim(); label = labelValue.trim(); } else { label = value; url = value; } return createComponent(Link, { label, url }); } function isWikiLink(value) { return value.startsWith("[[") && value.endsWith("]]"); } function FrontmatterLink(props) { let value = props.value.slice(1, -1); let url; let label; if (value.includes("|")) { const [urlValue, labelValue] = value.split("|"); url = urlValue.trim(); label = labelValue.trim(); } else { label = value; url = value; } return createComponent(Link, { label, url }); } function isFrontmatterLink(value) { return value.startsWith("%") && value.endsWith("%"); } function LocalLink(props) { return createComponent(Link, { get label() { return props.value; }, get url() { return props.value; } }); } function isLocalLink(value) { return value.startsWith("./") || value.startsWith("../"); } function ObsidianLink(props) { return createComponent(Link, { get label() { return props.value; }, get url() { return props.value; } }); } function isObsidianUrl(url) { return url instanceof URL && url.protocol == "obsidian:"; } function expandUrl(url, parent) { var _a; if (!url.startsWith(".") || !url.startsWith("..")) { return url; } const parentTrail = (_a = parent == null ? void 0 : parent.split("/").filter((step) => step.length > 0)) != null ? _a : []; const [relativeStep, ...trail] = url.split("/"); if (relativeStep === "..") { parentTrail.pop(); } return `/${parentTrail.concat(trail).join("/")}`; } function Link(props) { const { workspace } = useMixture(); const [parent, setParent] = createSignal(); const view = () => workspace.getActiveViewOfType(import_obsidian2.MarkdownView); createEffect(() => { var _a, _b; setParent((_b = (_a = view()) == null ? void 0 : _a.file.parent) == null ? void 0 : _b.path); }); const { openNote } = useMixture(); const label = () => props.label; const url = () => decodeURIComponent(props.url); const localUrl = () => (0, import_obsidian2.getLinkpath)(url()); const clickHandler = (event) => { event.preventDefault(); const href = event.target.dataset.href; openNote(expandUrl(href, parent())); }; return (() => { const _el$ = _tmpl$9(); _el$.$$click = clickHandler; insert(_el$, label); createRenderEffect((_p$) => { const _v$ = localUrl(), _v$2 = localUrl(); _v$ !== _p$._v$ && setAttribute(_el$, "href", _p$._v$ = _v$); _v$2 !== _p$._v$2 && setAttribute(_el$, "data-href", _p$._v$2 = _v$2); return _p$; }, { _v$: void 0, _v$2: void 0 }); return _el$; })(); } delegateEvents(["click"]); // src/components/ExternalLink.tsx var _tmpl$10 = /* @__PURE__ */ template(`<a class="leaf link external-link" part="leaf link external-link" target="_blank" rel="noopener">`); function ExternalLink(props) { return createComponent(Link2, { get label() { return props.value; }, get url() { return props.value; } }); } function isExternalLink(value) { const url = tryUrl(value); return isUrl(url); } function isUrl(url) { const allowedProtocols = ["http:", "https:", "evernote:", "zotero:"]; return url instanceof URL && allowedProtocols.some((protocol) => url.protocol == protocol); } function tryUrl(value) { try { return new URL(value); } catch (_) { return value; } } function Link2(props) { const label = props.label; const url = props.url; return (() => { const _el$ = _tmpl$10(); setAttribute(_el$, "href", url); insert(_el$, label); return _el$; })(); } // src/components/Leaf.tsx var _tmpl$11 = /* @__PURE__ */ template(`<span class="leaf number" part="leaf number">`); var _tmpl$23 = /* @__PURE__ */ template(`<span class="leaf boolean" part="leaf boolean">`); var _tmpl$33 = /* @__PURE__ */ template(`<span class="leaf nil" part="leaf nil">`); var _tmpl$42 = /* @__PURE__ */ template(`<span class="leaf isodate" part="leaf isodate">`); var _tmpl$52 = /* @__PURE__ */ template(`<span class="leaf" part="leaf">`); var _tmpl$62 = /* @__PURE__ */ template(`<span class="leaf string" part="leaf string">`); var ISODATE_RE = new RegExp(/^\d{4}-\d{2}-\d{2}$/); var MD_LINK_RE = new RegExp(/^\[(?<label>[^\[\]]+)\]\((?<url>[^\(\)]+)\)$/); function Leaf(props) { const { settings } = useMixture(); const key = props.key; const value = props.value; return createComponent(Switch, { get children() { return [createComponent(Match, { when: typeof value === "number", get children() { const _el$ = _tmpl$11(); insert(_el$, value); return _el$; } }), createComponent(Match, { when: typeof value === "boolean", get children() { const _el$2 = _tmpl$23(); insert(_el$2, () => value.toString()); return _el$2; } }), createComponent(Match, { when: key == "tags", get children() { return createComponent(Tag, { value }); } }), createComponent(Match, { get when() { return value === settings.nullValue; }, get children() { const _el$3 = _tmpl$33(); insert(_el$3, value); return _el$3; } }), createComponent(Match, { get when() { return ISODATE_RE.test(value.trim()); }, get children() { const _el$4 = _tmpl$42(); insert(_el$4, value); return _el$4; } }), createComponent(Match, { when: typeof value === "string", get children() { return createComponent(String2, { key, value }); } }), createComponent(Match, { when: true, get children() { const _el$5 = _tmpl$52(); insert(_el$5, value); return _el$5; } })]; } }); } function String2(props) { const { settings } = useMixture(); const value = props.value; return createComponent(Switch, { get children() { return [createComponent(Match, { get when() { return createMemo(() => !!settings.autolinks)() && isInternalLink(value); }, get children() { return createComponent(InternalLink, { value }); } }), createComponent(Match, { get when() { return createMemo(() => !!settings.autolinks)() && isExternalLink(value); }, get children() { return createComponent(ExternalLink, { value }); } }), createComponent(Match, { get when() { return createMemo(() => !!settings.autolinks)() && MD_LINK_RE.test(value.trim()); }, get children() { return createComponent(MarkdownLink, { get value() { return value.trim(); } }); } }), createComponent(Match, { when: true, get children() { const _el$6 = _tmpl$62(); insert(_el$6, value); return _el$6; } })]; } }); } function MarkdownLink(props) { const groups = () => props.value.match(MD_LINK_RE).groups; return createComponent(Switch, { get children() { return [createComponent(Match, { get when() { return isExternalLink(groups().url); }, get children() { return createComponent(Link2, { get label() { return groups().label; }, get url() { return groups().url; } }); } }), createComponent(Match, { when: true, get children() { return createComponent(Link, { get label() { return groups().label; }, get url() { return groups().url; } }); } })]; } }); } // src/components/Value.tsx function Value(props) { const { settings } = useMixture(); const patchedKey = createMemo(() => patchKey(props.key)); const patchedValue = createMemo(() => patchValue(props.value, settings.nullValue)); return createComponent(Switch, { get children() { return [createComponent(Match, { get when() { return Array.isArray(patchedValue()); }, get children() { return createComponent(List, { get key() { return patchedKey(); }, get depth() { return props.depth; }, get value() { return patchedValue(); } }); } }), createComponent(Match, { get when() { return typeof patchedValue() == "object"; }, get children() { return createComponent(Set2, { get key() { return patchedKey(); }, get depth() { return props.depth; }, get value() { return patchedValue(); } }); } }), createComponent(Match, { get when() { return isLeaf(patchedValue()); }, get children() { return createComponent(Leaf, { get key() { return patchedKey(); }, get value() { return patchedValue(); } }); } })]; } }); } function patchKey(input) { return input.toLocaleLowerCase().replace(" ", "-"); } function patchValue(input, nullValue) { return isEmptyValue(input) ? nullValue : input; } // src/components/Metatable.tsx function Metatable(props) { return createComponent(Value, { key: "metatableroot", depth: 0, get value() { return props.data; } }); } // src/components/ParseError.tsx var _tmpl$12 = /* @__PURE__ */ template(`<div class="parse-error"><p></p><pre>`); function ParseError(props) { const message = props.message; const error = () => { const [msg, ...trace] = message().split("\n").filter((line) => line.length != 0); return { message: msg, trace: trace.join("\n") }; }; return (() => { const _el$ = _tmpl$12(), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling; insert(_el$2, () => error().message); insert(_el$3, () => error().trace); return _el$; })(); } // src/frontmatter.ts var import_obsidian3 = require("obsidian"); var FRONTMATTER_REGEX = /^\n*---[^\n]*\n+(?<fm>.+?)\n+---.*/s; function readFrontmatter(md) { var _a; const result = md.match(FRONTMATTER_REGEX); return (_a = result == null ? void 0 : result.groups) == null ? void 0 : _a.fm; } function parseFrontmatter(input) { if (input === void 0 || input === null) { return; } return (0, import_obsidian3.parseYaml)(input); } // src/state.ts function createState(settings) { const [state, setState] = createSignal({}); const nextState = (seed) => { if (seed !== null) { const newState = computeState(state, seed, settings); if (newState !== void 0) { setState(newState); } } else { setState({}); } }; return [state, nextState]; } function computeState(state, seed, settings) { const name = seed.name; const frontmatter = readFrontmatter(seed.content); if (frontmatter === state().frontmatter) { return; } let metadata; let error; try { metadata = parseFrontmatter(frontmatter); metadata = cleanData(metadata, settings); } catch (err) { error = err; } return { name, frontmatter, metadata, error }; } // src/metatable.css var metatable_default = ':host {\n /* global */\n --metatable-font-family: var(--font-text, sans-serif);\n --metatable-font-size: 14px;\n\n /* symbols */\n --metatable-collapsed-symbol: "\u25B6\uFE0E";\n --metatable-expanded-symbol: "\u25BC";\n --metatable-mark-symbol: "\u2026";\n --metatable-tag-symbol: "";\n --metatable-alias-symbol: "\u2021";\n\n /* palette */\n --metatable-background-primary-alt: var(--background-primary-alt);\n /* DEPRECATED: 0.14.0 --metatable-background */\n --metatable-background-primary: var(--metatable-background, transparent);\n --metatable-background-secondary: var(--background-secondary);\n --metatable-background-secondary-alt: var(--background-secondary-alt);\n --metatable-text-focus: inherit;\n /* DEPRECATED: 0.14.0 --metatable-foreground */\n --metatable-text-primary: var(--metatable-foreground, var(--text-muted));\n --metatable-text-secondary: var(--text-normal);\n\n --metatable-background-link: transparent;\n --metatable-text-link: var(--text-accent);\n --metatable-text-link-hover: var(--text-accent-hover);\n\n\n /* part palette */\n\n /* root */\n --metatable-root-background: var(--metatable-background-primary);\n --metatable-root-color: var(--metatable-text-primary);\n\n /* set */\n --metatable-set-background: transparent;\n --metatable-set-color: inherit;\n\n /** member */\n --metatable-member-background: inherit;\n --metatable-member-color: inherit;\n\n /*** key */\n --metatable-key-background: transparent;\n --metatable-key-color: inherit;\n /* DEPRECATED: 0.14.0 --metatable-key-focus */\n --metatable-key-background-focus: var(--metatable-key-focus, var(--metatable-background-focus));\n --metatable-key-color-focus: var(--metatable-text-focus);\n\n /*** value */\n --metatable-value-background: transparent;\n --metatable-value-color: inherit;\n\n /* tags */\n --metatable-tag-background: var(--metatable-background-primary-alt);\n --metatable-tag-color: var(--metatable-text-primary);\n --metatable-tag-border: none;\n --metatable-tag-background-focus: var(--metatable-background-focus);\n --metatable-tag-color-focus: var(--metatable-text-focus);\n\n /* aliases */\n --metatable-alias-color: var(--text-muted);\n\n /* links */\n --metatable-external-link-background: var(--metatable-background-link);\n --metatable-external-link-color: var(--metatable-text-link);\n --metatable-external-link-background-hover: transparent;\n --metatable-external-link-color-hover: var(--metatable-text-link-hover);\n --metatable-external-link-background-focus: var(--metatable-background-focus);\n --metatable-external-link-color-focus: var(--metatable-text-focus);\n --metatable-external-link-icon: url(app://obsidian.md/public/images/874d8b8e340f75575caa.svg);\n\n --metatable-internal-link-background: var(--metatable-background-link);\n --metatable-internal-link-color: var(--metatable-text-link);\n --metatable-internal-link-background-hover: transparent;\n --metatable-internal-link-color-hover: var(--metatable-text-hover);\n --metatable-internal-link-background-focus: var(--metatable-background-focus);\n --metatable-internal-link-color-focus: var(--metatable-text-link-focus);\n}\n\n:host(.light) {\n /* global */\n --metatable-background-focus: lightyellow;\n\n /* leafs */\n --metatable-leaf-number-color: purple;\n --metatable-leaf-boolean-color: slateblue;\n --metatable-leaf-date-color: darkolivegreen;\n --metatable-leaf-nil-color: inherit;\n\n /* warning */\n --metatable-warning-background: lightgoldenrodyellow;\n --metatable-warning-foreground: brown;\n --metatable-warning-border: 2px solid palegoldenrod;\n}\n\n:host(.dark) {\n --metatable-background-focus: black;\n --metatable-text-focus: orange;\n\n /* leafs */\n --metatable-leaf-number-color: lightpink;\n --metatable-leaf-boolean-color: lightskyblue;\n --metatable-leaf-date-color: darkseagreen;\n --metatable-leaf-nil-color: inherit;\n\n /* tags */\n --metatable-tag-background: black;\n\n /* aliases */\n --metatable-alias-background: black;\n\n /* links */\n --metatable-warning-background: transparent;\n --metatable-warning-color: gold;\n --metatable-warning-border: 2px solid palegoldenrod;\n}\n\n\n:host(.light.obsidian-metatable-sidebar) {\n --metatable-tag-background: var(--metatable-background-secondary-alt);\n}\n\n\n* {\n box-sizing: border-box;\n}\n\n.root {\n background: var(--metatable-root-background);\n color: var(--metatable-root-color);\n font-family: var(--metatable-font-family);\n font-size: var(--metatable-font-size);\n\n user-select: text;\n}\n\n.metatable-sidebar {\n font-size: calc(var(--metatable-font-size) - 1px);\n}\n\n.metatable-sidebar.root {\n margin: 10px;\n}\n\ndetails {\n margin-bottom: 20px;\n}\n\nsummary+* {\n margin-top: 10px;\n}\n\n.metatable-sidebar>.summary {\n font-size: var(--font-text-size, 1.2rem);\n margin-top: 0;\n}\n\n\n.set {\n background: var(--metatable-set-background);\n color: var(--metatable-set-color);\n\n display: grid;\n grid-gap: 2px;\n}\n\n.member {\n background: var(--metatable-member-background);\n color: var(--metatable-member-color);\n\n grid-gap: 2px;\n display: grid;\n grid-template-areas: "key value";\n grid-template-columns: minmax(0, 2fr) minmax(0, 4fr);\n}\n\n.member:nth-child(even) {\n background: var(--metatable-background-alt);\n}\n\n.tight .member {\n display: block;\n}\n\n.member .key {\n background: var(--metatable-key-background);\n color: var(--metatable-key-color);\n\n display: block;\n font-weight: 600;\n overflow: hidden;\n padding: 2px 4px;\n text-align: left;\n text-overflow: ellipsis;\n}\n\n.key>span {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.member .key.toggle {\n display: grid;\n grid-area: key;\n grid-gap: 4px;\n grid-template-columns: 10px auto;\n}\n\n.member .key[role=button] {\n cursor: pointer;\n}\n\n.member .key:focus,\n.member .key:focus-visible {\n background: var(--metatable-key-background-focus);\n color: var(--metatable-key-color-focus);\n\n outline: none;\n}\n\n.key[aria-expanded]::before {\n font-size: 8px;\n padding-top: 5px;\n}\n\n.key[aria-expanded=true]::before {\n padding-top: 5px;\n}\n\n.metatable-sidebar .key[aria-expanded]::before {\n padding-top: 4px;\n}\n\n.metatable-sidebar .key[aria-expanded=true]::before {\n padding-top: 4px;\n}\n\n.key[aria-expanded=true]::before {\n content: var(--metatable-expanded-symbol);\n}\n\n.key[aria-expanded=false]::before {\n content: var(--metatable-collapsed-symbol);\n}\n\n.key[aria-expanded=false]+.value> :first-child {\n display: none;\n}\n\n.key[aria-expanded=false]+.value>.marker::after {\n content: var(--metatable-mark-symbol);\n\n display: block;\n padding-top: 2px;\n}\n\n.member .value {\n background: var(--metatable-value-background);\n color: var(--metatable-value-color);\n\n display: block;\n grid-area: value;\n margin: 0;\n overflow: auto;\n padding: 2px 4px;\n}\n\n.tight .member .value {\n margin-left: 16px;\n}\n\n.member .toggle+.value {\n padding: 0;\n}\n\n.list {\n margin: 0;\n padding: 0 0 0 16px;\n}\n\n.list-item {\n margin-left: 1rem;\n}\n\n/* warning */\n.parse-error {\n background: var(--metatable-warning-background);\n color: var(--metatable-warning-color);\n border: var(--metatable-warning-border);\n\n margin: 0;\n padding: 8px;\n}\n\n.parse-error p {\n margin-top: 0;\n}\n\n\n/* Leafs */\n.number {\n color: var(--metatable-leaf-number-color);\n}\n\n.boolean {\n color: var(--metatable-leaf-boolean-color);\n}\n\n.isodate {\n color: var(--metatable-leaf-date-color);\n}\n\n.nil {\n color: var(--metatable-leaf-nil-color);\n}\n\n\n/* links */\n.external-link {\n background: var(--metatable-external-link-background);\n color: var(--metatable-external-link-color);\n\n display: inline-block;\n white-space: nowrap;\n}\n\n.external-link::after {\n content: var(--metatable-external-link-icon);\n\n display: inline-block;\n margin-left: 0.3rem;\n vertical-align: sub;\n}\n\n.external-link:hover {\n background: var(--metatable-external-link-background-hover);\n color: var(--metatable-external-link-color-hover);\n}\n\n.external-link:focus,\n.external-link:focus-visible {\n background: var(--metatable-internal-link-background-focus);\n color: var(--metatable-internal-link-color-focus);\n}\n\n.internal-link {\n background: var(--metatable-internal-link-background);\n color: var(--metatable-internal-link-color);\n\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 450px;\n white-space: nowrap;\n}\n\n.internal-link:hover {\n background: var(--metatable-internal-link-background-hover);\n color: var(--metatable-internal-link-color-hover);\n}\n\n.internal-link:focus,\n.internal-link:focus-visible {\n background: var(--metatable-internal-link-background-focus);\n color: var(--metatable-internal-link-color-focus);\n}\n\n\n/* tags */\n.value .list-tags {\n padding: 2px 0 0 0;\n}\n\n.list-tags li {\n display: inline-block;\n margin: 0 4px 4px 0;\n}\n\n.tag {\n background: var(--metatable-tag-background);\n color: var(--metatable-tag-color);\n border: var(--metatable-tag-border);\n\n display: block;\n border-radius: 16px;\n margin: 0;\n padding: 0 10px;\n text-decoration: none;\n}\n\n.tag::before {\n content: var(--metatable-tag-symbol);\n}\n\n.tag:hover {\n filter: brightness(0.8);\n}\n\n.tag:focus,\n.external-link:focus,\n.internal-link:focus {\n outline: none;\n}\n\n.tag:focus-visible,\n.external-link:focus-visible,\n.internal-link:focus-visible {\n background: var(--metatable-tag-background-focus);\n color: var(--metatable-tag-color-focus);\n\n outline: none;\n}\n\n/* aliases */\n.value .list-aliases {\n padding: 0;\n}\n\n.list-aliases li {\n display: inline-block;\n margin: 0 4px 4px 0;\n}\n\n.list-aliases li span {\n text-decoration: none;\n}\n\n.list-aliases li::before {\n content: var(--metatable-alias-symbol);\n color: var(--metatable-alias-color);\n}\n\n.pane-empty {\n color: var(--metadata-text-primary);\n font-size: 16px;\n margin: 6px;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n'; // src/components/Sidebar.tsx var _tmpl$13 = /* @__PURE__ */ template(`<style>`); var _tmpl$24 = /* @__PURE__ */ template(`<h1 part="summary">Metadata for \u201C<!>\u201D`); var _tmpl$34 = /* @__PURE__ */ template(`<section part="root">`); var _tmpl$43 = /* @__PURE__ */ template(`<p class="pane-empty">No markdown files active.`); var _tmpl$53 = /* @__PURE__ */ template(`<p>(empty)`); function Sidebar() { const { workspace, settings, isNaked } = useMixture(); let root; let listeners = []; const [state, setState] = createState(settings); const [isTight, setIsTight] = createSignal(false); const rootClasses = ["metatable-sidebar", "root"]; const rootClass = () => { const classes = isTight() ? ["tight", ...rootClasses] : rootClasses; return classes.join(" "); }; const fetchData = () => { const view = workspace.getActiveViewOfType(import_obsidian4.MarkdownView); if (view instanceof import_obsidian4.MarkdownView) { const name = view.getDisplayText(); const content = view.getViewData(); setState({ name, content }); } else { const leaves = workspace.getLeavesOfType("markdown"); if (leaves.length == 0) { setState(null); } } }; onMount(() => { fetchData(); listeners = [workspace.on("active-leaf-change", () => fetchData()), workspace.on("editor-change", (0, import_obsidian4.debounce)(() => fetchData(), 180, true)), workspace.on("resize", () => { setIsTight(root.clientWidth < 260); })]; }); onCleanup(() => { listeners.forEach((listener) => workspace.offref(listener)); }); return [createComponent(Show, { when: !isNaked, get children() { const _el$ = _tmpl$13(); insert(_el$, metatable_default); return _el$; } }), (() => { const _el$2 = _tmpl$34(); const _ref$ = root; typeof _ref$ === "function" ? use(_ref$, _el$2) : root = _el$2; insert(_el$2, createComponent(Show, { get when() { return state().name !== void 0; }, get fallback() { return _tmpl$43(); }, get children() { return [(() => { const _el$3 = _tmpl$24(), _el$4 = _el$3.firstChild, _el$6 = _el$4.nextSibling, _el$5 = _el$6.nextSibling; insert(_el$3, () => state().name, _el$6); return _el$3; })(), createComponent(Switch, { get fallback() { return _tmpl$53(); }, get children() { return [createComponent(Match, { get when() { return state().error !== void 0; }, get children() { return createComponent(ParseError, { message: () => state().error.message }); } }), createComponent(Match, { get when() { return state().metadata !== void 0; }, get children() { return createComponent(Metatable, { get data() { return state().metadata; } }); } })]; } })]; } })); createRenderEffect(() => className(_el$2, rootClass())); return _el$2; })()]; } // src/sidebarView.tsx var SidebarViewType = "metatable-sidebar-view"; var SidebarView = class extends import_obsidian5.ItemView { constructor(leaf, settings, iconName) { super(leaf); this.settings = settings; this.iconName = iconName; } getViewType() { return SidebarViewType; } getDisplayText() { return "Metatable Sidebar"; } getIcon() { return this.iconName; } async onOpen() { const root = this.containerEl.children[1]; const wrapper = root.createEl("div"); let dock; wrapper.classList.add("obsidian-metatable-sidebar"); wrapper.classList.add(this.settings.theme); const themeObserver = observeTheme(wrapper); if (this.settings.naked) { dock = wrapper; } else { wrapper.attachShadow({ mode: "open" }); dock = wrapper.shadowRoot; } const _self$ = this; this.dispose = render(() => createComponent(MixtureProvider, { get app() { return _self$.app; }, get settings() { return _self$.settings; }, themeObserver, get children() { return createComponent(Sidebar, {}); } }), dock); } async onClose() { this.dispose(); } }; // src/components/Inline.tsx var _tmpl$14 = /* @__PURE__ */ template(`<style>`); var _tmpl$25 = /* @__PURE__ */ template(`<details class="metatable root" part="root"><summary part="summary">Metatable`); function Inline(props) { let { settings, isOpen: isOpen2, cleanData: cleanData2 } = useMixture(); let metadata; try { metadata = cleanData2(parseFrontmatter(props.data)); } catch (err) { metadata = err; } return [createComponent(Show, { get when() { return !settings.naked; }, get children() { const _el$ = _tmpl$14(); insert(_el$, metatable_default); return _el$; } }), createComponent(Switch, { get children() { return [createComponent(Match, { when: metadata instanceof Error, get children() { return createComponent(ParseError, { message: () => metadata.message }); } }), createComponent(Match, { when: metadata !== void 0, get children() { const _el$2 = _tmpl$25(), _el$3 = _el$2.firstChild; insert(_el$2, createComponent(Metatable, { data: metadata }), null); createRenderEffect(() => _el$2.open = isOpen2(0)); return _el$2; } })]; } })]; } // src/inliner.tsx function createInline(root, data, context) { let dock; let { app, settings } = context; const wrapper = root.createEl("div"); wrapper.classList.add("obsidian-metatable"); wrapper.classList.add(settings.theme); const observer = observeTheme(wrapper); if (settings.naked) { dock = wrapper; } else { wrapper.attachShadow({ mode: "open" }); dock = wrapper.shadowRoot; } const dispose2 = render(() => createComponent(MixtureProvider, { app, settings, themeObserver: observer, get children() { return createComponent(Inline, { data }); } }), dock); return dispose2; } // src/plugin.ts var MetatablePlugin = class extends import_obsidian6.Plugin { constructor() { super(...arguments); __publicField(this, "settings"); __publicField(this, "sidebarView"); __publicField(this, "toggleSidebar", async () => { const { workspace } = this.app; const existing = workspace.getLeavesOfType(SidebarViewType); if (existing.length > 0) { workspace.detachLeavesOfType(SidebarViewType); } else { await workspace.getRightLeaf(false).setViewState({ type: SidebarViewType, active: true }); workspace.revealLeaf(workspace.getLeavesOfType(SidebarViewType)[0]); } }); } async onload() { const iconName = "bracket-glyph"; await this.loadSettings(); this.settings.theme = queryTheme(); this.registerMarkdownPostProcessor(frontmatterProcessor.bind(this)); this.addSettingTab(new MetatableSettingTab(this.app, this)); this.registerView( SidebarViewType, (leaf) => this.sidebarView = new SidebarView(leaf, this.settings, iconName) ); this.addRibbonIcon(iconName, "Metatable", () => this.toggleSidebar()); this.addCommand({ id: "toggle-metatable-sidebar", name: "Toggle Metatable sidebar", callback: () => this.toggleSidebar() }); } onunload() { this.app.workspace.detachLeavesOfType(SidebarViewType); } async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } async saveSettings() { await this.saveData(this.settings); } }; async function frontmatterProcessor(el) { var _a; const plugin = this; const frontmatter = el.querySelector(".frontmatter"); if (frontmatter !== null) { const embed = el.querySelector(".internal-embed"); if (embed !== null) { return; } const target = el.querySelector(".frontmatter-container"); target.style.display = "none"; const raw = (_a = frontmatter.querySelector("code")) == null ? void 0 : _a.textContent; const context = { app: plugin.app, settings: plugin.settings }; const _dispose = createInline(target.parentNode, raw, context); } } // src/main.ts var main_default = MetatablePlugin;