Code Blocks
Fern uses Shiki for syntax highlighting in code blocks. It’s reliable and performant. Below are examples of how you can configure syntax highlighting in code snippets.
Basic
To create a code snippet, you need to wrap your code in three backticks. You can also specify the language for syntax highlighting after the opening backticks.
Example
Markdown
Titles
You can add a title to your code snippet by adding a title after the language identifier.
Example
Markdown
Line highlighting
You can highlight specific lines in your code snippet by placing a numeric range inside {}
after the language identifier.
Example
Markdown
Line focusing
Instead of highlighting lines, you can focus on specific lines by adding a comment [!code focus]
or by adding a
focus
attribute after the language identifier. The focus
attribute works the same way as the highlight
attribute.
Example
Markdown
Start line
You can control which line appears first in your code block by adding a startLine
attribute after the language identifier. This is particularly useful for longer code snippets where you want to highlight the main logic while still providing the complete context.
Example
Markdown
Max height
You can control the max height of the code block by adding
a maxLines
attribute after the language identifier. The
maxLines
attribute should be a number representing the maximum
number of lines to display. By default, the code block will display up to 20 lines.
When you use maxLines
, an expand button automatically appears on hover in the top-right corner, allowing users to view the full code content in an expanded overlay that displays over the page.
Example: maxLines=10
Markdown
To hide the expand button or add custom styling, target the .fern-expand-button
selector:
Wrap overflow
By default, long lines that exceed the width of the code block become scrollable:
Example
Markdown
To disable scrolling and wrap overflow onto the next line, use the wordWrap
prop:
Example
Markdown
Combining props
You can combine the title
, highlight
, focus
, startLine
, maxLines
, and wordWrap
props to create a code block with a title, highlighted lines, specific starting line,
and a maximum height.
Example
Markdown
Code Blocks with Tabs
The CodeBlocks
component allows you to display multiple code blocks in a tabbed interface.
Example
Markdown
Language synchronization
Multiple CodeBlocks
on a documentation site automatically synchronize. This
means when a user selects a CodeBlock
with a specific language, all other
CodeBlocks
across your documentation site with the same language will
automatically sync and switch to match. Language preferences are stored in
client-side local storage and persist across browser sessions.
The example below demonstrates language sync in action – choosing a language in
either set of CodeBlocks
will automatically update both sets to match:
Tabs and CodeBlocks integration
CodeBlocks
automatically synchronize with <Tab>
components that have a language
property.
Linking to language-specific content
You can link directly to content in a specific language by adding ?language=<some-language>
to the end of a URL. This sets which language tab wil be displayed by default when users visit the page.
For example, the following link opens with Java tabs displayed: https://buildwithfern.com/learn/docs/writing-content/components/tabs?language=java
This works with both CodeBlocks
and Tab
components that have a language
property.
Override synchronization
You can override the synchronization of code blocks by setting the for
prop.
Example
Markdown
Embed local code files
Example
Markdown
Option A
Option B