{
  "title": "Page Spec",
  "description": "PageSpec defines a routed screen composing blocks (Frontend §3).\n`blocks` and `tabs` are mutually exclusive; `mode: custom` excludes both.\n",
  "type": "object",
  "properties": {
    "asset": {
      "description": "Asset is the spec-root-relative asset path for `mode: custom`",
      "type": "string"
    },
    "binds": {
      "$ref": "#/$defs/PageBinds",
      "description": "Binds is the backend footprint (entities/actions/subscribe) a custom",
      "nullable": true
    },
    "blocks": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/PageBlock"
      }
    },
    "context": {
      "description": "Context declares render-context variables injected into this page's",
      "type": "array",
      "items": {
        "$ref": "#/$defs/ContextDecl"
      }
    },
    "description": {
      "type": "string"
    },
    "icon": {
      "type": "string"
    },
    "layout": {
      "$ref": "#/$defs/PageLayout",
      "nullable": true
    },
    "mode": {
      "description": "Page mode. `custom` hands all rendering to an asset component; empty means blocks/tabs composition.",
      "type": "string",
      "enum": [
        "",
        "custom"
      ]
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "public": {
      "description": "If true (default), a route is generated for this page. Set false to restrict to embedding only.",
      "type": "boolean",
      "examples": [
        "true"
      ],
      "nullable": true
    },
    "renderer": {
      "description": "Renderer is the per-instance renderer override (frontend/03-renderer-",
      "type": "string"
    },
    "route": {
      "description": "@schema {example: \"/orders/:id\"}",
      "type": "string",
      "examples": [
        "/orders/:id"
      ]
    },
    "tabs": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/PageTab"
      }
    },
    "title": {
      "description": "@schema {example: \"Order {order.number}\"}",
      "type": "string",
      "examples": [
        "Order {order.number}"
      ]
    },
    "title_visible": {
      "description": "Render the page title heading (default true)",
      "type": "boolean",
      "nullable": true
    }
  },
  "required": [
    "route",
    "title"
  ],
  "additionalProperties": false
}