From 0703f64b0a10a4dfccce8c79313e406f95c34bfc Mon Sep 17 00:00:00 2001 From: saberzero1 Date: Sat, 14 Mar 2026 21:56:19 +0100 Subject: [PATCH] chore: commit dist/ and remove prepare script Pre-built output is now committed to the repository so that Quartz can skip the build step during plugin installation. The prepare script is removed to prevent redundant builds when installing from npm/git. --- .gitignore | 1 - dist/components/index.d.ts | 2 + dist/components/index.js | 113 +++++++++++++++++++++++++++++++++++ dist/components/index.js.map | 1 + dist/index.d.ts | 9 +++ dist/index.js | 113 +++++++++++++++++++++++++++++++++++ dist/index.js.map | 1 + package-lock.json | 7 +-- package.json | 1 - 9 files changed, 242 insertions(+), 6 deletions(-) create mode 100644 dist/components/index.d.ts create mode 100644 dist/components/index.js create mode 100644 dist/components/index.js.map create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/index.js.map diff --git a/.gitignore b/.gitignore index 657842b..ef88793 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ node_modules/ .pnp.js # Build output -dist/ build/ *.tsbuildinfo diff --git a/dist/components/index.d.ts b/dist/components/index.d.ts new file mode 100644 index 0000000..6c10425 --- /dev/null +++ b/dist/components/index.d.ts @@ -0,0 +1,2 @@ +export { Backlinks, BacklinksOptions } from '../index.js'; +import '@quartz-community/types'; diff --git a/dist/components/index.js b/dist/components/index.js new file mode 100644 index 0000000..ce3eb62 --- /dev/null +++ b/dist/components/index.js @@ -0,0 +1,113 @@ +import { simplifySlug as simplifySlug$1, joinSegments } from '@quartz-community/utils'; +import { jsxs, jsx } from 'preact/jsx-runtime'; + +// src/util/lang.ts +function classNames(...classes) { + return classes.filter(Boolean).join(" "); +} + +// src/i18n/locales/en-US.ts +var en_US_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "No backlinks found" + } + } +}; + +// src/i18n/index.ts +var locales = { + "en-US": en_US_default +}; +function i18n(locale) { + return locales[locale] || en_US_default; +} + +// src/components/styles/backlinks.scss +var backlinks_default = ".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}"; +function simplifySlug(fp) { + return simplifySlug$1(fp); +} +function resolveRelative(current, target) { + const simplified = simplifySlug(target); + const rootPath = pathToRoot(current); + return joinSegments(rootPath, simplified); +} +function pathToRoot(slug) { + let rootPath = slug.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); + if (rootPath.length === 0) { + rootPath = "."; + } + return rootPath; +} +var OverflowList = ({ + children, + ...props +}) => { + return /* @__PURE__ */ jsxs("ul", { ...props, class: [props.class, "overflow"].filter(Boolean).join(" "), id: props.id, children: [ + children, + /* @__PURE__ */ jsx("li", { class: "overflow-end" }) + ] }); +}; +var numLists = 0; +var OverflowList_default = () => { + const id = `list-${numLists++}`; + return { + OverflowList: (props) => /* @__PURE__ */ jsx(OverflowList, { ...props, id }), + overflowListAfterDOMLoaded: ` +document.addEventListener("nav", (e) => { + const observer = new IntersectionObserver((entries) => { + for (const entry of entries) { + const parentUl = entry.target.parentElement + if (!parentUl) return + if (entry.isIntersecting) { + parentUl.classList.remove("gradient-active") + } else { + parentUl.classList.add("gradient-active") + } + } + }) + + const ul = document.getElementById("${id}") + if (!ul) return + + const end = ul.querySelector(".overflow-end") + if (!end) return + + observer.observe(end) +}) +` + }; +}; +var defaultOptions = { + hideWhenEmpty: true +}; +var Backlinks_default = ((opts) => { + const options = { ...defaultOptions, ...opts }; + const { OverflowList: OverflowList2, overflowListAfterDOMLoaded } = OverflowList_default(); + const Backlinks = ({ + fileData, + allFiles, + displayClass, + cfg + }) => { + const slug = simplifySlug(fileData.slug); + const locale = cfg.locale ?? "en-US"; + const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)); + if (options.hideWhenEmpty && backlinkFiles.length === 0) { + return null; + } + return /* @__PURE__ */ jsxs("div", { class: classNames(displayClass, "backlinks"), children: [ + /* @__PURE__ */ jsx("h3", { children: i18n(locale).components.backlinks.title }), + /* @__PURE__ */ jsx(OverflowList2, { children: backlinkFiles.length > 0 ? backlinkFiles.map((f) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: resolveRelative(fileData.slug, f.slug), class: "internal", children: f.frontmatter?.title }) })) : /* @__PURE__ */ jsx("li", { children: i18n(locale).components.backlinks.noBacklinksFound }) }) + ] }); + }; + Backlinks.css = backlinks_default; + Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded; + return Backlinks; +}); + +export { Backlinks_default as Backlinks }; +//# sourceMappingURL=index.js.map +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/components/index.js.map b/dist/components/index.js.map new file mode 100644 index 0000000..732deee --- /dev/null +++ b/dist/components/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/util/lang.ts","../../src/i18n/locales/en-US.ts","../../src/i18n/index.ts","../../src/components/styles/backlinks.scss","../../src/util/path.ts","../../src/components/OverflowList.tsx","../../src/components/Backlinks.tsx"],"names":["utilSimplifySlug","OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n",".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\n/**\n * Simplifies a full slug by removing the '/index' suffix.\n * Uses the utility from @quartz-community/utils.\n */\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\n/**\n * Resolves a relative path from current slug to target slug.\n * @param current - The current page's slug\n * @param target - The target page's slug\n * @returns A relative path like \"../..\" or \"./page\"\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\n/**\n * Gets the path to root from a given slug.\n * For example, \"a/b/c\" becomes \"../../..\"\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","import type { JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
    \n {children}\n
  • \n
\n );\n};\n\nlet numLists = 0;\nexport default () => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n })\n\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n observer.observe(end)\n})\n`,\n };\n};\n","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/backlinks.scss\";\nimport { resolveRelative, simplifySlug } from \"../util/path\";\nimport OverflowListFactory from \"./OverflowList\";\n\nexport interface BacklinksOptions {\n hideWhenEmpty: boolean;\n}\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\nconst defaultOptions: BacklinksOptions = {\n hideWhenEmpty: true,\n};\n\nexport default ((opts?: Partial) => {\n const options: BacklinksOptions = { ...defaultOptions, ...opts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const Backlinks: QuartzComponent = ({\n fileData,\n allFiles,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const slug = simplifySlug(fileData.slug as string);\n const locale = cfg.locale ?? \"en-US\";\n const backlinkFiles = (\n allFiles as Array<{ links?: string[]; slug?: string; frontmatter?: { title?: string } }>\n ).filter((file) => file.links?.includes(slug));\n if (options.hideWhenEmpty && backlinkFiles.length === 0) {\n return null;\n }\n return (\n
\n

{i18n(locale).components.backlinks.title}

\n \n {backlinkFiles.length > 0 ? (\n backlinkFiles.map((f) => (\n
  • \n \n {f.frontmatter?.title}\n \n
  • \n ))\n ) : (\n
  • {i18n(locale).components.backlinks.noBacklinksFound}
  • \n )}\n
    \n
    \n );\n };\n\n Backlinks.css = style;\n Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded;\n\n return Backlinks;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..fc8c80f --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,9 @@ +import { QuartzComponent } from '@quartz-community/types'; +export { QuartzComponent, QuartzComponentProps, StringResource } from '@quartz-community/types'; + +interface BacklinksOptions { + hideWhenEmpty: boolean; +} +declare const _default: (opts?: Partial) => QuartzComponent; + +export { _default as Backlinks, type BacklinksOptions }; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..ce3eb62 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,113 @@ +import { simplifySlug as simplifySlug$1, joinSegments } from '@quartz-community/utils'; +import { jsxs, jsx } from 'preact/jsx-runtime'; + +// src/util/lang.ts +function classNames(...classes) { + return classes.filter(Boolean).join(" "); +} + +// src/i18n/locales/en-US.ts +var en_US_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "No backlinks found" + } + } +}; + +// src/i18n/index.ts +var locales = { + "en-US": en_US_default +}; +function i18n(locale) { + return locales[locale] || en_US_default; +} + +// src/components/styles/backlinks.scss +var backlinks_default = ".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}"; +function simplifySlug(fp) { + return simplifySlug$1(fp); +} +function resolveRelative(current, target) { + const simplified = simplifySlug(target); + const rootPath = pathToRoot(current); + return joinSegments(rootPath, simplified); +} +function pathToRoot(slug) { + let rootPath = slug.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); + if (rootPath.length === 0) { + rootPath = "."; + } + return rootPath; +} +var OverflowList = ({ + children, + ...props +}) => { + return /* @__PURE__ */ jsxs("ul", { ...props, class: [props.class, "overflow"].filter(Boolean).join(" "), id: props.id, children: [ + children, + /* @__PURE__ */ jsx("li", { class: "overflow-end" }) + ] }); +}; +var numLists = 0; +var OverflowList_default = () => { + const id = `list-${numLists++}`; + return { + OverflowList: (props) => /* @__PURE__ */ jsx(OverflowList, { ...props, id }), + overflowListAfterDOMLoaded: ` +document.addEventListener("nav", (e) => { + const observer = new IntersectionObserver((entries) => { + for (const entry of entries) { + const parentUl = entry.target.parentElement + if (!parentUl) return + if (entry.isIntersecting) { + parentUl.classList.remove("gradient-active") + } else { + parentUl.classList.add("gradient-active") + } + } + }) + + const ul = document.getElementById("${id}") + if (!ul) return + + const end = ul.querySelector(".overflow-end") + if (!end) return + + observer.observe(end) +}) +` + }; +}; +var defaultOptions = { + hideWhenEmpty: true +}; +var Backlinks_default = ((opts) => { + const options = { ...defaultOptions, ...opts }; + const { OverflowList: OverflowList2, overflowListAfterDOMLoaded } = OverflowList_default(); + const Backlinks = ({ + fileData, + allFiles, + displayClass, + cfg + }) => { + const slug = simplifySlug(fileData.slug); + const locale = cfg.locale ?? "en-US"; + const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)); + if (options.hideWhenEmpty && backlinkFiles.length === 0) { + return null; + } + return /* @__PURE__ */ jsxs("div", { class: classNames(displayClass, "backlinks"), children: [ + /* @__PURE__ */ jsx("h3", { children: i18n(locale).components.backlinks.title }), + /* @__PURE__ */ jsx(OverflowList2, { children: backlinkFiles.length > 0 ? backlinkFiles.map((f) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: resolveRelative(fileData.slug, f.slug), class: "internal", children: f.frontmatter?.title }) })) : /* @__PURE__ */ jsx("li", { children: i18n(locale).components.backlinks.noBacklinksFound }) }) + ] }); + }; + Backlinks.css = backlinks_default; + Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded; + return Backlinks; +}); + +export { Backlinks_default as Backlinks }; +//# sourceMappingURL=index.js.map +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..60a5b75 --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/util/lang.ts","../src/i18n/locales/en-US.ts","../src/i18n/index.ts","../src/components/styles/backlinks.scss","../src/util/path.ts","../src/components/OverflowList.tsx","../src/components/Backlinks.tsx"],"names":["utilSimplifySlug","OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n",".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\n/**\n * Simplifies a full slug by removing the '/index' suffix.\n * Uses the utility from @quartz-community/utils.\n */\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\n/**\n * Resolves a relative path from current slug to target slug.\n * @param current - The current page's slug\n * @param target - The target page's slug\n * @returns A relative path like \"../..\" or \"./page\"\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\n/**\n * Gets the path to root from a given slug.\n * For example, \"a/b/c\" becomes \"../../..\"\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","import type { JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
      \n {children}\n
    • \n
    \n );\n};\n\nlet numLists = 0;\nexport default () => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n })\n\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n observer.observe(end)\n})\n`,\n };\n};\n","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/backlinks.scss\";\nimport { resolveRelative, simplifySlug } from \"../util/path\";\nimport OverflowListFactory from \"./OverflowList\";\n\nexport interface BacklinksOptions {\n hideWhenEmpty: boolean;\n}\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\nconst defaultOptions: BacklinksOptions = {\n hideWhenEmpty: true,\n};\n\nexport default ((opts?: Partial) => {\n const options: BacklinksOptions = { ...defaultOptions, ...opts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const Backlinks: QuartzComponent = ({\n fileData,\n allFiles,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const slug = simplifySlug(fileData.slug as string);\n const locale = cfg.locale ?? \"en-US\";\n const backlinkFiles = (\n allFiles as Array<{ links?: string[]; slug?: string; frontmatter?: { title?: string } }>\n ).filter((file) => file.links?.includes(slug));\n if (options.hideWhenEmpty && backlinkFiles.length === 0) {\n return null;\n }\n return (\n
    \n

    {i18n(locale).components.backlinks.title}

    \n \n {backlinkFiles.length > 0 ? (\n backlinkFiles.map((f) => (\n
  • \n \n {f.frontmatter?.title}\n \n
  • \n ))\n ) : (\n
  • {i18n(locale).components.backlinks.noBacklinksFound}
  • \n )}\n
    \n
    \n );\n };\n\n Backlinks.css = style;\n Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded;\n\n return Backlinks;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7609d75..619838c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,7 @@ "license": "MIT", "dependencies": { "@quartz-community/types": "github:quartz-community/types", - "@quartz-community/utils": "github:quartz-community/utils", - "tsup": "^8.5.0", - "typescript": "^5.9.3" + "@quartz-community/utils": "github:quartz-community/utils" }, "devDependencies": { "@types/hast": "^3.0.4", @@ -25,6 +23,8 @@ "preact": "^10.28.2", "prettier": "^3.6.2", "sass": "^1.97.3", + "tsup": "^8.5.0", + "typescript": "^5.9.3", "vitest": "^2.1.9" }, "engines": { @@ -4045,7 +4045,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", diff --git a/package.json b/package.json index 5c18551..3aa1beb 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,6 @@ "sideEffects": false, "scripts": { "build": "tsup", - "prepare": "npm run build", "dev": "tsup --watch", "lint": "eslint . --max-warnings=0", "format": "prettier . --check",