From af30701a2118510f206c9f358d9c4da19f335849 Mon Sep 17 00:00:00 2001 From: Luka <47296785+lukadev-0@users.noreply.github.com> Date: Sat, 30 Nov 2024 19:23:14 +0100 Subject: [PATCH] feat: add admonitions to main website (#11) * feat: add admonitions * feat: better admonition styles * feat: more admonition styles --- website/bun.lockb | Bin 247440 -> 253320 bytes website/package.json | 7 +++ website/src/admonitions.css | 108 ++++++++++++++++++++++++++++++++++++ website/src/app.css | 2 + website/src/app.d.ts | 2 + website/src/lib/markdown.ts | 98 ++++++++++++++++++++++++++++++-- 6 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 website/src/admonitions.css diff --git a/website/bun.lockb b/website/bun.lockb index 1a31e23bb8f887ce591729405699191bc113ef4d..25a0afb3ef72bc1ff37ae24fb8019457e37821c2 100755 GIT binary patch delta 49811 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 ox^3T~th_5i#n6?ol%Z01y+g?V1N}=OLjV8( diff --git a/website/package.json b/website/package.json index a42fa36..816e031 100644 --- a/website/package.json +++ b/website/package.json @@ -24,6 +24,9 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.46.0", "globals": "^15.11.0", + "mdast": "^3.0.0", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-hast": "^13.2.0", "mdsvex": "^0.12.3", "prettier": "^3.3.3", "prettier-plugin-svelte": "^3.2.7", @@ -48,15 +51,19 @@ "hast-util-heading": "^3.0.0", "hast-util-heading-rank": "^3.0.0", "hast-util-to-text": "^4.0.2", + "hastscript": "^9.0.0", + "lucide-static": "^0.462.0", "lucide-svelte": "^0.446.0", "rehype-infer-description-meta": "^2.0.0", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "rehype-slug": "^6.0.0", "rehype-stringify": "^10.0.1", + "remark-directive": "^3.0.0", "remark-frontmatter": "^5.0.0", "remark-gemoji": "^8.0.0", "remark-gfm": "^4.0.0", + "remark-github-admonitions-to-directives": "^2.1.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "shiki": "^1.22.2", diff --git a/website/src/admonitions.css b/website/src/admonitions.css new file mode 100644 index 0000000..7826766 --- /dev/null +++ b/website/src/admonitions.css @@ -0,0 +1,108 @@ +.admonition { + @apply my-4 rounded-sm px-4 py-3 text-[--tw-prose-body] prose-p:my-2 prose-pre:my-4; + @apply border-l-4 border-[--admonition-border]; + @apply bg-[--admonition-bg]; + + @apply [--shiki-background:theme(colors.white/0.2)]; + @apply dark:[--shiki-background:theme(colors.black/0.2)]; + + --tw-prose-body: theme(colors.light); + --tw-prose-headings: theme(colors.light); + --tw-prose-lead: theme(colors.light); + --tw-prose-links: var(--admonition-text); + --tw-prose-bold: theme(colors.light); + --tw-prose-counters: theme(colors.light); + --tw-prose-bullets: var(--admonition-border); + --tw-prose-hr: var(--admonition-border); + --tw-prose-quotes: theme(colors.light); + --tw-prose-quote-borders: var(--admonition-border); + --tw-prose-code: theme(colors.light); + --tw-prose-pre-code: theme(colors.light); + --tw-prose-pre-bg: var(--shiki-background); + --tw-prose-th-borders: var(--admonition-border); + --tw-prose-td-borders: var(--admonition-border); +} + +.admonition pre { + @apply border border-[--admonition-border] bg-[--shiki-background]; +} + +.admonition-title { + @apply flex items-center space-x-2 text-lg font-semibold; +} + +.admonition-title * { + color: var(--admonition-text); +} + +.admonition-icon { + @apply inline-block size-6 bg-current; + mask-image: var(--admonition-icon); +} + +.admonition-note { + --admonition-bg: theme(colors.blue.600 / 0.1); + --admonition-border: theme(colors.blue.600 / 0.4); + --admonition-text: theme(colors.blue.950); + --admonition-icon: url(lucide-static/icons/info.svg); +} + +.admonition-tip { + --admonition-bg: theme(colors.green.600 / 0.1); + --admonition-border: theme(colors.green.600 / 0.4); + --admonition-text: theme(colors.green.950); + --admonition-icon: url(lucide-static/icons/lightbulb.svg); +} + +.admonition-info { + --admonition-bg: theme(colors.purple.600 / 0.1); + --admonition-border: theme(colors.purple.600 / 0.4); + --admonition-text: theme(colors.purple.950); + --admonition-icon: url(lucide-static/icons/message-square-warning.svg); +} + +.admonition-warning { + --admonition-bg: theme(colors.yellow.600 / 0.1); + --admonition-border: theme(colors.yellow.600 / 0.4); + --admonition-text: theme(colors.yellow.950); + --admonition-icon: url(lucide-static/icons/triangle-alert.svg); +} + +.admonition-danger { + --admonition-bg: theme(colors.red.600 / 0.1); + --admonition-border: theme(colors.red.600 / 0.4); + --admonition-text: theme(colors.red.950); + --admonition-icon: url(lucide-static/icons/octagon-alert.svg); +} + +@media (prefers-color-scheme: dark) { + .admonition-note { + --admonition-bg: theme(colors.blue.500 / 0.1); + --admonition-border: theme(colors.blue.500 / 0.6); + --admonition-text: theme(colors.blue.100); + } + + .admonition-tip { + --admonition-bg: theme(colors.green.500 / 0.1); + --admonition-border: theme(colors.green.500 / 0.6); + --admonition-text: theme(colors.green.100); + } + + .admonition-info { + --admonition-bg: theme(colors.purple.500 / 0.1); + --admonition-border: theme(colors.purple.500 / 0.6); + --admonition-text: theme(colors.purple.100); + } + + .admonition-warning { + --admonition-bg: theme(colors.yellow.500 / 0.1); + --admonition-border: theme(colors.yellow.500 / 0.6); + --admonition-text: theme(colors.yellow.100); + } + + .admonition-danger { + --admonition-bg: theme(colors.red.500 / 0.1); + --admonition-border: theme(colors.red.500 / 0.6); + --admonition-text: theme(colors.red.100); + } +} diff --git a/website/src/app.css b/website/src/app.css index 0883f6a..35cb953 100644 --- a/website/src/app.css +++ b/website/src/app.css @@ -2,6 +2,8 @@ @import "tailwindcss/components"; @import "tailwindcss/utilities"; +@import "admonitions.css"; + :root { --color-background: 255 245 230; --color-card: 245 230 210; diff --git a/website/src/app.d.ts b/website/src/app.d.ts index f70d0e1..6463062 100644 --- a/website/src/app.d.ts +++ b/website/src/app.d.ts @@ -1,3 +1,5 @@ +/// + // See https://kit.svelte.dev/docs/types#app // for information about these interfaces declare global { diff --git a/website/src/lib/markdown.ts b/website/src/lib/markdown.ts index 2cab9b2..044a35d 100644 --- a/website/src/lib/markdown.ts +++ b/website/src/lib/markdown.ts @@ -3,14 +3,19 @@ import type { Nodes } from "hast" import { heading } from "hast-util-heading" import { headingRank } from "hast-util-heading-rank" import { toText } from "hast-util-to-text" +import { h, type Child } from "hastscript" +import type { ContainerDirective } from "mdast-util-directive" +import type { Handler } from "mdast-util-to-hast" import rehypeInferDescriptionMeta from "rehype-infer-description-meta" import rehypeRaw from "rehype-raw" -import rehypeSanitize from "rehype-sanitize" +import rehypeSanitize, { defaultSchema } from "rehype-sanitize" import rehypeSlug from "rehype-slug" import rehypeStringify from "rehype-stringify" +import remarkDirective from "remark-directive" import remarkFrontmatter from "remark-frontmatter" import remarkGemoji from "remark-gemoji" import remarkGfm from "remark-gfm" +import remarkGithubAdmonitionsToDirectives from "remark-github-admonitions-to-directives" import remarkParse from "remark-parse" import remarkRehype from "remark-rehype" import { createCssVariablesTheme, createHighlighter } from "shiki" @@ -23,15 +28,92 @@ const highlighter = createHighlighter({ langs: [], }) +const ADMONITION_TYPES = { + note: { + label: "Note", + }, + tip: { + label: "Tip", + }, + info: { + label: "Info", + }, + warning: { + label: "Warning", + }, + danger: { + label: "Danger", + }, +} + +const containerDirectiveHandler: Handler = (state, node: ContainerDirective) => { + const type = node.name as keyof typeof ADMONITION_TYPES + if (!type || !(type in ADMONITION_TYPES)) { + return + } + + const typeInfo = ADMONITION_TYPES[type] + + let label: Child = typeInfo.label + + const firstChild = node.children[0] + if (firstChild?.type === "paragraph" && firstChild.data?.directiveLabel) { + node.children.shift() + label = state.all(firstChild) + } + + return h( + "div", + { + class: `admonition admonition-${type}`, + }, + [ + h( + "p", + { + class: "admonition-title", + }, + [ + h("span", { + class: "admonition-icon", + }), + h( + "span", + { + class: "admonition-label", + }, + label, + ), + ], + ), + state.all(node), + ], + ) +} + +const sanitizeSchema: typeof defaultSchema = { + ...defaultSchema, + attributes: { + ...defaultSchema.attributes, + "*": [...(defaultSchema.attributes?.["*"] ?? []), ["className", "admonition", /^admonition-/]], + }, +} + +const remarkRehypeHandlers = { + containerDirective: containerDirectiveHandler, +} + export const markdown = (async () => { return unified() .use(remarkParse) .use(remarkFrontmatter) .use(remarkGfm) .use(remarkGemoji) - .use(remarkRehype, { allowDangerousHtml: true }) + .use(remarkGithubAdmonitionsToDirectives) + .use(remarkDirective) + .use(remarkRehype, { allowDangerousHtml: true, handlers: remarkRehypeHandlers }) .use(rehypeRaw) - .use(rehypeSanitize) + .use(rehypeSanitize, sanitizeSchema) .use(rehypeShikiFromHighlighter, await highlighter, { lazy: true, theme: createCssVariablesTheme({ @@ -58,7 +140,13 @@ export const docsMarkdown = (async () => { .use(remarkFrontmatter) .use(remarkGfm) .use(remarkGemoji) - .use(remarkRehype, { allowDangerousHtml: true, clobberPrefix: "" }) + .use(remarkGithubAdmonitionsToDirectives) + .use(remarkDirective) + .use(remarkRehype, { + allowDangerousHtml: true, + clobberPrefix: "", + handlers: remarkRehypeHandlers, + }) .use(rehypeSlug) .use(() => (node, file) => { const toc: TocItem[] = [] @@ -97,7 +185,7 @@ export const docsMarkdown = (async () => { }) as Node }) .use(rehypeRaw) - .use(rehypeSanitize) + .use(rehypeSanitize, sanitizeSchema) .use(rehypeShikiFromHighlighter, await highlighter, { lazy: true, theme: createCssVariablesTheme({