Components
Use the live MDX component set for documentation pages: asides, tabs, code blocks, videos, diagrams, and the rules each one carries.
Documentation pages are MDX, and this page is the whole component vocabulary: every entry is a design system component from @aziontech/webkit, or a thin wrapper over one. A component absent from this page is not available: an import of it fails the build.
Asides
No import needed. Asides are written as ::: blocks and render the design system’s DocCallout; they are the most common construct after links.
Valid types: note, tip, caution, danger. caution renders as the callout’s warning kind.
:::warning is not valid and does not render as intended. Use :::caution.
- A callout holds prose: sentences, short paragraphs, and a list. Keep fences and tables out of it: a fence inside a callout renders every line boxed as inline code. Put them before or after the aside.
- The callout has no title row. The bracket text is kept as a lead-in to the copy (
Did you know? — ...), so use it only when the first words need it. In Portuguese pages, localize it::::note[nota],:::tip[dica],:::caution[Atenção].
DocButton
The house call to action. A wrapper around the design system’s Button that keeps the button styling inside the article body.
hrefandlabelare required. No client directive: the button is a static link.kind: omit it for the primary action,secondaryfor a reference link.outlined,text, anddangeralso exist.- Always
size="medium". icontakes an icon class, always placed before the label.target="_blank"opens an external destination in a new tab.
Code
Renders the design system’s CodeBlock, with a copy button. Fenced blocks render the same component.
- A block of two or more lines numbers its lines and shows a bar on top naming the language:
Shell,JSON,JavaScript. Atextblock readsText. - A one-line block shows the code and the copy button, with no line numbers, and no bar unless it has a file name.
client:visibleis mandatory on<Code>: without it the copy button does not work. A fence gets it for you.- Props:
code,lang, and two optional ones.fileNameputs a file name in the bar in place of the language.showLineNumbersoverrides the line-number default. On a fence,title="index.js"after the language tag sets the file name.
The value is a JavaScript template literal. Backticks and ${ inside it must be escaped, and a line continuation needs a doubled backslash. When a snippet contains either, that is a reason to use <Code> rather than a fence, because you control the escaping.
Fenced blocks are also house style. Use a fence for output the reader reads, and <Code> for input the reader copies.
Language tags in use: bash, sh, json, javascript, js, typescript, ts, hcl, graphql, shell, text, plaintext. Terraform is hcl, not terraform.
Tabs and Fragment
The multi-interface pattern: one task, one panel per interface. Renders the design system’s TabView, with every panel kept in the HTML.
client:visibleis mandatory. Without it the tabs render and do not switch.- A block pairs each
tab.xwith apanel.x. The one exception is a page that documents more than one interface, such as a Quickstart page or a how-to guide: the prerequisites block declares the tab strip, and every later block of the samesharedStoreholds onlypanel.xslots. A panel-only block of theinterfacestore renders that strip above its own panels, so the reader switches at any section. - Blank lines around markdown inside a Fragment are mandatory, or the markdown renders as one literal paragraph.
- Panels are paired to tabs by key, and the first tab is the default. An
interfaceblock renders its tabs in one order on every page, whatever order the MDX declares them in: Console, GraphiQL, CLI, GitHub, API. Write them in that order anyway, so the page and its Markdown twin read the same. - Canonical keys:
tab.console,tab.api,tab.cli, plustab.apiv3/tab.apiv4for versioned APIs. A key is lowercase letters and digits only: a hyphen escapes thetab.x/panel.xpairing check without failing it. - In a block with
sharedStore="interface", open every panel with a heading one level below the section it sits in, carrying the tab label:### Console. These headings stay out of the table of contents, and each one links to its section with its interface selected:?interface=console#create-a-database. - Optional
sharedStore="<key>"syncs selection across tab groups on a page. Interface tabs usesharedStore="interface", so one selection follows the reader down a page that repeats the tabs per section, and on to the next page: that one store is kept in the browser and written to the URL as?interface=<key>, which leaves the fragment free for a section. Give every block sharing a key the same tabs. A block that does not offer the selected key shows its own first panel instead, and leaves the selection untouched for the blocks that do offer it.
Tag
Status badges.
- No client directive: the badge is static HTML.
severityissuccess,info,warning, ordanger.infois the neutral label chip, used for “Preview” and product badges; the other three are status colors.- The label goes in the children.
value="Preview"is also accepted.
Video
No import needed. Emits the iframe plus schema.org VideoObject metadata.
src must be a YouTube embed URL. src and title are required. For a screenshot or a clip file, use Figure.
Mermaid diagrams
A diagram is a mermaid code fence, not an image. The text reaches an agent fetching the markdown twin; an image reference does not.
title="..." after mermaid on the fence adds a caption below the diagram. Label every node and edge in words, and never rely on color alone to carry a distinction. A diagram never stands alone: architecture and use-case pages keep the numbered dataflow beneath it.
Every diagram follows the same rules:
- Open with the shared
initline the example shows. It lays the diagram out with ELK, gives the labels room, and shrinks a diagram wider than the column to fit it. When the first node does not render at the top, add anelkobject right after"layout": "elk",. In a diagram with a cycle, such as a request and its response, use ELK’s model-order options, so the declaration order decides the layers:"cycleBreakingStrategy": "MODEL_ORDER", or"preset": "modelOrder", "keepEntryNodeOnTop": true. In a diagram with more than one starting node, use"layeringStrategy": "LONGEST_PATH_SOURCE", which puts every starting node in the top row. - Run every flowchart top to bottom (
flowchart TD), a chain of steps included. A chain drawn left to right grows wider than the column and shrinks its labels to fit. - Give each role one shape. The client is a stadium (
(["Client"])), anything on Azion, a Product or a Platform Resource, is a rectangle (["application"]), a data store is a cylinder ([("KV Store")]), and a system outside Azion is a subroutine ([["origin server"]]). A step, a state, or a decision keeps its rectangle or its diamond. - Let the line style say which way the flow runs. When a diagram draws a request and its response, solid arrows (
-->) carry the request and dotted arrows (-.->) carry the response. A flow that runs apart from any request, such as a purge or a log stream, takes thick arrows (==>).
Steps
A numbered walkthrough: each step is a title with an optional body, and the numbers come from the order on the page.
- No client directive.
- Never write the number: reordering the steps renumbers them.
- A
DocStepalways sits inside aDocSteps. Blank lines around the markdown inside a step are mandatory.
Figure
A framed screenshot, clip, or diagram, with an optional lead-in above and a caption below.
srctakes an image or a clip (.mp4,.webm). Give an image analt. Withoutsrc, the frame wraps its children, such as amermaidfence.captionandhintare plain strings; the slots of the same name (<Fragment slot="caption">) carry a caption with a link or inline code.autoplayplays a clip muted, inline, and looping, with no controls.
Cards
A grid of navigation cards, for a page that fans out into sections. It is the closing ## Next steps section of a page: one card per destination, with the reason as the copy.
- No client directive.
colsis 2, 3, or 4; the grid collapses to one column on a phone.hrefmakes the whole card the link.labelis the copy; children replace it when the copy needs a link or inline code.- Optional:
icontakes a PrimeIcons class (pi pi-bolt),overlinea small line above the title,linka call-to-action text on a closing row.
Related items
A framed list of rows, each a name and one sentence, for a reader choosing what to read next. It is the closing ## Related section of a page.
- No client directive.
FrameBoxdraws the perimeter;ItemListrules between the rows. hrefmakes the row the link; an external URL gets the outward arrow. Optionalicontakes a PrimeIcons class.- The copy is one sentence: what the thing is, or why the reader would go there. Inline code and links are allowed; blocks are not.
Changelog entry
One dated entry: label and version on the left, the notes on the right, with an anchor built from the label.
- No client directive. Blank lines around the markdown inside are mandatory.
labelis the anchor, slugified. Two entries with the same label need distinctanchorvalues.descriptionis the line under the label;tagsis an array of short labels.- A page of entries outlines them: the right rail lists one row per date and links the first entry with that date, in place of the headings inside the notes. The Changelog pattern holds the rest.
Prompt
A block of literal text the reader hands to an agent, set in the mono face with a copy control. It is not a code block: no language, no highlighting.
client:visibleis mandatory: the copy control and the expand control need it.kind="line"makes one scrolling line instead of a paragraph capped at four lines.titleandiconare optional.
Inline gloss
A term in running prose that shows its definition on hover or focus, with an optional link.
client:visibleis mandatory; without it the term renders and never opens.tipis the definition,headlinethe bold lead-in,ctaplushrefthe link.
Supplied by the layout
DocPageHeader (from title and description in the frontmatter), DocOnThisPage, DocPagination, and the DocProse typography contract render around every page. Never author them.
Shared snippets
Reusable blocks under ~/includes/snippets/, each with an en/ and a pt/ variant. Note the Portuguese folder is pt/, not pt-br/.
Available: versionRollingOut, versionDualSteps, versionDeprecated, JourneyAPI, InterfaceNote, LetsEncryptExpiration, RulesEngineExecution.
Version notices
A page about a resource that exists in API v3 and API v4 carries exactly one version notice, and the notice comes from one of three snippets. Never write a version notice by hand.
| Snippet | Goes on | Content | Removed when |
|---|---|---|---|
versionRollingOut | The top of an API v4 page whose resource has an API v3 page | A link to the API v3 page, titled as that page | API v4 reaches every account |
versionDualSteps | The end of the introduction of a guide with steps for API v4 and API v3 | None | API v4 reaches every account. The API v3 steps go with it |
versionDeprecated | The top of an API v3 page | A link to the API v4 page, titled as that page | API v4 reaches every account. The page then redirects to its API v4 counterpart, never to a home page |
An API v3 page is not listed in the navigation. Its row in the product tree carries "hidden": true, so the page keeps the sidebar and breadcrumb of its product, and readers reach it from the notice on its API v4 counterpart.
The date when API v3 shuts down appears only in versionDeprecated and on API v4 Migration.
SectionBasicContent
The header block of a template showcase page. Import it from ~/components/webkit/SectionBasicContent.vue. Takes description and a buttons array, with the rest of the page in a <Fragment slot="content">. Each button takes label, link, and optionally severity: "secondary", outlined: true, icon, and target. A button without link renders nothing. Read an existing showcase page before using it.
ProductGuidesSection
Renders the Guides and tutorials hub as a table of name, type, and last updated. Used on the hub page of a product section, and nowhere else.
product— the section’s id, such asapplications. The table lists every guide the guides catalog tags with the section or with a Product nested in it.- The date is the page’s last change, filled in for you. Never write it by hand.
- The type column shows each page’s content type, in the reader’s language.
- Rows sort by title.
GlossaryFilter
Client-side filter over a glossary table. Used on a product’s Glossary page, and nowhere else.
- The child is one GFM pipe table,
| Term | Definition |. Blank lines around it are mandatory. langlocalizes the filter placeholder and the empty-state message:enorpt-br.- Each body row gets an anchor id from its term, ASCII-folded (
ação múltipla→#acao-multipla), so a definition is deep-linkable. Ids are set at render time, so anchors work without JavaScript. - Filtering is a progressive enhancement: without JavaScript the full table renders. Matching is case- and accent-insensitive, against the whole row.
Tables and line breaks
Tables are plain GFM pipe tables. Horizontal scrolling is added automatically; do not wrap them yourself.
<br /> or <br></br>. Bare <br> breaks the build — MDX requires every tag closed.
MDX rules that break builds
- Bare
<and{in prose are parsed as JSX. Escape them or use backticks. - Every tag must be closed or self-closing.
- No H1 in the body;
titlerenders it. ---between major sections is house style, roughly three per page. Never immediately after the frontmatter block.- Imports go directly after the frontmatter block, before any prose.