Docs About Contact

Getting Started

Introduction File Structure Comments Metadata

Elements

Headings Text Buttons Links Images & Media Lists Forms Blocks Table Blockquote Accordion Code Blocks Callouts Embeds Modules Custom Fonts

Styles

Spacing Sizing Typography Colors Layout and Flex Borders Effects Position Transforms

Interactivity

Hover and Focus Responsive

Reference

Full Cheatsheet

zoar Syntax

A clean, readable language for building websites. No HTML tags, no CSS files, no build steps.

How it works

Every .zoar file is a page. Each line is an element. Styles go inside [square brackets]. Layout is done with curly braces.

The golden rule: element keyword first, content second, [styles] last. That's the whole language.

File structure

Each .zoar file becomes a page. The filename is the URL path. home.zoar is always the root /.

FileURL
home.zoar/
about.zoar/about
contact.zoar/contact
blog-post.zoar/blog-post

Comments

Lines starting with // are ignored by the parser. Use them to document your layout.

Metadata

Add a ---- block at the very top of any .zoar file to set page metadata. Controls the browser tab title, search descriptions, social previews, and favicon.

FieldWhat it sets
titleBrowser tab title + search heading
descriptionMeta description for search
authorMeta author tag
langHTML lang attribute (en hi fr...)
faviconBrowser tab icon
og-titleSocial media preview title
og-descriptionSocial media preview text
og-imageSocial media preview image
twitter-cardsummary or summary_large_image
canonicalCanonical URL for SEO

Headings

Use #, ##, or ### for h1, h2, h3. Styles are optional.

Text

Use t for paragraphs. A space after t is required.

Buttons

Use : to create a button for actions. For page navigation, use ~ instead.

: renders as a button element and does not navigate. Use ~ for any link that goes to a page or URL.

Use ~ for all navigation. Internal pages, external URLs, email links, and anchor scroll links are all supported.

SyntaxOutput
~ Label -> /pageInternal navigation
~ Label -> https://...External link (new tab)
~ Label -> mailto:...Email link
~ Label -> #anchorSmooth scroll to id
💡

Always add no-underline if you want links to look like buttons. Add hover-underline to restore it only on hover.

Images and Media

SymbolElement
>Image
>>Audio player with controls
>>>Video player with controls
<<Embed / iframe (YouTube Maps Figma Vimeo)

Lists

Start lines with - for unordered, 1. for ordered. Consecutive lines are grouped into one list automatically.

Forms

Use / for labels, _ for inputs, __ for textareas. Input type is set with the input-type-* token inside the style block.

TokenType
input-type-textText (default)
input-type-emailEmail
input-type-passwordPassword
input-type-numberNumber
input-type-telPhone
input-type-urlURL
input-type-dateDate picker
input-type-timeTime picker
input-type-fileFile upload
input-type-rangeSlider
input-type-colorColor picker
input-type-searchSearch
input-type-checkboxCheckbox
input-type-radioRadio

Blocks

Wrap elements in curly braces to group them. Styles on the closing brace apply to the container div.

Add an id token to any element or block for anchor navigation:

# My Section [text-size-24 bold id-my-section] — the id-my-section token adds id="my-section" to that heading. Then ~ Go to section -> #my-section will scroll to it.

Table

Wrap rows inside a block and add [table] to the closing brace. Use h at the start of a line for a header row. Cells are comma-separated.

Blockquote

Use a regular block with [blockquote] on the closing brace. Any elements inside work normally.

Accordion

Wrap child blocks in an outer block with [accordion]. Each child block becomes a details element. Use s for the clickable summary title.

Code Blocks

Use triple backticks to create a code block. Add a language label after the opening fence for display. A Copy button is added automatically.

💡

The language label after the backticks is display-only. It labels the block but does not affect rendering.

Callouts

Use callout variants on any block to create a highlighted notice box.

VariantUse for
[callout] or [callout-info]General information
[callout-tip]Tips and best practices
[callout-warning]Things to be careful about
[callout-danger]Critical warnings
💡

Info callout — for general notes.

Tip callout — for best practices.

⚠️

Warning callout — for things to watch out for.

🚫

Danger callout — for critical warnings.

Embeds

Use << to embed any iframe-compatible URL. All necessary iframe attributes are added automatically. Works with YouTube, Google Maps, Figma, Vimeo, and more.

Modules

Write UI once and reuse it across every page. Modules live in a modules/ subfolder and are referenced with @modules/name.

RuleDetail
@modules/nameMust be on its own line
Name = filenamefooter.zoar becomes @modules/footer
No nestingModules cannot reference other modules
Frontmatter ignoredMetadata inside a module is stripped
Export safeModule content is fully inlined in each ZIP page

Custom Fonts

Upload any font file (.ttf .woff2 .otf .woff) via the Assets panel. The utility name is derived from the filename — lowercased, spaces become hyphens.

FilenameToken
roboto.woff2font-roboto
Playfair Display.ttffont-playfair-display
JetBrains Mono.woff2font-jetbrains-mono

Spacing

TokenCSS Output
inner-20padding: 20px
inner-x-20padding left and right: 20px
inner-y-20padding top and bottom: 20px
inner-t-20padding-top: 20px
outer-20margin: 20px
outer-t-32margin-top: 32px
gap-16gap: 16px
gap-x-16column-gap: 16px
gap-y-16row-gap: 16px

Sizing

TokenCSS Output
w-200width: 200px
w-fullwidth: 100%
w-1/2width: 50%
w-screenwidth: 100vw
h-400height: 400px
h-screenheight: 100vh
min-w-300min-width: 300px
max-w-800max-width: 800px
min-h-200min-height: 200px
max-h-600max-height: 600px

Typography

TokenCSS Output
text-size-18font-size: 18px
text-color-ff0000color: #ff0000
leading-28line-height: 28px
tracking-2letter-spacing: 0.02em
boldfont-weight: 700
semi-boldfont-weight: 600
italicfont-style: italic
underlinetext-decoration: underline
no-underlinetext-decoration: none
strikethroughtext-decoration: line-through
capstext-transform: uppercase
lowercasetext-transform: lowercase
capitalizetext-transform: capitalize
text-centertext-align: center
text-righttext-align: right
truncateoverflow ellipsis on one line
no-wrapwhite-space: nowrap

Colors

Use any CSS color name or a hex code without the # symbol.

UtilityAffects
text-color-*Text color
bg-*Background color
border-color-*Border color
shadow-color-*Box shadow color
outline-color-*Outline color

Layout and Flex

TokenDescription
flexEnable flexbox
gridEnable CSS grid
hiddendisplay: none
rowflex-direction: row
colflex-direction: column
wrapflex-wrap: wrap
growflex-grow: 1
centerCenter both axes (shorthand)
betweenjustify-content: space-between
items-centeralign-items: center
items-startalign-items: flex-start
self-centeralign-self: center
grid-cols-3grid-template-columns: repeat(3 1fr)
col-span-2grid-column: span 2
col-span-fullFull width in grid

Borders and Radius

TokenCSS Output
borderborder: 1px solid #ddd
border-2border-width: 2px
border-color-ff0000border-color: #ff0000
border-t-1border-top: 1px solid
border-b-1border-bottom: 1px solid
round-8border-radius: 8px
round-fullborder-radius: 9999px
outline-noneoutline: none
outline-width-2outline: 2px solid

Effects

TokenCSS Output
shadow-12box-shadow depth 12
opacity-50opacity: 0.5
blur-8filter: blur(8px)
brightness-75filter: brightness(0.75)
overflow-hiddenoverflow: hidden
transitiontransition: all 0.3s ease
transition-colorscolor + bg + border only
duration-200transition-duration: 200ms
cursor-pointercursor: pointer
select-noneuser-select: none
disabledopacity 0.5 + cursor not-allowed

Position

TokenCSS Output
relativeposition: relative
absoluteposition: absolute
fixedposition: fixed
stickyposition: sticky
top-0top: 0
right-20right: 20px
left--10left: -10px
inset-0inset: 0
z-10z-index: 10
⚠️

Negative values use double dash — left--10 means left: -10px. Same applies to translate and rotate.

Transforms

Multiple transforms combine automatically — no need to write them separately.

TokenCSS Output
scale-110transform: scale(1.1)
rotate-45transform: rotate(45deg)
rotate--45transform: rotate(-45deg)
translate-x-10translateX(10px)
translate-y--8translateY(-8px)

Hover and Focus

Prefix any utility with hover- or focus- to apply it only on that state. Works with every utility in the system.

PrefixWhen it applies
hover-On mouse hover
focus-On keyboard focus or click

Responsive

Prefix any utility with mobile- or tablet- to override it at smaller screen sizes.

PrefixBreakpoint
mobile-*max-width: 640px
tablet-*max-width: 1024px

mobile-hidden removes an element on small screens. tablet-hidden removes it on tablet and below.

Full Cheatsheet

Every element and prefix in one place.

SymbolElement
# ## ###Headings h1 h2 h3
tParagraph
sAccordion summary
:Button
~Link (internal / external / mailto / #anchor)
>Image
>>Audio
>>>Video
<<Embed / iframe
-Unordered list item
1.Ordered list item
hTable header row
/Label
_Input
__Textarea
---Horizontal rule
--Line break
{ }Block / div
{} [table]Table block
{} [blockquote]Blockquote block
{} [accordion]Accordion block
{} [callout]Info callout
{} [callout-tip]Tip callout
{} [callout-warning]Warning callout
{} [callout-danger]Danger callout
```Code block
@modules/nameModule reference

zoar, a symbolic language · © 2026 Shepherd Games Private Limited

Privacy Terms