diff --git a/libs/registry/.vscode/settings.json b/libs/registry/.vscode/settings.json index de91a5d..85c920b 100644 --- a/libs/registry/.vscode/settings.json +++ b/libs/registry/.vscode/settings.json @@ -1,3 +1,10 @@ { - "tailwindCSS.classFunctions": ["cva", "cx"] + "tailwindCSS.classFunctions": [ + "cva", + "cx" + ], + "workbench.editorAssociations": { + // "*.md": "vscode.markdown.preview.editor" // 预览打开 + "*.md": "default" // 默认打开 + } } \ No newline at end of file diff --git a/libs/registry/astro.config.mjs b/libs/registry/astro.config.mjs index eabfb52..62b6d77 100644 --- a/libs/registry/astro.config.mjs +++ b/libs/registry/astro.config.mjs @@ -11,7 +11,22 @@ const isDev = process.env.NODE_ENV === 'development'; export default defineConfig({ // ... // site: 'https://kevisual.xiongxiao.me/root/astro/', - base: isDev ? undefined : pkgs.basename, + base: pkgs.basename, + markdown: { + // 适用于 MDX 和普通 Markdown 的配置 + syntaxHighlight: 'shiki', + shikiConfig: { + theme: 'nord', + }, + remarkPlugins: [ + 'remark-gfm', // GitHub Flavored Markdown + ['remark-toc', { headings: ['h2', 'h3'] }], // 目录生成 + ], + rehypePlugins: [ + 'rehype-slug', // 为标题添加 ID + 'rehype-autolink-headings', // 为标题添加链接 + ], + }, integrations: [ mdx(), react(), // diff --git a/libs/registry/package.json b/libs/registry/package.json index afb414f..bb905fa 100644 --- a/libs/registry/package.json +++ b/libs/registry/package.json @@ -3,6 +3,7 @@ "version": "0.0.1", "description": "", "main": "index.js", + "basename": "/root/registry", "scripts": { "dev": "astro dev", "build": "paraglide-js compile --project ./project.inlang --outdir ./src/paraglide && astro build", @@ -27,6 +28,10 @@ "@tailwindcss/vite": "^4.1.6", "@types/react": "^19.1.3", "astro": "^5.7.12", + "rehype-autolink-headings": "^7.1.0", + "rehype-slug": "^6.0.0", + "remark-gfm": "^4.0.1", + "remark-toc": "^9.0.0", "tailwindcss": "^4.1.6", "tw-animate-css": "^1.2.9" }, diff --git a/libs/registry/registry/astro/layouts/mdx/main.astro b/libs/registry/registry/astro/layouts/mdx/main.astro new file mode 100644 index 0000000..fca4e52 --- /dev/null +++ b/libs/registry/registry/astro/layouts/mdx/main.astro @@ -0,0 +1,36 @@ +--- +export interface Props { + children: any; +} +--- + + +
+ + Docs + +
+ +
+ +

My Site Header

+
+
+
+ +
+ + + + + diff --git a/libs/registry/registry/modules/basename.ts b/libs/registry/registry/modules/basename.ts index 6da2da4..e647be9 100644 --- a/libs/registry/registry/modules/basename.ts +++ b/libs/registry/registry/modules/basename.ts @@ -1 +1,4 @@ -export const basename = DEV_SERVER ? '' : '/root/center'; +// @ts-ignore +export const basename = BASE_NAME; + +console.log(basename); \ No newline at end of file diff --git a/libs/registry/src/content.config.ts b/libs/registry/src/content.config.ts new file mode 100644 index 0000000..46bf8eb --- /dev/null +++ b/libs/registry/src/content.config.ts @@ -0,0 +1,14 @@ +// @ts-ignore +import { defineCollection, z } from 'astro:content'; +import { glob, file } from 'astro/loaders'; // 不适用于旧版 API + +const blog = defineCollection({ + loader: glob({ pattern: '**/*.md', base: './src/data/blog' }), + schema: z.object({ + title: z.string(), + description: z.string(), + // pubDate: z.coerce.date(), + // updatedDate: z.coerce.date().optional(), + }), +}); +export const collections = { blog }; diff --git a/libs/registry/src/data/blog/1.md b/libs/registry/src/data/blog/1.md new file mode 100644 index 0000000..4ec0b9a --- /dev/null +++ b/libs/registry/src/data/blog/1.md @@ -0,0 +1,5 @@ +--- +title: My Blog Post +description: This is a post on My Blog about win-win survival strategies. +--- +Your blog post content here. \ No newline at end of file diff --git a/libs/registry/src/data/blog/shadcn-init.md b/libs/registry/src/data/blog/shadcn-init.md new file mode 100644 index 0000000..c549490 --- /dev/null +++ b/libs/registry/src/data/blog/shadcn-init.md @@ -0,0 +1,10 @@ +--- +title: test dir +description: This is a post on My Blog about win-win survival strategies. +--- + +# Download shadcn + +```sh +pnpm dlx shadcn@latest add https://kevisual.xiongxiao.me/root/registry/r/basename.json +``` diff --git a/libs/registry/src/pages/demo/[id].astro b/libs/registry/src/pages/demo/[id].astro new file mode 100644 index 0000000..1e73b4b --- /dev/null +++ b/libs/registry/src/pages/demo/[id].astro @@ -0,0 +1,23 @@ +--- +import { getCollection, render } from 'astro:content'; +import Main from '@/registry/astro/layouts/mdx/main.astro'; +// 1. 为每个集合条目生成一个新路径 +export async function getStaticPaths() { + const posts = await getCollection('blog'); + return posts.map((post) => ({ + params: { id: post.id }, + props: { post }, + })); +} +type Post = { + data: { title: string }; +}; +// 2. 对于你的模板,你可以直接从 prop 获取条目 +const { post } = Astro.props as { post: Post }; +const { Content } = await render(post); +--- + +
+

{post.data.title}

+ +
diff --git a/libs/registry/src/pages/demo/index.astro b/libs/registry/src/pages/demo/index.astro new file mode 100644 index 0000000..b420b03 --- /dev/null +++ b/libs/registry/src/pages/demo/index.astro @@ -0,0 +1,17 @@ +--- +import { getCollection } from 'astro:content'; +const posts = await getCollection('blog'); +console.log('post', posts); +import { basename } from '@/registry/modules/basename'; +--- + +

My posts

+ diff --git a/libs/registry/src/pages/examples/markdown.md b/libs/registry/src/pages/examples/markdown.md new file mode 100644 index 0000000..dd9c745 --- /dev/null +++ b/libs/registry/src/pages/examples/markdown.md @@ -0,0 +1,76 @@ +--- +title: Markdown +layout: '@/registry/astro/layouts/mdx/main.astro' +--- + +## Heading 2 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu ante elementum, ultrices massa ut, ornare lacus. Praesent iaculis, ex ac pellentesque malesuada, arcu mi imperdiet purus, et molestie neque leo quis felis. Nunc et odio bibendum, vestibulum elit sit amet, viverra lorem. + +### Heading 3 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu ante elementum, ultrices massa ut, ornare lacus. Praesent iaculis, ex ac pellentesque malesuada, arcu mi imperdiet purus, et molestie neque leo quis felis. Nunc et odio bibendum, vestibulum elit sit amet, viverra lorem. + +#### Heading 4 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu ante elementum, ultrices massa ut, ornare lacus. Praesent iaculis, ex ac pellentesque malesuada, arcu mi imperdiet purus, et molestie neque leo quis felis. Nunc et odio bibendum, vestibulum elit sit amet, viverra lorem. + +##### Heading 5 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu ante elementum, ultrices massa ut, ornare lacus. Praesent iaculis, ex ac pellentesque malesuada, arcu mi imperdiet purus, et molestie neque leo quis felis. Nunc et odio bibendum, vestibulum elit sit amet, viverra lorem. + +###### Heading 6 + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eu ante elementum, ultrices massa ut, ornare lacus. Praesent iaculis, ex ac pellentesque malesuada, arcu mi imperdiet purus, et molestie neque leo quis felis. Nunc et odio bibendum, vestibulum elit sit amet, viverra lorem. + +## Styling text + +Fusce imperdiet, **tellus** ornare tempor _cursus_, tellus ipsum fringilla ~~quam~~, in venenatis neque augue vitae **_turpis_**. Nulla sed neque volutpat, eleifend purus sit amet, porttitor nisi. Ut id sodales lorem. Suspendisse auctor augue nisl, sed placerat enim porttitor at. Etiam eu ipsum suscipit, egestas ante non, eleifend nulla. + +## Quoting text + +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla in enim sem. + +> Mauris dictum augue augue, ut accumsan tellus convallis ut. Nam vitae libero vestibulum, feugiat mi rhoncus, imperdiet dui. In eros diam, sagittis ultrices dolor ac, ultrices cursus sapien. Morbi fringilla porta purus, sed interdum urna luctus vitae. + +## Quoting code + +Curabitur congue ac `enim` id hendrerit. + +```js +const foo = 'bar' +``` + +## Links + +Fusce tincidunt urna at [ultricies](#_) sollicitudin. + +## Lists + +- Lorem +- Ipsum + - Dolor + - Sit +- Amet + 1. Consectetur + 2. Adipiscing + +## Tables + +| Column 1 | Column 2 | Column 3 | Column 4 | +| -------- | -------- | -------- | -------- | +| Cell 1-1 | Cell 1-2 | Cell 1-3 | Cell 1-4 | +| Cell 2-1 | Cell 2-2 | Cell 2-3 | Cell 2-4 | +| Cell 3-1 | Cell 3-2 | Cell 3-3 | Cell 3-4 | +| Cell 4-1 | Cell 4-2 | Cell 4-3 | Cell 4-4 | +| Cell 5-1 | Cell 5-2 | Cell 5-3 | Cell 5-4 | +| Cell 6-1 | Cell 6-2 | Cell 6-3 | Cell 6-4 | + +## Details + +
+Nullam nec posuere lorem. + +Aenean tempor, orci eget ullamcorper luctus, nisl turpis pharetra mauris, sit amet tristique elit orci et sem. Aenean odio purus, suscipit quis accumsan in, blandit at ex. + +
\ No newline at end of file diff --git a/libs/registry/src/pages/shadcn/index.astro b/libs/registry/src/pages/shadcn/index.astro new file mode 100644 index 0000000..9563c81 --- /dev/null +++ b/libs/registry/src/pages/shadcn/index.astro @@ -0,0 +1,11 @@ +--- +// layout: '@/registry/astro/layouts/mdx/main.astro' +import Main from '@/registry/astro/layouts/mdx/main.astro'; +const baseurl = 'http://localhost:4321/r'; +--- + +
+ # Download shadcn ```sh pnpm dlx shadcn@latest add ${baseurl}/basename.json ``` + +

这是默认插槽的内容

+
diff --git a/libs/registry/src/pages/shadcn/index.mdx b/libs/registry/src/pages/shadcn/index.mdx deleted file mode 100644 index 95b7ca9..0000000 --- a/libs/registry/src/pages/shadcn/index.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- ---- - -# Download shadcn - -```sh - -pnpm dlx shadcn@latest add http://localhost:4321/r/basename.json - -``` \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14832e7..d18f6bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,6 +115,18 @@ importers: astro: specifier: ^5.7.12 version: 5.7.12(@types/node@22.15.17)(jiti@2.4.2)(lightningcss@1.29.2)(rollup@4.40.2)(terser@5.36.0)(typescript@5.8.3)(yaml@2.5.1) + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + rehype-slug: + specifier: ^6.0.0 + version: 6.0.0 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 + remark-toc: + specifier: ^9.0.0 + version: 9.0.0 tailwindcss: specifier: ^4.1.6 version: 4.1.6 @@ -1373,6 +1385,9 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/ungap__structured-clone@1.2.0': + resolution: {integrity: sha512-ZoaihZNLeZSxESbk9PUAPZOlSpcKx81I1+4emtULDVmBLkYutTcMlCj2K9VNlf9EWODxdO6gkAqEaLorXwZQVA==} + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -2264,6 +2279,9 @@ packages: hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} @@ -2285,6 +2303,9 @@ packages: hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} @@ -2675,6 +2696,9 @@ packages: mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-toc@7.1.0: + resolution: {integrity: sha512-2TVKotOQzqdY7THOdn2gGzS9d1Sdd66bvxUyw3aNpWfcPXCLYSJCCgfPy30sEtuzkDraJgqF35dzgmz6xlvH/w==} + mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -3782,6 +3806,9 @@ packages: regex@6.0.1: resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} @@ -3791,6 +3818,9 @@ packages: rehype-recma@1.0.0: resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + rehype-slug@6.0.0: + resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} + rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} @@ -3816,6 +3846,9 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-toc@9.0.0: + resolution: {integrity: sha512-KJ9txbo33GjDAV1baHFze7ij4G8c7SGYoY8Kzsm2gzFpbhL/bSoVpMMzGa3vrNDSWASNd/3ppAqL7cP2zD6JIA==} + resize-observer-polyfill@1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} @@ -5525,6 +5558,8 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/ungap__structured-clone@1.2.0': {} + '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} @@ -6719,6 +6754,10 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -6808,6 +6847,10 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: dependencies: '@types/hast': 3.0.4 @@ -7255,6 +7298,16 @@ snapshots: dependencies: '@types/mdast': 4.0.4 + mdast-util-toc@7.1.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/ungap__structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 + github-slugger: 2.0.0 + mdast-util-to-string: 4.0.0 + unist-util-is: 6.0.0 + unist-util-visit: 5.0.0 + mdn-data@2.0.14: {} mdn-data@2.0.28: {} @@ -8542,6 +8595,15 @@ snapshots: dependencies: regex-utilities: 2.3.0 + rehype-autolink-headings@7.1.0: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 + rehype-parse@9.0.1: dependencies: '@types/hast': 3.0.4 @@ -8562,6 +8624,14 @@ snapshots: transitivePeerDependencies: - supports-color + rehype-slug@6.0.0: + dependencies: + '@types/hast': 3.0.4 + github-slugger: 2.0.0 + hast-util-heading-rank: 3.0.0 + hast-util-to-string: 3.0.1 + unist-util-visit: 5.0.0 + rehype-stringify@10.0.1: dependencies: '@types/hast': 3.0.4 @@ -8623,6 +8693,11 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + remark-toc@9.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-toc: 7.1.0 + resize-observer-polyfill@1.5.1: {} resolve-from@4.0.0: {}