
Simple Card with image (custom classes for the image) and no link
Instantly complete tasks, analyze text, and redact key information across your documents
Links: internal link and external link(opens in a new tab).
The Steps component provides a visually appealing way to present sequential instructions or processes.
First Step
This is the first step in the process.
Second Step
After completing the first step, proceed to the second step.
// Example code for the second stepconst secondStep = () => { console.log('Executing second step');};Final Step
Complete the process with the final step.
// Example code for the final stepconst finalStep = () => { console.log('Process complete!');};To use the Steps component in your Markdoc files, use the following syntax:
[STEPS-TAG-OPEN]1. First step2. Second step3. Third step[STEPS-TAG-CLOSE]Replace [STEPS-TAG-OPEN] with {% steps %} and [STEPS-TAG-CLOSE] with {% /steps %} in your actual code.
Note the following important formatting requirements:
[STEPS-TAG-OPEN]
1. **Add a title to your step**
This is the description for the first step.
```js // You can include code blocks const firstStep = () => { console.log('Executing first step'); }; ```
1. **Add images or other components**
You can include other components inside steps.
[PACKAGEMANAGERS-TAG pkg="package-name" /]
1. **Format your content**
Use **bold**, *italic*, or other Markdown formatting.
[STEPS-TAG-CLOSE]Replace [STEPS-TAG-OPEN] with {% steps %}, [STEPS-TAG-CLOSE] with {% /steps %}, and [PACKAGEMANAGERS-TAG pkg="package-name" /] with {% packagemanagers pkg="package-name" /%} in your actual code.
In Astro components, you can use the Steps component directly:
<Steps> <ol> <li> <strong>First Step</strong> <p>Description of the first step.</p> </li> <li> <strong>Second Step</strong> <p>Description of the second step.</p> </li> <li> <strong>Final Step</strong> <p>Description of the final step.</p> </li> </ol></Steps>The Tabs component allows you to organize content into multiple tabbed sections, making it easier for users to navigate between related information.
This is the content for Tab 1.
You can include any Markdown content here, including:
This is the content for Tab 2.
// You can include code blocks in tabsconst tabExample = () => { console.log('This is Tab 2');};// Form option.formOption = { "label": "name", "value": "John Appleseed"};// Form option.declare type FormOption = { label: string, value: string,};To use the Tabs component in your Markdoc files, use the following syntax:
[TABS-TAG-OPEN][TABITEM-TAG label="Tab 1"]Content for Tab 1[TABITEM-TAG-CLOSE]
[TABITEM-TAG label="Tab 2"]Content for Tab 2[TABITEM-TAG-CLOSE]
[TABITEM-TAG label="Tab 3" icon="icon-name"]Content for Tab 3[TABITEM-TAG-CLOSE][TABS-TAG-CLOSE]Replace the placeholders with the actual Markdoc tags:
[TABS-TAG-OPEN] → {% tabs %}[TABS-TAG-CLOSE] → {% /tabs %}[TABITEM-TAG label="Tab 1"] → {% tabitem label="Tab 1" %}[TABITEM-TAG-CLOSE] → {% /tabitem %}The Tabs component supports the following attributes:
syncKey (optional): A unique identifier to synchronize tab selection across multiple tab groupsThe TabItem component supports the following attributes:
label (required): The text displayed in the tabicon (optional): An icon to display alongside the labelIn Astro components, you can use the Tabs component directly:
<Tabs> <TabItem label="Tab 1"> <p>Content for Tab 1</p> </TabItem> <TabItem label="Tab 2"> <p>Content for Tab 2</p> </TabItem> <TabItem label="Tab 3" icon="icon-name"> <p>Content for Tab 3</p> </TabItem></Tabs>The Switcher tabs component allows you to organize content into tabbed sections similar to tabs, but each tab points to a separate URL. This is useful for creating a tabbed navigation system where each tab corresponds to a different page or section.
The tab representing the current page is automatically highlighted.
NOTE: Switcher tabs turn into a dropdown on smaller screens.
This is the content for Overview Tab.
You can include any Markdown content here, including:
To use the Tabs component in your Markdoc files, use the following syntax:
[SWITCHER-TABS-TAG-OPEN][SWITCHER-TABITEM-TAG label="Tab 1" url="/guides/sample-components/tab1" SWITCHER-TABITEM-TAG-CLOSE][SWITCHER-TABITEM-TAG label="Tab 2" url="/guides/sample-components/tab2" SWITCHER-TABITEM-TAG-CLOSE][SWITCHER-TABITEM-TAG label="Tab 3" url="/guides/sample-components/tab3" SWITCHER-TABITEM-TAG-CLOSE][SWITCHER-TABS-TAG-CLOSE]Replace the placeholders with the actual Markdoc tags:
[TABS-TAG-OPEN] → {% switcherTabs %}[TABS-TAG-CLOSE] → {% /switcherTabs %}[TABITEM-TAG label="Tab 1"] → {% switcherTabItem label="Tab 1" %}[TABITEM-TAG-CLOSE] → {% /switcherTabItem %}The SwitcherTabItem component supports the following attributes:
label (required): The text displayed in the taburl (required): The URL to navigate to when the tab is clickedIn Astro components, you can use the SwitcherTabs component directly:
<SwitcherTabs> <SwitcherTabItem label="Tab 1" url="/guides/sample-components/tab1" /> <SwitcherTabItem label="Tab 2" url="/guides/sample-components/tab2" /> <SwitcherTabItem label="Tab 3" url="/guides/sample-components/tab3" /></SwitcherTabs>The PackageManagers component displays installation or command instructions for multiple package managers (npm, yarn, pnpm).
npm i @nutrient-sdk/viewerpnpm add @nutrient-sdk/vieweryarn add @nutrient-sdk/viewernpm i -D @nutrient-sdk/viewerpnpm add -D @nutrient-sdk/vieweryarn add -D @nutrient-sdk/viewernpm i vitepnpm add viteyarn add vitebun add vitenpm run devpnpm run devyarn run devbun run devTo use the PackageManagers component in your Markdoc files, use the following syntax:
[PACKAGEMANAGERS-TAG pkg="package-name" /]Replace [PACKAGEMANAGERS-TAG pkg="package-name" /] with {% packagemanagers pkg="package-name" /%} in your actual code.
The PackageManagers component supports the following attributes:
pkg (optional): The name of the package to installextrapkg (optional): Comma-separated list of additional package managers to display (e.g., "bun" or "bun,deno")args (optional): Additional arguments to pass to the commanddev (optional, boolean): Whether to install as a dev dependencytype (optional): The type of command to run. Possible values:install (default): Install a packagerun: Run a scriptremove: Remove a packagecreate: Create a new projectexec: Execute a commanddlx: Run a package without installing itcomment (optional): A comment to display alongside the commandtitle (optional): A title for the command blockicons (optional, boolean): Whether to display package manager icons (default: true)prefix (optional): A prefix to add to the commandIn Astro components, you can use the PackageManagers component directly:
<PackageManagers pkg="@nutrient-sdk/viewer" /><PackageManagers pkg="@nutrient-sdk/viewer" dev={true} /><PackageManagers type="run" args="dev" />The CodeBlock component provides syntax-highlighted code blocks with additional features like line highlighting, titles, and more.
// This line is markedconst example = () => { // This line is also marked console.log('Hello, world!'); // This line is inserted return true; // This line is deleted};5 collapsed lines
// All this boilerplate setup code will be collapsedimport { 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 defaultengine.doSomething(1, 2, 3, calcFn)
function calcFn() { // You can have multiple collapsed sections3 collapsed lines
const a = 1 const b = 2 const c = a + b
// This will remain visible console.log(`Calculation result: ${a} + ${b} = ${c}`) return c}
4 collapsed lines
// All this code until the end of the block will be collapsed againengine.closeConnection()engine.freeMemory()engine.shutdown({ reason: 'End of example boilerplate code' })import NutrientViewer from "@nutrient-sdk/viewer";
const customTheme = { elevation: { low: "0 0 4px 0 rgba(0, 0, 0, 0.4)", medium: "0 4px 16px 0 rgba(0, 0, 0, 0.15)", }, opacity: { none: "0", low: "0.1", medium: "0.5", high: "0.9", },324 collapsed lines
rounded: { xs: "2px", sm: "4px", md: "8px", lg: "12px", xl: "16px", "2xl": "24px", full: "9999px", }, spacing: { xs: "2px", sm: "4px", md: "8px", lg: "12px", xl: "16px", "2xl": "24px", "3xl": "32px", "4xl": "40px", "5xl": "48px", "6xl": "64px", "7xl": "80px", "8xl": "96px", "9xl": "160px", }, color: { support: { error: { subtler: "#711b00", subtle: "#b53007", medium: "#fe7a68", strong: "#ffd4ce", }, success: { subtler: "#223a03", subtle: "#3C6612", medium: "#80CC34", strong: "#ecfeda", }, warning: { subtler: "#562800", subtle: "#bd5a00", medium: "#eb7f00", strong: "#ffd4a1", }, info: { subtler: "#190d94", subtle: "#4537de", medium: "#777cf0", strong: "#d3dcff", }, }, focused: { default: "#FB6F3B", inset: "#5B1C0F", }, background: { primary: { subtle: "#5B1C0F", medium: "#431207", strong: "#180501", }, interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "rgb(84.7% 28.6% 16.1% / 0.5)", }, inverse: { subtle: "#E95635", medium: "#FFC938", strong: "#FFE7A9", }, secondary: { subtle: "#762B1A", medium: "#A93920", strong: "#D84929", }, overlay: { subtle: "rgb(100% 90.6% 66.3% / 0.25)", medium: "rgb(9.41% 1.96% 0.39% / 0.5)", interactive: "rgb(98.4% 43.5% 23.1% / 0.25)", }, positive: { subtle: "#FFC938", medium: "#FEDE89", strong: "#FFE7A9", interactive: { enabled: "#5B1C0F", }, }, }, text: { primary: "#FFE7A9", secondary: "#FEB609", helper: "#FB6F3B", placeholder: "#FB6F3B", inverse: "#5B1C0F", oninteractive: "#5B1C0F", interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "rgb(100% 90.6% 66.3% / 0.5)", }, }, icon: { primary: "#FFE7A9", secondary: "#FB6F3B", inverse: "#5B1C0F", oninteractive: "#5B1C0F", interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "rgb(100% 90.6% 66.3% / 0.5)", }, }, border: { subtle: "#762B1A", medium: "#A93920", strong: "#D84929", inverse: "#FFE7A9", interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "#D84929", }, positive: { interactive: { enabled: "#5B1C0F", }, subtle: "#FFC938", medium: "#FEB609", strong: "#FB6F3B", }, }, }, typography: { heading: { h6: { regular: { font: '400 0.875rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.875rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.875rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, h5: { regular: { font: '400 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, h4: { regular: { font: '400 1.375rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 1.375rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 1.375rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, h3: { regular: { font: '400 1.5rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 1.5rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 1.5rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, h2: { regular: { font: '400 1.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 1.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 1.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, h1: { regular: { font: '400 2rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 2rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 2rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, }, label: { sm: { regular: { font: '400 0.688rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, medium: { font: '500 0.688rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, semibold: { font: '600 0.688rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, }, md: { regular: { font: '400 0.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, lg: { regular: { font: '400 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, }, body: { sm: { regular: { font: '400 0.75rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, medium: { font: '500 0.75rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, semibold: { font: '600 0.75rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, }, md: { regular: { font: '400 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, lg: { regular: { font: '400 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, }, }, }
NutrientViewer.load({ theme: customTheme, document: "YOUR_DOCUMENT_URL",});To create a code block with additional features, wrap the attributes in {% %}:
```js [OPEN]% title="example.js" frame="terminal" mark=[1,3] ins=[5] del=[7] %[CLOSE]// Your code here```Replace [OPEN] with { and [CLOSE] with } in your actual code.
The Code Block component supports these attributes:
lang: The language for syntax highlighting (e.g., "js", "python", "bash")title: Add a title to the code blockframe: Choose display style ("terminal", "browser", "code", "none")meta: Additional meta informationlocale: The locale for the code blockwrap: Whether to wrap long lines (boolean)preserveIndent: Whether to preserve indentation (boolean)showLineNumbers: Whether to show line numbers (boolean)startLineNumber: Start counting from a specific numbermark: Line numbers to highlight (array)ins: Line numbers to mark as inserted (array)del: Line numbers to mark as deleted (array)collapse: Line ranges to make collapsible (e.g., "{1-5, 12-14, 21-24}")collapseStyle: Where the summary line is located (e.g., "github", "collapsible-start")In Astro components, you can use the CodeBlock component directly:
<CodeBlock language="js" title="example.js" frame="terminal" mark={[1, 3]} ins={[5]} del={[7]} showLineNumbers startLineNumber={1} collapse="{1-5,15-25}">{`// Your code hereconst example = () => { // This line is also marked console.log('Hello, world!'); // This line is inserted return true; // This line is deleted};`}</CodeBlock>The Github Code component displays code snippets from GitHub repositories. It is very similar to the CodeBlock component but is specifically designed for displaying code from GitHub.
[GITHUB-CODE-TAG lang="vb" samplePath="app/src/main/java/com/pspdfkit/catalog/examples/java/DynamicMultimediaAnnotationExample.java" showLineNumbers=true /%]To create a code block with additional features, wrap the attributes in {% %}:
[GITHUB-CODE-TAG lang="vb" samplePath="app/src/main/java/com/pspdfkit/catalog/examples/java/DynamicMultimediaAnnotationExample.java" /]The Github Code component supports these attributes:
url (required): The URL of the raw code snippet on GitHub.lang: The language for syntax highlighting (e.g., "js", "python", "bash")title: Add a title to the code blockframe: Choose display style ("terminal", "browser", "code", "none")meta: Additional meta informationlocale: The locale for the code blockwrap: Whether to wrap long lines (boolean)preserveIndent: Whether to preserve indentation (boolean)showLineNumbers: Whether to show line numbers (boolean)startLineNumber: Start counting from a specific numbermark: Line numbers to highlight (array)ins: Line numbers to mark as inserted (array)del: Line numbers to mark as deleted (array)In Astro components, you can use the GithubCode component directly:
<GithubCode url="https://raw.githubusercontent.com/PSPDFKit/pspdfkit-android-catalog/master/app/src/main/java/com/pspdfkit/catalog/examples/java/DynamicMultimediaAnnotationExample.java" language="js" title="example.js" frame="terminal"/>The Alert component is used to display alerts to the user. It can be used to display warnings, errors, or other important information.
Testing here is extremely tricky; Apple saves absolute paths in the binary, so if you happen to have the same username on the build machine and your test machine, it might work, but it fails somewhere else. It also seems that LLDB uses the shared module cache, so you need to delete DerivedData on every run. And (see later in this article), where you store the example and which other files you store also play into this — dare I say, this was extremely confusing and frustrating to debug.
One line alert box.
Default alert with no props. There is no text in this alert. The text is not visible. No text.
One line alert box.
Discover what's new! Check out our changelog for the latest release updates, of which there are a lot.
Read more →To use the Alert component in your Markdoc files, use the following syntax:
[ALERT-TAG text="Alert text" type="warning" line="multi-line" boxed=false /]The Alert component supports the following attributes:
type (optional): The type of alert to display (warning, success, error, neutral-gray)line (optional): The line style to use (multi-line, single-line)boxed (optional, boolean): Whether to display the alert in a boxed format (default: false)In Astro components, you can use the Alert component directly:
<Alert type="neutral-gray" line="single-line" boxed={false}> One line alert box.</Alert>The List component is used to display lists of items. It can work with both ordered and unordered lists.
The Quote component is used to display quotes/testimonials from a person.
Nutrient helps us significantly accelerate our time to market, provide key services to our clients, and reliably deliver solutions that we can easily integrate into our portfolio.
Nutrient helps us significantly accelerate our time to market, provide key services to our clients, and reliably deliver solutions that we can easily integrate into our portfolio.
To use the Quote component in your Markdoc files, use the following syntax:
[QUOTE-TAGsize="big"name="Angelica Nierras"position="Chief Growth Officer"company="Faria Education Group" /]
Quote here
[QUOTE-TAG /]The Quote component supports the following attributes:
size (optional): The size of the quote (big, small)name (optional): The name of the person who said the quoteposition (optional): The position of the person who said the quotecompany (optional): The company of the person who said the quoteIn Astro components, you can use the Quote component directly:
<Quote size="big" name="Angelica Nierras" position="Chief Growth Officer" company="Faria Education Group"/> Quote here</Quote>The CTA component is used to display a call to action. It can be used to display a button or a link.
Ready to get started?
Ready to get started?
To use the CTA component in your Markdoc files, use the following syntax:
[CTA-TAG color="accent" supertitle="Ready to get started?" href="https://www.nutrient.io/try" boxed=false /]Ready to get started?[CTA-TAG /]The CTA component supports the following attributes:
color (optional): The color of the CTA (neutral, accent)supertitle (optional): The supertitle of the CTAhref (optional): The href of the CTAboxed (optional, boolean): Whether to display the CTA in a boxed format (default: false)In Astro components, you can use the CTA component directly:
<CTA color="accent" supertitle="Ready to get started?" href="https://www.nutrient.io/try" boxed={false}/> Ready to get started?</CTA>Try our product for free and see the difference.
Get access to premium features and priority support.

The Tag component is used to display a tag.
Tag name
Tag name
Tag name
Tag name
Tag name
[TAG-TAG color="accent" variant="text" href="/try" filter=false /]The Tag component supports the following attributes:
color (optional): The color of the tag (to be used with variant bullet or text. NOTE: This does not change the color of the button, only the bullet point or text)variant (optional): The variant of the tag (text, bullet), to be used with colorhref (optional): The href of the tagfilter (optional, boolean): Whether to display the tag as a clickable filter (default: false)In Astro components, you can use the Tag component directly:
<Tag color="accent" variant="text" href="/try" filter={false}/> Tag name</Tag>| Feature Description | Status |
|---|---|
| Advanced user authentication system with multi-factor authentication, password recovery, and session management capabilities | ✅ Live |
| Basic contact form with email validation | 🚧 Testing |
| Comprehensive analytics dashboard featuring real-time user behavior tracking, conversion funnels, and detailed reporting with exportable data formats | 📋 Planned |
| Project Title | Budget | Team Lead Notes |
|---|---|---|
| E-commerce platform redesign with modern UI/UX patterns, mobile-first approach, and enhanced checkout flow | $85,000 | Sarah mentioned concerns about the timeline given the complexity of the payment integration. Need to discuss with the client about potentially phasing the rollout. |
| Bug fixes | $2,500 | Quick turnaround |
| Customer relationship management system overhaul including automated email campaigns, lead scoring, and integration with existing sales tools | $45,000 | Mike has experience with similar CRM implementations. Should be straightforward but will require data migration. |
| Course Name | Duration | Prerequisites | Course Description |
|---|---|---|---|
| Introduction to Web Development | 12 weeks | None | A comprehensive beginner-friendly course covering HTML5, CSS3, JavaScript fundamentals, responsive design principles, and basic version control with Git. Students will build three projects including a personal portfolio website. |
| Advanced React Patterns | 3 days | React basics, JavaScript ES6+ | Intensive workshop focusing on advanced React concepts including custom hooks, context patterns, performance optimization, and state management strategies. |
| Data Structures | 16 weeks | Programming fundamentals, basic mathematics | In-depth exploration of fundamental data structures and algorithms including arrays, linked lists, trees, graphs, sorting algorithms, and complexity analysis with practical implementation exercises. |
| UX Design Bootcamp | 8 weeks | Design thinking basics | Hands-on program covering user research methodologies, wireframing, prototyping tools, usability testing, and design systems creation with real client projects. |
| Company | Industry | Revenue | Employees | Recent Developments |
|---|---|---|---|---|
| TechCorp Solutions | Software Development | $2.4M | 45 | Just secured Series A funding of $8M to expand their AI-powered customer service platform. Planning to hire 20 new engineers and open a European office by Q3. The CEO announced partnerships with three major enterprises. |
| Local Bakery | Food & Beverage | $180K | 8 | New location opening next month |
| DataFlow Analytics | Business Intelligence | $890K | 23 | Recently launched their machine learning-powered predictive analytics suite. The product has gained traction with mid-market companies looking to optimize their supply chain operations. Currently in talks with a Fortune 500 company for a pilot program. |
| Green Energy Co | Renewable Energy | $5.7M | 78 | Completed installation of 50MW solar farm project ahead of schedule. Received government contract worth $12M for rural electrification program. Stock price up 23% this quarter. |
| Product Name | Category | Price | Inventory | Customer Reviews | Marketing Notes |
|---|---|---|---|---|---|
| UltraBook Pro 15" | Laptops | $1,299 | 47 | "Exceptional build quality and performance. The battery life easily lasts a full work day, and the display is crisp and vibrant. Some users reported minor heating issues during intensive tasks, but overall satisfaction is very high. Would definitely recommend for professional use." | Premium positioning working well. Consider highlighting the sustainable materials in next campaign. Sales team reports strong interest from creative professionals. |
| Wireless Earbuds | Audio | $79 | 203 | "Good value for money but could improve" | Price-sensitive segment |
| Smart Home Hub | IoT | $149 | 12 | "Setup was more complicated than expected, but once configured, it works flawlessly. Integration with major smart home brands is seamless. The mobile app could use some UI improvements, but the functionality is solid. Great for tech-savvy users." | Inventory running low - reorder soon |
| Gaming Mouse RGB | Peripherals | $45 | 89 | "Perfect for competitive gaming. Highly responsive and customizable. The RGB lighting effects are a nice touch, though they can be disabled for a more professional look. Ergonomics are excellent for extended gaming sessions." | Popular with streamers and esports community. Consider sponsorship opportunities. Recent firmware update improved performance significantly. |
| Column 1 | Column 2 |
|---|---|
| |
| Android | iOS |
|---|---|
This is the default card style
Instantly complete tasks, analyze text, and redact key information across your documents
Instantly complete tasks, analyze text, and redact key information across your documents

Instantly complete tasks, analyze text, and redact key information across your documents
Instantly complete tasks, analyze text, and redact key information across your documents
Modify content, merge/split PDFs, and generate PDFs from templates
Convert images to PDFs, render PDFs as images, and extract text or pages
10 - Tenth card
11 - Eleventh card
12 - Twelfth card
Documentation
Documentation
Documentation
Documentation
Documentation
Documentation
Documentation
Documentation
Documentation
A responsive grid that changes columns at different breakpoints:
Item 1
Item 2
Item 3
Item 4
Item 5
Item 6
Item 7
Item 8
Item 9
Item 10
Item 11
Item 12
A simple 12-column grid that demonstrates the basic structure:
span 12
span 6
span 6
span 4
span 4
span 4
span 3
span 3
span 3
span 3
A 12-column grid that adapts to different screen sizes:
12 cols on mobile → 6 on tablet → 4 on desktop
12 cols on mobile → 6 on tablet → 4 on desktop
12 cols on mobile → 12 on tablet → 4 on desktop
A grid with specific column and row positioning:
Item 1: Full width on mobile, spans 2x2 on tablet+
Item 2: Full width on mobile, col 3 on tablet+
Item 3: Full width on mobile, col 4 on tablet+
Item 4: Full width on mobile, col 5 on tablet+
Item 5: Full width on mobile, col 3, row 2 on tablet+
Item 6: Full width on mobile, col 4, row 2 on tablet+
Item 7: Full width on mobile, col 5, row 2 on tablet+
A grid with different positioning and spanning:
Item 1: Default position
Item 2: Default position
Item 3: Default position
Item 4: Col 1, Row 2
Item 5: Col 2, Row 2
Item 6: Col 3, Row 2
Item 7: Spans 2x2 at Col 4, Row 1
A grid with nested grids inside some of the items:
A simple flex layout with items:
Flex Item 1
Flex Item 2
Flex Item 3
A flex layout that changes direction on different screen sizes:
A classic "holy grail" layout with header, footer, main content, and sidebars:
Header
Footer
A Pinterest-like masonry layout with items of different heights:
This card has more content.
It spans multiple lines to create a taller card in the layout.
The height of this card will affect the layout of other cards.
A complex dashboard-style layout with nested flex containers:
Navigation
Quick Stats
Users 1,234
Revenue $5,678
Conversion 12.3%
Main Dashboard Area
This is the main content area of our dashboard layout. In a real application, this would contain charts, tables, and other data visualizations.
The dashboard layout demonstrates how to create complex nested layouts using flexbox.
The Dialog component is used to display a dialog (usually a cookie consent dialog).
We use cookies to improve your experience and for marketing. Learn more in our privacy policy.
We use cookies to improve your experience and for marketing. Learn more in our privacy policy.
To use the Dialog component in your Markdoc files, use the following syntax:
[DIALOG-TAG hasX=true /]The Dialog component supports the following attributes:
color (optional): The color of the dialog (red, green, yellow, pink)hasX (optional, boolean): Whether to display the X button (default: false)In Astro components, you can use the Dialog component directly:
<Dialog hasX={true}> We use cookies to improve your experience and for marketing. Learn more in our privacy policy.</Dialog>The Button component is used to display a button.
Click me Click me Click me Click me Click me Click me Click meThe Accordion component is used to display a list of items in an accordion. It should be used with the AccordionItem component.
Common use cases include generating invoices, reports, tickets, and any other documents that need to be downloadable or printable from a web application.
Common use cases include generating invoices, reports, tickets, and any other documents that need to be downloadable or printable from a web application.
import NutrientViewer from "@nutrient-sdk/viewer";
const customTheme = { elevation: { low: "0 0 4px 0 rgba(0, 0, 0, 0.4)", medium: "0 4px 16px 0 rgba(0, 0, 0, 0.15)", }, opacity: { none: "0", low: "0.1", medium: "0.5", high: "0.9", }, rounded: { xs: "2px", sm: "4px", md: "8px", lg: "12px", xl: "16px", "2xl": "24px", full: "9999px", }, spacing: { xs: "2px", sm: "4px", md: "8px", lg: "12px", xl: "16px", "2xl": "24px", "3xl": "32px", "4xl": "40px", "5xl": "48px", "6xl": "64px", "7xl": "80px", "8xl": "96px", "9xl": "160px", }, color: { support: { error: { subtler: "#711b00", subtle: "#b53007", medium: "#fe7a68", strong: "#ffd4ce", }, success: { subtler: "#223a03", subtle: "#3C6612", medium: "#80CC34", strong: "#ecfeda", }, warning: { subtler: "#562800", subtle: "#bd5a00", medium: "#eb7f00", strong: "#ffd4a1", }, info: { subtler: "#190d94", subtle: "#4537de", medium: "#777cf0", strong: "#d3dcff", }, }, focused: { default: "#FB6F3B", inset: "#5B1C0F", }, background: { primary: { subtle: "#5B1C0F", medium: "#431207", strong: "#180501", }, interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "rgb(84.7% 28.6% 16.1% / 0.5)", }, inverse: { subtle: "#E95635", medium: "#FFC938", strong: "#FFE7A9", }, secondary: { subtle: "#762B1A", medium: "#A93920", strong: "#D84929", }, overlay: { subtle: "rgb(100% 90.6% 66.3% / 0.25)", medium: "rgb(9.41% 1.96% 0.39% / 0.5)", interactive: "rgb(98.4% 43.5% 23.1% / 0.25)", }, positive: { subtle: "#FFC938", medium: "#FEDE89", strong: "#FFE7A9", interactive: { enabled: "#5B1C0F", }, }, }, text: { primary: "#FFE7A9", secondary: "#FEB609", helper: "#FB6F3B", placeholder: "#FB6F3B", inverse: "#5B1C0F", oninteractive: "#5B1C0F", interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "rgb(100% 90.6% 66.3% / 0.5)", }, }, icon: { primary: "#FFE7A9", secondary: "#FB6F3B", inverse: "#5B1C0F", oninteractive: "#5B1C0F", interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "rgb(100% 90.6% 66.3% / 0.5)", }, }, border: { subtle: "#762B1A", medium: "#A93920", strong: "#D84929", inverse: "#FFE7A9", interactive: { enabled: "#FB6F3B", hovered: "#FEB609", active: "#FFC938", visited: "#FFC938", disabled: "#D84929", }, positive: { interactive: { enabled: "#5B1C0F", }, subtle: "#FFC938", medium: "#FEB609", strong: "#FB6F3B", }, }, }, typography: { heading: { h6: { regular: { font: '400 0.875rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.875rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.875rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, h5: { regular: { font: '400 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, h4: { regular: { font: '400 1.375rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 1.375rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 1.375rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, h3: { regular: { font: '400 1.5rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 1.5rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 1.5rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, h2: { regular: { font: '400 1.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 1.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 1.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, h1: { regular: { font: '400 2rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, medium: { font: '500 2rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, semibold: { font: '600 2rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0", }, }, }, label: { sm: { regular: { font: '400 0.688rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, medium: { font: '500 0.688rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, semibold: { font: '600 0.688rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, }, md: { regular: { font: '400 0.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.75rem/1.25 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, lg: { regular: { font: '400 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, }, body: { sm: { regular: { font: '400 0.75rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, medium: { font: '500 0.75rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, semibold: { font: '600 0.75rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.05px", }, }, md: { regular: { font: '400 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 0.875rem/1.375 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, lg: { regular: { font: '400 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, medium: { font: '500 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, semibold: { font: '600 1rem/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif', letterSpacing: "0.1px", }, }, }, }, }
NutrientViewer.load({ theme: customTheme, document: "YOUR_DOCUMENT_URL",});Default label
Neutral label and some more text
Neutral label and some more text
Neutral label and some more text
Neutral label and some more text
Label
Label
The Separator component is used to separate content. It can be used to create a visual break between sections of content.
Primary separator (default):
Secondary separator:
Custom classes to separators:
[SEPARATOR-TAG type="secondary" /]<Separator type="secondary" />type (optional): The type of separator (primary, secondary)class (optional): Additional classes to apply to the separatorThe Spacer component is used to create space between elements.
This text is above the spacer.
There is a spacer with pt-10 below this text.
This text is below the spacer.
[SPACER-TAG class="pt-10" /]<Spacer class="pt-10" />class (optional): Additional classes to apply to the spacerThe Short Feature component displays a feature with an icon or number, title, and description in a compact horizontal layout.
[SHORT-FEATURE-TAG iconProps={name: "dotted/unlock"} title="No trial key required" description="You have the option to try our SDK without obtaining a trial key." /]
[SHORT-FEATURE-TAG number="1" title="Install the SDK" description="Add our SDK to your project using npm or yarn package manager." /]Replace [SHORT-FEATURE-TAG with {% shortFeature and /] with /%} in your actual code.
import ShortFeature from "@/components/common/ShortFeature.astro";
<!-- With Icon --><ShortFeature iconProps={{ name: "dotted/unlock" }} title="No trial key required" description="You have the option to try our SDK without obtaining a trial key."/>
<!-- With Number --><ShortFeature number="1" title="Install the SDK" description="Add our SDK to your project using npm or yarn package manager."/>iconProps (object, optional): Icon component props including name, width, height, and classname (string, required): Icon name (e.g., "dotted/unlock")width (string, optional): Icon width (default: "32")height (string, optional): Icon height (default: "32")class (string, optional): Additional classes for the iconnumber (string, optional): Number to display instead of icon (e.g., "1", "2", "3")title (string, required): Feature titledescription (string, required): Feature descriptionclass (string, optional): Additional classes to apply to the componentNote: Either iconProps or number must be provided, but not both.
The Logo Switcher component is used to display a list of logos.
[LOGOSWITCHER-TAG logos=["...", "...", "..."] background="default" /]<LogoSwitcher background="transparent" logos={[ "customer-logos/autodesk", "customer-logos/disney", "customer-logos/ubs", ]}/>The LogoSwitcher component supports the following attributes:
logos (required): The logo icons to displaybackground (optional): The background color, either default or transparentclass (optional): Any custom classesThe Video component is used to display a video from a URL or a local file.
Video with no given aspect ratio and full width
Video with no given aspect ratio and limited with (%)
Video with no given aspect ratio and limited with (px)
[VIDEOPLAYER-TAG class="mb-10" src="@/assets/videos/article-header.mp4" poster="@/assets/videos/video-poster.jpg" controls=true muted=true /]<VideoPlayer class="mb-10" src="@/assets/videos/article-header.mp4" poster="@/assets/videos/video-poster.jpg" controls={true} muted={true} />src (required): URL for self-hosted video or ID for YouTube/Vimeotype (optional): Type of video (self-hosted, YouTube, Vimeo)title (optional): Video title (for accessibility)class (optional): Additional classes to apply to the videoaspectRatio (optional): Aspect ratio (16:9, 4:3, etc.)poster (optional): Poster image URL or ImageMetadatacontrols (optional): Show video controlsautoplay (optional): Autoplay videoloop (optional): Loop videomuted (optional): Mute videopreload (optional): Preload strategy (auto, metadata, none)width (optional): Video widthheight (optional): Video heightstartAt (optional): Start time in secondsshowInfo (optional): Show video info (YouTube)showRelated (optional): Show related videos (YouTube)showControls (optional): Show player controls (YouTube/Vimeo)privacyMode (optional): Enable privacy-enhanced modeThe Image component is used to display an image. It can be used with a URL or a local file.


[IMAGE-TAG src="/src/assets/images/people/cosmin-iorgus.jpg" width=40 class="mx-auto" /]<Image src="/src/assets/images/people/cosmin-iorgus.jpg" width=40 class="mx-auto" />src (required): URL for imagealt (optional): Alt text for imagewidth (optional): Image widthheight (optional): Image heightclass (optional): Additional classes to apply to the imagetitle (optional): Title for image (for accessibility)This is a styled summary with a custom title.
The Testimonial component displays customer testimonials with optional headshots, company logos, and call-to-action buttons. It supports two variants: standard and large.
Complete testimonial with all fields
"Using Pilotbrief and Mercury allows this all to be done electronically, saving not only paper but also precious time."
Minimal testimonial (essential fields only)
"Minimal example demonstrating essential fields only."
Large size with button
"Nutrient helps us significantly accelerate our time to market, provide key services to our clients, and reliably deliver solutions that we can easily integrate into our portfolio."
To use the Testimonial component in your Markdoc files, use the following syntax:
[TESTIMONIAL-TAG headshot="@/assets/images/people/cosmin-iorgus.jpg" name="Name Surname" position="Position" company="Company" logo="customer-logos/ibm" /]
Your testimonial quote here
[TESTIMONIAL-TAG /]Replace [TESTIMONIAL-TAG with {% testimonial and [TESTIMONIAL-TAG /] with {% /testimonial %} in your actual code.
The Testimonial component supports the following attributes:
Required attributes:
name (required): The name of the person giving the testimonialOptional attributes:
position (optional): The person's job title or positioncompany (optional): The person's company or organizationsize (optional): Size variant ("large" for larger testimonials, default is "small")headshot (optional): Path to the person's headshot imagelogo (optional): Company logo identifier (references logos in the assets directory) - only visible in small sizeboxed (optional, boolean): Whether to display with background and padding (default: true). Only applies to small size; large size is always boxedclass (optional): Additional CSS classes to apply to the testimonialButton functionality (requires size="large"):
buttonText (required for button): Text for the call-to-action buttonbuttonUrl (required for button): URL for the button linkbuttonIcon (optional): Icon to display in the buttonNote: Button functionality only works with size="large". Both buttonText and buttonUrl are required for the button to display, while buttonIcon is optional.
In Astro components, you can use the Testimonial component directly:
<Testimonial name="Name Surname" position="Position" company="Company" headshot="@/assets/images/people/cosmin-iorgus.jpg" size="large" buttonText="read case study" buttonUrl="/case-study" buttonIcon="dotted/check" boxed={true}> Your testimonial quote here</Testimonial>The GuidesList component automatically scans .mdoc files within a folder or subfolder and generates an index list of guides. It's perfect for creating dynamic lists that stay up-to-date as you add or remove guide files.
<nav aria-label="List of guides guides in java/conversion"><ul class="guides-list"><li class="guides-list-item"><a href="/guides/java/conversion/pdf-to-excel-document/" class="guides-list-link"><span class="guides-list-title">PDF to Excel</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/pdf-to-html/" class="guides-list-link"><span class="guides-list-title">PDF to HTML</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/pdf-to-powerpoint-document/" class="guides-list-link"><span class="guides-list-title">PDF to PowerPoint</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/pdf-to-word-document/" class="guides-list-link"><span class="guides-list-title">PDF to Word</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/powerpoint-document-to-pdf/" class="guides-list-link"><span class="guides-list-title">PowerPoint to PDF</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/word-document-to-pdf/" class="guides-list-link"><span class="guides-list-title">Word to PDF</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/word-document-to-pdf-ua/" class="guides-list-link"><span class="guides-list-title">Word to PDF/UA</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/word-document-to-pdf-including-comments/" class="guides-list-link"><span class="guides-list-title">Word to PDF with comments</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/excel-document-to-pdf/" class="guides-list-link"><span class="guides-list-title">Excel to PDF</span></a></li><li class="guides-list-item"><a href="/guides/java/conversion/markdown-to-pdf/" class="guides-list-link"><span class="guides-list-title">Markdown to PDF</span></a></li></ul></nav><nav aria-label="List of guides guides in ios/tutorials"><ul class="guides-list"></ul></nav><nav aria-label="List of sdk guides in android/advanced"><div class="guides-list guides-list-div" role="list"></div></nav>The GuidesList component supports the following attributes:
Required attributes:
folder (required): The folder path to scan for guides (relative to collection root)Optional attributes:
collection (optional): Content collection to scan ("guides", "sdk", "blog"). Default: "guides"includeSubfolders (optional, boolean): Whether to include files from subfolders. Default: trueorderBy (optional): How to sort the guides ("title", "order", "filename"). Default: "order"showDescriptions (optional, boolean): Whether to display guide descriptions. Default: falselistStyle (optional): Display format ("ul", "ol", "div"). Default: "ul"class (optional): Additional CSS classes to apply.mdoc files and generates links_) and index filessidenav_label when available for consistent navigationIn Astro components, you can use the GuidesList component directly:
<GuidesList collection="guides" folder="java/conversion" showDescriptions={true} listStyle="ul" orderBy="order"/>