# Page (/docs/components/page)

> A Page is one record: its Theme, an optional Template, its frame, its head and three to twenty sections, rendered as one document.

> A Page is an addressable page of a Site, of a named type such as pricing, about one Thing or each member of a Collection.
>
> startupbuilder.dev, [Page](https://startupbuilder.dev/business/nouns/page)

## What mdxui renders

One record, parsed by `PageSchema` and rendered by `renderPage`. This is Harbor's pricing page, five sections; open the Record tab to read the record that drew it, or pick another Theme.

The rendered page: https://next.mdxui.dev/sites/harbor/pricing; its record: https://next.mdxui.dev/pages/harbor/pricing.json

Each field decides one thing; a section decides its own layout and content.

From `@mdxui/site@7.0.0-alpha.0`.

| Field | Type and bound | Required | Decides |
| --- | --- | --- | --- |
| `theme` | `"certificate" \| "vaultline" \| "quaypoint" \| "callboard" \| "directory"` | yes | The Brand the page wears: tokens, typefaces and policies |
| `template` | `"api-product" \| "article" \| "blog" \| "post" \| "contact" \| "directory-list" \| "directory-product"` | no | The page kind; it names the slots the sections fill |
| `title` | `string ≤64` | yes | The document title and the share title |
| `description` | `string ≤320` | yes | The meta and share description |
| `meta` | `object` | no | The head: canonical address, icons, share image, `noindex` |
| `meta.canonical` | `string ≤160` | no | — |
| `meta.type` | `"website" \| "article"` | no | — |
| `meta.icon` | `string ≤160` | no | — |
| `meta.iconFallback` | `string ≤160` | no | — |
| `meta.appleTouchIcon` | `string ≤160` | no | — |
| `meta.image` | `object` | no | — |
| `meta.noindex` | `boolean` | no | — |
| `jsonLd` | `0–4 × object` | no | Structured data, written into the head as given |
| `frame` | `"none" \| "sheet" \| "split"` | yes | The frame around every section: none, one ruled sheet, or a split with an aside |
| `sections` | `3–20 × section` | yes | The page itself, in order |

Every bound, with its refusal, is on [Page fields and bounds](https://next.mdxui.dev/docs/reference/page-schema).

## How it maps

  - **path** (gap): Not in the record: the file's place decides it, so `pages/harbor/pricing.json` serves `/pricing`
  - **kind** (alpha): `template`, one of seven. A `landing` or `pricing` page is `api-product`; a `terms` page is `article`
  - **from** (gap): Not in the record: no lineage back to a Hypothesis slot
  - **uses Components** (alpha): `sections`, three to twenty, each one Section type
  - **about one Thing** (gap): Literal props: the agent writes the Thing's facts into the record
  - **each member of a Collection** (gap): One record per member, written out

## Status

A Page record parses and renders today, and none of its fields is a Spec. The record binds to no other record: an agent fills every field with literal words, and the bounds keep those words inside the design.

## Intended Noun

The three Page props the record lacks, drafted as the fields that close the gap.

```yaml title="intended Noun: Page record, the startupbuilder.dev props (mdxui.dev namespace)"
noun: Page record
projects: startupbuilder.dev Page, quoted above; defines nothing new
adds:
  path: { type: string, pattern: "^/[a-z0-9/-]*$", max: 160, required: true, note: the address under its Site; today the file path }
  kind: { type: enum, values: the startupbuilder.dev page types, required: false, note: maps onto template }
  from: { type: string, pattern: "Hypothesis#<slot>@v<version>", required: false, note: lineage, never rendered }
  about: { type: Thing reference, required: false, note: the Thing whose fields fill the sections }
```

## Related

  - [Section](https://next.mdxui.dev/docs/components/section): What one entry of `sections` holds.
  - [Template](https://next.mdxui.dev/docs/components/template): The seven page kinds.
  - [Pages are data](https://next.mdxui.dev/docs/start/pages-are-data): Why a page is a record.

