From 29815e206b0b486c8fe834538fcd4189005c3456 Mon Sep 17 00:00:00 2001 From: saberzero1 Date: Thu, 16 Apr 2026 15:22:53 +0200 Subject: [PATCH] refactor: reuse upstream types instead of redeclaring them locally Import QuartzComponentConstructor and GlobalConfiguration from @quartz-community/types rather than redeclaring them. Simplify RecentNotesPluginData to an intersection with Record since the redundant fields (slug, filePath, dates, frontmatter) are already declared on QuartzPluginData. The plugin genuinely narrows GlobalConfiguration (it assumes locale and defaultDateType are resolved), so a ResolvedGlobalConfiguration type alias is kept for that assertion. It is a type intersection (not an interface extension) to avoid the DTS emission issue that affected PageList.tsx historically. --- dist/components/index.js.map | 2 +- dist/index.d.ts | 12 +----------- dist/index.js.map | 2 +- src/components/RecentNotes.tsx | 29 ++++++++--------------------- 4 files changed, 11 insertions(+), 34 deletions(-) diff --git a/dist/components/index.js.map b/dist/components/index.js.map index 1948c21..0eef76c 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/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/@quartz-community/utils/src/path.ts","../../src/util/path.ts","../../src/components/styles/recentNotes.scss","../../src/components/RecentNotes.tsx"],"names":["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","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 { slug as slugAnchor } from \"github-slugger\";\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 folderPath = isFolderPath(fplike);\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 simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\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 #.\n * Operates per segment so directory 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 )\n .join(\"/\")\n .replace(/\\/$/, \"\");\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","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 QuartzComponent,\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 { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\ntype RecentNotesPluginData = QuartzPluginData & {\n slug?: string;\n filePath?: string;\n dates?: Record;\n frontmatter?: {\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ninterface GlobalConfiguration {\n locale: string;\n defaultDateType: ValidDateType;\n [key: string]: unknown;\n}\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: 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\nconst byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): 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: GlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\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 unknown as GlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\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/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/@quartz-community/utils/src/path.ts","../../src/util/path.ts","../../src/components/styles/recentNotes.scss","../../src/components/RecentNotes.tsx"],"names":["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","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 { slug as slugAnchor } from \"github-slugger\";\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 folderPath = isFolderPath(fplike);\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 simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\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 #.\n * Operates per segment so directory 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 )\n .join(\"/\")\n .replace(/\\/$/, \"\");\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","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 { 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 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\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 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(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.d.ts b/dist/index.d.ts index b5aefe7..15702a1 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,17 +1,7 @@ import { QuartzPluginData, SortFn, QuartzComponent } from '@quartz-community/types'; export { QuartzComponent, QuartzComponentProps, StringResource } from '@quartz-community/types'; -type RecentNotesPluginData = QuartzPluginData & { - slug?: string; - filePath?: string; - dates?: Record; - frontmatter?: { - title?: string; - tags?: string[]; - [key: string]: unknown; - }; - [key: string]: unknown; -}; +type RecentNotesPluginData = QuartzPluginData & Record; interface RecentNotesOptions { title?: string; limit: number; diff --git a/dist/index.js.map b/dist/index.js.map index 17d296c..6c52359 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/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/@quartz-community/utils/src/path.ts","../src/util/path.ts","../src/components/styles/recentNotes.scss","../src/components/RecentNotes.tsx"],"names":["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","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 { slug as slugAnchor } from \"github-slugger\";\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 folderPath = isFolderPath(fplike);\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 simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\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 #.\n * Operates per segment so directory 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 )\n .join(\"/\")\n .replace(/\\/$/, \"\");\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","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 QuartzComponent,\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 { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\ntype RecentNotesPluginData = QuartzPluginData & {\n slug?: string;\n filePath?: string;\n dates?: Record;\n frontmatter?: {\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ninterface GlobalConfiguration {\n locale: string;\n defaultDateType: ValidDateType;\n [key: string]: unknown;\n}\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: 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\nconst byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): 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: GlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\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 unknown as GlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\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/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/@quartz-community/utils/src/path.ts","../src/util/path.ts","../src/components/styles/recentNotes.scss","../src/components/RecentNotes.tsx"],"names":["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","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 { slug as slugAnchor } from \"github-slugger\";\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 folderPath = isFolderPath(fplike);\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 simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\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 #.\n * Operates per segment so directory 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 )\n .join(\"/\")\n .replace(/\\/$/, \"\");\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","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 { 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 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\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 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(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/src/components/RecentNotes.tsx b/src/components/RecentNotes.tsx index 89add9a..5ed1ac7 100644 --- a/src/components/RecentNotes.tsx +++ b/src/components/RecentNotes.tsx @@ -1,5 +1,7 @@ import type { + GlobalConfiguration, QuartzComponent, + QuartzComponentConstructor, QuartzComponentProps, QuartzPluginData, SortFn, @@ -12,27 +14,12 @@ import { i18n } from "../i18n"; import { resolveRelative } from "../util/path"; import style from "./styles/recentNotes.scss"; -type QuartzComponentConstructor = ( - opts: Options, -) => QuartzComponent; +type RecentNotesPluginData = QuartzPluginData & Record; -type RecentNotesPluginData = QuartzPluginData & { - slug?: string; - filePath?: string; - dates?: Record; - frontmatter?: { - title?: string; - tags?: string[]; - [key: string]: unknown; - }; - [key: string]: unknown; -}; - -interface GlobalConfiguration { +type ResolvedGlobalConfiguration = GlobalConfiguration & { locale: string; defaultDateType: ValidDateType; - [key: string]: unknown; -} +}; export interface RecentNotesOptions { title?: string; @@ -55,7 +42,7 @@ export function filterListedPages(pages: T[]): T[] { return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true); } -const byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): SortFn => { +const byDateAndAlphabeticalWithConfig = (cfg: ResolvedGlobalConfiguration): SortFn => { const sortFn = byDateAndAlphabetical(); return (f1, f2) => sortFn( @@ -64,7 +51,7 @@ const byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): SortFn => { ); }; -const defaultOptions = (cfg: GlobalConfiguration): RecentNotesOptions => ({ +const defaultOptions = (cfg: ResolvedGlobalConfiguration): RecentNotesOptions => ({ limit: 3, linkToMore: false, showTags: true, @@ -79,7 +66,7 @@ export default ((userOpts?: Partial) => { displayClass, cfg, }: QuartzComponentProps & { displayClass?: string }) => { - const globalCfg = cfg as unknown as GlobalConfiguration; + const globalCfg = cfg as ResolvedGlobalConfiguration; const opts = { ...defaultOptions(globalCfg), ...userOpts }; const pages = filterListedPages(allFiles as RecentNotesPluginData[]) .filter(opts.filter)