From a165e287ea2dc67883c7f18c214cc0750d02de10 Mon Sep 17 00:00:00 2001 From: saberzero1 Date: Mon, 27 Apr 2026 21:38:20 +0200 Subject: [PATCH] build: bundle dependencies and ship pre-built dist --- dist/components/index.js | 91 ++++++++++++++++++++++-------------- dist/components/index.js.map | 2 +- dist/index.js | 91 ++++++++++++++++++++++-------------- dist/index.js.map | 2 +- 4 files changed, 114 insertions(+), 72 deletions(-) diff --git a/dist/components/index.js b/dist/components/index.js index b965b85..9f1e5ff 100644 --- a/dist/components/index.js +++ b/dist/components/index.js @@ -1,9 +1,6 @@ -import { jsxs, jsx } from 'preact/jsx-runtime'; -import 'preact'; - // node_modules/@quartz-community/utils/dist/date.js -function formatDate(d, locale = "en-US") { - return d.toLocaleDateString(locale, { +function formatDate(d2, locale = "en-US") { + return d2.toLocaleDateString(locale, { year: "numeric", month: "short", day: "2-digit" @@ -20,9 +17,9 @@ function getDate(data) { return dates?.[defaultDateType]; } function byDateAndAlphabetical() { - return (f1, f2) => { + return (f1, f22) => { const f1Date = getDate(f1); - const f2Date = getDate(f2); + const f2Date = getDate(f22); if (f1Date && f2Date) { return f2Date.getTime() - f1Date.getTime(); } else if (f1Date && !f2Date) { @@ -31,14 +28,14 @@ function byDateAndAlphabetical() { return 1; } const f1Title = (f1.frontmatter?.title ?? "").toLowerCase(); - const f2Title = (f2.frontmatter?.title ?? "").toLowerCase(); + const f2Title = (f22.frontmatter?.title ?? "").toLowerCase(); return f1Title.localeCompare(f2Title); }; } // node_modules/@quartz-community/utils/dist/path.js -function endsWith(s, suffix) { - return s === suffix || s.endsWith("/" + suffix); +function endsWith(s2, suffix) { + return s2 === suffix || s2.endsWith("/" + suffix); } function isFolderPath(fplike) { return fplike.endsWith("/") || endsWith(fplike, "index") || endsWith(fplike, "index.md") || endsWith(fplike, "index.html"); @@ -393,6 +390,28 @@ var locales = { function i18n(locale) { return locales[locale] || en_US_default; } +var l; +l = { __e: function(n2, l2, u3, t2) { + for (var i2, r2, o2; l2 = l2.__; ) if ((i2 = l2.__c) && !i2.__) try { + if ((r2 = i2.constructor) && null != r2.getDerivedStateFromError && (i2.setState(r2.getDerivedStateFromError(n2)), o2 = i2.__d), null != i2.componentDidCatch && (i2.componentDidCatch(n2, t2 || {}), o2 = i2.__d), o2) return i2.__E = i2; + } catch (l3) { + n2 = l3; + } + throw n2; +} }, "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, Math.random().toString(8); + +// node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs +var f2 = 0; +function u2(e2, t2, n2, o2, i2, u3) { + t2 || (t2 = {}); + var a2, c2, p2 = t2; + if ("ref" in p2) for (c2 in p2 = {}, t2) "ref" == c2 ? a2 = t2[c2] : p2[c2] = t2[c2]; + var l2 = { type: e2, props: p2, key: n2, ref: a2, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --f2, __i: -1, __u: 0, __source: i2, __self: u3 }; + if ("function" == typeof e2 && (a2 = e2.defaultProps)) for (c2 in a2) void 0 === p2[c2] && (p2[c2] = a2[c2]); + return l.vnode && l.vnode(l2), l2; +} + +// node_modules/@quartz-community/utils/dist/index.js function simplifySlug(fp) { const res = stripSlashes(trimSuffix(fp, "index"), true); return res.length === 0 ? "/" : res; @@ -412,23 +431,23 @@ function joinSegments(...args) { } return joined; } -function endsWith2(s, suffix) { - return s === suffix || s.endsWith("/" + suffix); +function endsWith2(s2, suffix) { + return s2 === suffix || s2.endsWith("/" + suffix); } -function trimSuffix(s, suffix) { - if (endsWith2(s, suffix)) { - s = s.slice(0, -suffix.length); +function trimSuffix(s2, suffix) { + if (endsWith2(s2, suffix)) { + s2 = s2.slice(0, -suffix.length); } - return s; + return s2; } -function stripSlashes(s, onlyStripPrefix) { - if (s.startsWith("/")) { - s = s.substring(1); +function stripSlashes(s2, onlyStripPrefix) { + if (s2.startsWith("/")) { + s2 = s2.substring(1); } - if (!onlyStripPrefix && s.endsWith("/")) { - s = s.slice(0, -1); + if (!onlyStripPrefix && s2.endsWith("/")) { + s2 = s2.slice(0, -1); } - return s; + return s2; } // src/util/path.ts @@ -441,7 +460,7 @@ function resolveRelative(current, target) { return joinSegments(rootPath, simplified); } function pathToRoot(slug2) { - let rootPath = slug2.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); + let rootPath = slug2.split("/").filter((x2) => x2 !== "").slice(0, -1).map((_2) => "..").join("/"); if (rootPath.length === 0) { rootPath = "."; } @@ -450,12 +469,14 @@ function pathToRoot(slug2) { // src/components/styles/recentNotes.scss var recentNotes_default = ".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}"; + +// src/components/RecentNotes.tsx var withDefaultDateType = (data, defaultDateType) => ({ ...data, defaultDateType }); function filterListedPages(pages) { - return pages.filter((p) => p.unlisted !== true); + return pages.filter((p2) => p2.unlisted !== true); } function isTagPageSlug(slug2) { if (!slug2) return false; @@ -467,9 +488,9 @@ function isFolderPageSlug(slug2) { } var byDateAndAlphabeticalWithConfig = (cfg) => { const sortFn = byDateAndAlphabetical(); - return (f1, f2) => sortFn( + return (f1, f22) => sortFn( withDefaultDateType(f1, cfg.defaultDateType), - withDefaultDateType(f2, cfg.defaultDateType) + withDefaultDateType(f22, cfg.defaultDateType) ); }; var defaultOptions = (cfg) => ({ @@ -490,18 +511,18 @@ var RecentNotes_default = ((userOpts) => { }) => { const globalCfg = cfg; const opts = { ...defaultOptions(globalCfg), ...userOpts }; - const pages = filterListedPages(allFiles).filter((p) => !opts.hideTagPages || !isTagPageSlug(p.slug)).filter((p) => !opts.hideFolderPages || !isFolderPageSlug(p.slug)).filter(opts.filter).sort(opts.sort); + const pages = filterListedPages(allFiles).filter((p2) => !opts.hideTagPages || !isTagPageSlug(p2.slug)).filter((p2) => !opts.hideFolderPages || !isFolderPageSlug(p2.slug)).filter(opts.filter).sort(opts.sort); const remaining = Math.max(0, pages.length - opts.limit); const slug2 = fileData.slug; const locale = cfg.locale ?? "en-US"; - return /* @__PURE__ */ jsxs("div", { class: classNames(displayClass, "recent-notes"), children: [ - /* @__PURE__ */ jsx("h3", { children: opts.title ?? i18n(locale).components.recentNotes.title }), - /* @__PURE__ */ jsx("ul", { class: "recent-ul", children: pages.slice(0, opts.limit).map((page) => { + return /* @__PURE__ */ u2("div", { class: classNames(displayClass, "recent-notes"), children: [ + /* @__PURE__ */ u2("h3", { children: opts.title ?? i18n(locale).components.recentNotes.title }), + /* @__PURE__ */ u2("ul", { class: "recent-ul", children: pages.slice(0, opts.limit).map((page) => { const title = page.frontmatter?.title ?? "Untitled"; const tags = page.frontmatter?.tags ?? []; - return /* @__PURE__ */ jsx("li", { class: "recent-li", children: /* @__PURE__ */ jsxs("div", { class: "section", children: [ - /* @__PURE__ */ jsx("div", { class: "desc", children: /* @__PURE__ */ jsx("h3", { children: /* @__PURE__ */ jsx("a", { href: resolveRelative(slug2, page.slug), class: "internal", children: title }) }) }), - page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && /* @__PURE__ */ jsx("p", { class: "meta", children: /* @__PURE__ */ jsx( + return /* @__PURE__ */ u2("li", { class: "recent-li", children: /* @__PURE__ */ u2("div", { class: "section", children: [ + /* @__PURE__ */ u2("div", { class: "desc", children: /* @__PURE__ */ u2("h3", { children: /* @__PURE__ */ u2("a", { href: resolveRelative(slug2, page.slug), class: "internal", children: title }) }) }), + page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && /* @__PURE__ */ u2("p", { class: "meta", children: /* @__PURE__ */ u2( "time", { datetime: getDate( @@ -513,10 +534,10 @@ var RecentNotes_default = ((userOpts) => { ) } ) }), - opts.showTags && /* @__PURE__ */ jsx("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { class: "internal tag-link", href: resolveRelative(slug2, `tags/${tag}`), children: tag }) })) }) + opts.showTags && /* @__PURE__ */ u2("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ u2("li", { children: /* @__PURE__ */ u2("a", { class: "internal tag-link", href: resolveRelative(slug2, `tags/${tag}`), children: tag }) })) }) ] }) }); }) }), - opts.linkToMore && remaining > 0 && /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("a", { href: resolveRelative(slug2, opts.linkToMore), children: i18n(locale).components.recentNotes.seeRemainingMore({ remaining }) }) }) + opts.linkToMore && remaining > 0 && /* @__PURE__ */ u2("p", { children: /* @__PURE__ */ u2("a", { href: resolveRelative(slug2, opts.linkToMore), children: i18n(locale).components.recentNotes.seeRemainingMore({ remaining }) }) }) ] }); }; RecentNotes.css = recentNotes_default; diff --git a/dist/components/index.js.map b/dist/components/index.js.map index 2bea982..b30617b 100644 --- a/dist/components/index.js.map +++ b/dist/components/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/@quartz-community/utils/src/date.ts","../../node_modules/@quartz-community/utils/src/sort.ts","../../node_modules/@quartz-community/utils/src/path.ts","../../node_modules/@quartz-community/utils/src/lang.ts","../../src/i18n/locales/en-US.ts","../../src/i18n/locales/ar-SA.ts","../../src/i18n/locales/ca-ES.ts","../../src/i18n/locales/cs-CZ.ts","../../src/i18n/locales/de-DE.ts","../../src/i18n/locales/en-GB.ts","../../src/i18n/locales/es-ES.ts","../../src/i18n/locales/fa-IR.ts","../../src/i18n/locales/fi-FI.ts","../../src/i18n/locales/fr-FR.ts","../../src/i18n/locales/he-IL.ts","../../src/i18n/locales/hu-HU.ts","../../src/i18n/locales/id-ID.ts","../../src/i18n/locales/it-IT.ts","../../src/i18n/locales/ja-JP.ts","../../src/i18n/locales/kk-KZ.ts","../../src/i18n/locales/ko-KR.ts","../../src/i18n/locales/lt-LT.ts","../../src/i18n/locales/nb-NO.ts","../../src/i18n/locales/nl-NL.ts","../../src/i18n/locales/pl-PL.ts","../../src/i18n/locales/pt-BR.ts","../../src/i18n/locales/ro-RO.ts","../../src/i18n/locales/ru-RU.ts","../../src/i18n/locales/th-TH.ts","../../src/i18n/locales/tr-TR.ts","../../src/i18n/locales/uk-UA.ts","../../src/i18n/locales/vi-VN.ts","../../src/i18n/locales/zh-CN.ts","../../src/i18n/locales/zh-TW.ts","../../src/i18n/index.ts","../../src/util/path.ts","../../src/components/styles/recentNotes.scss","../../src/components/RecentNotes.tsx"],"names":["endsWith","simplifySlug","slug","jsxs","jsx"],"mappings":";;;;AAAO,SAAS,UAAA,CAAW,CAAA,EAAS,MAAA,GAAiB,OAAA,EAAiB;AACpE,EAAA,OAAO,CAAA,CAAE,mBAAmB,MAAA,EAAQ;IAClC,IAAA,EAAM,SAAA;IACN,KAAA,EAAO,OAAA;IACP,GAAA,EAAK;GACN,CAAA;AACH;;;ACJO,SAAS,QAAQ,IAAA,EAA0C;AAChE,EAAA,MAAM,kBAAkB,IAAA,CAAK,eAAA;AAC7B,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO,MAAA;AACT,EAAA;AACA,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,OAAO,QAAQ,eAAe,CAAA;AAChC;AAEO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAC,IAAI,EAAA,KAAO;AACjB,IAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,IAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,MAAA,OAAO,MAAA,CAAO,OAAA,EAAA,GAAY,MAAA,CAAO,OAAA,EAAA;IACnC,CAAA,MAAA,IAAW,MAAA,IAAU,CAAC,MAAA,EAAQ;AAC5B,MAAA,OAAO,EAAA;IACT,CAAA,MAAA,IAAW,CAAC,UAAU,MAAA,EAAQ;AAC5B,MAAA,OAAO,CAAA;AACT,IAAA;AAEA,IAAA,MAAM,OAAA,GAAA,CACF,EAAA,CAAG,WAAA,EAAyC,KAAA,IAAoB,IAClE,WAAA,EAAA;AACF,IAAA,MAAM,OAAA,GAAA,CACF,EAAA,CAAG,WAAA,EAAyC,KAAA,IAAoB,IAClE,WAAA,EAAA;AACF,IAAA,OAAO,OAAA,CAAQ,cAAc,OAAO,CAAA;AACtC,EAAA,CAAA;AACF;;;AC+GO,SAAS,QAAA,CAAA,GAAW,MAAA,EAAW;AACpC,EAAA,OAAI,CAAA,KAAS,MAAA,IAAS,CAAA,CAAG,QAAA,CAAA,MAAA,MAAA,CAAA;AACvB;AA8BG,SAAS,aAAA,MAAA,EAAA;AACd,EAAA,OACA,MAAA,CAAM,QAAA,CAAqB,GAAA,CAAA,IAC3B,SAAS,MAAA,EAAO,OAAI,CAAA,IAClB,QAAA,CAAQ,MAAA,EAAK,UAAS,CAAA,IACxB,QAAA,CAAA,QAAA,YAAA,CAAA;AAEF;;;ACjLO,SAAS,cAAc,OAAA,EAAwD;AACpF,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;;;ACNA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,cAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,OAAO,SAAS,CAAA,YAAA;AAAA;AAC9E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,2EAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,4BAAQ,SAAS,CAAA,gCAAA;AAAA;AAC/E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,eAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,QAAQ,SAAS,CAAA,cAAA;AAAA;AAC/E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,qCAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,UAAU,SAAS,CAAA,uBAAA;AAAA;AACjF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,4BAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,GAAG,SAAS,CAAA,uBAAA;AAAA;AAC1E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,cAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,OAAO,SAAS,CAAA,YAAA;AAAA;AAC9E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,iBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,OAAO,SAAS,CAAA,cAAA;AAAA;AAC9E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,6FAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,GAAG,SAAS,CAAA,2EAAA;AAAA;AAC1E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,+BAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,eAAS,SAAS,CAAA,mBAAA;AAAA;AAChF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,mBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,QAAQ,SAAS,CAAA,eAAA;AAAA;AAC/E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,2EAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,mCAAU,SAAS,CAAA,4CAAA;AAAA;AACjF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,wBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAC7B,GAAG,SAAS,CAAA,kCAAA;AAAA;AAChB;AAEJ,CAAA;;;ACRA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,iBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,SAAS,SAAS,CAAA,YAAA;AAAA;AAChF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,cAAA;AAAA,MACP,gBAAA,EAAkB,CAAC,EAAE,SAAA,OACnB,SAAA,KAAc,CAAA,GAAI,qBAAA,GAAmB,CAAA,WAAA,EAAc,SAAS,CAAA,OAAA;AAAA;AAChE;AAEJ,CAAA;;;ACRA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,gCAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,qBAAM,SAAS,CAAA,aAAA;AAAA;AAC7E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,iFAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAC7B,4BAAQ,SAAS,CAAA,iFAAA;AAAA;AACrB;AAEJ,CAAA;;;ACRA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,iCAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,GAAG,SAAS,CAAA,gCAAA;AAAA;AAC1E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,4BAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,iCAAkB,SAAS,CAAA,OAAA;AAAA;AACzF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,gBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,MAAM,SAAS,CAAA,WAAA;AAAA;AAC7E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,kBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,OAAO,SAAS,CAAA,YAAA;AAAA;AAC9E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,mBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAC7B,UAAU,SAAS,CAAA,kBAAA;AAAA;AACvB;AAEJ,CAAA;;;ACRA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,gBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,aAAa,SAAS,CAAA,OAAA;AAAA;AACpF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,qBAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,qBAAa,SAAS,CAAA,OAAA;AAAA;AACpF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,6FAAA;AAAA,MACP,gBAAA,EAAkB,CAAC,EAAE,SAAA,EAAU,KAC7B,CAAA,iGAAA,EAAoB,OAAA,CAAQ,SAAA,EAAW,0BAAA,EAAQ,0BAAA,EAAQ,0BAAM,CAAC,IAAI,SAAS,CAAA,OAAA;AAAA;AAC/E;AAEJ,CAAA;AAEA,SAAS,OAAA,CAAQ,MAAA,EAAgB,KAAA,EAAe,KAAA,EAAe,KAAA,EAAuB;AACpF,EAAA,MAAM,eAAe,MAAA,GAAS,GAAA;AAC9B,EAAA,MAAM,cAAc,YAAA,GAAe,EAAA;AAEnC,EAAA,IAAI,YAAA,IAAgB,EAAA,IAAM,YAAA,IAAgB,EAAA,EAAI,OAAO,KAAA;AACrD,EAAA,IAAI,WAAA,GAAc,CAAA,IAAK,WAAA,GAAc,CAAA,EAAG,OAAO,KAAA;AAC/C,EAAA,IAAI,WAAA,IAAe,GAAG,OAAO,KAAA;AAC7B,EAAA,OAAO,KAAA;AACT;;;AClBA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,0EAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAC7B,gEAAc,SAAS,CAAA,4CAAA;AAAA;AAC3B;AAEJ,CAAA;;;ACRA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,YAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,GAAG,SAAS,CAAA,wBAAA;AAAA;AAC1E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,uFAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,mFAAkB,SAAS,CAAA,OAAA;AAAA;AACzF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,iCAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,eAAY,SAAS,CAAA,kBAAA;AAAA;AACnF;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,gCAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,2BAAO,SAAS,CAAA,yBAAA;AAAA;AAC9E;AAEJ,CAAA;;;ACPA,IAAO,aAAA,GAAQ;AAAA,EACb,UAAA,EAAY;AAAA,IACV,WAAA,EAAa;AAAA,MACX,KAAA,EAAO,gCAAA;AAAA,MACP,kBAAkB,CAAC,EAAE,SAAA,EAAU,KAA6B,4BAAQ,SAAS,CAAA,0BAAA;AAAA;AAC/E;AAEJ,CAAA;;;ACwBA,IAAM,OAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,KAAK,MAAA,EAAgB;AACnC,EAAA,OAAO,OAAA,CAAQ,MAAM,CAAA,IAAK,aAAA;AAC5B;AhCjBO,SAAS,aAAa,EAAA,EAAmC;AAC9D,EAAA,MAAM,MAAM,YAAA,CAAa,UAAA,CAAW,EAAA,EAAI,OAAO,GAAG,IAAI,CAAA;AACtD,EAAA,OAAQ,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,GAAA;AACnC;AA0CO,SAAS,gBAAgB,IAAA,EAAwB;AACtD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAA;AACT,EAAA;AAEA,EAAA,IAAI,SAAS,IAAA,CAKb,MAAA,CAAM,CAAA,OAAA,KAAc,OAAA,KAAA,MAAA,OAAA,KAAA,GAAA,CAAA,CACpB,GAAA,CAAM,CAAA,OAAA,KAAY,YAAA,CAAe,OAAA,CAAA,CAAA,CAEjC,KAAI,GAAO,CAAA;AACT,EAAA,MAAA,KAAA,GAAS,KAAM,CAAA,CAAA;AACjB,EAAA,MAAA,IAAA,GAAA,IAAA,CAAA,IAAA,CAAA,MAAA,GAAA,CAAA,CAAA;AAEA,EAAA,IAAI,KAAA,EAAM,UAAA,CAAY,GAAG,CAAA,EAAA;AACvB,IAAA,MAAA,GAAS,GAAA,GAAA,MAAA;AACX,EAAA;AAEA,EAAA,IAAA,IAAA,EAAO,QAAA,CAAA,GAAA,CAAA,EAAA;AACT,IAAA,MAAA,GAAA,MAAA,GAAA,GAAA;AAEO,EAAA;AACL,EAAA,OAAO,MAAA;AACP;AAsBK,SAASA,SAAAA,CAAA,GAAW,MAAA,EAAW;AACpC,EAAA,OAAI,CAAA,KAAS,MAAA,IAAS,CAAA,CAAG,QAAA,CAAA,MAAA,MAAA,CAAA;AACvB;AAA6B,SAC/B,UAAA,CAAA,GAAA,MAAA,EAAA;AACA,EAAA,IAAAA,SAAAA,CAAO,CAAA,EAAA,MAAA,CAAA,EAAA;AACT,IAAA,CAAA,GAAA,CAAA,CAAA,KAAA,CAAA,CAAA,EAAA,CAAA,OAAA,MAAA,CAAA;AAEO,EAAA;AACL,EAAA,OAAM,CAAA;AACJ;AAAiB,SACnB,YAAA,CAAA,GAAA,eAAA,EAAA;AAEA,EAAA,IAAI,CAAA,CAAC,UAAA,CAAA,GAAA,CAAA,EAAA;AACH,IAAA,CAAA,GAAI,CAAA,CAAE,UAAS,CAAE,CAAA;AACnB,EAAA;AAEA,EAAA,IAAA,CAAA,eAAA,IAAO,CAAA,CAAA,QAAA,CAAA,GAAA,CAAA,EAAA;AACT,IAAA,CAAA,GAAA,CAAA,CAAA,KAAA,CAAA,CAAA,EAAA,EAAA,CAAA;AAEO,EAAA;AACL,EAAA,OAAO,CAAA;AACT;;;AiCjKO,SAASC,cAAa,EAAA,EAAoB;AAC/C,EAAA,OAAO,aAAiB,EAAE,CAAA;AAC5B;AAEO,SAAS,eAAA,CAAgB,SAAiB,MAAA,EAAwB;AACvE,EAAA,MAAM,UAAA,GAAaA,cAAa,MAAM,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,WAAW,OAAO,CAAA;AACnC,EAAA,OAAO,YAAA,CAAa,UAAU,UAAU,CAAA;AAC1C;AAEA,SAAS,WAAWC,KAAAA,EAAsB;AACxC,EAAA,IAAI,QAAA,GAAWA,MACZ,KAAA,CAAM,GAAG,EACT,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,EACtB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAA,CACf,IAAA,CAAK,GAAG,CAAA;AAEX,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,QAAA,GAAW,GAAA;AAAA,EACb;AAEA,EAAA,OAAO,QAAA;AACT;;;ACzBA,IAAA,mBAAA,GAAA,yaAAA;ACmCA,IAAM,mBAAA,GAAsB,CAC1B,IAAA,EACA,eAAA,MACsB;AAAA,EACtB,GAAG,IAAA;AAAA,EACH;AACF,CAAA,CAAA;AAEO,SAAS,kBAAqB,KAAA,EAAiB;AACpD,EAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,KAAO,CAAA,CAA6B,aAAa,IAAI,CAAA;AAC5E;AAGO,SAAS,cAAcA,KAAAA,EAAmC;AAC/D,EAAA,IAAI,CAACA,OAAM,OAAO,KAAA;AAClB,EAAA,OAAOA,UAAS,MAAA,IAAUA,KAAAA,KAAS,YAAA,IAAgBA,KAAAA,CAAK,WAAW,OAAO,CAAA;AAC5E;AAGO,SAAS,iBAAiBA,KAAAA,EAAmC;AAClE,EAAA,IAAI,CAACA,OAAM,OAAO,KAAA;AAClB,EAAA,OAAO,aAAaA,KAAI,CAAA;AAC1B;AAEA,IAAM,+BAAA,GAAkC,CAAC,GAAA,KAA6C;AACpF,EAAA,MAAM,SAAS,qBAAA,EAAsB;AACrC,EAAA,OAAO,CAAC,IAAI,EAAA,KACV,MAAA;AAAA,IACE,mBAAA,CAAoB,EAAA,EAA6B,GAAA,CAAI,eAAe,CAAA;AAAA,IACpE,mBAAA,CAAoB,EAAA,EAA6B,GAAA,CAAI,eAAe;AAAA,GACtE;AACJ,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAC,GAAA,MAA0D;AAAA,EAChF,KAAA,EAAO,CAAA;AAAA,EACP,UAAA,EAAY,KAAA;AAAA,EACZ,QAAA,EAAU,IAAA;AAAA,EACV,YAAA,EAAc,KAAA;AAAA,EACd,eAAA,EAAiB,KAAA;AAAA,EACjB,QAAQ,MAAM,IAAA;AAAA,EACd,IAAA,EAAM,gCAAgC,GAAG;AAC3C,CAAA,CAAA;AAEA,IAAO,mBAAA,IAAS,CAAC,QAAA,KAA2C;AAC1D,EAAA,MAAM,cAA+B,CAAC;AAAA,IACpC,QAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,KAAwD;AACtD,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,MAAM,OAAO,EAAE,GAAG,eAAe,SAAS,CAAA,EAAG,GAAG,QAAA,EAAS;AACzD,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,QAAmC,CAAA,CAChE,OAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,gBAAgB,CAAC,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA,CAC1D,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,eAAA,IAAmB,CAAC,iBAAiB,CAAA,CAAE,IAAI,CAAC,CAAA,CAChE,OAAO,IAAA,CAAK,MAAM,CAAA,CAClB,IAAA,CAAK,KAAK,IAAI,CAAA;AACjB,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,MAAA,GAAS,KAAK,KAAK,CAAA;AACvD,IAAA,MAAMA,QAAO,QAAA,CAAS,IAAA;AACtB,IAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,OAAA;AAC7B,IAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,UAAA,CAAW,YAAA,EAAc,cAAc,CAAA,EACjD,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,QAAI,QAAA,EAAA,IAAA,CAAK,KAAA,IAAS,KAAK,MAAM,CAAA,CAAE,UAAA,CAAW,WAAA,CAAY,KAAA,EAAM,CAAA;AAAA,sBAC7DA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAM,WAAA,EACP,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACxC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,EAAa,KAAA,IAAS,UAAA;AACzC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,EAAa,IAAA,IAAQ,EAAC;AAExC,QAAA,uBACEA,IAAC,IAAA,EAAA,EAAG,KAAA,EAAM,aACR,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,SAAA,EACT,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,SAAI,KAAA,EAAM,MAAA,EACT,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EACC,0BAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,eAAA,CAAgBF,KAAAA,EAAO,KAAK,IAAK,CAAA,EAAG,OAAM,UAAA,EAChD,QAAA,EAAA,KAAA,EACH,GACF,CAAA,EACF,CAAA;AAAA,UACC,IAAA,CAAK,KAAA,IAAS,OAAA,CAAQ,mBAAA,CAAoB,MAAM,SAAA,CAAU,eAAe,CAAC,CAAA,oBACzEE,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAM,QACP,QAAA,kBAAAA,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,QAAA,EAAU,OAAA;AAAA,gBACR,mBAAA,CAAoB,IAAA,EAAM,SAAA,CAAU,eAAe;AAAA,gBAClD,WAAA,EAAY;AAAA,cAEd,QAAA,EAAA,UAAA;AAAA,gBACC,OAAA,CAAQ,mBAAA,CAAoB,IAAA,EAAM,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA,gBAC5D;AAAA;AACF;AAAA,WACF,EACF,CAAA;AAAA,UAED,IAAA,CAAK,QAAA,oBACJA,GAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAM,MAAA,EACP,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACTA,GAAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAM,mBAAA,EAAoB,IAAA,EAAM,eAAA,CAAgBF,KAAAA,EAAO,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CAAA,EACpE,QAAA,EAAA,GAAA,EACH,CAAA,EACF,CACD,CAAA,EACH;AAAA,SAAA,EAEJ,CAAA,EACF,CAAA;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,MACC,IAAA,CAAK,UAAA,IAAc,SAAA,GAAY,CAAA,oBAC9BE,GAAAA,CAAC,GAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,eAAA,CAAgBF,KAAAA,EAAO,KAAK,UAAU,CAAA,EAC5C,QAAA,EAAA,IAAA,CAAK,MAAM,CAAA,CAAE,UAAA,CAAW,WAAA,CAAY,gBAAA,CAAiB,EAAE,SAAA,EAAW,CAAA,EACrE,CAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,WAAA,CAAY,GAAA,GAAM,mBAAA;AAClB,EAAA,OAAO,WAAA;AACT,CAAA","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","import { slug as slugAnchor } from \"github-slugger\";\nimport type { Element as HastElement } from \"hast\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n // Obsidian \"Folder Notes\" convention (insideFolder storage): a file named the\n // same as its parent folder is treated as the folder's landing page. Rewrite\n // `folder/folder` → `folder/index` so every downstream consumer (trie, link\n // resolver, simplifySlug, isFolderPath) sees the canonical Quartz slug shape\n // and Just Works. A top-level single-segment slug is NOT rewritten — that\n // represents Obsidian's `parentFolder` storage mode, which Quartz already\n // routes as a regular top-level page.\n const segments = slug.split(\"/\");\n if (segments.length >= 2 && segments[segments.length - 1] === segments[segments.length - 2]) {\n segments[segments.length - 1] = \"index\";\n slug = segments.join(\"/\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const slugged = slugifyFilePath(fp as FilePath);\n const simpleSlug = simplifySlug(slugged);\n const folderPath = isFolderPath(fplike) || isFolderPath(slugged);\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #, and\n * lowercases the result so that link matching is case-insensitive (matching\n * Obsidian's link-resolution semantics). Operates per segment so directory\n * separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\")\n .toLowerCase(),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/**\n * Re-base the relative `href` and `src` attributes of a HAST element so that\n * links inside content originally resolved relative to `newBase` remain valid\n * when the element is embedded at a page with slug `curBase`.\n *\n * Used for transclusions and cross-slug HAST embedding (Quartz core's\n * `renderPage` transclude expansion, canvas-page's embedded file-nodes, and\n * any plugin that takes `vfile.data.htmlAst` from one page and renders it\n * inside another). Absolute URLs pass through unchanged.\n *\n * The element (and its children) are deep-cloned via `structuredClone`, so\n * the original HAST tree is never mutated.\n */\nexport function normalizeHastElement(\n rawEl: T,\n curBase: FullSlug,\n newBase: FullSlug,\n): T {\n const el = structuredClone(rawEl);\n _rebaseHastElement(el, \"src\", curBase, newBase);\n _rebaseHastElement(el, \"href\", curBase, newBase);\n if (el.children) {\n el.children = el.children.map((child) =>\n child.type === \"element\"\n ? (normalizeHastElement(child as HastElement, curBase, newBase) as typeof child)\n : child,\n );\n }\n return el;\n}\n\n/** @internal */\nfunction _rebaseHastElement(\n el: HastElement,\n attr: \"href\" | \"src\",\n curBase: FullSlug,\n newBase: FullSlug,\n): void {\n const value = el.properties?.[attr];\n if (value === undefined || value === null) return;\n const href = String(value);\n if (!isRelativeURL(href)) return;\n el.properties![attr] = joinSegments(resolveRelative(curBase, newBase), \"..\", href);\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\n },\n },\n};\n","import enUS from \"./locales/en-US\";\nimport arSA from \"./locales/ar-SA\";\nimport caES from \"./locales/ca-ES\";\nimport csCZ from \"./locales/cs-CZ\";\nimport deDE from \"./locales/de-DE\";\nimport enGB from \"./locales/en-GB\";\nimport esES from \"./locales/es-ES\";\nimport faIR from \"./locales/fa-IR\";\nimport fiFI from \"./locales/fi-FI\";\nimport frFR from \"./locales/fr-FR\";\nimport heIL from \"./locales/he-IL\";\nimport huHU from \"./locales/hu-HU\";\nimport idID from \"./locales/id-ID\";\nimport itIT from \"./locales/it-IT\";\nimport jaJP from \"./locales/ja-JP\";\nimport kkKZ from \"./locales/kk-KZ\";\nimport koKR from \"./locales/ko-KR\";\nimport ltLT from \"./locales/lt-LT\";\nimport nbNO from \"./locales/nb-NO\";\nimport nlNL from \"./locales/nl-NL\";\nimport plPL from \"./locales/pl-PL\";\nimport ptBR from \"./locales/pt-BR\";\nimport roRO from \"./locales/ro-RO\";\nimport ruRU from \"./locales/ru-RU\";\nimport thTH from \"./locales/th-TH\";\nimport trTR from \"./locales/tr-TR\";\nimport ukUA from \"./locales/uk-UA\";\nimport viVN from \"./locales/vi-VN\";\nimport zhCN from \"./locales/zh-CN\";\nimport zhTW from \"./locales/zh-TW\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n \"ar-SA\": arSA,\n \"ca-ES\": caES,\n \"cs-CZ\": csCZ,\n \"de-DE\": deDE,\n \"en-GB\": enGB,\n \"es-ES\": esES,\n \"fa-IR\": faIR,\n \"fi-FI\": fiFI,\n \"fr-FR\": frFR,\n \"he-IL\": heIL,\n \"hu-HU\": huHU,\n \"id-ID\": idID,\n \"it-IT\": itIT,\n \"ja-JP\": jaJP,\n \"kk-KZ\": kkKZ,\n \"ko-KR\": koKR,\n \"lt-LT\": ltLT,\n \"nb-NO\": nbNO,\n \"nl-NL\": nlNL,\n \"pl-PL\": plPL,\n \"pt-BR\": ptBR,\n \"ro-RO\": roRO,\n \"ru-RU\": ruRU,\n \"th-TH\": thTH,\n \"tr-TR\": trTR,\n \"uk-UA\": ukUA,\n \"vi-VN\": viVN,\n \"zh-CN\": zhCN,\n \"zh-TW\": zhTW,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\nexport function resolveRelative(current: string, target: string): string {\n const simplified = simplifySlug(target);\n const rootPath = pathToRoot(current);\n return joinSegments(rootPath, simplified);\n}\n\nfunction pathToRoot(slug: string): string {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath;\n}\n",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n GlobalConfiguration,\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { isFolderPath } from \"@quartz-community/utils/path\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype RecentNotesPluginData = QuartzPluginData & Record;\n\ntype ResolvedGlobalConfiguration = GlobalConfiguration & {\n locale: string;\n defaultDateType: ValidDateType;\n};\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n hideTagPages: boolean;\n hideFolderPages: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nexport function filterListedPages(pages: T[]): T[] {\n return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true);\n}\n\n/** True for Quartz tag-index slugs: `tags`, `tags/index`, or `tags/`. */\nexport function isTagPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return slug === \"tags\" || slug === \"tags/index\" || slug.startsWith(\"tags/\");\n}\n\n/** True for Quartz folder-index slugs; delegates to `isFolderPath` from `@quartz-community/utils`. */\nexport function isFolderPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return isFolderPath(slug);\n}\n\nconst byDateAndAlphabeticalWithConfig = (cfg: ResolvedGlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: ResolvedGlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n hideTagPages: false,\n hideFolderPages: false,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as ResolvedGlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\n .filter((p) => !opts.hideTagPages || !isTagPageSlug(p.slug))\n .filter((p) => !opts.hideFolderPages || !isFolderPageSlug(p.slug))\n .filter(opts.filter)\n .sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/@quartz-community/utils/src/date.ts","../../node_modules/@quartz-community/utils/src/sort.ts","../../node_modules/@quartz-community/utils/src/path.ts","../../node_modules/@quartz-community/utils/src/lang.ts","../../src/i18n/locales/en-US.ts","../../src/i18n/locales/ar-SA.ts","../../src/i18n/locales/ca-ES.ts","../../src/i18n/locales/cs-CZ.ts","../../src/i18n/locales/de-DE.ts","../../src/i18n/locales/en-GB.ts","../../src/i18n/locales/es-ES.ts","../../src/i18n/locales/fa-IR.ts","../../src/i18n/locales/fi-FI.ts","../../src/i18n/locales/fr-FR.ts","../../src/i18n/locales/he-IL.ts","../../src/i18n/locales/hu-HU.ts","../../src/i18n/locales/id-ID.ts","../../src/i18n/locales/it-IT.ts","../../src/i18n/locales/ja-JP.ts","../../src/i18n/locales/kk-KZ.ts","../../src/i18n/locales/ko-KR.ts","../../src/i18n/locales/lt-LT.ts","../../src/i18n/locales/nb-NO.ts","../../src/i18n/locales/nl-NL.ts","../../src/i18n/locales/pl-PL.ts","../../src/i18n/locales/pt-BR.ts","../../src/i18n/locales/ro-RO.ts","../../src/i18n/locales/ru-RU.ts","../../src/i18n/locales/th-TH.ts","../../src/i18n/locales/tr-TR.ts","../../src/i18n/locales/uk-UA.ts","../../src/i18n/locales/vi-VN.ts","../../src/i18n/locales/zh-CN.ts","../../src/i18n/locales/zh-TW.ts","../../src/i18n/index.ts","../../node_modules/preact/src/constants.js","../../node_modules/preact/src/options.js","../../node_modules/preact/src/diff/catch-error.js","../../node_modules/preact/src/component.js","../../node_modules/preact/src/diff/props.js","../../node_modules/preact/src/create-context.js","../../node_modules/preact/jsx-runtime/src/index.js","../../src/util/path.ts","../../src/components/styles/recentNotes.scss","../../src/components/RecentNotes.tsx"],"names":["d","f2","s","options","__e","error","vnode","oldVNode","errorInfo","component","ctor","handled","__","__c","constructor","getDerivedStateFromError","setState","__d","componentDidCatch","__E","e","Promise","prototype","then","bind","resolve","setTimeout","Math","random","toString","vnodeId","createVNode","type","props","key","isStaticChildren","__source","__self","ref","i","normalizedProps","__k","__b","__v","__i","__u","defaultProps","endsWith","simplifySlug","slug","x","_","p","u"],"mappings":"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","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","import { slug as slugAnchor } from \"github-slugger\";\nimport type { Element as HastElement } from \"hast\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n // Obsidian \"Folder Notes\" convention (insideFolder storage): a file named the\n // same as its parent folder is treated as the folder's landing page. Rewrite\n // `folder/folder` → `folder/index` so every downstream consumer (trie, link\n // resolver, simplifySlug, isFolderPath) sees the canonical Quartz slug shape\n // and Just Works. A top-level single-segment slug is NOT rewritten — that\n // represents Obsidian's `parentFolder` storage mode, which Quartz already\n // routes as a regular top-level page.\n const segments = slug.split(\"/\");\n if (segments.length >= 2 && segments[segments.length - 1] === segments[segments.length - 2]) {\n segments[segments.length - 1] = \"index\";\n slug = segments.join(\"/\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const slugged = slugifyFilePath(fp as FilePath);\n const simpleSlug = simplifySlug(slugged);\n const folderPath = isFolderPath(fplike) || isFolderPath(slugged);\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #, and\n * lowercases the result so that link matching is case-insensitive (matching\n * Obsidian's link-resolution semantics). Operates per segment so directory\n * separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\")\n .toLowerCase(),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/**\n * Re-base the relative `href` and `src` attributes of a HAST element so that\n * links inside content originally resolved relative to `newBase` remain valid\n * when the element is embedded at a page with slug `curBase`.\n *\n * Used for transclusions and cross-slug HAST embedding (Quartz core's\n * `renderPage` transclude expansion, canvas-page's embedded file-nodes, and\n * any plugin that takes `vfile.data.htmlAst` from one page and renders it\n * inside another). Absolute URLs pass through unchanged.\n *\n * The element (and its children) are deep-cloned via `structuredClone`, so\n * the original HAST tree is never mutated.\n */\nexport function normalizeHastElement(\n rawEl: T,\n curBase: FullSlug,\n newBase: FullSlug,\n): T {\n const el = structuredClone(rawEl);\n _rebaseHastElement(el, \"src\", curBase, newBase);\n _rebaseHastElement(el, \"href\", curBase, newBase);\n if (el.children) {\n el.children = el.children.map((child) =>\n child.type === \"element\"\n ? (normalizeHastElement(child as HastElement, curBase, newBase) as typeof child)\n : child,\n );\n }\n return el;\n}\n\n/** @internal */\nfunction _rebaseHastElement(\n el: HastElement,\n attr: \"href\" | \"src\",\n curBase: FullSlug,\n newBase: FullSlug,\n): void {\n const value = el.properties?.[attr];\n if (value === undefined || value === null) return;\n const href = String(value);\n if (!isRelativeURL(href)) return;\n el.properties![attr] = joinSegments(resolveRelative(curBase, newBase), \"..\", href);\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\n },\n },\n};\n","import enUS from \"./locales/en-US\";\nimport arSA from \"./locales/ar-SA\";\nimport caES from \"./locales/ca-ES\";\nimport csCZ from \"./locales/cs-CZ\";\nimport deDE from \"./locales/de-DE\";\nimport enGB from \"./locales/en-GB\";\nimport esES from \"./locales/es-ES\";\nimport faIR from \"./locales/fa-IR\";\nimport fiFI from \"./locales/fi-FI\";\nimport frFR from \"./locales/fr-FR\";\nimport heIL from \"./locales/he-IL\";\nimport huHU from \"./locales/hu-HU\";\nimport idID from \"./locales/id-ID\";\nimport itIT from \"./locales/it-IT\";\nimport jaJP from \"./locales/ja-JP\";\nimport kkKZ from \"./locales/kk-KZ\";\nimport koKR from \"./locales/ko-KR\";\nimport ltLT from \"./locales/lt-LT\";\nimport nbNO from \"./locales/nb-NO\";\nimport nlNL from \"./locales/nl-NL\";\nimport plPL from \"./locales/pl-PL\";\nimport ptBR from \"./locales/pt-BR\";\nimport roRO from \"./locales/ro-RO\";\nimport ruRU from \"./locales/ru-RU\";\nimport thTH from \"./locales/th-TH\";\nimport trTR from \"./locales/tr-TR\";\nimport ukUA from \"./locales/uk-UA\";\nimport viVN from \"./locales/vi-VN\";\nimport zhCN from \"./locales/zh-CN\";\nimport zhTW from \"./locales/zh-TW\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n \"ar-SA\": arSA,\n \"ca-ES\": caES,\n \"cs-CZ\": csCZ,\n \"de-DE\": deDE,\n \"en-GB\": enGB,\n \"es-ES\": esES,\n \"fa-IR\": faIR,\n \"fi-FI\": fiFI,\n \"fr-FR\": frFR,\n \"he-IL\": heIL,\n \"hu-HU\": huHU,\n \"id-ID\": idID,\n \"it-IT\": itIT,\n \"ja-JP\": jaJP,\n \"kk-KZ\": kkKZ,\n \"ko-KR\": koKR,\n \"lt-LT\": ltLT,\n \"nb-NO\": nbNO,\n \"nl-NL\": nlNL,\n \"pl-PL\": plPL,\n \"pt-BR\": ptBR,\n \"ro-RO\": roRO,\n \"ru-RU\": ruRU,\n \"th-TH\": thTH,\n \"tr-TR\": trTR,\n \"uk-UA\": ukUA,\n \"vi-VN\": viVN,\n \"zh-CN\": zhCN,\n \"zh-TW\": zhTW,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n","import { _catchError } from './diff/catch-error';\n\n/**\n * The `option` object can potentially contain callback functions\n * that are called during various stages of our renderer. This is the\n * foundation on which all our addons like `preact/debug`, `preact/compat`,\n * and `preact/hooks` are based on. See the `Options` type in `internal.d.ts`\n * for a full list of available option hooks (most editors/IDEs allow you to\n * ctrl+click or cmd+click on mac the type definition below).\n * @type {import('./internal').Options}\n */\nconst options = {\n\t_catchError\n};\n\nexport default options;\n","import { NULL } from '../constants';\n\n/**\n * Find the closest error boundary to a thrown error and call it\n * @param {object} error The thrown value\n * @param {import('../internal').VNode} vnode The vnode that threw the error that was caught (except\n * for unmounting when this parameter is the highest parent that was being\n * unmounted)\n * @param {import('../internal').VNode} [oldVNode]\n * @param {import('../internal').ErrorInfo} [errorInfo]\n */\nexport function _catchError(error, vnode, oldVNode, errorInfo) {\n\t/** @type {import('../internal').Component} */\n\tlet component,\n\t\t/** @type {import('../internal').ComponentType} */\n\t\tctor,\n\t\t/** @type {boolean} */\n\t\thandled;\n\n\tfor (; (vnode = vnode._parent); ) {\n\t\tif ((component = vnode._component) && !component._processingException) {\n\t\t\ttry {\n\t\t\t\tctor = component.constructor;\n\n\t\t\t\tif (ctor && ctor.getDerivedStateFromError != NULL) {\n\t\t\t\t\tcomponent.setState(ctor.getDerivedStateFromError(error));\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\tif (component.componentDidCatch != NULL) {\n\t\t\t\t\tcomponent.componentDidCatch(error, errorInfo || {});\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\t// This is an error boundary. Mark it as having bailed out, and whether it was mid-hydration.\n\t\t\t\tif (handled) {\n\t\t\t\t\treturn (component._pendingError = component);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\t}\n\n\tthrow error;\n}\n","import { assign } from './util';\nimport { diff, commitRoot } from './diff/index';\nimport options from './options';\nimport { Fragment } from './create-element';\nimport { MODE_HYDRATE, NULL } from './constants';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function BaseComponent(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @this {import('./internal').Component}\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nBaseComponent.prototype.setState = function (update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s;\n\tif (this._nextState != NULL && this._nextState != this.state) {\n\t\ts = this._nextState;\n\t} else {\n\t\ts = this._nextState = assign({}, this.state);\n\t}\n\n\tif (typeof update == 'function') {\n\t\t// Some libraries like `immer` mark the current state as readonly,\n\t\t// preventing us from mutating it, so we need to clone it. See #2716\n\t\tupdate = update(assign({}, s), this.props);\n\t}\n\n\tif (update) {\n\t\tassign(s, update);\n\t}\n\n\t// Skip update if updater function returned null\n\tif (update == NULL) return;\n\n\tif (this._vnode) {\n\t\tif (callback) {\n\t\t\tthis._stateCallbacks.push(callback);\n\t\t}\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @this {import('./internal').Component}\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nBaseComponent.prototype.forceUpdate = function (callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._force = true;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](https://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {ComponentChildren | void}\n */\nBaseComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == NULL) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent\n\t\t\t? getDomSibling(vnode._parent, vnode._index + 1)\n\t\t\t: NULL;\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling != NULL && sibling._dom != NULL) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search)\n\treturn typeof vnode.type == 'function' ? getDomSibling(vnode) : NULL;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} component The component to rerender\n */\nfunction renderComponent(component) {\n\tif (component._parentDom && component._dirty) {\n\t\tlet oldVNode = component._vnode,\n\t\t\toldDom = oldVNode._dom,\n\t\t\tcommitQueue = [],\n\t\t\trefQueue = [],\n\t\t\tnewVNode = assign({}, oldVNode);\n\t\tnewVNode._original = oldVNode._original + 1;\n\t\tif (options.vnode) options.vnode(newVNode);\n\n\t\tdiff(\n\t\t\tcomponent._parentDom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tcomponent._globalContext,\n\t\t\tcomponent._parentDom.namespaceURI,\n\t\t\toldVNode._flags & MODE_HYDRATE ? [oldDom] : NULL,\n\t\t\tcommitQueue,\n\t\t\toldDom == NULL ? getDomSibling(oldVNode) : oldDom,\n\t\t\t!!(oldVNode._flags & MODE_HYDRATE),\n\t\t\trefQueue\n\t\t);\n\n\t\tnewVNode._original = oldVNode._original;\n\t\tnewVNode._parent._children[newVNode._index] = newVNode;\n\t\tcommitRoot(commitQueue, newVNode, refQueue);\n\t\toldVNode._dom = oldVNode._parent = null;\n\n\t\tif (newVNode._dom != oldDom) {\n\t\t\tupdateParentDomPointers(newVNode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\tif ((vnode = vnode._parent) != NULL && vnode._component != NULL) {\n\t\tvnode._dom = vnode._component.base = NULL;\n\t\tvnode._children.some(child => {\n\t\t\tif (child != NULL && child._dom != NULL) {\n\t\t\t\treturn (vnode._dom = vnode._component.base = child._dom);\n\t\t\t}\n\t\t});\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array}\n */\nlet rerenderQueue = [];\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce;\n\nconst defer =\n\ttypeof Promise == 'function'\n\t\t? Promise.prototype.then.bind(Promise.resolve())\n\t\t: setTimeout;\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif (\n\t\t(!c._dirty &&\n\t\t\t(c._dirty = true) &&\n\t\t\trerenderQueue.push(c) &&\n\t\t\t!process._rerenderCount++) ||\n\t\tprevDebounce != options.debounceRendering\n\t) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(prevDebounce || defer)(process);\n\t}\n}\n\n/**\n * @param {import('./internal').Component} a\n * @param {import('./internal').Component} b\n */\nconst depthSort = (a, b) => a._vnode._depth - b._vnode._depth;\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\ttry {\n\t\tlet c,\n\t\t\tl = 1;\n\n\t\t// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary\n\t\t// process() calls from getting scheduled while `queue` is still being consumed.\n\t\twhile (rerenderQueue.length) {\n\t\t\t// Keep the rerender queue sorted by (depth, insertion order). The queue\n\t\t\t// will initially be sorted on the first iteration only if it has more than 1 item.\n\t\t\t//\n\t\t\t// New items can be added to the queue e.g. when rerendering a provider, so we want to\n\t\t\t// keep the order from top to bottom with those new items so we can handle them in a\n\t\t\t// single pass\n\t\t\tif (rerenderQueue.length > l) {\n\t\t\t\trerenderQueue.sort(depthSort);\n\t\t\t}\n\n\t\t\tc = rerenderQueue.shift();\n\t\t\tl = rerenderQueue.length;\n\n\t\t\trenderComponent(c);\n\t\t}\n\t} finally {\n\t\trerenderQueue.length = process._rerenderCount = 0;\n\t}\n}\n\nprocess._rerenderCount = 0;\n","import { IS_NON_DIMENSIONAL, NULL, SVG_NAMESPACE } from '../constants';\nimport options from '../options';\n\n// Per-instance unique key for event clock stamps. Each Preact copy on the page\n// gets its own random suffix so that `_dispatched` / `_attached` properties on\n// shared event objects and handler functions cannot collide across instances.\n// ~1 in 60M collision odds - if you have that many praect versions on the page,\n// you deserve some weird bugs.\n// In 11 we can replace this with a\n// Symbol\nlet _id = Math.random().toString(8),\n\tEVENT_DISPATCHED = '__d' + _id,\n\tEVENT_ATTACHED = '__a' + _id;\n\nfunction setStyle(style, key, value) {\n\tif (key[0] == '-') {\n\t\tstyle.setProperty(key, value == NULL ? '' : value);\n\t} else if (value == NULL) {\n\t\tstyle[key] = '';\n\t} else if (typeof value != 'number' || IS_NON_DIMENSIONAL.test(key)) {\n\t\tstyle[key] = value;\n\t} else {\n\t\tstyle[key] = value + 'px';\n\t}\n}\n\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\n\n// A logical clock to solve issues like https://github.com/preactjs/preact/issues/3927.\n// When the DOM performs an event it leaves micro-ticks in between bubbling up which means that\n// an event can trigger on a newly reated DOM-node while the event bubbles up.\n//\n// Originally inspired by Vue\n// (https://github.com/vuejs/core/blob/caeb8a68811a1b0f79/packages/runtime-dom/src/modules/events.ts#L90-L101),\n// but modified to use a logical clock instead of Date.now() in case event handlers get attached\n// and events get dispatched during the same millisecond.\n//\n// The clock is incremented after each new event dispatch. This allows 1 000 000 new events\n// per second for over 280 years before the value reaches Number.MAX_SAFE_INTEGER (2**53 - 1).\nlet eventClock = 0;\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {string} namespace Whether or not this DOM node is an SVG node or not\n */\nexport function setProperty(dom, name, value, oldValue, namespace) {\n\tlet useCapture;\n\n\to: if (name == 'style') {\n\t\tif (typeof value == 'string') {\n\t\t\tdom.style.cssText = value;\n\t\t} else {\n\t\t\tif (typeof oldValue == 'string') {\n\t\t\t\tdom.style.cssText = oldValue = '';\n\t\t\t}\n\n\t\t\tif (oldValue) {\n\t\t\t\tfor (name in oldValue) {\n\t\t\t\t\tif (!(value && name in value)) {\n\t\t\t\t\t\tsetStyle(dom.style, name, '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tfor (name in value) {\n\t\t\t\t\tif (!oldValue || value[name] != oldValue[name]) {\n\t\t\t\t\t\tsetStyle(dom.style, name, value[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0] == 'o' && name[1] == 'n') {\n\t\tuseCapture = name != (name = name.replace(CAPTURE_REGEX, '$1'));\n\t\tconst lowerCaseName = name.toLowerCase();\n\n\t\t// Infer correct casing for DOM built-in events:\n\t\tif (lowerCaseName in dom || name == 'onFocusOut' || name == 'onFocusIn')\n\t\t\tname = lowerCaseName.slice(2);\n\t\telse name = name.slice(2);\n\n\t\tif (!dom._listeners) dom._listeners = {};\n\t\tdom._listeners[name + useCapture] = value;\n\n\t\tif (value) {\n\t\t\tif (!oldValue) {\n\t\t\t\tvalue[EVENT_ATTACHED] = eventClock;\n\t\t\t\tdom.addEventListener(\n\t\t\t\t\tname,\n\t\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\t\tuseCapture\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tvalue[EVENT_ATTACHED] = oldValue[EVENT_ATTACHED];\n\t\t\t}\n\t\t} else {\n\t\t\tdom.removeEventListener(\n\t\t\t\tname,\n\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\tuseCapture\n\t\t\t);\n\t\t}\n\t} else {\n\t\tif (namespace == SVG_NAMESPACE) {\n\t\t\t// Normalize incorrect prop usage for SVG:\n\t\t\t// - xlink:href / xlinkHref --> href (xlink:href was removed from SVG and isn't needed)\n\t\t\t// - className --> class\n\t\t\tname = name.replace(/xlink(H|:h)/, 'h').replace(/sName$/, 's');\n\t\t} else if (\n\t\t\tname != 'width' &&\n\t\t\tname != 'height' &&\n\t\t\tname != 'href' &&\n\t\t\tname != 'list' &&\n\t\t\tname != 'form' &&\n\t\t\t// Default value in browsers is `-1` and an empty string is\n\t\t\t// cast to `0` instead\n\t\t\tname != 'tabIndex' &&\n\t\t\tname != 'download' &&\n\t\t\tname != 'rowSpan' &&\n\t\t\tname != 'colSpan' &&\n\t\t\tname != 'role' &&\n\t\t\tname != 'popover' &&\n\t\t\tname in dom\n\t\t) {\n\t\t\ttry {\n\t\t\t\tdom[name] = value == NULL ? '' : value;\n\t\t\t\t// labelled break is 1b smaller here than a return statement (sorry)\n\t\t\t\tbreak o;\n\t\t\t} catch (e) {}\n\t\t}\n\n\t\t// aria- and data- attributes have no boolean representation.\n\t\t// A `false` value is different from the attribute not being\n\t\t// present, so we can't remove it. For non-boolean aria\n\t\t// attributes we could treat false as a removal, but the\n\t\t// amount of exceptions would cost too many bytes. On top of\n\t\t// that other frameworks generally stringify `false`.\n\n\t\tif (typeof value == 'function') {\n\t\t\t// never serialize functions as attribute values\n\t\t} else if (value != NULL && (value !== false || name[4] == '-')) {\n\t\t\tdom.setAttribute(name, name == 'popover' && value == true ? '' : value);\n\t\t} else {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t}\n}\n\n/**\n * Create an event proxy function.\n * @param {boolean} useCapture Is the event handler for the capture phase.\n * @private\n */\nfunction createEventProxy(useCapture) {\n\t/**\n\t * Proxy an event to hooked event handlers\n\t * @param {import('../internal').PreactEvent} e The event object from the browser\n\t * @private\n\t */\n\treturn function (e) {\n\t\tif (this._listeners) {\n\t\t\tconst eventHandler = this._listeners[e.type + useCapture];\n\t\t\tif (e[EVENT_DISPATCHED] == NULL) {\n\t\t\t\te[EVENT_DISPATCHED] = eventClock++;\n\n\t\t\t\t// When `e[EVENT_DISPATCHED]` is smaller than the time when the targeted event\n\t\t\t\t// handler was attached we know we have bubbled up to an element that was added\n\t\t\t\t// during patching the DOM.\n\t\t\t} else if (e[EVENT_DISPATCHED] < eventHandler[EVENT_ATTACHED]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn eventHandler(options.event ? options.event(e) : e);\n\t\t}\n\t};\n}\n\nconst eventProxy = createEventProxy(false);\nconst eventProxyCapture = createEventProxy(true);\n","import { enqueueRender } from './component';\nimport { NULL } from './constants';\n\nexport let i = 0;\n\nexport function createContext(defaultValue) {\n\tfunction Context(props) {\n\t\tif (!this.getChildContext) {\n\t\t\t/** @type {Set | null} */\n\t\t\tlet subs = new Set();\n\t\t\tlet ctx = {};\n\t\t\tctx[Context._id] = this;\n\n\t\t\tthis.getChildContext = () => ctx;\n\n\t\t\tthis.componentWillUnmount = () => {\n\t\t\t\tsubs = NULL;\n\t\t\t};\n\n\t\t\tthis.shouldComponentUpdate = function (_props) {\n\t\t\t\t// @ts-expect-error even\n\t\t\t\tif (this.props.value != _props.value) {\n\t\t\t\t\tsubs.forEach(c => {\n\t\t\t\t\t\tc._force = true;\n\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.sub = c => {\n\t\t\t\tsubs.add(c);\n\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\tif (subs) {\n\t\t\t\t\t\tsubs.delete(c);\n\t\t\t\t\t}\n\t\t\t\t\tif (old) old.call(c);\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\n\t\treturn props.children;\n\t}\n\n\tContext._id = '__cC' + i++;\n\tContext._defaultValue = defaultValue;\n\n\t/** @type {import('./internal').FunctionComponent} */\n\tContext.Consumer = (props, contextValue) => {\n\t\treturn props.children(contextValue);\n\t};\n\n\t// we could also get rid of _contextRef entirely\n\tContext.Provider =\n\t\tContext._contextRef =\n\t\tContext.Consumer.contextType =\n\t\t\tContext;\n\n\treturn Context;\n}\n","import { options, Fragment } from 'preact';\nimport { encodeEntities } from './utils';\nimport { IS_NON_DIMENSIONAL } from '../../src/constants';\n\nlet vnodeId = 0;\n\nconst isArray = Array.isArray;\n\n/**\n * @fileoverview\n * This file exports various methods that implement Babel's \"automatic\" JSX runtime API:\n * - jsx(type, props, key)\n * - jsxs(type, props, key)\n * - jsxDEV(type, props, key, __source, __self)\n *\n * The implementation of createVNode here is optimized for performance.\n * Benchmarks: https://esbench.com/bench/5f6b54a0b4632100a7dcd2b3\n */\n\n/**\n * JSX.Element factory used by Babel's {runtime:\"automatic\"} JSX transform\n * @param {VNode['type']} type\n * @param {VNode['props']} props\n * @param {VNode['key']} [key]\n * @param {unknown} [isStaticChildren]\n * @param {unknown} [__source]\n * @param {unknown} [__self]\n */\nfunction createVNode(type, props, key, isStaticChildren, __source, __self) {\n\tif (!props) props = {};\n\t// We'll want to preserve `ref` in props to get rid of the need for\n\t// forwardRef components in the future, but that should happen via\n\t// a separate PR.\n\tlet normalizedProps = props,\n\t\tref,\n\t\ti;\n\n\tif ('ref' in normalizedProps) {\n\t\tnormalizedProps = {};\n\t\tfor (i in props) {\n\t\t\tif (i == 'ref') {\n\t\t\t\tref = props[i];\n\t\t\t} else {\n\t\t\t\tnormalizedProps[i] = props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @type {VNode & { __source: any; __self: any }} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops: normalizedProps,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t_component: null,\n\t\tconstructor: undefined,\n\t\t_original: --vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0,\n\t\t__source,\n\t\t__self\n\t};\n\n\t// If a Component VNode, check for and apply defaultProps.\n\t// Note: `type` is often a String, and can be `undefined` in development.\n\tif (typeof type === 'function' && (ref = type.defaultProps)) {\n\t\tfor (i in ref)\n\t\t\tif (normalizedProps[i] === undefined) {\n\t\t\t\tnormalizedProps[i] = ref[i];\n\t\t\t}\n\t}\n\n\tif (options.vnode) options.vnode(vnode);\n\treturn vnode;\n}\n\n/**\n * Create a template vnode. This function is not expected to be\n * used directly, but rather through a precompile JSX transform\n * @param {string[]} templates\n * @param {Array} exprs\n * @returns {VNode}\n */\nfunction jsxTemplate(templates, ...exprs) {\n\tconst vnode = createVNode(Fragment, { tpl: templates, exprs });\n\t// Bypass render to string top level Fragment optimization\n\tvnode.key = vnode._vnode;\n\treturn vnode;\n}\n\nconst JS_TO_CSS = {};\nconst CSS_REGEX = /[A-Z]/g;\n\n/**\n * Unwrap potential signals.\n * @param {*} value\n * @returns {*}\n */\nfunction normalizeAttrValue(value) {\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.valueOf === 'function'\n\t\t? value.valueOf()\n\t\t: value;\n}\n\n/**\n * Serialize an HTML attribute to a string. This function is not\n * expected to be used directly, but rather through a precompile\n * JSX transform\n * @param {string} name The attribute name\n * @param {*} value The attribute value\n * @returns {string}\n */\nfunction jsxAttr(name, value) {\n\tif (options.attr) {\n\t\tconst result = options.attr(name, value);\n\t\tif (typeof result === 'string') return result;\n\t}\n\n\tvalue = normalizeAttrValue(value);\n\n\tif (name === 'ref' || name === 'key') return '';\n\tif (name === 'style' && typeof value === 'object') {\n\t\tlet str = '';\n\t\tfor (let prop in value) {\n\t\t\tlet val = value[prop];\n\t\t\tif (val != null && val !== '') {\n\t\t\t\tconst name =\n\t\t\t\t\tprop[0] == '-'\n\t\t\t\t\t\t? prop\n\t\t\t\t\t\t: JS_TO_CSS[prop] ||\n\t\t\t\t\t\t\t(JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$&').toLowerCase());\n\n\t\t\t\tlet suffix = ';';\n\t\t\t\tif (\n\t\t\t\t\ttypeof val === 'number' &&\n\t\t\t\t\t// Exclude custom-attributes\n\t\t\t\t\t!name.startsWith('--') &&\n\t\t\t\t\t!IS_NON_DIMENSIONAL.test(name)\n\t\t\t\t) {\n\t\t\t\t\tsuffix = 'px;';\n\t\t\t\t}\n\t\t\t\tstr = str + name + ':' + val + suffix;\n\t\t\t}\n\t\t}\n\t\treturn name + '=\"' + encodeEntities(str) + '\"';\n\t}\n\n\tif (\n\t\tvalue == null ||\n\t\tvalue === false ||\n\t\ttypeof value === 'function' ||\n\t\ttypeof value === 'object'\n\t) {\n\t\treturn '';\n\t} else if (value === true) return name;\n\n\treturn name + '=\"' + encodeEntities('' + value) + '\"';\n}\n\n/**\n * Escape a dynamic child passed to `jsxTemplate`. This function\n * is not expected to be used directly, but rather through a\n * precompile JSX transform\n * @param {*} value\n * @returns {string | null | VNode | Array}\n */\nfunction jsxEscape(value) {\n\tif (\n\t\tvalue == null ||\n\t\ttypeof value === 'boolean' ||\n\t\ttypeof value === 'function'\n\t) {\n\t\treturn null;\n\t}\n\n\tif (typeof value === 'object') {\n\t\t// Check for VNode\n\t\tif (value.constructor === undefined) return value;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tvalue[i] = jsxEscape(value[i]);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t}\n\n\treturn encodeEntities('' + value);\n}\n\nexport {\n\tcreateVNode as jsx,\n\tcreateVNode as jsxs,\n\tcreateVNode as jsxDEV,\n\tFragment,\n\t// precompiled JSX transform\n\tjsxTemplate,\n\tjsxAttr,\n\tjsxEscape\n};\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\nexport function resolveRelative(current: string, target: string): string {\n const simplified = simplifySlug(target);\n const rootPath = pathToRoot(current);\n return joinSegments(rootPath, simplified);\n}\n\nfunction pathToRoot(slug: string): string {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath;\n}\n",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n GlobalConfiguration,\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { isFolderPath } from \"@quartz-community/utils/path\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype RecentNotesPluginData = QuartzPluginData & Record;\n\ntype ResolvedGlobalConfiguration = GlobalConfiguration & {\n locale: string;\n defaultDateType: ValidDateType;\n};\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n hideTagPages: boolean;\n hideFolderPages: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nexport function filterListedPages(pages: T[]): T[] {\n return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true);\n}\n\n/** True for Quartz tag-index slugs: `tags`, `tags/index`, or `tags/`. */\nexport function isTagPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return slug === \"tags\" || slug === \"tags/index\" || slug.startsWith(\"tags/\");\n}\n\n/** True for Quartz folder-index slugs; delegates to `isFolderPath` from `@quartz-community/utils`. */\nexport function isFolderPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return isFolderPath(slug);\n}\n\nconst byDateAndAlphabeticalWithConfig = (cfg: ResolvedGlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: ResolvedGlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n hideTagPages: false,\n hideFolderPages: false,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as ResolvedGlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\n .filter((p) => !opts.hideTagPages || !isTagPageSlug(p.slug))\n .filter((p) => !opts.hideFolderPages || !isFolderPageSlug(p.slug))\n .filter(opts.filter)\n .sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index c063002..ba1286f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,9 +1,6 @@ -import { jsxs, jsx } from 'preact/jsx-runtime'; -import 'preact'; - // node_modules/@quartz-community/utils/dist/date.js -function formatDate(d, locale = "en-US") { - return d.toLocaleDateString(locale, { +function formatDate(d2, locale = "en-US") { + return d2.toLocaleDateString(locale, { year: "numeric", month: "short", day: "2-digit" @@ -20,9 +17,9 @@ function getDate(data) { return dates?.[defaultDateType]; } function byDateAndAlphabetical() { - return (f1, f2) => { + return (f1, f22) => { const f1Date = getDate(f1); - const f2Date = getDate(f2); + const f2Date = getDate(f22); if (f1Date && f2Date) { return f2Date.getTime() - f1Date.getTime(); } else if (f1Date && !f2Date) { @@ -31,14 +28,14 @@ function byDateAndAlphabetical() { return 1; } const f1Title = (f1.frontmatter?.title ?? "").toLowerCase(); - const f2Title = (f2.frontmatter?.title ?? "").toLowerCase(); + const f2Title = (f22.frontmatter?.title ?? "").toLowerCase(); return f1Title.localeCompare(f2Title); }; } // node_modules/@quartz-community/utils/dist/path.js -function endsWith(s, suffix) { - return s === suffix || s.endsWith("/" + suffix); +function endsWith(s2, suffix) { + return s2 === suffix || s2.endsWith("/" + suffix); } function isFolderPath(fplike) { return fplike.endsWith("/") || endsWith(fplike, "index") || endsWith(fplike, "index.md") || endsWith(fplike, "index.html"); @@ -393,6 +390,28 @@ var locales = { function i18n(locale) { return locales[locale] || en_US_default; } +var l; +l = { __e: function(n2, l2, u3, t2) { + for (var i2, r2, o2; l2 = l2.__; ) if ((i2 = l2.__c) && !i2.__) try { + if ((r2 = i2.constructor) && null != r2.getDerivedStateFromError && (i2.setState(r2.getDerivedStateFromError(n2)), o2 = i2.__d), null != i2.componentDidCatch && (i2.componentDidCatch(n2, t2 || {}), o2 = i2.__d), o2) return i2.__E = i2; + } catch (l3) { + n2 = l3; + } + throw n2; +} }, "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, Math.random().toString(8); + +// node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs +var f2 = 0; +function u2(e2, t2, n2, o2, i2, u3) { + t2 || (t2 = {}); + var a2, c2, p2 = t2; + if ("ref" in p2) for (c2 in p2 = {}, t2) "ref" == c2 ? a2 = t2[c2] : p2[c2] = t2[c2]; + var l2 = { type: e2, props: p2, key: n2, ref: a2, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --f2, __i: -1, __u: 0, __source: i2, __self: u3 }; + if ("function" == typeof e2 && (a2 = e2.defaultProps)) for (c2 in a2) void 0 === p2[c2] && (p2[c2] = a2[c2]); + return l.vnode && l.vnode(l2), l2; +} + +// node_modules/@quartz-community/utils/dist/index.js function simplifySlug(fp) { const res = stripSlashes(trimSuffix(fp, "index"), true); return res.length === 0 ? "/" : res; @@ -412,23 +431,23 @@ function joinSegments(...args) { } return joined; } -function endsWith2(s, suffix) { - return s === suffix || s.endsWith("/" + suffix); +function endsWith2(s2, suffix) { + return s2 === suffix || s2.endsWith("/" + suffix); } -function trimSuffix(s, suffix) { - if (endsWith2(s, suffix)) { - s = s.slice(0, -suffix.length); +function trimSuffix(s2, suffix) { + if (endsWith2(s2, suffix)) { + s2 = s2.slice(0, -suffix.length); } - return s; + return s2; } -function stripSlashes(s, onlyStripPrefix) { - if (s.startsWith("/")) { - s = s.substring(1); +function stripSlashes(s2, onlyStripPrefix) { + if (s2.startsWith("/")) { + s2 = s2.substring(1); } - if (!onlyStripPrefix && s.endsWith("/")) { - s = s.slice(0, -1); + if (!onlyStripPrefix && s2.endsWith("/")) { + s2 = s2.slice(0, -1); } - return s; + return s2; } // src/util/path.ts @@ -441,7 +460,7 @@ function resolveRelative(current, target) { return joinSegments(rootPath, simplified); } function pathToRoot(slug2) { - let rootPath = slug2.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); + let rootPath = slug2.split("/").filter((x2) => x2 !== "").slice(0, -1).map((_2) => "..").join("/"); if (rootPath.length === 0) { rootPath = "."; } @@ -450,12 +469,14 @@ function pathToRoot(slug2) { // src/components/styles/recentNotes.scss var recentNotes_default = ".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}"; + +// src/components/RecentNotes.tsx var withDefaultDateType = (data, defaultDateType) => ({ ...data, defaultDateType }); function filterListedPages(pages) { - return pages.filter((p) => p.unlisted !== true); + return pages.filter((p2) => p2.unlisted !== true); } function isTagPageSlug(slug2) { if (!slug2) return false; @@ -467,9 +488,9 @@ function isFolderPageSlug(slug2) { } var byDateAndAlphabeticalWithConfig = (cfg) => { const sortFn = byDateAndAlphabetical(); - return (f1, f2) => sortFn( + return (f1, f22) => sortFn( withDefaultDateType(f1, cfg.defaultDateType), - withDefaultDateType(f2, cfg.defaultDateType) + withDefaultDateType(f22, cfg.defaultDateType) ); }; var defaultOptions = (cfg) => ({ @@ -490,18 +511,18 @@ var RecentNotes_default = ((userOpts) => { }) => { const globalCfg = cfg; const opts = { ...defaultOptions(globalCfg), ...userOpts }; - const pages = filterListedPages(allFiles).filter((p) => !opts.hideTagPages || !isTagPageSlug(p.slug)).filter((p) => !opts.hideFolderPages || !isFolderPageSlug(p.slug)).filter(opts.filter).sort(opts.sort); + const pages = filterListedPages(allFiles).filter((p2) => !opts.hideTagPages || !isTagPageSlug(p2.slug)).filter((p2) => !opts.hideFolderPages || !isFolderPageSlug(p2.slug)).filter(opts.filter).sort(opts.sort); const remaining = Math.max(0, pages.length - opts.limit); const slug2 = fileData.slug; const locale = cfg.locale ?? "en-US"; - return /* @__PURE__ */ jsxs("div", { class: classNames(displayClass, "recent-notes"), children: [ - /* @__PURE__ */ jsx("h3", { children: opts.title ?? i18n(locale).components.recentNotes.title }), - /* @__PURE__ */ jsx("ul", { class: "recent-ul", children: pages.slice(0, opts.limit).map((page) => { + return /* @__PURE__ */ u2("div", { class: classNames(displayClass, "recent-notes"), children: [ + /* @__PURE__ */ u2("h3", { children: opts.title ?? i18n(locale).components.recentNotes.title }), + /* @__PURE__ */ u2("ul", { class: "recent-ul", children: pages.slice(0, opts.limit).map((page) => { const title = page.frontmatter?.title ?? "Untitled"; const tags = page.frontmatter?.tags ?? []; - return /* @__PURE__ */ jsx("li", { class: "recent-li", children: /* @__PURE__ */ jsxs("div", { class: "section", children: [ - /* @__PURE__ */ jsx("div", { class: "desc", children: /* @__PURE__ */ jsx("h3", { children: /* @__PURE__ */ jsx("a", { href: resolveRelative(slug2, page.slug), class: "internal", children: title }) }) }), - page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && /* @__PURE__ */ jsx("p", { class: "meta", children: /* @__PURE__ */ jsx( + return /* @__PURE__ */ u2("li", { class: "recent-li", children: /* @__PURE__ */ u2("div", { class: "section", children: [ + /* @__PURE__ */ u2("div", { class: "desc", children: /* @__PURE__ */ u2("h3", { children: /* @__PURE__ */ u2("a", { href: resolveRelative(slug2, page.slug), class: "internal", children: title }) }) }), + page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && /* @__PURE__ */ u2("p", { class: "meta", children: /* @__PURE__ */ u2( "time", { datetime: getDate( @@ -513,10 +534,10 @@ var RecentNotes_default = ((userOpts) => { ) } ) }), - opts.showTags && /* @__PURE__ */ jsx("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { class: "internal tag-link", href: resolveRelative(slug2, `tags/${tag}`), children: tag }) })) }) + opts.showTags && /* @__PURE__ */ u2("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ u2("li", { children: /* @__PURE__ */ u2("a", { class: "internal tag-link", href: resolveRelative(slug2, `tags/${tag}`), children: tag }) })) }) ] }) }); }) }), - opts.linkToMore && remaining > 0 && /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsx("a", { href: resolveRelative(slug2, opts.linkToMore), children: i18n(locale).components.recentNotes.seeRemainingMore({ remaining }) }) }) + opts.linkToMore && remaining > 0 && /* @__PURE__ */ u2("p", { children: /* @__PURE__ */ u2("a", { href: resolveRelative(slug2, opts.linkToMore), children: i18n(locale).components.recentNotes.seeRemainingMore({ remaining }) }) }) ] }); }; RecentNotes.css = recentNotes_default; diff --git a/dist/index.js.map b/dist/index.js.map index eee68e9..ba1869b 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/@quartz-community/utils/src/date.ts","../node_modules/@quartz-community/utils/src/sort.ts","../node_modules/@quartz-community/utils/src/path.ts","../node_modules/@quartz-community/utils/src/lang.ts","../src/i18n/locales/en-US.ts","../src/i18n/locales/ar-SA.ts","../src/i18n/locales/ca-ES.ts","../src/i18n/locales/cs-CZ.ts","../src/i18n/locales/de-DE.ts","../src/i18n/locales/en-GB.ts","../src/i18n/locales/es-ES.ts","../src/i18n/locales/fa-IR.ts","../src/i18n/locales/fi-FI.ts","../src/i18n/locales/fr-FR.ts","../src/i18n/locales/he-IL.ts","../src/i18n/locales/hu-HU.ts","../src/i18n/locales/id-ID.ts","../src/i18n/locales/it-IT.ts","../src/i18n/locales/ja-JP.ts","../src/i18n/locales/kk-KZ.ts","../src/i18n/locales/ko-KR.ts","../src/i18n/locales/lt-LT.ts","../src/i18n/locales/nb-NO.ts","../src/i18n/locales/nl-NL.ts","../src/i18n/locales/pl-PL.ts","../src/i18n/locales/pt-BR.ts","../src/i18n/locales/ro-RO.ts","../src/i18n/locales/ru-RU.ts","../src/i18n/locales/th-TH.ts","../src/i18n/locales/tr-TR.ts","../src/i18n/locales/uk-UA.ts","../src/i18n/locales/vi-VN.ts","../src/i18n/locales/zh-CN.ts","../src/i18n/locales/zh-TW.ts","../src/i18n/index.ts","../src/util/path.ts","../src/components/styles/recentNotes.scss","../src/components/RecentNotes.tsx"],"names":["endsWith","simplifySlug","slug","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","import { slug as slugAnchor } from \"github-slugger\";\nimport type { Element as HastElement } from \"hast\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n // Obsidian \"Folder Notes\" convention (insideFolder storage): a file named the\n // same as its parent folder is treated as the folder's landing page. Rewrite\n // `folder/folder` → `folder/index` so every downstream consumer (trie, link\n // resolver, simplifySlug, isFolderPath) sees the canonical Quartz slug shape\n // and Just Works. A top-level single-segment slug is NOT rewritten — that\n // represents Obsidian's `parentFolder` storage mode, which Quartz already\n // routes as a regular top-level page.\n const segments = slug.split(\"/\");\n if (segments.length >= 2 && segments[segments.length - 1] === segments[segments.length - 2]) {\n segments[segments.length - 1] = \"index\";\n slug = segments.join(\"/\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const slugged = slugifyFilePath(fp as FilePath);\n const simpleSlug = simplifySlug(slugged);\n const folderPath = isFolderPath(fplike) || isFolderPath(slugged);\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #, and\n * lowercases the result so that link matching is case-insensitive (matching\n * Obsidian's link-resolution semantics). Operates per segment so directory\n * separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\")\n .toLowerCase(),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/**\n * Re-base the relative `href` and `src` attributes of a HAST element so that\n * links inside content originally resolved relative to `newBase` remain valid\n * when the element is embedded at a page with slug `curBase`.\n *\n * Used for transclusions and cross-slug HAST embedding (Quartz core's\n * `renderPage` transclude expansion, canvas-page's embedded file-nodes, and\n * any plugin that takes `vfile.data.htmlAst` from one page and renders it\n * inside another). Absolute URLs pass through unchanged.\n *\n * The element (and its children) are deep-cloned via `structuredClone`, so\n * the original HAST tree is never mutated.\n */\nexport function normalizeHastElement(\n rawEl: T,\n curBase: FullSlug,\n newBase: FullSlug,\n): T {\n const el = structuredClone(rawEl);\n _rebaseHastElement(el, \"src\", curBase, newBase);\n _rebaseHastElement(el, \"href\", curBase, newBase);\n if (el.children) {\n el.children = el.children.map((child) =>\n child.type === \"element\"\n ? (normalizeHastElement(child as HastElement, curBase, newBase) as typeof child)\n : child,\n );\n }\n return el;\n}\n\n/** @internal */\nfunction _rebaseHastElement(\n el: HastElement,\n attr: \"href\" | \"src\",\n curBase: FullSlug,\n newBase: FullSlug,\n): void {\n const value = el.properties?.[attr];\n if (value === undefined || value === null) return;\n const href = String(value);\n if (!isRelativeURL(href)) return;\n el.properties![attr] = joinSegments(resolveRelative(curBase, newBase), \"..\", href);\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\n },\n },\n};\n","import enUS from \"./locales/en-US\";\nimport arSA from \"./locales/ar-SA\";\nimport caES from \"./locales/ca-ES\";\nimport csCZ from \"./locales/cs-CZ\";\nimport deDE from \"./locales/de-DE\";\nimport enGB from \"./locales/en-GB\";\nimport esES from \"./locales/es-ES\";\nimport faIR from \"./locales/fa-IR\";\nimport fiFI from \"./locales/fi-FI\";\nimport frFR from \"./locales/fr-FR\";\nimport heIL from \"./locales/he-IL\";\nimport huHU from \"./locales/hu-HU\";\nimport idID from \"./locales/id-ID\";\nimport itIT from \"./locales/it-IT\";\nimport jaJP from \"./locales/ja-JP\";\nimport kkKZ from \"./locales/kk-KZ\";\nimport koKR from \"./locales/ko-KR\";\nimport ltLT from \"./locales/lt-LT\";\nimport nbNO from \"./locales/nb-NO\";\nimport nlNL from \"./locales/nl-NL\";\nimport plPL from \"./locales/pl-PL\";\nimport ptBR from \"./locales/pt-BR\";\nimport roRO from \"./locales/ro-RO\";\nimport ruRU from \"./locales/ru-RU\";\nimport thTH from \"./locales/th-TH\";\nimport trTR from \"./locales/tr-TR\";\nimport ukUA from \"./locales/uk-UA\";\nimport viVN from \"./locales/vi-VN\";\nimport zhCN from \"./locales/zh-CN\";\nimport zhTW from \"./locales/zh-TW\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n \"ar-SA\": arSA,\n \"ca-ES\": caES,\n \"cs-CZ\": csCZ,\n \"de-DE\": deDE,\n \"en-GB\": enGB,\n \"es-ES\": esES,\n \"fa-IR\": faIR,\n \"fi-FI\": fiFI,\n \"fr-FR\": frFR,\n \"he-IL\": heIL,\n \"hu-HU\": huHU,\n \"id-ID\": idID,\n \"it-IT\": itIT,\n \"ja-JP\": jaJP,\n \"kk-KZ\": kkKZ,\n \"ko-KR\": koKR,\n \"lt-LT\": ltLT,\n \"nb-NO\": nbNO,\n \"nl-NL\": nlNL,\n \"pl-PL\": plPL,\n \"pt-BR\": ptBR,\n \"ro-RO\": roRO,\n \"ru-RU\": ruRU,\n \"th-TH\": thTH,\n \"tr-TR\": trTR,\n \"uk-UA\": ukUA,\n \"vi-VN\": viVN,\n \"zh-CN\": zhCN,\n \"zh-TW\": zhTW,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\nexport function resolveRelative(current: string, target: string): string {\n const simplified = simplifySlug(target);\n const rootPath = pathToRoot(current);\n return joinSegments(rootPath, simplified);\n}\n\nfunction pathToRoot(slug: string): string {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath;\n}\n",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n GlobalConfiguration,\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { isFolderPath } from \"@quartz-community/utils/path\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype RecentNotesPluginData = QuartzPluginData & Record;\n\ntype ResolvedGlobalConfiguration = GlobalConfiguration & {\n locale: string;\n defaultDateType: ValidDateType;\n};\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n hideTagPages: boolean;\n hideFolderPages: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nexport function filterListedPages(pages: T[]): T[] {\n return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true);\n}\n\n/** True for Quartz tag-index slugs: `tags`, `tags/index`, or `tags/`. */\nexport function isTagPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return slug === \"tags\" || slug === \"tags/index\" || slug.startsWith(\"tags/\");\n}\n\n/** True for Quartz folder-index slugs; delegates to `isFolderPath` from `@quartz-community/utils`. */\nexport function isFolderPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return isFolderPath(slug);\n}\n\nconst byDateAndAlphabeticalWithConfig = (cfg: ResolvedGlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: ResolvedGlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n hideTagPages: false,\n hideFolderPages: false,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as ResolvedGlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\n .filter((p) => !opts.hideTagPages || !isTagPageSlug(p.slug))\n .filter((p) => !opts.hideFolderPages || !isFolderPageSlug(p.slug))\n .filter(opts.filter)\n .sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/@quartz-community/utils/src/date.ts","../node_modules/@quartz-community/utils/src/sort.ts","../node_modules/@quartz-community/utils/src/path.ts","../node_modules/@quartz-community/utils/src/lang.ts","../src/i18n/locales/en-US.ts","../src/i18n/locales/ar-SA.ts","../src/i18n/locales/ca-ES.ts","../src/i18n/locales/cs-CZ.ts","../src/i18n/locales/de-DE.ts","../src/i18n/locales/en-GB.ts","../src/i18n/locales/es-ES.ts","../src/i18n/locales/fa-IR.ts","../src/i18n/locales/fi-FI.ts","../src/i18n/locales/fr-FR.ts","../src/i18n/locales/he-IL.ts","../src/i18n/locales/hu-HU.ts","../src/i18n/locales/id-ID.ts","../src/i18n/locales/it-IT.ts","../src/i18n/locales/ja-JP.ts","../src/i18n/locales/kk-KZ.ts","../src/i18n/locales/ko-KR.ts","../src/i18n/locales/lt-LT.ts","../src/i18n/locales/nb-NO.ts","../src/i18n/locales/nl-NL.ts","../src/i18n/locales/pl-PL.ts","../src/i18n/locales/pt-BR.ts","../src/i18n/locales/ro-RO.ts","../src/i18n/locales/ru-RU.ts","../src/i18n/locales/th-TH.ts","../src/i18n/locales/tr-TR.ts","../src/i18n/locales/uk-UA.ts","../src/i18n/locales/vi-VN.ts","../src/i18n/locales/zh-CN.ts","../src/i18n/locales/zh-TW.ts","../src/i18n/index.ts","../node_modules/preact/src/constants.js","../node_modules/preact/src/options.js","../node_modules/preact/src/diff/catch-error.js","../node_modules/preact/src/component.js","../node_modules/preact/src/diff/props.js","../node_modules/preact/src/create-context.js","../node_modules/preact/jsx-runtime/src/index.js","../src/util/path.ts","../src/components/styles/recentNotes.scss","../src/components/RecentNotes.tsx"],"names":["d","f2","s","options","__e","error","vnode","oldVNode","errorInfo","component","ctor","handled","__","__c","constructor","getDerivedStateFromError","setState","__d","componentDidCatch","__E","e","Promise","prototype","then","bind","resolve","setTimeout","Math","random","toString","vnodeId","createVNode","type","props","key","isStaticChildren","__source","__self","ref","i","normalizedProps","__k","__b","__v","__i","__u","defaultProps","endsWith","simplifySlug","slug","x","_","p","u"],"mappings":"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","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","import { slug as slugAnchor } from \"github-slugger\";\nimport type { Element as HastElement } from \"hast\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n // Obsidian \"Folder Notes\" convention (insideFolder storage): a file named the\n // same as its parent folder is treated as the folder's landing page. Rewrite\n // `folder/folder` → `folder/index` so every downstream consumer (trie, link\n // resolver, simplifySlug, isFolderPath) sees the canonical Quartz slug shape\n // and Just Works. A top-level single-segment slug is NOT rewritten — that\n // represents Obsidian's `parentFolder` storage mode, which Quartz already\n // routes as a regular top-level page.\n const segments = slug.split(\"/\");\n if (segments.length >= 2 && segments[segments.length - 1] === segments[segments.length - 2]) {\n segments[segments.length - 1] = \"index\";\n slug = segments.join(\"/\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const slugged = slugifyFilePath(fp as FilePath);\n const simpleSlug = simplifySlug(slugged);\n const folderPath = isFolderPath(fplike) || isFolderPath(slugged);\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #, and\n * lowercases the result so that link matching is case-insensitive (matching\n * Obsidian's link-resolution semantics). Operates per segment so directory\n * separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\")\n .toLowerCase(),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/**\n * Re-base the relative `href` and `src` attributes of a HAST element so that\n * links inside content originally resolved relative to `newBase` remain valid\n * when the element is embedded at a page with slug `curBase`.\n *\n * Used for transclusions and cross-slug HAST embedding (Quartz core's\n * `renderPage` transclude expansion, canvas-page's embedded file-nodes, and\n * any plugin that takes `vfile.data.htmlAst` from one page and renders it\n * inside another). Absolute URLs pass through unchanged.\n *\n * The element (and its children) are deep-cloned via `structuredClone`, so\n * the original HAST tree is never mutated.\n */\nexport function normalizeHastElement(\n rawEl: T,\n curBase: FullSlug,\n newBase: FullSlug,\n): T {\n const el = structuredClone(rawEl);\n _rebaseHastElement(el, \"src\", curBase, newBase);\n _rebaseHastElement(el, \"href\", curBase, newBase);\n if (el.children) {\n el.children = el.children.map((child) =>\n child.type === \"element\"\n ? (normalizeHastElement(child as HastElement, curBase, newBase) as typeof child)\n : child,\n );\n }\n return el;\n}\n\n/** @internal */\nfunction _rebaseHastElement(\n el: HastElement,\n attr: \"href\" | \"src\",\n curBase: FullSlug,\n newBase: FullSlug,\n): void {\n const value = el.properties?.[attr];\n if (value === undefined || value === null) return;\n const href = String(value);\n if (!isRelativeURL(href)) return;\n el.properties![attr] = joinSegments(resolveRelative(curBase, newBase), \"..\", href);\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\n },\n },\n};\n","import enUS from \"./locales/en-US\";\nimport arSA from \"./locales/ar-SA\";\nimport caES from \"./locales/ca-ES\";\nimport csCZ from \"./locales/cs-CZ\";\nimport deDE from \"./locales/de-DE\";\nimport enGB from \"./locales/en-GB\";\nimport esES from \"./locales/es-ES\";\nimport faIR from \"./locales/fa-IR\";\nimport fiFI from \"./locales/fi-FI\";\nimport frFR from \"./locales/fr-FR\";\nimport heIL from \"./locales/he-IL\";\nimport huHU from \"./locales/hu-HU\";\nimport idID from \"./locales/id-ID\";\nimport itIT from \"./locales/it-IT\";\nimport jaJP from \"./locales/ja-JP\";\nimport kkKZ from \"./locales/kk-KZ\";\nimport koKR from \"./locales/ko-KR\";\nimport ltLT from \"./locales/lt-LT\";\nimport nbNO from \"./locales/nb-NO\";\nimport nlNL from \"./locales/nl-NL\";\nimport plPL from \"./locales/pl-PL\";\nimport ptBR from \"./locales/pt-BR\";\nimport roRO from \"./locales/ro-RO\";\nimport ruRU from \"./locales/ru-RU\";\nimport thTH from \"./locales/th-TH\";\nimport trTR from \"./locales/tr-TR\";\nimport ukUA from \"./locales/uk-UA\";\nimport viVN from \"./locales/vi-VN\";\nimport zhCN from \"./locales/zh-CN\";\nimport zhTW from \"./locales/zh-TW\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n \"ar-SA\": arSA,\n \"ca-ES\": caES,\n \"cs-CZ\": csCZ,\n \"de-DE\": deDE,\n \"en-GB\": enGB,\n \"es-ES\": esES,\n \"fa-IR\": faIR,\n \"fi-FI\": fiFI,\n \"fr-FR\": frFR,\n \"he-IL\": heIL,\n \"hu-HU\": huHU,\n \"id-ID\": idID,\n \"it-IT\": itIT,\n \"ja-JP\": jaJP,\n \"kk-KZ\": kkKZ,\n \"ko-KR\": koKR,\n \"lt-LT\": ltLT,\n \"nb-NO\": nbNO,\n \"nl-NL\": nlNL,\n \"pl-PL\": plPL,\n \"pt-BR\": ptBR,\n \"ro-RO\": roRO,\n \"ru-RU\": ruRU,\n \"th-TH\": thTH,\n \"tr-TR\": trTR,\n \"uk-UA\": ukUA,\n \"vi-VN\": viVN,\n \"zh-CN\": zhCN,\n \"zh-TW\": zhTW,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n","import { _catchError } from './diff/catch-error';\n\n/**\n * The `option` object can potentially contain callback functions\n * that are called during various stages of our renderer. This is the\n * foundation on which all our addons like `preact/debug`, `preact/compat`,\n * and `preact/hooks` are based on. See the `Options` type in `internal.d.ts`\n * for a full list of available option hooks (most editors/IDEs allow you to\n * ctrl+click or cmd+click on mac the type definition below).\n * @type {import('./internal').Options}\n */\nconst options = {\n\t_catchError\n};\n\nexport default options;\n","import { NULL } from '../constants';\n\n/**\n * Find the closest error boundary to a thrown error and call it\n * @param {object} error The thrown value\n * @param {import('../internal').VNode} vnode The vnode that threw the error that was caught (except\n * for unmounting when this parameter is the highest parent that was being\n * unmounted)\n * @param {import('../internal').VNode} [oldVNode]\n * @param {import('../internal').ErrorInfo} [errorInfo]\n */\nexport function _catchError(error, vnode, oldVNode, errorInfo) {\n\t/** @type {import('../internal').Component} */\n\tlet component,\n\t\t/** @type {import('../internal').ComponentType} */\n\t\tctor,\n\t\t/** @type {boolean} */\n\t\thandled;\n\n\tfor (; (vnode = vnode._parent); ) {\n\t\tif ((component = vnode._component) && !component._processingException) {\n\t\t\ttry {\n\t\t\t\tctor = component.constructor;\n\n\t\t\t\tif (ctor && ctor.getDerivedStateFromError != NULL) {\n\t\t\t\t\tcomponent.setState(ctor.getDerivedStateFromError(error));\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\tif (component.componentDidCatch != NULL) {\n\t\t\t\t\tcomponent.componentDidCatch(error, errorInfo || {});\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\t// This is an error boundary. Mark it as having bailed out, and whether it was mid-hydration.\n\t\t\t\tif (handled) {\n\t\t\t\t\treturn (component._pendingError = component);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\t}\n\n\tthrow error;\n}\n","import { assign } from './util';\nimport { diff, commitRoot } from './diff/index';\nimport options from './options';\nimport { Fragment } from './create-element';\nimport { MODE_HYDRATE, NULL } from './constants';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function BaseComponent(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @this {import('./internal').Component}\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nBaseComponent.prototype.setState = function (update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s;\n\tif (this._nextState != NULL && this._nextState != this.state) {\n\t\ts = this._nextState;\n\t} else {\n\t\ts = this._nextState = assign({}, this.state);\n\t}\n\n\tif (typeof update == 'function') {\n\t\t// Some libraries like `immer` mark the current state as readonly,\n\t\t// preventing us from mutating it, so we need to clone it. See #2716\n\t\tupdate = update(assign({}, s), this.props);\n\t}\n\n\tif (update) {\n\t\tassign(s, update);\n\t}\n\n\t// Skip update if updater function returned null\n\tif (update == NULL) return;\n\n\tif (this._vnode) {\n\t\tif (callback) {\n\t\t\tthis._stateCallbacks.push(callback);\n\t\t}\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @this {import('./internal').Component}\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nBaseComponent.prototype.forceUpdate = function (callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._force = true;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](https://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {ComponentChildren | void}\n */\nBaseComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == NULL) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent\n\t\t\t? getDomSibling(vnode._parent, vnode._index + 1)\n\t\t\t: NULL;\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling != NULL && sibling._dom != NULL) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search)\n\treturn typeof vnode.type == 'function' ? getDomSibling(vnode) : NULL;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} component The component to rerender\n */\nfunction renderComponent(component) {\n\tif (component._parentDom && component._dirty) {\n\t\tlet oldVNode = component._vnode,\n\t\t\toldDom = oldVNode._dom,\n\t\t\tcommitQueue = [],\n\t\t\trefQueue = [],\n\t\t\tnewVNode = assign({}, oldVNode);\n\t\tnewVNode._original = oldVNode._original + 1;\n\t\tif (options.vnode) options.vnode(newVNode);\n\n\t\tdiff(\n\t\t\tcomponent._parentDom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tcomponent._globalContext,\n\t\t\tcomponent._parentDom.namespaceURI,\n\t\t\toldVNode._flags & MODE_HYDRATE ? [oldDom] : NULL,\n\t\t\tcommitQueue,\n\t\t\toldDom == NULL ? getDomSibling(oldVNode) : oldDom,\n\t\t\t!!(oldVNode._flags & MODE_HYDRATE),\n\t\t\trefQueue\n\t\t);\n\n\t\tnewVNode._original = oldVNode._original;\n\t\tnewVNode._parent._children[newVNode._index] = newVNode;\n\t\tcommitRoot(commitQueue, newVNode, refQueue);\n\t\toldVNode._dom = oldVNode._parent = null;\n\n\t\tif (newVNode._dom != oldDom) {\n\t\t\tupdateParentDomPointers(newVNode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\tif ((vnode = vnode._parent) != NULL && vnode._component != NULL) {\n\t\tvnode._dom = vnode._component.base = NULL;\n\t\tvnode._children.some(child => {\n\t\t\tif (child != NULL && child._dom != NULL) {\n\t\t\t\treturn (vnode._dom = vnode._component.base = child._dom);\n\t\t\t}\n\t\t});\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array}\n */\nlet rerenderQueue = [];\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce;\n\nconst defer =\n\ttypeof Promise == 'function'\n\t\t? Promise.prototype.then.bind(Promise.resolve())\n\t\t: setTimeout;\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif (\n\t\t(!c._dirty &&\n\t\t\t(c._dirty = true) &&\n\t\t\trerenderQueue.push(c) &&\n\t\t\t!process._rerenderCount++) ||\n\t\tprevDebounce != options.debounceRendering\n\t) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(prevDebounce || defer)(process);\n\t}\n}\n\n/**\n * @param {import('./internal').Component} a\n * @param {import('./internal').Component} b\n */\nconst depthSort = (a, b) => a._vnode._depth - b._vnode._depth;\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\ttry {\n\t\tlet c,\n\t\t\tl = 1;\n\n\t\t// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary\n\t\t// process() calls from getting scheduled while `queue` is still being consumed.\n\t\twhile (rerenderQueue.length) {\n\t\t\t// Keep the rerender queue sorted by (depth, insertion order). The queue\n\t\t\t// will initially be sorted on the first iteration only if it has more than 1 item.\n\t\t\t//\n\t\t\t// New items can be added to the queue e.g. when rerendering a provider, so we want to\n\t\t\t// keep the order from top to bottom with those new items so we can handle them in a\n\t\t\t// single pass\n\t\t\tif (rerenderQueue.length > l) {\n\t\t\t\trerenderQueue.sort(depthSort);\n\t\t\t}\n\n\t\t\tc = rerenderQueue.shift();\n\t\t\tl = rerenderQueue.length;\n\n\t\t\trenderComponent(c);\n\t\t}\n\t} finally {\n\t\trerenderQueue.length = process._rerenderCount = 0;\n\t}\n}\n\nprocess._rerenderCount = 0;\n","import { IS_NON_DIMENSIONAL, NULL, SVG_NAMESPACE } from '../constants';\nimport options from '../options';\n\n// Per-instance unique key for event clock stamps. Each Preact copy on the page\n// gets its own random suffix so that `_dispatched` / `_attached` properties on\n// shared event objects and handler functions cannot collide across instances.\n// ~1 in 60M collision odds - if you have that many praect versions on the page,\n// you deserve some weird bugs.\n// In 11 we can replace this with a\n// Symbol\nlet _id = Math.random().toString(8),\n\tEVENT_DISPATCHED = '__d' + _id,\n\tEVENT_ATTACHED = '__a' + _id;\n\nfunction setStyle(style, key, value) {\n\tif (key[0] == '-') {\n\t\tstyle.setProperty(key, value == NULL ? '' : value);\n\t} else if (value == NULL) {\n\t\tstyle[key] = '';\n\t} else if (typeof value != 'number' || IS_NON_DIMENSIONAL.test(key)) {\n\t\tstyle[key] = value;\n\t} else {\n\t\tstyle[key] = value + 'px';\n\t}\n}\n\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\n\n// A logical clock to solve issues like https://github.com/preactjs/preact/issues/3927.\n// When the DOM performs an event it leaves micro-ticks in between bubbling up which means that\n// an event can trigger on a newly reated DOM-node while the event bubbles up.\n//\n// Originally inspired by Vue\n// (https://github.com/vuejs/core/blob/caeb8a68811a1b0f79/packages/runtime-dom/src/modules/events.ts#L90-L101),\n// but modified to use a logical clock instead of Date.now() in case event handlers get attached\n// and events get dispatched during the same millisecond.\n//\n// The clock is incremented after each new event dispatch. This allows 1 000 000 new events\n// per second for over 280 years before the value reaches Number.MAX_SAFE_INTEGER (2**53 - 1).\nlet eventClock = 0;\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {string} namespace Whether or not this DOM node is an SVG node or not\n */\nexport function setProperty(dom, name, value, oldValue, namespace) {\n\tlet useCapture;\n\n\to: if (name == 'style') {\n\t\tif (typeof value == 'string') {\n\t\t\tdom.style.cssText = value;\n\t\t} else {\n\t\t\tif (typeof oldValue == 'string') {\n\t\t\t\tdom.style.cssText = oldValue = '';\n\t\t\t}\n\n\t\t\tif (oldValue) {\n\t\t\t\tfor (name in oldValue) {\n\t\t\t\t\tif (!(value && name in value)) {\n\t\t\t\t\t\tsetStyle(dom.style, name, '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tfor (name in value) {\n\t\t\t\t\tif (!oldValue || value[name] != oldValue[name]) {\n\t\t\t\t\t\tsetStyle(dom.style, name, value[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0] == 'o' && name[1] == 'n') {\n\t\tuseCapture = name != (name = name.replace(CAPTURE_REGEX, '$1'));\n\t\tconst lowerCaseName = name.toLowerCase();\n\n\t\t// Infer correct casing for DOM built-in events:\n\t\tif (lowerCaseName in dom || name == 'onFocusOut' || name == 'onFocusIn')\n\t\t\tname = lowerCaseName.slice(2);\n\t\telse name = name.slice(2);\n\n\t\tif (!dom._listeners) dom._listeners = {};\n\t\tdom._listeners[name + useCapture] = value;\n\n\t\tif (value) {\n\t\t\tif (!oldValue) {\n\t\t\t\tvalue[EVENT_ATTACHED] = eventClock;\n\t\t\t\tdom.addEventListener(\n\t\t\t\t\tname,\n\t\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\t\tuseCapture\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tvalue[EVENT_ATTACHED] = oldValue[EVENT_ATTACHED];\n\t\t\t}\n\t\t} else {\n\t\t\tdom.removeEventListener(\n\t\t\t\tname,\n\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\tuseCapture\n\t\t\t);\n\t\t}\n\t} else {\n\t\tif (namespace == SVG_NAMESPACE) {\n\t\t\t// Normalize incorrect prop usage for SVG:\n\t\t\t// - xlink:href / xlinkHref --> href (xlink:href was removed from SVG and isn't needed)\n\t\t\t// - className --> class\n\t\t\tname = name.replace(/xlink(H|:h)/, 'h').replace(/sName$/, 's');\n\t\t} else if (\n\t\t\tname != 'width' &&\n\t\t\tname != 'height' &&\n\t\t\tname != 'href' &&\n\t\t\tname != 'list' &&\n\t\t\tname != 'form' &&\n\t\t\t// Default value in browsers is `-1` and an empty string is\n\t\t\t// cast to `0` instead\n\t\t\tname != 'tabIndex' &&\n\t\t\tname != 'download' &&\n\t\t\tname != 'rowSpan' &&\n\t\t\tname != 'colSpan' &&\n\t\t\tname != 'role' &&\n\t\t\tname != 'popover' &&\n\t\t\tname in dom\n\t\t) {\n\t\t\ttry {\n\t\t\t\tdom[name] = value == NULL ? '' : value;\n\t\t\t\t// labelled break is 1b smaller here than a return statement (sorry)\n\t\t\t\tbreak o;\n\t\t\t} catch (e) {}\n\t\t}\n\n\t\t// aria- and data- attributes have no boolean representation.\n\t\t// A `false` value is different from the attribute not being\n\t\t// present, so we can't remove it. For non-boolean aria\n\t\t// attributes we could treat false as a removal, but the\n\t\t// amount of exceptions would cost too many bytes. On top of\n\t\t// that other frameworks generally stringify `false`.\n\n\t\tif (typeof value == 'function') {\n\t\t\t// never serialize functions as attribute values\n\t\t} else if (value != NULL && (value !== false || name[4] == '-')) {\n\t\t\tdom.setAttribute(name, name == 'popover' && value == true ? '' : value);\n\t\t} else {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t}\n}\n\n/**\n * Create an event proxy function.\n * @param {boolean} useCapture Is the event handler for the capture phase.\n * @private\n */\nfunction createEventProxy(useCapture) {\n\t/**\n\t * Proxy an event to hooked event handlers\n\t * @param {import('../internal').PreactEvent} e The event object from the browser\n\t * @private\n\t */\n\treturn function (e) {\n\t\tif (this._listeners) {\n\t\t\tconst eventHandler = this._listeners[e.type + useCapture];\n\t\t\tif (e[EVENT_DISPATCHED] == NULL) {\n\t\t\t\te[EVENT_DISPATCHED] = eventClock++;\n\n\t\t\t\t// When `e[EVENT_DISPATCHED]` is smaller than the time when the targeted event\n\t\t\t\t// handler was attached we know we have bubbled up to an element that was added\n\t\t\t\t// during patching the DOM.\n\t\t\t} else if (e[EVENT_DISPATCHED] < eventHandler[EVENT_ATTACHED]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn eventHandler(options.event ? options.event(e) : e);\n\t\t}\n\t};\n}\n\nconst eventProxy = createEventProxy(false);\nconst eventProxyCapture = createEventProxy(true);\n","import { enqueueRender } from './component';\nimport { NULL } from './constants';\n\nexport let i = 0;\n\nexport function createContext(defaultValue) {\n\tfunction Context(props) {\n\t\tif (!this.getChildContext) {\n\t\t\t/** @type {Set | null} */\n\t\t\tlet subs = new Set();\n\t\t\tlet ctx = {};\n\t\t\tctx[Context._id] = this;\n\n\t\t\tthis.getChildContext = () => ctx;\n\n\t\t\tthis.componentWillUnmount = () => {\n\t\t\t\tsubs = NULL;\n\t\t\t};\n\n\t\t\tthis.shouldComponentUpdate = function (_props) {\n\t\t\t\t// @ts-expect-error even\n\t\t\t\tif (this.props.value != _props.value) {\n\t\t\t\t\tsubs.forEach(c => {\n\t\t\t\t\t\tc._force = true;\n\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.sub = c => {\n\t\t\t\tsubs.add(c);\n\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\tif (subs) {\n\t\t\t\t\t\tsubs.delete(c);\n\t\t\t\t\t}\n\t\t\t\t\tif (old) old.call(c);\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\n\t\treturn props.children;\n\t}\n\n\tContext._id = '__cC' + i++;\n\tContext._defaultValue = defaultValue;\n\n\t/** @type {import('./internal').FunctionComponent} */\n\tContext.Consumer = (props, contextValue) => {\n\t\treturn props.children(contextValue);\n\t};\n\n\t// we could also get rid of _contextRef entirely\n\tContext.Provider =\n\t\tContext._contextRef =\n\t\tContext.Consumer.contextType =\n\t\t\tContext;\n\n\treturn Context;\n}\n","import { options, Fragment } from 'preact';\nimport { encodeEntities } from './utils';\nimport { IS_NON_DIMENSIONAL } from '../../src/constants';\n\nlet vnodeId = 0;\n\nconst isArray = Array.isArray;\n\n/**\n * @fileoverview\n * This file exports various methods that implement Babel's \"automatic\" JSX runtime API:\n * - jsx(type, props, key)\n * - jsxs(type, props, key)\n * - jsxDEV(type, props, key, __source, __self)\n *\n * The implementation of createVNode here is optimized for performance.\n * Benchmarks: https://esbench.com/bench/5f6b54a0b4632100a7dcd2b3\n */\n\n/**\n * JSX.Element factory used by Babel's {runtime:\"automatic\"} JSX transform\n * @param {VNode['type']} type\n * @param {VNode['props']} props\n * @param {VNode['key']} [key]\n * @param {unknown} [isStaticChildren]\n * @param {unknown} [__source]\n * @param {unknown} [__self]\n */\nfunction createVNode(type, props, key, isStaticChildren, __source, __self) {\n\tif (!props) props = {};\n\t// We'll want to preserve `ref` in props to get rid of the need for\n\t// forwardRef components in the future, but that should happen via\n\t// a separate PR.\n\tlet normalizedProps = props,\n\t\tref,\n\t\ti;\n\n\tif ('ref' in normalizedProps) {\n\t\tnormalizedProps = {};\n\t\tfor (i in props) {\n\t\t\tif (i == 'ref') {\n\t\t\t\tref = props[i];\n\t\t\t} else {\n\t\t\t\tnormalizedProps[i] = props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @type {VNode & { __source: any; __self: any }} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops: normalizedProps,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t_component: null,\n\t\tconstructor: undefined,\n\t\t_original: --vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0,\n\t\t__source,\n\t\t__self\n\t};\n\n\t// If a Component VNode, check for and apply defaultProps.\n\t// Note: `type` is often a String, and can be `undefined` in development.\n\tif (typeof type === 'function' && (ref = type.defaultProps)) {\n\t\tfor (i in ref)\n\t\t\tif (normalizedProps[i] === undefined) {\n\t\t\t\tnormalizedProps[i] = ref[i];\n\t\t\t}\n\t}\n\n\tif (options.vnode) options.vnode(vnode);\n\treturn vnode;\n}\n\n/**\n * Create a template vnode. This function is not expected to be\n * used directly, but rather through a precompile JSX transform\n * @param {string[]} templates\n * @param {Array} exprs\n * @returns {VNode}\n */\nfunction jsxTemplate(templates, ...exprs) {\n\tconst vnode = createVNode(Fragment, { tpl: templates, exprs });\n\t// Bypass render to string top level Fragment optimization\n\tvnode.key = vnode._vnode;\n\treturn vnode;\n}\n\nconst JS_TO_CSS = {};\nconst CSS_REGEX = /[A-Z]/g;\n\n/**\n * Unwrap potential signals.\n * @param {*} value\n * @returns {*}\n */\nfunction normalizeAttrValue(value) {\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.valueOf === 'function'\n\t\t? value.valueOf()\n\t\t: value;\n}\n\n/**\n * Serialize an HTML attribute to a string. This function is not\n * expected to be used directly, but rather through a precompile\n * JSX transform\n * @param {string} name The attribute name\n * @param {*} value The attribute value\n * @returns {string}\n */\nfunction jsxAttr(name, value) {\n\tif (options.attr) {\n\t\tconst result = options.attr(name, value);\n\t\tif (typeof result === 'string') return result;\n\t}\n\n\tvalue = normalizeAttrValue(value);\n\n\tif (name === 'ref' || name === 'key') return '';\n\tif (name === 'style' && typeof value === 'object') {\n\t\tlet str = '';\n\t\tfor (let prop in value) {\n\t\t\tlet val = value[prop];\n\t\t\tif (val != null && val !== '') {\n\t\t\t\tconst name =\n\t\t\t\t\tprop[0] == '-'\n\t\t\t\t\t\t? prop\n\t\t\t\t\t\t: JS_TO_CSS[prop] ||\n\t\t\t\t\t\t\t(JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$&').toLowerCase());\n\n\t\t\t\tlet suffix = ';';\n\t\t\t\tif (\n\t\t\t\t\ttypeof val === 'number' &&\n\t\t\t\t\t// Exclude custom-attributes\n\t\t\t\t\t!name.startsWith('--') &&\n\t\t\t\t\t!IS_NON_DIMENSIONAL.test(name)\n\t\t\t\t) {\n\t\t\t\t\tsuffix = 'px;';\n\t\t\t\t}\n\t\t\t\tstr = str + name + ':' + val + suffix;\n\t\t\t}\n\t\t}\n\t\treturn name + '=\"' + encodeEntities(str) + '\"';\n\t}\n\n\tif (\n\t\tvalue == null ||\n\t\tvalue === false ||\n\t\ttypeof value === 'function' ||\n\t\ttypeof value === 'object'\n\t) {\n\t\treturn '';\n\t} else if (value === true) return name;\n\n\treturn name + '=\"' + encodeEntities('' + value) + '\"';\n}\n\n/**\n * Escape a dynamic child passed to `jsxTemplate`. This function\n * is not expected to be used directly, but rather through a\n * precompile JSX transform\n * @param {*} value\n * @returns {string | null | VNode | Array}\n */\nfunction jsxEscape(value) {\n\tif (\n\t\tvalue == null ||\n\t\ttypeof value === 'boolean' ||\n\t\ttypeof value === 'function'\n\t) {\n\t\treturn null;\n\t}\n\n\tif (typeof value === 'object') {\n\t\t// Check for VNode\n\t\tif (value.constructor === undefined) return value;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tvalue[i] = jsxEscape(value[i]);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t}\n\n\treturn encodeEntities('' + value);\n}\n\nexport {\n\tcreateVNode as jsx,\n\tcreateVNode as jsxs,\n\tcreateVNode as jsxDEV,\n\tFragment,\n\t// precompiled JSX transform\n\tjsxTemplate,\n\tjsxAttr,\n\tjsxEscape\n};\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\nexport function resolveRelative(current: string, target: string): string {\n const simplified = simplifySlug(target);\n const rootPath = pathToRoot(current);\n return joinSegments(rootPath, simplified);\n}\n\nfunction pathToRoot(slug: string): string {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath;\n}\n",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n GlobalConfiguration,\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { isFolderPath } from \"@quartz-community/utils/path\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype RecentNotesPluginData = QuartzPluginData & Record;\n\ntype ResolvedGlobalConfiguration = GlobalConfiguration & {\n locale: string;\n defaultDateType: ValidDateType;\n};\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n hideTagPages: boolean;\n hideFolderPages: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nexport function filterListedPages(pages: T[]): T[] {\n return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true);\n}\n\n/** True for Quartz tag-index slugs: `tags`, `tags/index`, or `tags/`. */\nexport function isTagPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return slug === \"tags\" || slug === \"tags/index\" || slug.startsWith(\"tags/\");\n}\n\n/** True for Quartz folder-index slugs; delegates to `isFolderPath` from `@quartz-community/utils`. */\nexport function isFolderPageSlug(slug: string | undefined): boolean {\n if (!slug) return false;\n return isFolderPath(slug);\n}\n\nconst byDateAndAlphabeticalWithConfig = (cfg: ResolvedGlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: ResolvedGlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n hideTagPages: false,\n hideFolderPages: false,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as ResolvedGlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\n .filter((p) => !opts.hideTagPages || !isTagPageSlug(p.slug))\n .filter((p) => !opts.hideFolderPages || !isFolderPageSlug(p.slug))\n .filter(opts.filter)\n .sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file