Skip to content

Commit 01fdcc6

Browse files
committed
feat(astro): custom expressive code plugins
1 parent bda1a31 commit 01fdcc6

File tree

6 files changed

+133
-18
lines changed

6 files changed

+133
-18
lines changed

Diff for: packages/astro/src/index.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { fileURLToPath } from 'node:url';
22
import type { AstroConfig, AstroIntegration } from 'astro';
3+
import type { ExpressiveCodePlugin } from 'astro-expressive-code';
34
import { extraIntegrations } from './integrations.js';
45
import { updateMarkdownConfig } from './remark/index.js';
56
import { tutorialkitCore } from './vite-plugins/core.js';
@@ -59,13 +60,21 @@ export interface Options {
5960
*/
6061
scope: string;
6162
};
63+
64+
/**
65+
* Expressive code plugins.
66+
*
67+
* @default []
68+
*/
69+
expressiveCodePlugins?: ExpressiveCodePlugin[];
6270
}
6371

6472
export default function createPlugin({
6573
defaultRoutes = true,
6674
components,
6775
isolation,
6876
enterprise,
77+
expressiveCodePlugins = [],
6978
}: Options = {}): AstroIntegration {
7079
const webcontainerFiles = new WebContainerFiles();
7180

@@ -137,7 +146,11 @@ export default function createPlugin({
137146

138147
// inject the additional integrations right after ours
139148
const selfIndex = config.integrations.findIndex((integration) => integration.name === '@tutorialkit/astro');
140-
config.integrations.splice(selfIndex + 1, 0, ...extraIntegrations({ root: fileURLToPath(config.root) }));
149+
config.integrations.splice(
150+
selfIndex + 1,
151+
0,
152+
...extraIntegrations({ root: fileURLToPath(config.root), expressiveCodePlugins }),
153+
);
141154
},
142155
'astro:config:done'({ config }) {
143156
_config = config;

Diff for: packages/astro/src/integrations.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ import react from '@astrojs/react';
44
import { pluginCollapsibleSections } from '@expressive-code/plugin-collapsible-sections';
55
import { pluginLineNumbers } from '@expressive-code/plugin-line-numbers';
66
import { getInlineContentForPackage } from '@tutorialkit/theme';
7-
import expressiveCode from 'astro-expressive-code';
7+
import expressiveCode, { type ExpressiveCodePlugin } from 'astro-expressive-code';
88
import UnoCSS from 'unocss/astro';
99

10-
export function extraIntegrations({ root }: { root: string }) {
10+
export function extraIntegrations({
11+
root,
12+
expressiveCodePlugins = [],
13+
}: {
14+
root: string;
15+
expressiveCodePlugins?: ExpressiveCodePlugin[];
16+
}) {
1117
return [
1218
react(),
1319
expressiveCode({
14-
plugins: [pluginCollapsibleSections(), pluginLineNumbers()],
20+
plugins: [pluginCollapsibleSections(), pluginLineNumbers(), ...expressiveCodePlugins],
1521
themes: ['dark-plus', 'light-plus'],
1622
customizeTheme: (theme) => {
1723
const isDark = theme.type === 'dark';

Diff for: packages/template/astro.config.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import tutorialkit from '@tutorialkit/astro';
22
import { defineConfig } from 'astro/config';
3+
import { pluginColorChips } from 'expressive-code-color-chips';
34

45
export default defineConfig({
56
devToolbar: {
67
enabled: false,
78
},
8-
integrations: [tutorialkit()],
9+
integrations: [
10+
tutorialkit({
11+
expressiveCodePlugins: [pluginColorChips()],
12+
}),
13+
],
914
});

Diff for: packages/template/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@types/node": "^20.14.6",
2525
"@types/react": "^18.3.3",
2626
"astro": "^4.15.0",
27+
"expressive-code-color-chips": "0.1.2",
2728
"prettier-plugin-astro": "^0.14.1",
2829
"typescript": "^5.4.5"
2930
}

Diff for: packages/template/src/content/tutorial/1-basics/1-introduction/1-welcome/content.md

+26
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,32 @@ const client = createPublicClient({
277277
const blockNumber = await client.getBlockNumber();
278278
```
279279

280+
## Custom Expressive Code Plugins
281+
282+
This code block uses the custom `expressive-code-color-chips` plugin for expressive code. The plugin adds the color thumbnail preview next to the css color value.
283+
284+
```css
285+
.some-class {
286+
color: #33ff66;
287+
}
288+
```
289+
290+
The plugin is registered in the `astro.config.ts` file like this:
291+
292+
```ts title=astro.config.ts
293+
import tutorialkit from '@tutorialkit/astro';
294+
import { defineConfig } from 'astro/config';
295+
import { pluginColorChips } from 'expressive-code-color-chips';
296+
297+
export default defineConfig({
298+
integrations: [
299+
tutorialkit({
300+
expressiveCodePlugins: [pluginColorChips()],
301+
}),
302+
],
303+
});
304+
```
305+
280306
## Tabs (TODO)
281307

282308
TODO

Diff for: pnpm-lock.yaml

+77-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)