Files
shadcn-ui/apps/www/contentlayer.config.js
shadcn 2fade2326a feat(shadcn): add css props to schema (#7072)
* feat(shadcn): add css props to schema

* fix: types
2025-03-28 17:48:59 +04:00

176 lines
4.5 KiB
JavaScript

import { getHighlighter } from "@shikijs/compat"
import {
defineDocumentType,
defineNestedType,
makeSource,
} from "contentlayer2/source-files"
import rehypeAutolinkHeadings from "rehype-autolink-headings"
import rehypePrettyCode from "rehype-pretty-code"
import rehypeSlug from "rehype-slug"
import { codeImport } from "remark-code-import"
import remarkGfm from "remark-gfm"
import { visit } from "unist-util-visit"
import { rehypeComponent } from "./lib/rehype-component"
import { rehypeNpmCommand } from "./lib/rehype-npm-command"
/** @type {import('contentlayer/source-files').ComputedFields} */
const computedFields = {
slug: {
type: "string",
resolve: (doc) => `/${doc._raw.flattenedPath}`,
},
slugAsParams: {
type: "string",
resolve: (doc) => doc._raw.flattenedPath.split("/").slice(1).join("/"),
},
}
const LinksProperties = defineNestedType(() => ({
name: "LinksProperties",
fields: {
doc: {
type: "string",
},
api: {
type: "string",
},
},
}))
export const Doc = defineDocumentType(() => ({
name: "Doc",
filePathPattern: `docs/**/*.mdx`,
contentType: "mdx",
fields: {
title: {
type: "string",
required: true,
},
description: {
type: "string",
required: true,
},
published: {
type: "boolean",
default: true,
},
links: {
type: "nested",
of: LinksProperties,
},
featured: {
type: "boolean",
default: false,
required: false,
},
component: {
type: "boolean",
default: false,
required: false,
},
toc: {
type: "boolean",
default: true,
required: false,
},
},
computedFields,
}))
export default makeSource({
contentDirPath: "./content",
documentTypes: [Doc],
mdx: {
remarkPlugins: [remarkGfm, codeImport],
rehypePlugins: [
rehypeSlug,
rehypeComponent,
() => (tree) => {
visit(tree, (node) => {
if (node?.type === "element" && node?.tagName === "pre") {
const [codeEl] = node.children
if (codeEl.tagName !== "code") {
return
}
if (codeEl.data?.meta) {
// Extract event from meta and pass it down the tree.
const regex = /event="([^"]*)"/
const match = codeEl.data?.meta.match(regex)
if (match) {
node.__event__ = match ? match[1] : null
codeEl.data.meta = codeEl.data.meta.replace(regex, "")
}
}
node.__rawString__ = codeEl.children?.[0].value
node.__src__ = node.properties?.__src__
node.__style__ = node.properties?.__style__
}
})
},
[
rehypePrettyCode,
{
theme: "github-dark-default",
getHighlighter,
onVisitLine(node) {
// Prevent lines from collapsing in `display: grid` mode, and allow empty
// lines to be copy/pasted
if (node.children.length === 0) {
node.children = [{ type: "text", value: " " }]
}
},
onVisitHighlightedLine(node) {
node.properties.className.push("line--highlighted")
},
onVisitHighlightedWord(node) {
node.properties.className = ["word--highlighted"]
},
},
],
() => (tree) => {
visit(tree, (node) => {
if (node?.type === "element" && node?.tagName === "div") {
if (!("data-rehype-pretty-code-fragment" in node.properties)) {
return
}
const preElement = node.children.at(-1)
if (preElement.tagName !== "pre") {
return
}
preElement.properties["__withMeta__"] =
node.children.at(0).tagName === "div"
preElement.properties["__rawString__"] = node.__rawString__
if (node.__src__) {
preElement.properties["__src__"] = node.__src__
}
if (node.__event__) {
preElement.properties["__event__"] = node.__event__
}
if (node.__style__) {
preElement.properties["__style__"] = node.__style__
}
}
})
},
rehypeNpmCommand,
[
rehypeAutolinkHeadings,
{
properties: {
className: ["subheading-anchor"],
ariaLabel: "Link to section",
},
},
],
],
},
})