diff --git a/app/entities/users/page.mdx b/app/entities/users/page.mdx index 3b16c29..8740711 100644 --- a/app/entities/users/page.mdx +++ b/app/entities/users/page.mdx @@ -11,7 +11,7 @@ export const metadata = { - + A new contact was created. @@ -25,8 +25,7 @@ export const metadata = { "type": "User", "uri": "https://social.lysand.org/users/018ec082-0ae1-761c-b2c5-22275a611771", "created_at": "2024-04-09T01:38:51.743Z", - // [!code focus:10] - "avatar": { + "avatar": { // [!code focus:100] "application/octet-stream": { "content": "https://avatars.githubusercontent.com/u/30842467?v=4" } diff --git a/bun.lockb b/bun.lockb index 8ee2aa8..2351867 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/mdx/rehype.mjs b/mdx/rehype.mjs index a842c52..273b1ae 100644 --- a/mdx/rehype.mjs +++ b/mdx/rehype.mjs @@ -1,8 +1,13 @@ +import { + transformerMetaHighlight, + transformerNotationFocus, + transformerNotationHighlight, +} from "@shikijs/transformers"; import { slugifyWithCounter } from "@sindresorhus/slugify"; import * as acorn from "acorn"; import { toString as mdastToString } from "mdast-util-to-string"; import { mdxAnnotations } from "mdx-annotations"; -import shiki from "shiki"; +import { createCssVariablesTheme, createHighlighter } from "shiki"; import { visit } from "unist-util-visit"; function rehypeParseCodeBlocks() { @@ -17,14 +22,31 @@ function rehypeParseCodeBlocks() { }; } -let highlighter; +const myTheme = createCssVariablesTheme({ + name: "css-variables", + variablePrefix: "--shiki-", + variableDefaults: {}, + fontStyle: true, +}); + +const highlighter = await createHighlighter({ + langs: [ + "typescript", + "javascript", + "json", + "css", + "html", + "json5", + "jsonc", + "bash", + "php", + "python", + ], + themes: [myTheme], +}); function rehypeShiki() { return async (tree) => { - highlighter = - highlighter ?? - (await shiki.getHighlighter({ theme: "css-variables" })); - visit(tree, "element", (node) => { if ( node.tagName === "pre" && @@ -36,18 +58,17 @@ function rehypeShiki() { node.properties.code = textNode.value; if (node.properties.language) { - const tokens = highlighter.codeToThemedTokens( - textNode.value, - node.properties.language, - ); - - textNode.value = shiki.renderToHtml(tokens, { - elements: { - pre: ({ children }) => children, - code: ({ children }) => children, - line: ({ children }) => `${children}`, - }, + const html = highlighter.codeToHtml(textNode.value, { + lang: node.properties.language, + theme: myTheme, + transformers: [ + transformerNotationFocus(), + transformerNotationHighlight(), + transformerMetaHighlight(), + ], }); + + textNode.value = html; } } }); diff --git a/package.json b/package.json index af9cae2..5e54148 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "@mdx-js/loader": "^3.0.1", "@mdx-js/react": "^3.0.1", "@next/mdx": "^14.2.5", - "@shikijs/rehype": "^1.11.0", "@sindresorhus/slugify": "^2.2.1", "@tailwindcss/typography": "^0.5.13", "@types/mdx": "^2.0.13", @@ -42,7 +41,7 @@ "remark": "^15.0.1", "remark-gfm": "^4.0.0", "remark-mdx": "^3.0.1", - "shiki": "0.14.7", + "shiki": "^1.11.0", "simple-functional-loader": "^1.2.1", "tailwindcss": "^3.4.6", "typescript": "^5.5.3", @@ -52,6 +51,7 @@ }, "devDependencies": { "@biomejs/biome": "^1.8.3", + "@shikijs/transformers": "^1.11.0", "eslint": "^9.7.0", "eslint-config-next": "^14.2.5", "prettier": "^3.3.3", diff --git a/styles/tailwind.css b/styles/tailwind.css index bfc9612..3bbd214 100644 --- a/styles/tailwind.css +++ b/styles/tailwind.css @@ -14,6 +14,75 @@ [inert] ::-webkit-scrollbar { display: none; } + + .prose [class*='language-'] code .highlighted { + background-color: var(--vp-code-line-highlight-color); + transition: background-color 0.5s; + margin: 0 -24px; + padding: 0 24px; + width: calc(100% + 48px); + display: inline-block; + } + + .prose [class*='language-'] code .highlighted.error { + background-color: var(--vp-code-line-error-color); + } + + .prose [class*='language-'] code .highlighted.warning { + background-color: var(--vp-code-line-warning-color); + } + + .prose [class*='language-'] code .diff { + transition: background-color 0.5s; + margin: 0 -24px; + padding: 0 24px; + width: calc(100% + 48px); + display: inline-block; + } + + .prose [class*='language-'] code .diff:before { + position: absolute; + left: 10px; + } + + .prose [class*='language-'] .has-focused .line:not(.focused) { + filter: blur(0.095rem); + opacity: 0.4; + transition: + filter 0.35s, + opacity 0.35s; + } + + .prose [class*='language-'] .has-focused .line:not(.focused) { + opacity: 0.7; + transition: + filter 0.35s, + opacity 0.35s; + } + + .prose [class*='language-']:hover .has-focused .line:not(.focused) { + filter: blur(0); + opacity: 1; + } + + .prose [class*='language-'] code .diff.remove { + background-color: var(--vp-code-line-diff-remove-color); + opacity: 0.7; + } + + .prose [class*='language-'] code .diff.remove:before { + content: '-'; + color: var(--vp-code-line-diff-remove-symbol-color); + } + + .prose [class*='language-'] code .diff.add { + background-color: var(--vp-code-line-diff-add-color); + } + + .prose [class*='language-'] code .diff.add:before { + content: '+'; + color: var(--vp-code-line-diff-add-symbol-color); + } } @tailwind base;