This optional plugin allows you to reduce long code examples to their relevant parts by collapsing any line ranges that are not relevant to the example.
The lines of collapsed sections will be replaced by a clickable X collapsed lines
element. When clicked, the collapsed section will be expanded, showing the previously hidden lines.
Installation
Before being able to use collapsible sections in your code blocks, you need to install the plugin as a dependency and add it to your configuration:
Add the package to your site’s dependencies:
npm i @expressive-code/plugin-collapsible-sections
pnpm add @expressive-code/plugin-collapsible-sections
yarn add @expressive-code/plugin-collapsible-sections
Add the plugin to your site’s configuration by passing it in the plugins
list:
import { defineConfig } from ' astro/config '
import astroExpressiveCode from ' astro-expressive-code '
import { pluginCollapsibleSections } from ' @expressive-code/plugin-collapsible-sections '
export default defineConfig ( {
plugins: [ pluginCollapsibleSections ( ) ] ,
import { defineConfig } from ' astro/config '
import starlight from ' @astrojs/starlight '
import { pluginCollapsibleSections } from ' @expressive-code/plugin-collapsible-sections '
export default defineConfig ( {
title: ' My Starlight site ' ,
plugins: [ pluginCollapsibleSections ( ) ] ,
import createMDX from ' @next/mdx '
import rehypeExpressiveCode from ' rehype-expressive-code '
import { pluginCollapsibleSections } from ' @expressive-code/plugin-collapsible-sections '
/** @type { import ( 'rehype-expressive-code' ) .RehypeExpressiveCodeOptions } */
const rehypeExpressiveCodeOptions = {
plugins: [ pluginCollapsibleSections ( ) ] ,
/** @type { import ( 'next' ) .NextConfig } */
pageExtensions: [ " js " , " jsx " , " ts " , " tsx " , " md " , " mdx " ] ,
const withMDX = createMDX ( {
// The nested array structure is required to pass options
[ rehypeExpressiveCode, rehypeExpressiveCodeOptions ] ,
export default withMDX ( nextConfig )
Usage in markdown / MDX
To mark a section as collapsible, you need to add meta information to your code blocks. This is done by appending collapse={X-Y}
to your opening code fence, indicating a collapsed section from line X
to (and including) line Y
.
You can also collapse multiple sections in a single code block by separating them with commas:
```js collapse= { 1-5, 12-14 }
// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from ' @example/some-boilerplate '
import { evenMoreBoilerplate } from ' @example/even-more-boilerplate '
const engine = someBoilerplateEngine ( evenMoreBoilerplate ( ) )
// This part of the code will be visible by default
engine . doSomething ( 1 , 2 , 3 , calcFn )
// You can have multiple collapsed sections
The above code block will be rendered like this:
// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from ' @example/some-boilerplate '
import { evenMoreBoilerplate } from ' @example/even-more-boilerplate '
const engine = someBoilerplateEngine ( evenMoreBoilerplate ( ) )
// This part of the code will be visible by default
engine . doSomething ( 1 , 2 , 3 , calcFn )
// You can have multiple collapsed sections
Usage in the <Code>
component
The collapsible sections plugin adds the following props to the <Code>
component that allow direct access to its features:
Props
collapse
Type:
string
| string
[]
Collapses the given line range or ranges.
collapsePreserveIndent
Type:
boolean
Default:
true
Determines if collapsed section titles (X collapsed lines
) should be indented to preserve the minimum indent level of their contained collapsed code lines.
Styling
This plugin adds a collapsibleSections
object to the styleOverrides
engine config option, allowing you to customize the visual appearance of the sections:
import { defineConfig } from ' astro/config '
import astroExpressiveCode from ' astro-expressive-code '
import { pluginCollapsibleSections } from ' @expressive-code/plugin-collapsible-sections '
export default defineConfig ( {
plugins: [ pluginCollapsibleSections ( ) ] ,
// You can optionally override the plugin's default styles here
closedBackgroundColor: ' #68F ' ,
import { defineConfig } from ' astro/config '
import starlight from ' @astrojs/starlight '
import { pluginCollapsibleSections } from ' @expressive-code/plugin-collapsible-sections '
export default defineConfig ( {
title: ' My Starlight site ' ,
plugins: [ pluginCollapsibleSections ( ) ] ,
// You can optionally override the plugin's default styles here
closedBackgroundColor: ' #68F ' ,
import createMDX from ' @next/mdx '
import rehypeExpressiveCode from ' rehype-expressive-code '
import { pluginCollapsibleSections } from ' @expressive-code/plugin-collapsible-sections '
/** @type { import ( 'rehype-expressive-code' ) .RehypeExpressiveCodeOptions } */
const rehypeExpressiveCodeOptions = {
plugins: [ pluginCollapsibleSections ( ) ] ,
// You can optionally override the plugin's default styles here
closedBackgroundColor: ' #68F ' ,
/** @type { import ( 'next' ) .NextConfig } */
pageExtensions: [ " js " , " jsx " , " ts " , " tsx " , " md " , " mdx " ] ,
const withMDX = createMDX ( {
// The nested array structure is required to pass options
[ rehypeExpressiveCode, rehypeExpressiveCodeOptions ] ,
export default withMDX ( nextConfig )
Available style overrides
closedBackgroundColor
Type:
UnresolvedStyleValue Default:
({ theme }) => setAlpha(theme.colors['editor.foldBackground'], 0.2) || 'rgb(84 174 255 / 20%)'
The background color of closed sections.
closedBorderColor
Type:
UnresolvedStyleValue Default:
({ theme }) => setAlpha(theme.colors['editor.foldBackground'], 0.5) || 'rgb(84 174 255 / 50%)'
The border color of closed sections.
closedBorderWidth
The border width of closed sections.
closedFontFamily
Type:
UnresolvedStyleValue Default:
'inherit'
The font family of the closed section summary text.
closedFontSize
Type:
UnresolvedStyleValue Default:
'inherit'
The font size of the closed section summary text.
closedLineHeight
Type:
UnresolvedStyleValue Default:
'inherit'
The line height of the closed section summary text.
closedMargin
The margin around closed sections.
closedPaddingBlock
Type:
UnresolvedStyleValue Default:
'4px'
The block padding of closed sections.
closedTextColor
Type:
UnresolvedStyleValue Default:
'inherit'
The text color of the closed section summary text.
openBackgroundColor
Type:
UnresolvedStyleValue Default:
'transparent'
The background color of open sections.
openBorderColor
Type:
UnresolvedStyleValue Default:
'transparent'
The border color of open sections.
openBorderWidth
Type:
UnresolvedStyleValue Default:
'1px'
The border width of open sections.
openMargin
The margin around open sections.
openPadding
The padding of open sections.