Creating Pages
Pages are the top-level documents in your Meno project. Each page produces one HTML file in your static build. This guide walks you through creating, configuring, and publishing pages.
Creating a New Page
Open the Pages tab in the left sidebar.
Click the + button at the top of the panel.
Enter a filename (e.g.,
aboutorblog/first-post). Use forward slashes for nested paths.The new page appears in the list. Click it to open it in the canvas.
You now have an empty page with a single root
<div>. Start adding elements.
Adding Content
Once your page is open:
Press Cmd+E (or Ctrl+E on Windows/Linux) to open the Command Palette.
Search for an element type (e.g., "section", "heading", "image") or a component name.
Select it to insert it into the page at the current selection point.
Alternatively, press C to open the Components tab and drag a component onto the canvas.
Setting Page Metadata
Every page has metadata that controls SEO, social sharing, and routing. To edit it:
Click the page background (deselect all elements) so the Properties panel shows page-level settings.
Fill in the fields described below.
SEO Fields
Field | Purpose | Example |
|---|---|---|
| Browser tab title and search engine title |
|
| Search engine snippet |
|
| Comma-separated keywords (minor SEO value) |
|
| Social share title (falls back to |
|
| Social share description |
|
| Social share image URL |
|
| Open Graph type |
|
Custom Slugs
By default, the page filename becomes the URL path. To override this, set a custom slug in the metadata.
If your project uses multiple locales, you can set translated slugs so that /en/about becomes /pl/o-nas in Polish.
Draft Pages
Mark a page as draft to exclude it from the static build, sitemap, and robots.txt. Draft pages are still visible in the editor so you can work on them before publishing.
Open the page metadata.
Toggle the Draft switch on.
The page stays in your project but will not appear in production output until you turn draft off.
Pages Auto-Save
Meno saves your page automatically as you edit. There is no manual save button for page content. You will see changes reflected immediately in the canvas.
Page Navigation
The Pages tab shows all pages in your project as a flat list or grouped by folder. Use these shortcuts:
Click a page name to open it.
Right-click for options (rename, delete, duplicate).
Use the search field at the top to filter pages by name.
Organizing Pages in Folders
Use forward slashes in filenames to create folder structure:
blog/first-postcreates a page at/blog/first-postproducts/shoes/runningcreates a page at/products/shoes/running
The Pages tab groups pages by folder automatically.
Under the Hood
Page JSON Structure
Every page is stored as a JSON file with two top-level keys:
{
"root": {
"type": "node",
"tag": "div",
"style": {
"base": {
"maxWidth": "1200px",
"margin": "0 auto",
"padding": "48px 24px"
}
},
"children": [
{
"type": "node",
"tag": "h1",
"children": "Welcome to Our Site"
},
{
"type": "node",
"tag": "p",
"children": "This is the homepage."
}
]
},
"meta": {
"title": "Home",
"description": "Welcome to our website.",
"ogType": "website"
}
}root-- The component tree. Always starts with a single root node.meta-- Page metadata for SEO and routing.
Important: HTML nodes use the children property for text content, not a text property. This is a common mistake:
// CORRECT
{ "type": "node", "tag": "h1", "children": "Page Title" }
// WRONG - text property does not exist
{ "type": "node", "tag": "h1", "text": "Page Title" }The Meta Object
The full set of meta fields:
{
"meta": {
"title": "About Us",
"description": "Learn about our team.",
"keywords": "team, about, company",
"ogTitle": "About Our Company",
"ogDescription": "Meet the people behind the product.",
"ogImage": "/images/og-about.jpg",
"ogType": "website",
"draft": false
}
}Internationalized Meta
If your project supports multiple locales, meta text fields can be i18n objects instead of plain strings:
{
"meta": {
"title": {
"_i18n": true,
"en": "About Us",
"pl": "O Nas",
"de": "Ueber Uns"
},
"description": {
"_i18n": true,
"en": "Learn about our team.",
"pl": "Poznaj nasz zespol.",
"de": "Erfahren Sie mehr ueber unser Team."
},
"slugs": {
"en": "about",
"pl": "o-nas",
"de": "ueber-uns"
}
}
}The _i18n: true marker tells Meno this field has per-locale values. The slugs object maps locale codes to URL-friendly path segments.
Node Types
The root tree can contain these node types:
Type | Description |
|---|---|
| Standard HTML element (div, span, h1, img, etc.) |
| Instance of a reusable component |
| Anchor link element with href |
| Embedded HTML/iframe content |
| Repeating list from data |
| Locale-specific content list |
| Content injection point (inside components only) |
CMS-Backed Pages
Pages can be backed by a CMS collection. Set source: "cms" in meta and configure the cms object:
{
"meta": {
"title": "{{cms.title}}",
"source": "cms",
"cms": {
"id": "blog-posts",
"name": "Blog Posts",
"slugField": "slug",
"urlPattern": "/blog/{{slug}}",
"fields": {
"title": { "type": "string", "required": true },
"slug": { "type": "string", "required": true },
"body": { "type": "rich-text" }
}
}
}
}This creates a page template that generates one HTML file per CMS entry during static build.
Next Steps
Building Components -- Create reusable UI blocks.
Styling -- Add responsive styles and colors.
Interactive Styles -- Add hover, focus, and state-based styles.