mirror of
https://github.com/withastro/astro.git
synced 2024-12-16 21:46:22 -05:00
Feature: add support for shiki defaultColors
option (#11341)
* feat: add shiki option for default color * feat: propagate shiki option for default color to astro config * feat: add tests for default color * chore: add change set * fix: add complete type to shiki default color config * fix: remove unneeded heavy shiki theme from fixture * fix: add literals to schema validation Co-authored-by: Bjorn Lu <bjornlu.dev@gmail.com> * Update .changeset/cold-crabs-arrive.md Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca> * feat: improve changeset * grammar tweak --------- Co-authored-by: Bjorn Lu <bjornlu.dev@gmail.com> Co-authored-by: Sarah Rainsberger <sarah@rainsberger.ca>
This commit is contained in:
parent
f4870e59ec
commit
49b5145158
11 changed files with 129 additions and 0 deletions
32
.changeset/cold-crabs-arrive.md
Normal file
32
.changeset/cold-crabs-arrive.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
'@astrojs/markdown-remark': minor
|
||||||
|
'astro': minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Adds support for [Shiki's `defaultColor` option](https://shiki.style/guide/dual-themes#without-default-color).
|
||||||
|
|
||||||
|
This option allows you to override the values of a theme's inline style, adding only CSS variables to give you more flexibility in applying multiple color themes.
|
||||||
|
|
||||||
|
Configure `defaultColor: false` in your Shiki config to apply throughout your site, or pass to Astro's built-in `<Code>` component to style an individual code block.
|
||||||
|
|
||||||
|
```js title="astro.config.mjs"
|
||||||
|
import { defineConfig } from 'astro/config';
|
||||||
|
export default defineConfig({
|
||||||
|
markdown: {
|
||||||
|
shikiConfig: {
|
||||||
|
themes: {
|
||||||
|
light: 'github-light',
|
||||||
|
dark: 'github-dark',
|
||||||
|
},
|
||||||
|
defaultColor: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
```astro
|
||||||
|
---
|
||||||
|
import { Code } from 'astro:components';
|
||||||
|
---
|
||||||
|
<Code code={`const useMyColors = true`} lang="js" defaultColor={false} />
|
||||||
|
```
|
|
@ -321,6 +321,7 @@ export const AstroConfigSchema = z.object({
|
||||||
.or(z.custom<ShikiTheme>())
|
.or(z.custom<ShikiTheme>())
|
||||||
)
|
)
|
||||||
.default(ASTRO_CONFIG_DEFAULTS.markdown.shikiConfig.themes!),
|
.default(ASTRO_CONFIG_DEFAULTS.markdown.shikiConfig.themes!),
|
||||||
|
defaultColor: z.union([z.literal('light'), z.literal('dark'), z.string(), z.literal(false)]).optional(),
|
||||||
wrap: z.boolean().or(z.null()).default(ASTRO_CONFIG_DEFAULTS.markdown.shikiConfig.wrap!),
|
wrap: z.boolean().or(z.null()).default(ASTRO_CONFIG_DEFAULTS.markdown.shikiConfig.wrap!),
|
||||||
transformers: z
|
transformers: z
|
||||||
.custom<ShikiTransformer>()
|
.custom<ShikiTransformer>()
|
||||||
|
|
|
@ -78,6 +78,22 @@ describe('Astro Markdown Shiki', () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Default color', async () => {
|
||||||
|
let fixture;
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
fixture = await loadFixture({ root: './fixtures/astro-markdown-shiki/default-color/' });
|
||||||
|
await fixture.build();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Renders default color without themes', async () => {
|
||||||
|
const html = await fixture.readFile('/index.html');
|
||||||
|
const $ = cheerio.load(html);
|
||||||
|
|
||||||
|
assert.doesNotMatch($('pre').attr().style, /background-color/);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Languages', () => {
|
describe('Languages', () => {
|
||||||
|
|
13
packages/astro/test/fixtures/astro-markdown-shiki/default-color/astro.config.mjs
vendored
Normal file
13
packages/astro/test/fixtures/astro-markdown-shiki/default-color/astro.config.mjs
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
export default {
|
||||||
|
markdown: {
|
||||||
|
syntaxHighlight: 'shiki',
|
||||||
|
shikiConfig: {
|
||||||
|
theme: 'github-light',
|
||||||
|
themes: {
|
||||||
|
light: 'github-light',
|
||||||
|
dark: 'github-light'
|
||||||
|
},
|
||||||
|
defaultColor: false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
8
packages/astro/test/fixtures/astro-markdown-shiki/default-color/package.json
vendored
Normal file
8
packages/astro/test/fixtures/astro-markdown-shiki/default-color/package.json
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"name": "@test/astro-markdown-skiki-default-color",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"astro": "workspace:*"
|
||||||
|
}
|
||||||
|
}
|
10
packages/astro/test/fixtures/astro-markdown-shiki/default-color/src/layouts/content.astro
vendored
Normal file
10
packages/astro/test/fixtures/astro-markdown-shiki/default-color/src/layouts/content.astro
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<!-- Head Stuff -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
24
packages/astro/test/fixtures/astro-markdown-shiki/default-color/src/pages/index.md
vendored
Normal file
24
packages/astro/test/fixtures/astro-markdown-shiki/default-color/src/pages/index.md
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
---
|
||||||
|
layout: ../layouts/content.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
# Hello world
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v3
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: rss-site
|
||||||
|
labels:
|
||||||
|
app: web
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: front-end
|
||||||
|
image: nginx
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
- name: rss-reader
|
||||||
|
image: nickchase/rss-php-nginx:v1
|
||||||
|
ports:
|
||||||
|
- containerPort: 88
|
||||||
|
```
|
|
@ -42,6 +42,7 @@ export async function createShikiHighlighter({
|
||||||
langs = [],
|
langs = [],
|
||||||
theme = 'github-dark',
|
theme = 'github-dark',
|
||||||
themes = {},
|
themes = {},
|
||||||
|
defaultColor,
|
||||||
wrap = false,
|
wrap = false,
|
||||||
transformers = [],
|
transformers = [],
|
||||||
}: ShikiConfig = {}): Promise<ShikiHighlighter> {
|
}: ShikiConfig = {}): Promise<ShikiHighlighter> {
|
||||||
|
@ -73,6 +74,7 @@ export async function createShikiHighlighter({
|
||||||
|
|
||||||
return highlighter.codeToHtml(code, {
|
return highlighter.codeToHtml(code, {
|
||||||
...themeOptions,
|
...themeOptions,
|
||||||
|
defaultColor,
|
||||||
lang,
|
lang,
|
||||||
// NOTE: while we can spread `options.attributes` here so that Shiki can auto-serialize this as rendered
|
// NOTE: while we can spread `options.attributes` here so that Shiki can auto-serialize this as rendered
|
||||||
// attributes on the top-level tag, it's not clear whether it is fine to pass all attributes as meta, as
|
// attributes on the top-level tag, it's not clear whether it is fine to pass all attributes as meta, as
|
||||||
|
|
|
@ -39,6 +39,7 @@ export interface ShikiConfig {
|
||||||
langs?: LanguageRegistration[];
|
langs?: LanguageRegistration[];
|
||||||
theme?: ThemePresets | ThemeRegistration | ThemeRegistrationRaw;
|
theme?: ThemePresets | ThemeRegistration | ThemeRegistrationRaw;
|
||||||
themes?: Record<string, ThemePresets | ThemeRegistration | ThemeRegistrationRaw>;
|
themes?: Record<string, ThemePresets | ThemeRegistration | ThemeRegistrationRaw>;
|
||||||
|
defaultColor?: 'light' | 'dark' | string | false;
|
||||||
wrap?: boolean | null;
|
wrap?: boolean | null;
|
||||||
transformers?: ShikiTransformer[];
|
transformers?: ShikiTransformer[];
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,4 +85,20 @@ describe('shiki syntax highlighting', () => {
|
||||||
|
|
||||||
assert.match(html, /data-test="\{1,3-4\}"/);
|
assert.match(html, /data-test="\{1,3-4\}"/);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('supports the defaultColor setting', async () => {
|
||||||
|
const processor = await createMarkdownProcessor({
|
||||||
|
shikiConfig: {
|
||||||
|
themes: {
|
||||||
|
light: 'github-light',
|
||||||
|
dark: 'github-dark',
|
||||||
|
},
|
||||||
|
defaultColor: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const { code } = await processor.render('```\ntest\n```');
|
||||||
|
|
||||||
|
// Doesn't have `color` or `background-color` properties.
|
||||||
|
assert.doesNotMatch(code, /color:/);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -2250,6 +2250,12 @@ importers:
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../..
|
version: link:../../..
|
||||||
|
|
||||||
|
packages/astro/test/fixtures/astro-markdown-shiki/default-color:
|
||||||
|
dependencies:
|
||||||
|
astro:
|
||||||
|
specifier: workspace:*
|
||||||
|
version: link:../../../..
|
||||||
|
|
||||||
packages/astro/test/fixtures/astro-markdown-shiki/langs:
|
packages/astro/test/fixtures/astro-markdown-shiki/langs:
|
||||||
dependencies:
|
dependencies:
|
||||||
astro:
|
astro:
|
||||||
|
|
Loading…
Reference in a new issue