Skip to content

Commit 61d3f44

Browse files
committed
feat: implement read-more functionality and enhance code group component
1 parent 9538c4e commit 61d3f44

21 files changed

+498
-124
lines changed

.astro/content-modules.mjs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11

22
export default new Map([
3-
["src/content/blog/welcome.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fblog%2Fwelcome.mdx&astroContentModuleFlag=true")],
43
["src/content/docs/framework/blog.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Fblog.mdx&astroContentModuleFlag=true")],
4+
["src/content/docs/framework/docs.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Fdocs.mdx&astroContentModuleFlag=true")],
55
["src/content/docs/framework/configuration.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Fconfiguration.mdx&astroContentModuleFlag=true")],
66
["src/content/docs/framework/getting-started.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Fgetting-started.mdx&astroContentModuleFlag=true")],
7-
["src/content/docs/framework/docs.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Fdocs.mdx&astroContentModuleFlag=true")],
8-
["src/content/docs/framework/project-structure.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Fproject-structure.mdx&astroContentModuleFlag=true")],
97
["src/content/docs/framework/installation.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Finstallation.mdx&astroContentModuleFlag=true")],
10-
["src/content/docs/syntax/alert.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fsyntax%2Falert.mdx&astroContentModuleFlag=true")],
8+
["src/content/docs/framework/project-structure.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fframework%2Fproject-structure.mdx&astroContentModuleFlag=true")],
9+
["src/content/blog/code-tabs.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fblog%2Fcode-tabs.mdx&astroContentModuleFlag=true")],
1110
["src/content/docs/syntax/code-block.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fsyntax%2Fcode-block.mdx&astroContentModuleFlag=true")],
12-
["src/content/docs/syntax/markdown.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fsyntax%2Fmarkdown.mdx&astroContentModuleFlag=true")],
13-
["src/content/docs/syntax/text.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fsyntax%2Ftext.mdx&astroContentModuleFlag=true")]]);
11+
["src/content/blog/welcome.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fblog%2Fwelcome.mdx&astroContentModuleFlag=true")],
12+
["src/content/docs/syntax/alert.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fsyntax%2Falert.mdx&astroContentModuleFlag=true")],
13+
["src/content/docs/syntax/text.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fsyntax%2Ftext.mdx&astroContentModuleFlag=true")],
14+
["src/content/docs/syntax/markdown.mdx", () => import("astro:content-layer-deferred-module?astro%3Acontent-layer-deferred-module=&fileName=src%2Fcontent%2Fdocs%2Fsyntax%2Fmarkdown.mdx&astroContentModuleFlag=true")]]);
1415

.astro/data-store.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

astro.config.mjs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,19 @@ import tailwindcss from '@tailwindcss/vite';
1515
import icon from "astro-icon";
1616
import rehypeCallouts from 'rehype-callouts';
1717
import rehypeMermaid from 'rehype-mermaid';
18+
import remarkDirective from 'remark-directive';
1819
import rehypeCodeGroupReact from './src/lib/plugins/code-group/plugin';
20+
import rehypeReadMoreReact from './src/lib/plugins/read-more/plugin';
21+
import remarkReadMoreDirective from './src/lib/plugins/read-more/remark-directive';
1922

2023
// https://astro.build/config
2124
export default defineConfig({
2225
output: 'static',
23-
integrations: [react(), mdx(), icon()],
26+
integrations: [
27+
react(),
28+
mdx(),
29+
icon()
30+
],
2431

2532
markdown: {
2633
shikiConfig: {
@@ -41,17 +48,21 @@ export default defineConfig({
4148
type: 'shiki',
4249
excludeLangs: ['mermaid'],
4350
},
51+
remarkPlugins: [
52+
remarkDirective,
53+
remarkReadMoreDirective
54+
],
4455
rehypePlugins: [
4556
rehypeMermaid,
4657
[rehypeCallouts, {
4758
customClassNames: {
48-
4959
calloutClass: "callout",
5060
calloutTitleClass: "callout-title",
5161
calloutContentClass: "callout-content",
5262
}
5363
}],
54-
rehypeCodeGroupReact
64+
rehypeCodeGroupReact,
65+
rehypeReadMoreReact
5566
],
5667
},
5768

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"@tailwindcss/vite": "^4.0.17",
2323
"@types/hast": "^3.0.4",
2424
"@types/luxon": "^3.6.2",
25+
"@types/mdast": "^4.0.4",
2526
"@types/react": "^19.0.12",
2627
"@types/react-dom": "^19.0.4",
2728
"astro": "^5.5.5",
@@ -31,8 +32,10 @@
3132
"clsx": "^2.1.1",
3233
"hast": "^1.0.0",
3334
"hast-util-to-html": "^9.0.5",
35+
"hastscript": "^9.0.1",
3436
"lucide-react": "^0.485.0",
3537
"luxon": "^3.6.1",
38+
"mdast": "^3.0.0",
3639
"mermaid": "^11.6.0",
3740
"motion": "^12.6.3",
3841
"playwright": "^1.51.1",
@@ -42,6 +45,7 @@
4245
"rehype-callouts": "^2.0.2",
4346
"rehype-code-group": "^0.2.4",
4447
"rehype-mermaid": "^3.0.0",
48+
"remark-directive": "^4.0.0",
4549
"remark-toc": "^9.0.0",
4650
"tailwind-merge": "^3.0.2",
4751
"tailwindcss": "^4.0.17",

pnpm-lock.yaml

Lines changed: 56 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/CodeGroupWrapper.astro

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { CodeGroup } from "../lib/plugins/code-group/code-group-component";
2+
3+
interface Props {
4+
labels: string;
5+
languages: string;
6+
codes: string;
7+
}
8+
9+
const { labels, languages, codes } = Astro.props;
10+
11+
<div class="code-group-wrapper">
12+
<CodeGroup
13+
client:idle
14+
labels={labels}
15+
languages={languages}
16+
codes={codes}
17+
/>
18+
</div>
19+
20+
<style>
21+
.code-group-wrapper {
22+
margin-bottom: 1.5rem;
23+
}
24+
</style>

src/components/MDXComponents.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import CodeGroupWrapper from './CodeGroupWrapper.astro';
2+
3+
export const components = {
4+
CodeGroupWrapper,
5+
};
6+
7+
export default components;

src/components/MDXContent.astro

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { components } from './MDXComponents';
2+
3+
interface Props {
4+
components?: Record<string, any>;
5+
}
6+
7+
const { components: propComponents } = Astro.props;
8+
const allComponents = { ...components, ...propComponents };
9+
10+
<div class="mdx-content">
11+
<slot />
12+
</div>
13+
14+
<style>
15+
.mdx-content {
16+
max-width: 100%;
17+
overflow-x: auto;
18+
}
19+
</style>
20+
21+
<script>
22+
// Add any client-side initialization for MDX components if needed
23+
</script>

src/content/blog/code-tabs.mdx

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
title: "Code Tabs"
3+
description: "Utiliser les onglets de gestionnaires de paquets dans vos documentations"
4+
permalink: "code-tabs"
5+
authors:
6+
- leadcode_dev
7+
---
8+
9+
Les onglets de code sont un excellent moyen de présenter différentes versions du même code, comme des commandes pour différents gestionnaires de paquets ou des implémentations dans différents langages de programmation.
10+
11+
## Exemple simple
12+
13+
Voici comment installer un package avec différents gestionnaires de paquets :
14+
15+
:::code-group labels=[npm,pnpm,yarn,bun]
16+
```bash
17+
npm install astro
18+
```
19+
20+
```bash
21+
pnpm add astro
22+
```
23+
24+
```bash
25+
yarn add astro
26+
```
27+
28+
```bash
29+
bun add astro
30+
```
31+
:::
32+
33+
## Exemple avec différents langages
34+
35+
Voici comment définir une classe dans différents langages :
36+
37+
:read-more{to="/docs/guide/code-tabs"}
38+
39+
:::code-group labels=[javascript,typescript,python,rust]
40+
```javascript
41+
class Person {
42+
constructor(name, age) {
43+
this.name = name;
44+
this.age = age;
45+
}
46+
47+
greet() {
48+
return `Hello, my name is ${this.name}`;
49+
}
50+
}
51+
```
52+
53+
```typescript
54+
class Person {
55+
constructor(
56+
private name: string,
57+
private age: number
58+
) {}
59+
60+
greet(): string {
61+
return `Hello, my name is ${this.name}`;
62+
}
63+
}
64+
```
65+
66+
```python
67+
class Person:
68+
def __init__(self, name, age):
69+
self.name = name
70+
self.age = age
71+
72+
def greet(self):
73+
return f"Hello, my name is {self.name}"
74+
```
75+
76+
```rust
77+
struct Person {
78+
name: String,
79+
age: u32,
80+
}
81+
82+
impl Person {
83+
fn new(name: String, age: u32) -> Self {
84+
Person { name, age }
85+
}
86+
87+
fn greet(&self) -> String {
88+
format!("Hello, my name is {}", self.name)
89+
}
90+
}
91+
```
92+
:::
93+
94+
## Conclusion
95+
96+
L'utilisation des onglets de code rend votre documentation plus propre et plus facile à lire, permettant aux utilisateurs de choisir la version qui correspond à leur environnement.

0 commit comments

Comments
 (0)