**A BOLDED WORD** instead of typing <strong>A BOLDED WORD</strong> just to bold some text, which saves you multiple keystrokes.
This guide is intended to ensure that the markup of SuperOfficeDocs has a consistent style, and is easy to navigate and maintain.
Adopting these guidelines also limits variation, thereby eliminating confusion, guesswork, and debates.
Use the style guide as a companion guide.
One benefit to markdown is that the style and formatting of the content can be more simple and uniform across pages. The following examples of formatting and elements can help get you started with the basics. You can find the details in the subsequent alphabetic sections about layout, formatting, and structure.
- Ordered list items
- bold list item
- italic list item
- Unordered list items
- link example
Angle brackets
Angle brackets are used for HTML and XML tags and to denote placeholders in code. The opening angle bracket must be escaped in text. For example, type \<cust ID> to produce <cust ID>. You don’t have to escape angle brackets in text formatted as inline code or in code blocks.Apostrophes and quotation marks
Use basic straight apostrophes and quotation marks. If copying into Markdown, use Ctrl+Shift+V.Blockquotes
Start the line with a >Bold and italic
- Use a pair of double stars for bold emphasis.
- Don’t use underscores to mark emphasis.
- Don’t use uppercase for emphasis.
- Don’t use quotes for emphasis.
- Use a pair of single stars for italic emphasis.
Call-outs (alerts, admonitions)
One thing you may see in the documentation is the use of call-outs. These show up in the form of light-colored boxes with words such as NOTE or WARNING in them. They look like this:This is important.
You cannot include a call-out inside a table.
<br /> tag to split call-outs.
Don’t stack multiple call-outs directly after each other.
Markdownlint’s link and image checks (MD034, MD045, MD051, MD052, MD053) don’t look inside HTML/JSX tags like
<Note>, <Tip>, <Warning>, or <Danger>. Links and images inside call-outs are still caught by mint validate, but not by markdownlint..vale.ini has folder-scoped overrides for contribute/: Microsoft.Contractions is off, since contractions are allowed here, and Microsoft.GeneralURL is off, since URL is the correct term for this technical audience rather than address. Separately, a BlockIgnores pattern excludes raw MDX import ... from "..."; lines, including inside fenced ```mdx examples, from Microsoft.Semicolon. Without it, Vale parses the JS import statement as an English sentence.Headings
- Start the line with 1 or more #. The number of hashes determines the heading level. For example, ## means H2.
- Don’t nest headings lower than H4.
- There must be a space between the last # and heading text.
HTML
Even though Markdown supports inline HTML, we (generally) don’t use it ondocs.superoffice.com. It is likely to cause build errors or warnings.
Exceptions:
- Use
<br />to break a line in table cells. Do not force line breaks within paragraphs. - Download links, for example,
<a href="/downloads/mirroredtables.docx" download>Mirrored Tables document</a>. - Use
<details>and<summary>to create drop-down content. - Use
<script>to bring in SuperOffice forms. - Use
<i>with Phosphor classes for icons. Always setaria-labeloraria-hidden="true".
Images
You can use either .png or .jpg images. Image files must be less than 20 MB. Place images in the appropriate media sub folder. Reference images with a root-relative path:/media/loc/en/{topic}/{filename} (or /media/loc/en/{topic}/{subfolder}/{filename} for topics large enough to need one). Unlike page links, images are always root-relative, with no same-topic exception: the media folder is one shared location, not duplicated per language or per topic, so there’s no “close by” case to be relative to, and a root-relative path resolves the same way no matter which page, or which language’s translated include, references it.
Format:

Example:
Reference-style images
We use reference-style links for image paths to improve the readability of the Markdown and simplify maintenance. Example: the above image of Yaktocat written as reference-style Inline:We prefix all labels referring to images with img.
Screenshots
All screenshots are styled with a green frame like this:
To produce this effect, add the string ” -screenshot” at the end of the alt tag:
App screens
Mobile app screenshots use a height-constrained frame instead of the full-width screenshot frame, since phone screens are tall and narrow:
To produce this effect, add the string ” -app-screen” at the end of the alt tag:
-app-screen for screenshots of the Mobile CRM app. Use -screenshot for desktop or browser screenshots.
Icons
We use Phosphor icons in the documentation. Browse the available icons on Phosphor Icons. Use the<i> tag with the ph base class and the icon name:
i.ph.
The VS Code Markdown preview loads .vscode/markdown.css, which imports the Phosphor icon font so icons render while you edit.
Don’t put an icon on an H1. The page H1 is hidden from view (the title already shows in the page header), but the heading text (icon markup included) still feeds the “On this page” sidebar, where it would show up as raw tag text instead of a rendered icon.
Accessibility
Always set eitheraria-label or aria-hidden="true" on every icon.
- Use
aria-labelwhen the icon replaces a visible UI label or carries meaning on its own. - Use
aria-hidden="true"when the icon is decorative, or when nearby text already names the action.
Videos
Embed a YouTube video by wrapping an<iframe> in a <Frame> component, using the no-cookie embed URL:
Snippets
One of the core principles of software development is DRY (Don’t Repeat Yourself). It applies to documentation too. If you find yourself repeating the same content in multiple places, create a snippet to keep it in sync. A snippet is a Markdown file placed in a folder named snippets: either next to the pages that use it, for content shared within one topic, or at the repository root, /snippets, for content shared across many topics or languages. Both levels use the same folder name; what differs is where the folder sits, not what it’s called.Snippets syntax
Import the file at the top of the page, below the front matter, then reference it as a component wherever it should appear:- The import path (the string after
from) is a JSX import, not a content link: it stays a literal relative path to the file (for example,./snippets/foo.md), regardless of the root-relative rule for content links described below. - The component name (
Fooabove) can be anything valid as a JSX identifier: pick something that describes the content. - You can import and use the same component more than once on a page.
Guidelines
- Write all the text in a snippet as complete sentences or phrases. Avoid creating a dependency on preceding text or following text on the page that references it.
- Don’t nest snippets.
- Place images used by a snippet in the shared media folder like any other image, and reference them with a root-relative path.
- Don’t add metadata or HTML comments at the top of a snippet file.
- A relative link inside a snippet resolves against the snippet’s own location, not the page that imports it, so a topic-local snippet can follow that topic’s normal relative-link rule, but a repository-root snippet reused across different topics or languages should use root-relative links, since it has no single “close by” tree to be relative to. See page links for the general rule.
Local versus repository-root snippets
Reused only within one topic or section? Put it in that topic’s own snippets folder. Reused across multiple topics, sections, or languages? Put it in the repository-root /snippets folder instead. Because both levels share the same folder name, the way to tell them apart is the import path’s relative depth:./snippets/... or ../snippets/... points to a topic-local folder close by; a longer chain like ../../../snippets/... reaching all the way to the repository root points to the shared one. When in doubt, check where the path actually resolves.
Naming conventions
Name a snippet file for what it is, not for what page uses it: that’s what keeps it reusable. Existing snippets follow a small set of prefixes:req-: a plan or feature requirement (req-cep.mdx)note-: a<Note>callout (note-req-saint.mdx)warn-: a<Warning>callout (warn-company-table.mdx)lim-: a limitation (lim-starter.mdx)table-: a reference table (table-misc.md)tip-: a<Tip>calloutstep-/goto-: a UI navigation step
.md versus .mdx extension rule.
The /snippets subfolders
The repository-root /snippets folder has a few subfolders, each holding a group of related fragments reused the same way:- /snippets/license: plan and license requirement blurbs. Sourced by English content directly; da, de, nl, no, and sv each have their own translated equivalents instead of importing this folder: see the next section for why.
- /snippets/merge-field, /snippets/variable, and /snippets/functional-rights: reference tables of literal system-defined names (merge-field tags, template variables, functional right names), imported identically by all 6 languages. This is the repository-root pattern working as intended.
/snippets/release-notes folder today: release notes live at the top-level /release-notes folder, unrelated to /snippets.
Create a new subfolder when you have multiple related fragments reused the same way (mirroring license, merge-field, or variable). A single one-off fragment goes directly at the /snippets root instead.
Why license snippets exist per language
English’s plan and license snippets live at/snippets/license. Each of da, de, nl, no, and sv has its own language-root snippets folder (for example de/snippets) holding translated equivalents of the same fragments, but not all of them exist in every language yet.
This split is deliberate, not a bug: translated text can’t live in one shared, root-relative file the way a language-agnostic reference table can: each language needs its own wording. But nothing enforces parity between the English source and the translated copies: that’s exactly how 3 files ended up untranslated in all 5 languages. When you add a new file to /snippets/license, also add (or file a translation task for) the matching file in each language’s own snippets folder.
Contrast this with /snippets/functional-rights: the table lists literal permission names defined by the SuperOffice product itself, not translatable prose, so there’s nothing to translate accurately without duplicating the product’s own (English) terminology. Each language’s page imports the one English table directly and adds a translated <Note> explaining why: see issue #244 for the case that established this pattern.
Links
For information about the syntax for links, see How to use links in docs.Lists
- Use numbers for ordered lists.
- Use stars for bulleted lists. Don’t use dashes.
Metadata (front-matter)
We use Yaml key-value front-matter syntax to embed metadata in Markdown files.The frontmatter date format is MM.DD.YYYY. For example,
date: 11.30.2025Source code
For information about the syntax for source code, see How to include code in docs.Special characters that need to be escaped
Markdown treats the following characters as ordinary text if there is a backslash escape character in front of them. For example,\#. If you don’t use escape characters, you can get undesired results when you type them directly.
Exceptions
- Follow standard conventions for fenced and inline code. If you wouldn’t escape it in the source code file, don’t escape it in Markdown-formatted code.
- Underscore characters within a word. For example, you can write
my_functionwithout escaping. However, leading and trailing underscores require it:\_my_function.
Tables
- Separate columns with a pipe character (|). Use surrounding pipes too.
- Separate the header row from the body with a row of dashes (and pipes to match the columns).
- Put 1 space on either side of a pipe (except the left-most and right-most).
- You can align the columns by using colons.
The table above would look like this in markdown:
Whitespace and line breaks
- Put 1 space after a sentence (except if followed by a line break).
- Put 1 empty line before and after all block elements:
- paragraphs
- headings
- lists
- tables
- images
- Press Enter once to break within a paragraph (<br />). Press Enter twice to start a new paragraph.
- Use horizontal rulers sparingly if at all. Type 3 or more consecutive hyphens to produce an <hr>.
Helpful links
Here are a few resources to help with Markdown to help get you started:- Markdown guide with examples and formatting info
- Dillinger.io is an online Markdown tool that can help convert HTML to Markdown and to work with Markdown
- Here’s a helpful Markdown plugin for Visual Studio Code