> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fetchski-attract.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update a page

> Partially update a page document.

**Perfect for:**
- Updating page titles or content
- Moving pages within the tree
- Making incremental changes

Can use MongoDB-style operators and dot notation for nested properties. Include `_targetId` and `_position` to move the page within the tree.

**Access:** an API key with `content:pages:write` (or a master above it: `content:pages:all`, `content:all`, `admin:all`). In published mode (the default) it goes live too, so the key also needs `content:pages:publish` (or a master above it); send `aposMode=draft` (or a draft `_id` and no `aposMode`) to change only the draft. A signed-in person may call it as far as their own permissions allow; anyone else gets 403.

**Rate limit:** the key’s own writes-per-minute limit, set when the key is created (default 120); over it, 429 with `Retry-After`.



## OpenAPI

````yaml /api-reference/openapi.yaml patch /@apostrophecms/page/{_id}
openapi: 3.1.0
info:
  title: Fetchski Attract CMS API
  description: >-
    Auto-generated OpenAPI spec for this Fetchski site instance. Authenticate
    machine-to-machine requests with an API key by sending the header
    `Authorization: ApiKey <token>`. Keys are issued in the CMS (API Keys) and
    carry scopes that limit them to specific actions. Each key also has its own
    security policy, chosen when it is created: a signing mode (token only,
    signed writes, or every request signed with the key’s signing secret via
    `X-Fetchski-Timestamp` + `X-Fetchski-Signature`), an optional network
    allowlist, and reads/writes-per-minute limits (429 with `Retry-After` over
    them). Some routes require a signature from every key — see each route.
  version: 1.0.0
servers:
  - url: https://{host}/api/v1
    description: 'Your site: set `host` to its host name.'
    variables:
      host:
        default: acme.example
security: []
tags:
  - name: Authentication
    description: >-
      Sign in as a person to get a bearer token or a session cookie.
      Integrations use an API key instead: send `Authorization: ApiKey <token>`.
  - name: SDK Packages
    description: >-
      The site’s own npm registry and Composer repository for the Attract SDKs,
      so an app installs them with one of the site’s API keys. Point npm, pnpm,
      Bun or Composer at them; the SDKs never call them.
  - name: Pages
    description: 'The page tree: each page’s content, place and URL.'
  - name: Global Content
    description: Site-wide content and settings every page shares.
  - name: Redirects
    description: Old URLs and where they now send visitors.
  - name: Internationalization
    description: The site’s locales.
  - name: Languages
    description: >-
      The site’s languages: the main language’s name and every further
      language’s name, code and Public switch. A save applies at once: a new
      language gets its home page and its own addresses (/fr/…), and its pages
      are then translated with each type’s localize routes.
  - name: Page Templates
    description: >-
      The site’s whole-page starting arrangements. They are not pages of the
      site (the Pages list leaves them out for API keys): read one, then make a
      page from it with Pages → create and `_copyingId` (`copyingId` in the
      SDKs).
  - name: Blog Posts
    description: The blog’s posts, and importing them from Markdown or MDX.
  - name: Blog Categories
    description: The categories posts are filed under.
  - name: Authors
    description: The people posts are credited to.
  - name: Team Members
    description: The people the Team section shows.
  - name: Testimonials
    description: Quotes from customers.
  - name: FAQ Items
    description: Questions and their answers.
  - name: FAQ Categories
    description: The groups questions are sorted into.
  - name: Google Reviews
    description: Reviews from the business’s Google profile, synced on a schedule.
  - name: Instagram Posts
    description: Posts from the connected Instagram account, synced on a schedule.
  - name: Service Areas
    description: The places the business serves, for the service map.
  - name: Cookies
    description: The cookies the consent banner declares.
  - name: Media
    description: The Images and Files libraries, and their tags.
  - name: Videos
    description: The Videos library.
  - name: Image Folders
    description: The folders that organize the Images library.
  - name: File Folders
    description: The folders that organize the Files library.
  - name: Video Folders
    description: The folders that organize the Videos library.
  - name: Photo Albums
    description: Hand-picked, ordered sets of photos for galleries.
  - name: Photo Feeds
    description: >-
      Feeds that collect photos from a connected photo source into the Images
      library on a schedule.
  - name: Attachments
    description: Uploading files and cropping images.
  - name: Fetchski Media
    description: >-
      Read-only discovery over the Images and Videos libraries: find what to
      reference in an MDX blog import, or which file to use, with its URLs.
  - name: Forms
    description: The site’s forms and their fields.
  - name: Form Submissions
    description: >-
      What visitors sent through the site’s forms. Submissions hold personal
      details: give a key `forms:read` only where it is needed.
  - name: Conversion Events
    description: >-
      The conversion event log — one record per conversion, with its attribution
      and consent snapshot and its delivery to each ad platform. Read it
      incrementally, post facts from other systems (a reservation purchase, a
      lead outcome), and adjust them (refunds, cancellations). One event ID
      travels everywhere as the platforms’ de-duplication key.
  - name: Visitor Attribution
    description: >-
      Per-visitor attribution on this site: first touch, last ad or campaign
      touch, and the ad platforms’ browser IDs. The join other systems use to
      attach a purchase to the marketing-site journey that led to it.
  - name: Ads Metrics
    description: >-
      Aggregates for dashboards: ad-click landings and conversions, by day,
      platform, campaign and more.
  - name: Conversions
    description: >-
      Conversion definitions — the visitor actions (a lead, a call click, a
      booking, a purchase) this site reports to the ad platforms, each with a
      row per platform. Managed by administrators in the CMS.
  - name: Webhooks
    description: >-
      Push notifications of form submissions and conversion-event changes to the
      site’s Webhook Destinations — signed with each destination’s own secret,
      retried for a day, at-least-once. Set destinations up in the CMS (Webhook
      Destinations, for people granted “Manage webhook destinations”): URL,
      events, optional filters and custom headers, and the signing secret shown
      once.
  - name: Request Log
    description: >-
      The page views the site captured (Connections → Tracking → Request log),
      and the query parameters on them: campaign tags and ad click IDs.
paths:
  /@apostrophecms/page/{_id}:
    patch:
      tags:
        - Pages
      summary: Update a page
      description: >-
        Partially update a page document.


        **Perfect for:**

        - Updating page titles or content

        - Moving pages within the tree

        - Making incremental changes


        Can use MongoDB-style operators and dot notation for nested properties.
        Include `_targetId` and `_position` to move the page within the tree.


        **Access:** an API key with `content:pages:write` (or a master above it:
        `content:pages:all`, `content:all`, `admin:all`). In published mode (the
        default) it goes live too, so the key also needs `content:pages:publish`
        (or a master above it); send `aposMode=draft` (or a draft `_id` and no
        `aposMode`) to change only the draft. A signed-in person may call it as
        far as their own permissions allow; anyone else gets 403.


        **Rate limit:** the key’s own writes-per-minute limit, set when the key
        is created (default 120); over it, 429 with `Retry-After`.
      operationId: updatePage
      parameters:
        - $ref: '#/components/parameters/DocumentId'
        - $ref: '#/components/parameters/AposMode'
        - $ref: '#/components/parameters/AposLocale'
      requestBody:
        required: true
        description: >-
          The fields to change. A key may also use dot notation to reach into a
          field (`sections.items.0.title`, `@<rowId>.title`).
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PageUpdateRequest'
      responses:
        '200':
          description: Page updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Page'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - ApiKeyAuth:
            - content:pages:write
        - BearerAuth: []
      x-codeSamples:
        - lang: typescript
          label: TypeScript
          source: >-
            import { createSiteClient } from '@fetchski/attract-cms-sdk';


            const site = createSiteClient();

            const page = await site.pages().updatePage({ id:
            'ckitdo5oq004pu69kr6oxo6fr:en:published' });
        - lang: php
          label: Laravel
          source: >-
            use Fetchski\AttractCmsLaravel\Facades\Attract;


            $page = Attract::pages()->updatePage(id:
            'ckitdo5oq004pu69kr6oxo6fr:en:published');
components:
  parameters:
    DocumentId:
      name: _id
      in: path
      required: true
      description: >-
        Computed document ID (can optionally include mode and locale, e.g.,
        id:en:published)
      schema:
        type: string
        pattern: ^\S+$
        example: ckitdo5oq004pu69kr6oxo6fr:en:published
    AposMode:
      name: aposMode
      in: query
      description: >-
        `published` (the default) or `draft`. Drafts need a credential that may
        see them: an API key with the type’s write scope
        (`content:<type>:write`), or a signed-in editor. The public and a key
        with only the read scope get 403.
      required: false
      schema:
        type: string
        enum:
          - draft
          - published
        default: published
      example: published
    AposLocale:
      name: aposLocale
      in: query
      description: >-
        The locale to read or write, e.g. `en` (default: the site’s default
        locale).
      required: false
      schema:
        type: string
        example: fr
  schemas:
    PageUpdateRequest:
      type: object
      description: >-
        The fields to change (the rest stay as they are), and, to move the page,
        where it goes.
      properties:
        _targetId:
          type:
            - string
            - 'null'
          description: >-
            The page to place it beside or under, by `_id` (`_home` and
            `_archive` work too). Default `_home`.
        _position:
          type:
            - string
            - 'null'
          enum:
            - before
            - after
            - firstChild
            - lastChild
            - null
          description: Where, relative to `_targetId`. Default `lastChild`.
        slug:
          type:
            - string
            - 'null'
          description: URL slug for the page
          example: /about-us
        orphan:
          type:
            - boolean
            - 'null'
          description: Whether page is orphaned (not in tree structure)
          default: false
        visibility:
          type:
            - string
            - 'null'
          description: Page visibility setting
          enum:
            - public
            - loginRequired
            - private
            - null
          default: public
          example: public
        type:
          type:
            - string
            - 'null'
          description: >-
            The page type: one of the site’s page types (the `type` its pages
            carry). Anything else is refused with the list.
          example: default-page
        title:
          type:
            - string
            - 'null'
          description: Page title
          example: About Us
          maxLength: 100
        main:
          title: Content
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/MainArea'
        aposShareKey:
          type:
            - string
            - 'null'
          description: >-
            The draft’s preview share key, while its share link is on: the link
            is the draft’s `_url` with `aposShareKey` and `aposShareId` (the
            draft’s `_id`) in its query. Absent otherwise, and on published
            documents.
          example: k3v9x2m7q1z8w4p6
          readOnly: true
        scheduledPublish:
          type:
            - string
            - 'null'
          description: An ISO 8601 date and time, e.g. `2026-10-21T14:30:00.000Z`.
        scheduledUnpublish:
          type:
            - string
            - 'null'
          description: An ISO 8601 date and time, e.g. `2026-10-21T14:30:00.000Z`.
        seoTitle:
          type:
            - string
            - 'null'
          title: SEO title
          description: >-
            Overrides the document title in the browser tab and search results.
            Leave blank to use the regular title.
          default: ''
        seoDescription:
          type:
            - string
            - 'null'
          title: SEO description
          description: >-
            Shown in search results and link previews. Aim for 150–160
            characters.
          default: ''
        seoImage:
          title: Social share image
          description: >-
            Used for Open Graph / social link previews. Recommended 1200×630.
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        pageFontOverrides:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/PagePageFontOverridesItem'
          title: Typeface for this page
          description: >-
            Optional. Set part of this page in a different typeface. Leave empty
            to follow the site’s fonts (Site design → Typography). Individual
            sections can still override this for themselves.
          default: []
          maxItems: 4
        footerMarqueeMode:
          type:
            - string
            - 'null'
          title: Marquee on this page
          description: >-
            The ribbon of phrases scrolling across the top of the footer. Its
            phrases and the site-wide default are set in Site design → Footer:
            Marquee.
          default: inherit
          enum:
            - inherit
            - 'on'
            - 'off'
            - null
        sections:
          title: Page sections
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area. A new
            document starts with `page-header`.
          allOf:
            - $ref: '#/components/schemas/SectionsArea'
        comingSoonIcon:
          type:
            - string
            - 'null'
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: sparkles
        comingSoonIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        comingSoonIconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        comingSoonIconAnimation:
          type:
            - string
            - 'null'
          title: Icon animation
          default: none
          enum:
            - none
            - fa-beat
            - fa-bounce
            - fa-fade
            - fa-beat-fade
            - fa-flip
            - fa-shake
            - fa-spin
            - null
          description: Icon animation.
        comingSoonIconSize:
          type:
            - string
            - 'null'
          title: Icon size
          description: Relative to the component’s base icon size.
          default: 5x
          enum:
            - default
            - sm
            - lg
            - xl
            - 2xl
            - 2x
            - 3x
            - 4x
            - 5x
            - null
        comingSoonNote:
          type:
            - string
            - 'null'
          title: Coming-soon message
          description: >-
            Optional. Shown under the icon while this page has no content. Leave
            empty for a tasteful default line.
          default: ''
        backLinkColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Color of the "← back" link at the top of every post. Leave
            empty to use the site accent color.
          title: Back link color (dark theme)
        backLinkColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Back link color (light theme)
        backLinkWeight:
          type:
            - string
            - 'null'
          title: Back link weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Back link weight.
        backLinkSize:
          type:
            - string
            - 'null'
          title: Back link size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Back link size.
        aboveSections:
          title: Page sections
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area. A new
            document starts with `page-header`.
          allOf:
            - $ref: '#/components/schemas/SectionsArea'
        postList:
          title: Post list
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area. A new
            document starts with `blog-list`.
          allOf:
            - $ref: '#/components/schemas/BlogListArea'
        belowSections:
          title: Page sections
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/SectionsArea'
        backButtonLabel:
          type:
            - string
            - 'null'
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Back to all posts
        backButtonVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        backButtonSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        backButtonRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        backButtonColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        backButtonColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        backButtonTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        backButtonTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        backButtonHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        backButtonHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        backButtonStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        backButtonShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        backButtonShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        backButtonAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        backButtonIcon:
          type:
            - string
            - 'null'
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-left
        backButtonIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        backButtonIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        backButtonIconNudge:
          type:
            - boolean
            - 'null'
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        postFontOverrides:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/PagePostFontOverridesItem'
          title: Typeface for posts
          description: >-
            Optional. Set part of every post in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography). An
            individual post can replace this on its own Fonts tab.
          default: []
          maxItems: 4
        postTextSize:
          type:
            - string
            - 'null'
          title: Body text size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Body text size.
        postTextWeight:
          type:
            - string
            - 'null'
          title: Body text weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - null
          description: Body text weight.
        postContentWidth:
          type:
            - string
            - 'null'
          title: Content width
          description: >-
            Reading measure — how wide the article column gets. Posts that
            contain section widgets open to Full width automatically so the
            widgets have room.
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - xwide
            - full
            - null
        postLineHeight:
          type:
            - string
            - 'null'
          title: Line height
          default: normal
          enum:
            - tight
            - normal
            - relaxed
            - null
          description: Line height.
        postAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Links, the blockquote rule, and heading accents. Leave empty to use
            the site link color.
          title: Accent color (dark theme)
        postAccentColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the link color.
          title: Accent color (light theme)
        postHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        postHeadingColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides in-article heading color. Leave empty to track
            the theme’s text color.
          title: Heading color (dark theme)
        postHeadingColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the theme default.
          title: Heading color (light theme)
        blogPostCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for every blog post’s page: the title band, the article and its
            parts. It wins over Site design → Custom CSS → Blog post.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Post custom CSS
      additionalProperties: true
      title: PageUpdateRequest
    Page:
      type: object
      description: >-
        A page: the fields every page has, and each page type’s own (`type` says
        which page type it is; a field belongs only to the page types that
        define it).
      required:
        - _id
        - aposDocId
        - type
        - title
        - slug
        - path
        - level
        - visibility
        - aposLocale
        - updatedAt
      properties:
        _id:
          type: string
          description: >-
            Unique document identifier, may include mode and locale (e.g.,
            "id:en:published")
          example: ckhdscx5900054z9k88uqs16w:en:published
        aposDocId:
          type: string
          description: Base document ID without mode/locale qualifiers
          example: ckhdscx5900054z9k88uqs16w
        aposLocale:
          type: string
          description: Document locale code
          example: en
        aposMode:
          type:
            - string
            - 'null'
          description: Document mode (draft or published)
          enum:
            - draft
            - published
            - null
          example: published
        archived:
          type:
            - boolean
            - 'null'
          description: Whether the page is archived
          default: false
        createdAt:
          type:
            - string
            - 'null'
          format: date-time
          description: Page creation timestamp
          example: '2023-01-15T10:30:00.000Z'
        updatedAt:
          type: string
          format: date-time
          description: Page last update timestamp
          example: '2024-12-18T14:20:00.000Z'
        titleSortified:
          type:
            - string
            - 'null'
          description: Sortable version of the page title
          example: about us
        slug:
          type: string
          description: URL slug for the page
          example: /about-us
        path:
          type: string
          description: Full hierarchical path in the page tree
          example: /about-us
        rank:
          type:
            - integer
            - 'null'
          description: Sort order within parent page
          example: 0
        level:
          type: integer
          description: Depth level in the page tree (0 = root level)
          example: 1
        orphan:
          type:
            - boolean
            - 'null'
          description: Whether page is orphaned (not in tree structure)
          default: false
        parked:
          type:
            - array
            - 'null'
          description: Array of parking lot configurations if page is parked
          items:
            type: string
          example: []
        visibility:
          type: string
          description: Page visibility setting
          enum:
            - public
            - loginRequired
            - private
          default: public
          example: public
        type:
          type: string
          description: Page type module name
          example: '@apostrophecms/page'
        title:
          type: string
          description: Page title
          example: About Us
          maxLength: 100
        main:
          title: Content
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/MainArea'
        _ancestors:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/Page'
          description: >-
            The page’s ancestors, from the home page down (each without its own
            `_ancestors` and `_children`).
        _children:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/Page'
          description: >-
            Its child pages, each with its own `_children` where the request
            asked for more levels.
        _url:
          type:
            - string
            - 'null'
          description: Full URL to the page
          example: https://example.com/about-us
          format: uri
        _edit:
          type:
            - boolean
            - 'null'
          description: Whether current user can edit this page
          example: true
        _publish:
          type:
            - boolean
            - 'null'
          description: Whether current user can publish this page
          example: true
        copyOfId:
          type:
            - string
            - 'null'
          description: >-
            The `_id` of the piece/page that was copied to create this document
            (only present if created via `_copyingId`)
          example: ckhdscx5900054z9k88uqs16w:en:published
        _publishedDoc:
          allOf:
            - $ref: '#/components/schemas/Page'
            - description: Published version of the page (when viewing drafts)
        _draftDoc:
          allOf:
            - $ref: '#/components/schemas/Page'
            - description: Draft version of the page (when viewing published)
        aposShareKey:
          type:
            - string
            - 'null'
          description: >-
            The draft’s preview share key, while its share link is on: the link
            is the draft’s `_url` with `aposShareKey` and `aposShareId` (the
            draft’s `_id`) in its query. Absent otherwise, and on published
            documents.
          example: k3v9x2m7q1z8w4p6
          readOnly: true
        scheduledPublish:
          type:
            - string
            - 'null'
          description: An ISO 8601 date and time, e.g. `2026-10-21T14:30:00.000Z`.
        scheduledUnpublish:
          type:
            - string
            - 'null'
          description: An ISO 8601 date and time, e.g. `2026-10-21T14:30:00.000Z`.
        seoTitle:
          type:
            - string
            - 'null'
          title: SEO title
          description: >-
            Overrides the document title in the browser tab and search results.
            Leave blank to use the regular title.
          default: ''
        seoDescription:
          type:
            - string
            - 'null'
          title: SEO description
          description: >-
            Shown in search results and link previews. Aim for 150–160
            characters.
          default: ''
        seoImage:
          title: Social share image
          description: >-
            Used for Open Graph / social link previews. Recommended 1200×630.
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        pageFontOverrides:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/PagePageFontOverridesItem'
          title: Typeface for this page
          description: >-
            Optional. Set part of this page in a different typeface. Leave empty
            to follow the site’s fonts (Site design → Typography). Individual
            sections can still override this for themselves.
          default: []
          maxItems: 4
        footerMarqueeMode:
          type:
            - string
            - 'null'
          title: Marquee on this page
          description: >-
            The ribbon of phrases scrolling across the top of the footer. Its
            phrases and the site-wide default are set in Site design → Footer:
            Marquee.
          default: inherit
          enum:
            - inherit
            - 'on'
            - 'off'
            - null
        sections:
          title: Page sections
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area. A new
            document starts with `page-header`.
          allOf:
            - $ref: '#/components/schemas/SectionsArea'
        comingSoonIcon:
          type:
            - string
            - 'null'
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: sparkles
        comingSoonIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        comingSoonIconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        comingSoonIconAnimation:
          type:
            - string
            - 'null'
          title: Icon animation
          default: none
          enum:
            - none
            - fa-beat
            - fa-bounce
            - fa-fade
            - fa-beat-fade
            - fa-flip
            - fa-shake
            - fa-spin
            - null
          description: Icon animation.
        comingSoonIconSize:
          type:
            - string
            - 'null'
          title: Icon size
          description: Relative to the component’s base icon size.
          default: 5x
          enum:
            - default
            - sm
            - lg
            - xl
            - 2xl
            - 2x
            - 3x
            - 4x
            - 5x
            - null
        comingSoonNote:
          type:
            - string
            - 'null'
          title: Coming-soon message
          description: >-
            Optional. Shown under the icon while this page has no content. Leave
            empty for a tasteful default line.
          default: ''
        backLinkColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Color of the "← back" link at the top of every post. Leave
            empty to use the site accent color.
          title: Back link color (dark theme)
        backLinkColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Back link color (light theme)
        backLinkWeight:
          type:
            - string
            - 'null'
          title: Back link weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Back link weight.
        backLinkSize:
          type:
            - string
            - 'null'
          title: Back link size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Back link size.
        aboveSections:
          title: Page sections
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area. A new
            document starts with `page-header`.
          allOf:
            - $ref: '#/components/schemas/SectionsArea'
        postList:
          title: Post list
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area. A new
            document starts with `blog-list`.
          allOf:
            - $ref: '#/components/schemas/BlogListArea'
        belowSections:
          title: Page sections
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/SectionsArea'
        backButtonLabel:
          type:
            - string
            - 'null'
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Back to all posts
        backButtonVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        backButtonSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        backButtonRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        backButtonColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        backButtonColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        backButtonTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        backButtonTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        backButtonHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        backButtonHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        backButtonStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        backButtonShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        backButtonShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        backButtonAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        backButtonIcon:
          type:
            - string
            - 'null'
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-left
        backButtonIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        backButtonIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        backButtonIconNudge:
          type:
            - boolean
            - 'null'
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        postFontOverrides:
          type:
            - array
            - 'null'
          items:
            $ref: '#/components/schemas/PagePostFontOverridesItem'
          title: Typeface for posts
          description: >-
            Optional. Set part of every post in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography). An
            individual post can replace this on its own Fonts tab.
          default: []
          maxItems: 4
        postTextSize:
          type:
            - string
            - 'null'
          title: Body text size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Body text size.
        postTextWeight:
          type:
            - string
            - 'null'
          title: Body text weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - null
          description: Body text weight.
        postContentWidth:
          type:
            - string
            - 'null'
          title: Content width
          description: >-
            Reading measure — how wide the article column gets. Posts that
            contain section widgets open to Full width automatically so the
            widgets have room.
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - xwide
            - full
            - null
        postLineHeight:
          type:
            - string
            - 'null'
          title: Line height
          default: normal
          enum:
            - tight
            - normal
            - relaxed
            - null
          description: Line height.
        postAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Links, the blockquote rule, and heading accents. Leave empty to use
            the site link color.
          title: Accent color (dark theme)
        postAccentColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the link color.
          title: Accent color (light theme)
        postHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        postHeadingColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides in-article heading color. Leave empty to track
            the theme’s text color.
          title: Heading color (dark theme)
        postHeadingColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the theme default.
          title: Heading color (light theme)
        blogPostCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for every blog post’s page: the title band, the article and its
            parts. It wins over Site design → Custom CSS → Blog post.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Post custom CSS
      additionalProperties: true
      title: Page
    MainArea:
      type: object
      description: >-
        Content made of widgets, as the site stores it: send `{ "items": [ … ]
        }`, one object per widget, top to bottom. It takes
        `@apostrophecms/rich-text`, `@apostrophecms/image`,
        `@apostrophecms/video` widgets; an item of any other type is dropped.
        Writing it replaces the whole area.
      properties:
        metaType:
          type: string
          enum:
            - area
          description: Always `area`.
        _id:
          type: string
          description: 'The area’s id, set by the site: leave it out when you write one.'
        items:
          type: array
          description: >-
            The widgets, top to bottom. Each is an object with its `type` and
            that widget’s own fields; `_id` and `metaType` may be left out (the
            site sets them).
          items:
            $ref: '#/components/schemas/MainAreaItem'
      additionalProperties: true
      example:
        items:
          - type: '@apostrophecms/rich-text'
            content: <p>Hello from the API.</p>
    ImageArea:
      type: object
      description: >-
        Content made of widgets, as the site stores it: send `{ "items": [ … ]
        }`, one object per widget, top to bottom. It takes
        `@apostrophecms/image` widgets; an item of any other type is dropped. At
        most 1. Writing it replaces the whole area.
      properties:
        metaType:
          type: string
          enum:
            - area
          description: Always `area`.
        _id:
          type: string
          description: 'The area’s id, set by the site: leave it out when you write one.'
        items:
          type: array
          description: >-
            The widgets, top to bottom. Each is an object with its `type` and
            that widget’s own fields; `_id` and `metaType` may be left out (the
            site sets them).
          items:
            $ref: '#/components/schemas/ImageWidget'
          maxItems: 1
      additionalProperties: true
      example:
        items: []
    PagePageFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/PagePageFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    SectionsArea:
      type: object
      description: >-
        Content made of widgets, as the site stores it: send `{ "items": [ … ]
        }`, one object per widget, top to bottom. It takes `page-header`,
        `hero`, `@apostrophecms/layout`, `intro`, `feature`, `stats`, `logos`,
        `steps`, `media-text`, `device-mock`, `team`, `faq`, `service-map`,
        `blog-preview`, `cookie-declaration`, `@apostrophecms/rich-text`,
        `google-reviews`, `testimonials`, `instagram-feed`, `gallery-preview`,
        `gallery-full`, `pricing`, `newsletter`, `sms-signup`, `form-render`,
        `final-cta` widgets; an item of any other type is dropped. Writing it
        replaces the whole area.
      properties:
        metaType:
          type: string
          enum:
            - area
          description: Always `area`.
        _id:
          type: string
          description: 'The area’s id, set by the site: leave it out when you write one.'
        items:
          type: array
          description: >-
            The widgets, top to bottom. Each is an object with its `type` and
            that widget’s own fields; `_id` and `metaType` may be left out (the
            site sets them).
          items:
            $ref: '#/components/schemas/SectionsAreaItem'
      additionalProperties: true
      example:
        items:
          - type: '@apostrophecms/rich-text'
            content: <p>Hello from the API.</p>
    BlogListArea:
      type: object
      description: >-
        Content made of widgets, as the site stores it: send `{ "items": [ … ]
        }`, one object per widget, top to bottom. It takes `blog-list` widgets;
        an item of any other type is dropped. At most 1. Writing it replaces the
        whole area.
      properties:
        metaType:
          type: string
          enum:
            - area
          description: Always `area`.
        _id:
          type: string
          description: 'The area’s id, set by the site: leave it out when you write one.'
        items:
          type: array
          description: >-
            The widgets, top to bottom. Each is an object with its `type` and
            that widget’s own fields; `_id` and `metaType` may be left out (the
            site sets them).
          items:
            $ref: '#/components/schemas/BlogListWidget'
          maxItems: 1
      additionalProperties: true
      example:
        items:
          - type: blog-list
    PagePostFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/PagePostFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    ApiError:
      type: object
      description: >-
        An error answer: the error’s name, a message saying what is wrong, and
        details by error.
      required:
        - name
      properties:
        name:
          type: string
          description: >-
            The error’s name: `invalid`, `required`, `unauthorized`,
            `forbidden`, `notfound`, `conflict`, `locked`, `tooManyRequests`,
            `error` (a server failure)…
        message:
          type: string
          description: What is wrong, and how to fix it.
        data:
          type: object
          additionalProperties: true
          description: >-
            Details, by error: `errors` (one entry per field problem, each with
            its `path`), `retryAfter` (seconds, on 429), `permission`…
    MainAreaItem:
      description: >-
        A widget in an area that takes `@apostrophecms/rich-text`,
        `@apostrophecms/image`, `@apostrophecms/video`: the one its `type`
        names.
      oneOf:
        - $ref: '#/components/schemas/RichTextWidget'
        - $ref: '#/components/schemas/ImageWidget'
        - $ref: '#/components/schemas/VideoWidget'
      discriminator:
        propertyName: type
        mapping:
          '@apostrophecms/rich-text': '#/components/schemas/RichTextWidget'
          '@apostrophecms/image': '#/components/schemas/ImageWidget'
          '@apostrophecms/video': '#/components/schemas/VideoWidget'
    ImageWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - '@apostrophecms/image'
          description: 'The widget’s type: always `@apostrophecms/image`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        _image:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Image
          maxItems: 1
          description: >-
            The related `@apostrophecms/image` documents, in order (empty when
            none). To set it, send a list of `{ "_id": "…" }`, one per document
            (one at most); a document the site can’t find is left out.
        caption:
          type: string
          title: Caption
          default: ''
          description: Caption.
        linkTo:
          type:
            - string
            - 'null'
          title: Link To...
          default: none
          enum:
            - none
            - '@apostrophecms/any-page-type'
            - _url
            - null
          description: Link To...
        _apostrophecms-any-page-type:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Page
          maxItems: 1
          description: >-
            The related `@apostrophecms/any-page-type` documents, in order
            (empty when none). To set it, send a list of `{ "_id": "…" }`, one
            per document (one at most); a document the site can’t find is left
            out.
        linkHref:
          type:
            - string
            - 'null'
          title: URL
          description: apostrophe:linkHrefHelp When set, a URL; empty or null when not.
        linkHrefTitle:
          type: string
          title: Link Title
          default: ''
          description: Link Title.
        linkTitle:
          type: string
          title: Link Title
          description: If empty, the title of the related document will be used.
          default: ''
        linkTarget:
          type:
            - array
            - 'null'
          items:
            type: string
            enum:
              - _blank
          title: Link Target
          description: Link Target.
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `@apostrophecms/image` widget: its `type` and its own fields. A field
        left out takes its default.
      additionalProperties: true
    PagePageFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    SectionsAreaItem:
      description: >-
        A widget in an area that takes `page-header`, `hero`,
        `@apostrophecms/layout`, `intro`, `feature`, `stats`, `logos`, `steps`,
        `media-text`, `device-mock`, `team`, `faq`, `service-map`,
        `blog-preview`, `cookie-declaration`, `@apostrophecms/rich-text`,
        `google-reviews`, `testimonials`, `instagram-feed`, `gallery-preview`,
        `gallery-full`, `pricing`, `newsletter`, `sms-signup`, `form-render`,
        `final-cta`: the one its `type` names.
      oneOf:
        - $ref: '#/components/schemas/PageHeaderWidget'
        - $ref: '#/components/schemas/HeroWidget'
        - $ref: '#/components/schemas/LayoutWidget'
        - $ref: '#/components/schemas/IntroWidget'
        - $ref: '#/components/schemas/FeatureWidget'
        - $ref: '#/components/schemas/StatsWidget'
        - $ref: '#/components/schemas/LogosWidget'
        - $ref: '#/components/schemas/StepsWidget'
        - $ref: '#/components/schemas/MediaTextWidget'
        - $ref: '#/components/schemas/DeviceMockWidget'
        - $ref: '#/components/schemas/TeamWidget'
        - $ref: '#/components/schemas/FaqWidget'
        - $ref: '#/components/schemas/ServiceMapWidget'
        - $ref: '#/components/schemas/BlogPreviewWidget'
        - $ref: '#/components/schemas/CookieDeclarationWidget'
        - $ref: '#/components/schemas/RichTextWidget'
        - $ref: '#/components/schemas/GoogleReviewsWidget'
        - $ref: '#/components/schemas/TestimonialsWidget'
        - $ref: '#/components/schemas/InstagramFeedWidget'
        - $ref: '#/components/schemas/GalleryPreviewWidget'
        - $ref: '#/components/schemas/GalleryFullWidget'
        - $ref: '#/components/schemas/PricingWidget'
        - $ref: '#/components/schemas/NewsletterWidget'
        - $ref: '#/components/schemas/SmsSignupWidget'
        - $ref: '#/components/schemas/FormRenderWidget'
        - $ref: '#/components/schemas/FinalCtaWidget'
      discriminator:
        propertyName: type
        mapping:
          page-header: '#/components/schemas/PageHeaderWidget'
          hero: '#/components/schemas/HeroWidget'
          '@apostrophecms/layout': '#/components/schemas/LayoutWidget'
          intro: '#/components/schemas/IntroWidget'
          feature: '#/components/schemas/FeatureWidget'
          stats: '#/components/schemas/StatsWidget'
          logos: '#/components/schemas/LogosWidget'
          steps: '#/components/schemas/StepsWidget'
          media-text: '#/components/schemas/MediaTextWidget'
          device-mock: '#/components/schemas/DeviceMockWidget'
          team: '#/components/schemas/TeamWidget'
          faq: '#/components/schemas/FaqWidget'
          service-map: '#/components/schemas/ServiceMapWidget'
          blog-preview: '#/components/schemas/BlogPreviewWidget'
          cookie-declaration: '#/components/schemas/CookieDeclarationWidget'
          '@apostrophecms/rich-text': '#/components/schemas/RichTextWidget'
          google-reviews: '#/components/schemas/GoogleReviewsWidget'
          testimonials: '#/components/schemas/TestimonialsWidget'
          instagram-feed: '#/components/schemas/InstagramFeedWidget'
          gallery-preview: '#/components/schemas/GalleryPreviewWidget'
          gallery-full: '#/components/schemas/GalleryFullWidget'
          pricing: '#/components/schemas/PricingWidget'
          newsletter: '#/components/schemas/NewsletterWidget'
          sms-signup: '#/components/schemas/SmsSignupWidget'
          form-render: '#/components/schemas/FormRenderWidget'
          final-cta: '#/components/schemas/FinalCtaWidget'
    BlogListWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - blog-list
          description: 'The widget’s type: always `blog-list`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        blogLayout:
          type:
            - string
            - 'null'
          title: List layout
          description: How posts are arranged.
          default: card
          enum:
            - card
            - list
            - compact
            - featured
            - masonry
            - null
        blogColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: Applies to the Card grid and Masonry layouts.
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - null
        blogEntrance:
          type:
            - string
            - 'null'
          title: Scroll-in animation
          description: >-
            How posts animate in as they scroll into view. Only plays when site
            animations are on (Site design → Motion) — otherwise the posts are
            simply shown. In the Featured + grid layout the banner rises first,
            then the grid staggers in.
          default: stagger
          enum:
            - stagger
            - none
            - null
        blogCardImageAspect:
          type:
            - string
            - 'null'
          title: Image shape
          description: >-
            Aspect ratio of the featured image. Choose “Hidden” for text-only
            cards.
          default: 16/10
          enum:
            - 16/10
            - 4/3
            - 3/2
            - 1/1
            - none
            - null
        blogCardImageHover:
          type:
            - string
            - 'null'
          title: Image hover
          default: zoom
          enum:
            - zoom
            - none
            - null
          description: Image hover.
        blogCardImageFill:
          type: boolean
          title: Image fills the card
          description: >-
            Use the featured image as the full card background, with the title
            and meta overlaid on a dark scrim. Posts with no image fall back to
            a normal card.
          default: false
        blogCardPreset:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The card surface. Raised is a quiet lit card; Luxe a frosted glass
            panel; Outline a plaque frame; Spine adds a color rail; Tint an
            accent wash; Ticket/Bracket/Forge/Press/Inlay are the graphic
            showstoppers. (On image-led cards the photo covers the top edge.)
          default: raised
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        blogCardPresetRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        blogCardPresetAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        blogCardPresetAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        blogCardPresetForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        blogCardPresetForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        blogCardHover:
          type:
            - string
            - 'null'
          title: Card hover effect
          description: >-
            What a card does on hover. Lift/Pop/Press/Glow/Outline are instant;
            Sheen sweeps a light across; Tilt (3-D + glare), Magnetic and
            Spotlight follow the cursor (need site animations on). The Hover
            color below tints these.
          default: pop
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        blogCardHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Border / shadow / glow color on hover. Leave empty to use the site
            accent color.
          title: Hover accent color (dark theme)
        blogCardHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Hover accent color (light theme)
        blogCardShowCategory:
          type: boolean
          title: Show category
          default: true
          description: Show category.
        blogCardCategoryStyle:
          type:
            - string
            - 'null'
          title: Category badge style
          description: >-
            How the category badge uses its color (set per category under Blog
            Categories). Filled = colored background; Outline = colored border +
            text; Minimal = colored text only.
          default: filled
          enum:
            - filled
            - outline
            - minimal
            - null
        blogCardShowDate:
          type: boolean
          title: Show date
          default: true
          description: Show date.
        blogCardShowExcerpt:
          type: boolean
          title: Show excerpt
          default: true
          description: Show excerpt.
        blogCardExcerptLines:
          type:
            - string
            - 'null'
          title: Excerpt lines
          description: How many lines of the excerpt to show before truncating.
          default: '3'
          enum:
            - '2'
            - '3'
            - '4'
            - none
            - null
        blogCardShowAuthor:
          type: boolean
          title: Show author
          default: true
          description: Show author.
        blogCardShowReadMore:
          type: boolean
          title: Show “Read post” link
          default: true
          description: Show “Read post” link.
        blogCardReadMorePlacement:
          type:
            - string
            - 'null'
          title: “Read post” placement
          description: >-
            Auto puts it on the right of horizontal cards (list / compact /
            featured) and below the text on grid cards. Or force one placement
            everywhere.
          default: auto
          enum:
            - auto
            - below
            - right
            - null
        blogCardReadMoreColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the “Read post” link color. Leave empty to use
            the site accent color.
          title: “Read post” color (dark theme)
        blogCardReadMoreColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: “Read post” color (light theme)
        blogCardReadMoreHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Color of the “Read post” link when the card is hovered.
            Leave empty to use the accent color.
          title: “Read post” hover color (dark theme)
        blogCardReadMoreHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color, then the accent.
          title: “Read post” hover color (light theme)
        blogCardTitleColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the card title color. Leave empty to track the
            theme’s text color.
          title: Title color (dark theme)
        blogCardTitleColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the theme default.
          title: Title color (light theme)
        blogCardTitleWeight:
          type:
            - string
            - 'null'
          title: Title weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Title weight.
        blogCardTitleHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Title color when the card is hovered. Leave empty to use
            the site accent color.
          title: Title hover color (dark theme)
        blogCardTitleHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color, then the accent.
          title: Title hover color (light theme)
        blogCardTextColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the excerpt text color. Leave empty for the
            muted default.
          title: Excerpt color (dark theme)
        blogCardTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the muted default.
          title: Excerpt color (light theme)
        blogCardTextWeight:
          type:
            - string
            - 'null'
          title: Excerpt weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - null
          description: Excerpt weight.
        blogCardMetaColor:
          type:
            - string
            - 'null'
          description: Date / meta line color. Leave empty for the faint default.
          title: Meta color (dark theme)
        blogCardMetaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the faint default.
          title: Meta color (light theme)
        blogBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        blogBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        blogBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        blogBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        blogFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/BlogListWidgetBlogFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `blog-list` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    PagePostFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    RichTextWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - '@apostrophecms/rich-text'
          description: 'The widget’s type: always `@apostrophecms/rich-text`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        content:
          type: string
          format: html
          description: >-
            The text as HTML, e.g. `<h2>Our story</h2><p>It began with
            <strong>one</strong> idea.</p>`. The site keeps the tags and styles
            this area’s editor offers (paragraphs, headings, bold, italic,
            links, lists…) and removes the rest.
          example: <p>Hello from the API.</p>
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `@apostrophecms/rich-text` widget: its `type` and its own fields. A
        field left out takes its default.
      additionalProperties: true
    VideoWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - '@apostrophecms/video'
          description: 'The widget’s type: always `@apostrophecms/video`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        video:
          type: object
          description: >-
            Enter the URL for a media source you wish to embed (e.g., YouTube,
            Vimeo, or other hosted video URL).
          title: Video URL
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
        - video
      description: >-
        A `@apostrophecms/video` widget: its `type` and its own fields. A field
        left out takes its default.
      additionalProperties: true
    PageHeaderWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - page-header
          description: 'The widget’s type: always `page-header`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        headline:
          type: string
          title: Headline
          description: >-
            Optional. Leave empty to show the page title (the usual case). Set
            it only when the visible heading should read differently from the
            page’s title in navigation, search results and breadcrumbs.
          default: ''
        eyebrowMode:
          type:
            - string
            - 'null'
          title: Eyebrow
          description: The small label above the title.
          default: business
          enum:
            - business
            - custom
            - none
            - null
        eyebrow:
          type: string
          title: Eyebrow text
          default: ''
          description: Eyebrow text.
        eyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        eyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        eyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        eyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        titleColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Title color (dark theme)
        titleColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Title color (light theme)
        titleWeight:
          type:
            - string
            - 'null'
          title: Title weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Title weight.
        titleSize:
          type:
            - string
            - 'null'
          title: Title size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Title size.
        leadText:
          type: string
          title: Lead paragraph
          description: Optional intro shown under the page title.
          default: ''
        leadColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Lead color (dark theme)
        leadColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Lead color (light theme)
        leadWeight:
          type:
            - string
            - 'null'
          title: Lead weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Lead weight.
        leadSize:
          type:
            - string
            - 'null'
          title: Lead size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Lead size.
        pageHeaderBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: sunken
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        pageHeaderBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        pageHeaderBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        pageHeaderBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        pageHeaderImage:
          title: Background image
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        pageHeaderOverlayColor:
          type:
            - string
            - 'null'
          description: >-
            Scrim behind the text over a background image (only applies when one
            is set). Leave empty to use the dark surface color.
          title: Overlay color (dark theme)
        pageHeaderOverlayColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme overlay,
            then the light surface color.
          title: Overlay color (light theme)
        pageHeaderOverlayOpacity:
          type:
            - number
            - 'null'
          title: Overlay opacity (%)
          default: 55
          minimum: 0
          maximum: 100
          x-fetchski-clamped: true
          description: Overlay opacity (%).
        pageHeaderFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/PageHeaderWidgetPageHeaderFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        pageHeaderPrimaryCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        pageHeaderPrimaryCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        pageHeaderPrimaryCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        pageHeaderPrimaryCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        pageHeaderPrimaryCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        pageHeaderPrimaryCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        pageHeaderPrimaryCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        pageHeaderPrimaryCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        pageHeaderPrimaryCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        pageHeaderPrimaryCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        pageHeaderPrimaryCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        pageHeaderPrimaryCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        pageHeaderPrimaryCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        pageHeaderPrimaryCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        pageHeaderPrimaryCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        pageHeaderPrimaryCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        pageHeaderPrimaryCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        pageHeaderPrimaryCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        pageHeaderPrimaryCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        pageHeaderPrimaryCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        pageHeaderSecondaryCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        pageHeaderSecondaryCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        pageHeaderSecondaryCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        pageHeaderSecondaryCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        pageHeaderSecondaryCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        pageHeaderSecondaryCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        pageHeaderSecondaryCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        pageHeaderSecondaryCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        pageHeaderSecondaryCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        pageHeaderSecondaryCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        pageHeaderSecondaryCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        pageHeaderSecondaryCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        pageHeaderSecondaryCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        pageHeaderSecondaryCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        pageHeaderSecondaryCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        pageHeaderSecondaryCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        pageHeaderSecondaryCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        pageHeaderSecondaryCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        pageHeaderSecondaryCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        pageHeaderSecondaryCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `page-header` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    HeroWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - hero
          description: 'The widget’s type: always `hero`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        heroAlign:
          type:
            - string
            - 'null'
          title: Content alignment
          default: left
          enum:
            - left
            - center
            - null
          description: Content alignment.
        heroHeight:
          type:
            - string
            - 'null'
          title: Hero height
          description: >-
            Full fills the screen (home pages); Compact is a short banner for
            interior pages.
          default: full
          enum:
            - full
            - tall
            - compact
            - null
        heroGhostEnabled:
          type: boolean
          title: Show ghost wordmark
          description: >-
            Giant outlined word above the headline (same treatment as the footer
            wordmark). Reveals on hover.
          default: true
        heroGhostText:
          type: string
          title: Ghost wordmark text
          description: >-
            Keep it short — one word reads best at display size. Leave empty to
            use the business name.
          default: ''
        heroGhostSize:
          type:
            - string
            - 'null'
          title: Ghost wordmark size
          default: display
          enum:
            - display
            - large
            - medium
            - null
          description: Ghost wordmark size.
        heroGhostFill:
          type:
            - string
            - 'null'
          title: Ghost wordmark fill
          description: >-
            Outlined letters that fill on hover one at a time, all at once, or
            always-solid (no ghost effect).
          default: letter
          enum:
            - letter
            - word
            - solid
            - null
        heroGhostFillColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the wordmark fill + outline tint in the dark
            theme. Leave empty to track the theme’s text color.
          title: Ghost fill color (dark theme)
        heroGhostFillColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override — handy over a fixed video/photo
            background that doesn’t switch with the theme. Falls back to the
            dark-theme color, then the theme default.
          title: Ghost fill color (light theme)
        heroLockupEnabled:
          type: boolean
          title: Show small name lockup
          description: >-
            A small line (optional icon + business name) above the headline. Off
            by default when the ghost wordmark carries the brand.
          default: false
        heroEyebrowEnabled:
          type: boolean
          title: Show eyebrow / kicker
          default: true
          description: Show eyebrow / kicker.
        heroEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Welcome
        heroEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        heroEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        heroEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        heroEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        heroEyebrowPlacement:
          type:
            - string
            - 'null'
          title: Eyebrow placement
          default: belowHeadline
          enum:
            - top
            - belowHeadline
            - aboveCta
            - null
          description: Eyebrow placement.
        heroHeadline:
          type: string
          title: Headline
          default: A bold headline that says what you do.
          description: Headline.
        heroHeadlineFill:
          type:
            - string
            - 'null'
          title: Headline fill
          description: >-
            Solid is the standard headline. The outline options give the
            headline the same ghost treatment as the wordmark, filling on hover.
            (The accent sticker word stays solid.)
          default: solid
          enum:
            - solid
            - letter
            - word
            - null
        heroHeadlineFillColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the headline color in the dark theme. Leave
            empty to track the theme’s text color.
          title: Headline fill color (dark theme)
        heroHeadlineFillColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override — handy over a fixed video/photo
            background. Falls back to the dark-theme color, then the theme
            default.
          title: Headline fill color (light theme)
        heroStickerEnabled:
          type: boolean
          title: Highlight last word (sticker)
          description: >-
            Wraps the final headline word in the solid accent “sticker”. Turn
            off for a plain headline.
          default: true
        heroStickerStyle:
          type:
            - string
            - 'null'
          title: Sticker style
          description: >-
            Dual layers a colored offset shadow behind the patch; single is one
            flat color.
          default: dual
          enum:
            - dual
            - single
            - null
        heroStickerColor:
          type:
            - string
            - 'null'
          description: Patch background. Leave empty to use the site primary/accent color.
          title: Sticker color (primary)
        heroStickerColorSecondary:
          type:
            - string
            - 'null'
          description: Offset-shadow layer. Leave empty to use the site secondary color.
          title: Sticker shadow color (secondary)
        heroLinkHoverFill:
          type: boolean
          title: Link wordmark + headline hover fill
          description: >-
            Hovering either the wordmark or the headline fills both at once.
            Only available when both are set to fill the whole word/headline on
            hover.
          default: false
        heroHashtagEnabled:
          type: boolean
          title: Show hashtag
          description: >-
            A bold social hashtag (e.g. #behindthescenes) with its own
            placement, fill, and optional pill background.
          default: false
        heroHashtagText:
          type: string
          title: Hashtag
          description: 'Include the # — e.g. #behindthescenes.'
          default: ''
        heroHashtagPlacement:
          type:
            - string
            - 'null'
          title: Hashtag placement
          default: belowHeadline
          enum:
            - aboveGhost
            - aboveHeadline
            - belowHeadline
            - aboveCta
            - null
          description: Hashtag placement.
        heroHashtagSize:
          type:
            - string
            - 'null'
          title: Hashtag size
          description: Smaller than the headline, but still a prominent element.
          default: medium
          enum:
            - large
            - medium
            - small
            - null
        heroHashtagFill:
          type:
            - string
            - 'null'
          title: Hashtag fill
          description: >-
            Solid color, or the same outlined “ghost” treatment as the headline
            that fills on hover. (Ignored when the Solid pill background is
            used.)
          default: solid
          enum:
            - solid
            - letter
            - word
            - null
        heroHashtagFillColor:
          type:
            - string
            - 'null'
          description: >-
            Optional text color (or outline tint). Leave empty to use the site
            accent color.
          title: Hashtag color (dark theme)
        heroHashtagFillColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override — handy over a fixed video/photo
            background. Falls back to the dark-theme color, then the accent.
          title: Hashtag color (light theme)
        heroHashtagBackground:
          type:
            - string
            - 'null'
          title: Hashtag background
          description: >-
            An optional patch behind the hashtag — a softer take on the headline
            sticker.
          default: none
          enum:
            - none
            - solid
            - outline
            - null
        heroHashtagBgShape:
          type:
            - string
            - 'null'
          title: Background shape
          description: Rounded pill or a squared patch like the headline sticker.
          default: pill
          enum:
            - pill
            - square
            - null
        heroHashtagBgColor:
          type:
            - string
            - 'null'
          description: >-
            Patch fill (solid) or border + text (outline). Leave empty to use
            the site accent color.
          title: Hashtag patch color
        heroHashtagTilt:
          type:
            - string
            - 'null'
          title: Hashtag tilt
          description: >-
            A slight rotation, like the headline sticker. Works with or without
            a background.
          default: none
          enum:
            - none
            - left
            - right
            - null
        heroIntro:
          type: string
          title: Intro copy
          default: >-
            Follow it with a sentence or two on who you help and why they choose
            you. Swap in your own words, then point the button at the next step.
          description: Intro copy.
        heroIntroColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the intro text color. Leave empty for the muted
            default.
          title: Intro color (dark theme)
        heroIntroColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override — handy over a fixed video/photo
            background. Falls back to the dark-theme color, then the muted
            default.
          title: Intro color (light theme)
        heroIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - null
          description: Intro weight.
        heroIconPlacement:
          type:
            - string
            - 'null'
          title: Decorative icon
          description: Where to place an optional Font Awesome icon.
          default: none
          enum:
            - none
            - lockup
            - aboveHeadline
            - aboveGhost
            - null
        heroIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: bolt
        heroIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        heroIconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        heroIconAnimation:
          type:
            - string
            - 'null'
          title: Icon animation
          default: none
          enum:
            - none
            - fa-beat
            - fa-bounce
            - fa-fade
            - fa-beat-fade
            - fa-flip
            - fa-shake
            - fa-spin
            - null
          description: Icon animation.
        heroBackgroundType:
          type:
            - string
            - 'null'
          title: Background type
          default: gradient
          enum:
            - gradient
            - image
            - video
            - null
          description: Background type.
        heroImage:
          title: Background image
          description: >-
            Used when background type is Image, and as the poster/fallback for
            Video. Widgets, top to bottom: send `{ "items": [ … ] }`, one object
            per widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        _heroVideo:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Background video
          description: >-
            Pick from the Videos library (⌘K → Videos). Short, muted loop;
            reduced-motion visitors get the fallback image instead. The related
            `video` documents, in order (empty when none). To set it, send a
            list of `{ "_id": "…" }`, one per document (one at most); a document
            the site can’t find is left out.
          maxItems: 1
        heroMotionPause:
          type: boolean
          title: Show pause button on background motion
          description: >-
            Adds a small, unobtrusive pause/play control so visitors can stop
            the auto-playing background motion (WCAG 2.2.2). Only appears when a
            moving background is set.
          default: false
        heroFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/HeroWidgetHeroFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        heroPrimaryCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Get started
        heroPrimaryCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: /contact-us
        heroPrimaryCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        heroPrimaryCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        heroPrimaryCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        heroPrimaryCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        heroPrimaryCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        heroPrimaryCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        heroPrimaryCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        heroPrimaryCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        heroPrimaryCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        heroPrimaryCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        heroPrimaryCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        heroPrimaryCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        heroPrimaryCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        heroPrimaryCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        heroPrimaryCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        heroPrimaryCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        heroPrimaryCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        heroPrimaryCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        heroSecondaryCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Read the blog
        heroSecondaryCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: /blog
        heroSecondaryCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        heroSecondaryCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        heroSecondaryCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        heroSecondaryCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        heroSecondaryCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        heroSecondaryCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        heroSecondaryCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        heroSecondaryCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        heroSecondaryCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        heroSecondaryCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        heroSecondaryCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        heroSecondaryCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        heroSecondaryCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        heroSecondaryCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        heroSecondaryCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        heroSecondaryCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        heroSecondaryCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        heroSecondaryCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
        - heroHeadline
      description: >-
        A `hero` widget: its `type` and its own fields. A field left out takes
        its default.
      additionalProperties: true
    LayoutWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - '@apostrophecms/layout'
          description: 'The widget’s type: always `@apostrophecms/layout`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        columns:
          title: Columns
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/LayoutColumnArea'
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `@apostrophecms/layout` widget: its `type` and its own fields. A field
        left out takes its default.
      additionalProperties: true
    IntroWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - intro
          description: 'The widget’s type: always `intro`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        introEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Why us
        introEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        introEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        introEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        introEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        introHeadline:
          type: string
          title: Headline
          default: What makes us different
          description: Headline.
        introHeadlineColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the headline color. Leave empty to track the
            theme’s text color.
          title: Headline color (dark theme)
        introHeadlineColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the theme default.
          title: Headline color (light theme)
        introHeadlineWeight:
          type:
            - string
            - 'null'
          title: Headline weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Headline weight.
        introBody:
          type: string
          title: Body copy
          default: >-
            Tell visitors what sets you apart: how you work, what you care about
            and what they can count on. Two or three sentences is plenty.
          description: Body copy.
        introBodyColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the body text color. Leave empty for the muted
            default.
          title: Body color (dark theme)
        introBodyColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the muted default.
          title: Body color (light theme)
        introBodyWeight:
          type:
            - string
            - 'null'
          title: Body weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - null
          description: Body weight.
        introPhotoPlacement:
          type:
            - string
            - 'null'
          title: Photo placement
          description: >-
            Where the optional photo sits. Left/right place it beside the text;
            Full background fills the whole section behind the text (with a
            readability overlay).
          default: right
          enum:
            - none
            - left
            - right
            - background
            - null
        introImage:
          title: Photo
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        introPhotoCorners:
          type:
            - string
            - 'null'
          title: Photo corners
          default: rounded
          enum:
            - rounded
            - squared
            - null
          description: Photo corners.
        introPhotoFrame:
          type:
            - string
            - 'null'
          title: Photo frame
          description: >-
            Border draws a frame around the photo; Offset adds a refined offset
            accent frame behind it.
          default: border
          enum:
            - none
            - border
            - offset
            - null
        introPhotoFrameColor:
          type:
            - string
            - 'null'
          description: >-
            Border / offset-frame color. Leave empty to use the site accent
            color.
          title: Frame color
        introPhotoTilt:
          type:
            - string
            - 'null'
          title: Photo tilt
          description: A slight rotation for a more playful look.
          default: none
          enum:
            - none
            - left
            - right
            - null
        introPhotoHover:
          type:
            - string
            - 'null'
          title: Photo hover effect
          default: lift
          enum:
            - none
            - lift
            - zoom
            - tilt
            - glow
            - lift-glow
            - zoom-glow
            - null
          description: Photo hover effect.
        introOverlayColor:
          type:
            - string
            - 'null'
          description: >-
            Scrim behind the text over a full-background photo. Leave empty to
            use the dark surface color.
          title: Overlay color (dark theme)
        introOverlayColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme overlay,
            then the light surface color.
          title: Overlay color (light theme)
        introOverlayOpacity:
          type:
            - number
            - 'null'
          title: Overlay opacity (%)
          default: 55
          minimum: 0
          maximum: 100
          x-fetchski-clamped: true
          description: Overlay opacity (%).
        introBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        introBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        introBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        introBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        introFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/IntroWidgetIntroFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `intro` widget: its `type` and its own fields. A field left out takes
        its default.
      additionalProperties: true
    FeatureWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - feature
          description: 'The widget’s type: always `feature`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        featureColumns:
          type:
            - string
            - 'null'
          title: Cards per row
          description: >-
            Auto fits as many as comfortably fit and works for any number of
            cards. Or lock a maximum per row.
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        featureGap:
          type:
            - string
            - 'null'
          title: Gap between cards
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between cards.
        featureCardSize:
          type:
            - string
            - 'null'
          title: Card size
          description: Scales padding, icon, title, and the index numeral together.
          default: medium
          enum:
            - small
            - medium
            - large
            - null
        featureCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The card treatment. Poster (the default) frames the card with an
            accent keyline; Raised is a quiet lit card; Luxe a frosted glass
            panel; Spine adds a color rail; Tint an accent wash;
            Ticket/Bracket/Forge/Press/Inlay are the graphic showstoppers.
          default: poster
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        featureCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        featureCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        featureCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        featureCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        featureCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        featureCardHover:
          type:
            - string
            - 'null'
          title: Card hover effect
          description: >-
            How a card reacts on hover. Pop is the lift + hard offset shadow;
            Glow is a soft accent halo.
          default: pop
          enum:
            - none
            - lift
            - pop
            - glow
            - border
            - null
        featureCardHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Border / shadow / glow color on hover. Leave empty to use the site
            accent color.
          title: Hover accent color (dark theme)
        featureCardHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Hover accent color (light theme)
        featureNumbering:
          type: boolean
          title: Show index numbers
          description: >-
            A big outlined numeral on each card (01, 02, …). Great for
            step-by-step sequences; turn off when the cards aren’t ordered.
          default: true
        featureNumberFill:
          type:
            - string
            - 'null'
          title: Number fill
          description: >-
            Same treatment as the hero ghost text: all numbers solid, outlined
            and filling on hover, or always outlined.
          default: hover
          enum:
            - solid
            - hover
            - outline
            - null
        featureNumberColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Tints the numeral fill + outline. Leave empty to track the
            theme’s text color.
          title: Number color (dark theme)
        featureNumberColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the theme default.
          title: Number color (light theme)
        featureTitleColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the card title color. Leave empty to track the
            theme’s text color.
          title: Title color (dark theme)
        featureTitleColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the theme default.
          title: Title color (light theme)
        featureTitleWeight:
          type:
            - string
            - 'null'
          title: Title weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Title weight.
        featureTextColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the card text color. Leave empty for the muted
            default.
          title: Text color (dark theme)
        featureTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the muted default.
          title: Text color (light theme)
        featureTextWeight:
          type:
            - string
            - 'null'
          title: Text weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - null
          description: Text weight.
        featureCards:
          type: array
          items:
            $ref: '#/components/schemas/FeatureWidgetFeatureCardsItem'
          title: Feature cards
          default:
            - icon: star
              cardTitle: Quality you can see
              cardText: >-
                Describe the standard you hold yourself to, in a sentence or
                two.
            - icon: tag
              cardTitle: Clear, fair pricing
              cardText: >-
                Say how your pricing works, so visitors know what to expect
                before they ask.
            - icon: users
              cardTitle: People who care
              cardText: Introduce the people behind the work and what they bring to it.
            - icon: comments
              cardTitle: Easy to reach
              cardText: Tell visitors how and when they can get in touch with you.
          description: Feature cards.
        featureBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        featureBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        featureBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        featureBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        featureFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/FeatureWidgetFeatureFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `feature` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    StatsWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - stats
          description: 'The widget’s type: always `stats`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        statsEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          description: A small label above the heading (e.g. "By the numbers").
          default: true
        statsEyebrow:
          type: string
          title: Eyebrow
          default: By the numbers
          description: Eyebrow.
        statsEyebrowColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the secondary (mint) color.
          title: Eyebrow color (dark theme)
        statsEyebrowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Eyebrow color (light theme)
        statsEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        statsEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        statsHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the numbers.
          default: The numbers speak for themselves
        statsHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        statsHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        statsHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        statsColumns:
          type:
            - string
            - 'null'
          title: Stats per row
          description: >-
            Auto fits as many as comfortably fit and works for any number of
            stats. Or lock a maximum per row.
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        statsGap:
          type:
            - string
            - 'null'
          title: Gap between stats
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between stats.
        statsSize:
          type:
            - string
            - 'null'
          title: Overall stat size
          description: >-
            The baseline scale for the whole stat (value / icon / label /
            description stay proportional). Fine-tune any single element with
            its own size control below.
          default: medium
          enum:
            - small
            - medium
            - large
            - null
        statsAlign:
          type:
            - string
            - 'null'
          title: Alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Alignment.
        statsDividers:
          type: boolean
          title: Vertical dividers between stats
          description: >-
            A hairline rule between each stat — the classic "by the numbers"
            rail.
          default: false
        statsCountUp:
          type: boolean
          title: Animate count-up on scroll
          description: >-
            Numbers tick up from zero when the band scrolls into view.
            Non-numeric values and reduced-motion visitors simply show the final
            value.
          default: true
        statsIconSize:
          type:
            - string
            - 'null'
          title: Icon size
          description: >-
            Size of the icon above each number, independent of the overall stat
            size.
          default: auto
          enum:
            - auto
            - sm
            - md
            - lg
            - xl
            - xxl
            - null
        statsIconGap:
          type:
            - string
            - 'null'
          title: Icon spacing
          description: Space between the icon and the number below it.
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
        statsValueSize:
          type:
            - string
            - 'null'
          title: Value size
          default: auto
          enum:
            - auto
            - xs
            - sm
            - md
            - lg
            - xl
            - null
          description: Value size.
        statsValueWeight:
          type:
            - string
            - 'null'
          title: Value weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Value weight.
        statsValueColor:
          type:
            - string
            - 'null'
          description: >-
            The big numeral. Optional — leave empty to use the site accent
            color.
          title: Value color (dark theme)
        statsValueColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Value color (light theme)
        statsLabelSize:
          type:
            - string
            - 'null'
          title: Label size
          default: auto
          enum:
            - auto
            - xs
            - sm
            - md
            - lg
            - xl
            - null
          description: Label size.
        statsLabelWeight:
          type:
            - string
            - 'null'
          title: Label weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Label weight.
        statsLabelColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Label color (dark theme)
        statsLabelColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Label color (light theme)
        statsDescriptionSize:
          type:
            - string
            - 'null'
          title: Description size
          default: auto
          enum:
            - auto
            - xs
            - sm
            - md
            - lg
            - xl
            - null
          description: Description size.
        statsDescriptionWeight:
          type:
            - string
            - 'null'
          title: Description weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Description weight.
        statsDescriptionColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Description color (dark theme)
        statsDescriptionColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Description color (light theme)
        stats:
          type: array
          items:
            $ref: '#/components/schemas/StatsWidgetStatsItem'
          title: Stats
          default:
            - icon: users
              value: 5,000
              valueSuffix: +
              label: Happy customers
              description: And the list keeps growing.
            - icon: calendar-days
              value: '12'
              label: Years in business
              description: Doing this since day one.
            - icon: circle-check
              value: '99'
              valueSuffix: '%'
              label: Satisfaction
              description: Based on customer feedback.
            - icon: star
              value: '4.9'
              label: Average rating
              description: From verified customer reviews.
          description: Stats.
        statsBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        statsBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        statsBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        statsBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        statsFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/StatsWidgetStatsFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        statsCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        statsCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        statsCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        statsCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        statsCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        statsCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        statsCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        statsCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        statsCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        statsCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        statsCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        statsCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        statsCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        statsCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        statsCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        statsCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        statsCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        statsCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        statsCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        statsCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `stats` widget: its `type` and its own fields. A field left out takes
        its default.
      additionalProperties: true
    LogosWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - logos
          description: 'The widget’s type: always `logos`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        logosEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          description: A small label above the heading (e.g. "Trusted by").
          default: true
        logosEyebrow:
          type: string
          title: Eyebrow
          default: Trusted by
          description: Eyebrow.
        logosEyebrowColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the secondary (mint) color.
          title: Eyebrow color (dark theme)
        logosEyebrowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Eyebrow color (light theme)
        logosEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        logosEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        logosHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the logos.
          default: In good company
        logosHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        logosHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        logosHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        logosIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        logosIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        logosIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        logosIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        logosDisplay:
          type:
            - string
            - 'null'
          title: Display
          description: A slow scrolling ribbon (marquee) or a calm static grid.
          default: marquee
          enum:
            - marquee
            - grid
            - null
        logosSpeed:
          type:
            - string
            - 'null'
          title: Marquee speed
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
          description: Marquee speed.
        logosDirection:
          type:
            - string
            - 'null'
          title: Marquee direction
          default: left
          enum:
            - left
            - right
            - null
          description: Marquee direction.
        logosMotionPause:
          type: boolean
          title: Show pause button on background motion
          description: >-
            Adds a small, unobtrusive pause/play control so visitors can stop
            the auto-playing background motion (WCAG 2.2.2). Only appears when a
            moving background is set.
          default: false
        logosColumns:
          type:
            - string
            - 'null'
          title: Logos per row
          description: >-
            Auto fits as many as comfortably fit and works for any number of
            logos. Or lock a maximum per row.
          default: auto
          enum:
            - auto
            - '3'
            - '4'
            - '5'
            - '6'
            - null
        logosGap:
          type:
            - string
            - 'null'
          title: Gap between logos
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between logos.
        logosSize:
          type:
            - string
            - 'null'
          title: Logo size
          description: >-
            The height each logo is scaled to (width follows the logo’s aspect
            ratio).
          default: medium
          enum:
            - small
            - medium
            - large
            - null
        logosAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          description: >-
            Aligns the eyebrow / heading / intro (and the grid when there are
            few logos).
          default: center
          enum:
            - center
            - left
            - null
        logosTile:
          type: boolean
          title: Show each logo on a tile
          description: >-
            Sets every logo on a raised, bordered card. Off = logos sit straight
            on the background.
          default: false
        logosGrayscale:
          type: boolean
          title: Grayscale until hover
          description: >-
            Mutes the logos to grayscale and dims them, returning to full color
            on hover — the classic logo-wall look.
          default: true
        logos:
          type: array
          items:
            $ref: '#/components/schemas/LogosWidgetLogosItem'
          title: Logos
          default: []
          description: Logos.
        logosBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        logosBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        logosBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        logosBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        logosFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/LogosWidgetLogosFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        logosCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        logosCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        logosCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        logosCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        logosCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        logosCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        logosCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        logosCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        logosCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        logosCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        logosCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        logosCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        logosCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        logosCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        logosCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        logosCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        logosCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        logosCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        logosCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        logosCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `logos` widget: its `type` and its own fields. A field left out takes
        its default.
      additionalProperties: true
    StepsWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - steps
          description: 'The widget’s type: always `steps`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        stepsEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          description: A small label above the heading (e.g. "How it works").
          default: true
        stepsEyebrow:
          type: string
          title: Eyebrow
          default: How it works
          description: Eyebrow.
        stepsEyebrowColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the secondary (mint) color.
          title: Eyebrow color (dark theme)
        stepsEyebrowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Eyebrow color (light theme)
        stepsEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        stepsEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        stepsHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the steps.
          default: Get started in four steps
        stepsHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        stepsHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        stepsHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        stepsHeadingSize:
          type:
            - string
            - 'null'
          title: Heading size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Heading size.
        stepsIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: A simple, step-by-step path from first contact to done.
        stepsIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        stepsIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        stepsIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        stepsIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Intro size.
        stepsLayout:
          type:
            - string
            - 'null'
          title: Layout
          description: >-
            Horizontal lays the steps across a row (marker on top); Vertical
            stacks them as a classic timeline (marker on the left).
          default: horizontal
          enum:
            - horizontal
            - vertical
            - null
        stepsColumns:
          type:
            - string
            - 'null'
          title: Steps per row
          description: >-
            Horizontal only. Auto fits as many as comfortably fit and works for
            any number of steps. Or lock a maximum per row.
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        stepsGap:
          type:
            - string
            - 'null'
          title: Gap between steps
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between steps.
        stepsAlign:
          type:
            - string
            - 'null'
          title: Alignment
          description: >-
            Horizontal only — aligns the section header and each step’s text.
            (Vertical is always left-aligned beside its marker.)
          default: center
          enum:
            - center
            - left
            - null
        stepsConnector:
          type: boolean
          title: Show connector line
          description: >-
            A line linking the step markers into a timeline (down the markers
            when vertical, across them when horizontal).
          default: true
        stepsCardStyle:
          type:
            - string
            - 'null'
          title: Step style
          description: >-
            Plain keeps the connector-linked timeline (just marker + text, no
            card). Every other style boxes each step — Raised is a quiet lit
            card, Luxe a frosted glass panel, Outline a plaque frame, Spine adds
            a color rail, Tint an accent wash; Ticket/Bracket/Forge/Press/Inlay
            are the graphic showstoppers.
          default: plain
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        stepsCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        stepsCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        stepsCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        stepsCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        stepsCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        stepsCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a boxed step does on hover (applies when Step style is not
            Plain). Lift/Pop/Press/Glow/Outline are instant; Sheen sweeps a
            light across; Tilt, Magnetic and Spotlight follow the cursor (need
            site animations on).
          default: none
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        stepsMarker:
          type:
            - string
            - 'null'
          title: Step marker
          description: >-
            Number auto-counts 1, 2, 3…; Icon shows each step’s icon (falling
            back to the number when a step has none); None hides the marker
            badge.
          default: number
          enum:
            - number
            - icon
            - none
            - null
        stepsMarkerStyle:
          type:
            - string
            - 'null'
          title: Marker style
          description: >-
            Soft is a tinted accent badge; Filled is a solid accent badge;
            Outline is a bordered badge.
          default: soft
          enum:
            - soft
            - filled
            - outline
            - null
        stepsMarkerShape:
          type:
            - string
            - 'null'
          title: Marker shape
          default: circle
          enum:
            - circle
            - rounded
            - square
            - null
          description: Marker shape.
        stepsMarkerSize:
          type:
            - string
            - 'null'
          title: Marker size
          default: medium
          enum:
            - small
            - medium
            - large
            - null
          description: Marker size.
        stepsAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Color for the marker badge and the connector line. Leave empty to
            use the site accent color.
          title: Accent color (dark theme)
        stepsAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme accent.
          title: Accent color (light theme)
        stepsTitleSize:
          type:
            - string
            - 'null'
          title: Title size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Title size.
        stepsTitleWeight:
          type:
            - string
            - 'null'
          title: Title weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Title weight.
        stepsTitleColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Title color (dark theme)
        stepsTitleColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Title color (light theme)
        stepsBodySize:
          type:
            - string
            - 'null'
          title: Body size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Body size.
        stepsBodyWeight:
          type:
            - string
            - 'null'
          title: Body weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Body weight.
        stepsBodyColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Body color (dark theme)
        stepsBodyColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Body color (light theme)
        stepsItems:
          type: array
          items:
            $ref: '#/components/schemas/StepsWidgetStepsItemsItem'
          title: Steps
          description: >-
            Each item is one step in the process. They render in this order; the
            number marker counts automatically.
          default:
            - icon: calendar-check
              title: Reach out
              body: >-
                Get in touch and tell us what you’re looking for — it only takes
                a minute.
            - icon: comments
              title: Say hello
              body: >-
                A quick conversation so we understand your goals and you get to
                know us.
            - icon: gear
              title: We get to work
              body: >-
                We take it from here and keep you in the loop every step of the
                way.
            - icon: circle-check
              title: All done
              body: Wrap up knowing exactly what happened — and what comes next.
        stepsBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        stepsBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        stepsBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        stepsBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        stepsFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/StepsWidgetStepsFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        stepsCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        stepsCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        stepsCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        stepsCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        stepsCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        stepsCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        stepsCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        stepsCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        stepsCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        stepsCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        stepsCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        stepsCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        stepsCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        stepsCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        stepsCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        stepsCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        stepsCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        stepsCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        stepsCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        stepsCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `steps` widget: its `type` and its own fields. A field left out takes
        its default.
      additionalProperties: true
    MediaTextWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - media-text
          description: 'The widget’s type: always `media-text`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        mediaTextEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          description: A small label above the section heading (e.g. "Why us").
          default: true
        mediaTextEyebrow:
          type: string
          title: Eyebrow
          default: Why us
          description: Eyebrow.
        mediaTextEyebrowColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the secondary (mint) color.
          title: Eyebrow color (dark theme)
        mediaTextEyebrowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Eyebrow color (light theme)
        mediaTextEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        mediaTextEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        mediaTextHeading:
          type: string
          title: Heading
          description: >-
            Optional section heading above the blocks. Leave empty to show just
            the blocks.
          default: What sets us apart
        mediaTextHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        mediaTextHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        mediaTextHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        mediaTextHeadingSize:
          type:
            - string
            - 'null'
          title: Heading size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Heading size.
        mediaTextIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: >-
            A few of the things that make the difference — shown in pictures and
            a little copy.
        mediaTextIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        mediaTextIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        mediaTextIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        mediaTextIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Intro size.
        mediaTextAlign:
          type:
            - string
            - 'null'
          title: Text alignment
          description: >-
            Aligns the section header and the text inside each block.
            (Side-by-side rows usually read best left-aligned.)
          default: left
          enum:
            - left
            - center
            - null
        mediaTextRatio:
          type:
            - string
            - 'null'
          title: Media / text split
          description: >-
            For media-left / media-right rows: how the two columns share the
            width.
          default: balanced
          enum:
            - balanced
            - media
            - text
            - null
        mediaTextVAlign:
          type:
            - string
            - 'null'
          title: Vertical alignment
          description: >-
            For media-left / media-right rows: how the text lines up against the
            media.
          default: center
          enum:
            - center
            - top
            - null
        mediaTextMediaRatio:
          type:
            - string
            - 'null'
          title: Media shape
          description: >-
            Aspect ratio of the media frame. Auto keeps an image at its natural
            shape (videos and embeds always use a ratio).
          default: landscape
          enum:
            - auto
            - landscape
            - standard
            - square
            - portrait
            - wide
            - null
        mediaTextMediaRadius:
          type:
            - string
            - 'null'
          title: Media corners
          default: large
          enum:
            - large
            - rounded
            - slight
            - square
            - null
          description: Media corners.
        mediaTextGap:
          type:
            - string
            - 'null'
          title: Gap between blocks
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between blocks.
        mediaTextDividers:
          type: boolean
          title: Show dividers between blocks
          description: A hairline rule between blocks.
          default: false
        mediaTextBlockEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Each block’s eyebrow color. Leave empty to use the secondary (mint)
            color.
          title: Block eyebrow color (dark theme)
        mediaTextBlockEyebrowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Block eyebrow color (light theme)
        mediaTextBlockEyebrowWeight:
          type:
            - string
            - 'null'
          title: Block eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Block eyebrow weight.
        mediaTextBlockHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Block heading color (dark theme)
        mediaTextBlockHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Block heading color (light theme)
        mediaTextBlockHeadingWeight:
          type:
            - string
            - 'null'
          title: Block heading weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Block heading weight.
        mediaTextBlockHeadingSize:
          type:
            - string
            - 'null'
          title: Block heading size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Block heading size.
        mediaTextBodyColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Block body color (dark theme)
        mediaTextBodyColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Block body color (light theme)
        mediaTextBodyWeight:
          type:
            - string
            - 'null'
          title: Block body weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Block body weight.
        mediaTextBodySize:
          type:
            - string
            - 'null'
          title: Block body size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Block body size.
        mediaTextBlocks:
          type: array
          items:
            $ref: '#/components/schemas/MediaTextWidgetMediaTextBlocksItem'
          title: Blocks
          description: >-
            Each block is one media + text row. They render top to bottom in
            this order; alternate “Media left” / “Media right” for a classic
            zig-zag.
          default:
            - layout: media-right
              mediaType: image
              eyebrow: The basics
              heading: Tell your story, one block at a time
              body: >-
                Pair an image, a video, or an embed with a column of copy. Each
                block picks its own layout, so a page reads naturally from top
                to bottom.
              ctaLabel: Learn more
              ctaUrl: /about-us
            - layout: media-left
              mediaType: image
              eyebrow: Flexible by design
              heading: Mix media and message
              body: >-
                Alternate media left and right for a classic zig-zag, stack
                media on top, or run it full-bleed edge to edge.
              ctaLabel: Learn more
              ctaUrl: /about-us
            - layout: full
              mediaType: image
              eyebrow: Make it yours
              heading: Every label is editable
              body: >-
                Nothing here is tied to one business — swap the copy, choose
                your media, and the section adapts to whatever you need.
        mediaTextBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        mediaTextBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        mediaTextBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        mediaTextBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        mediaTextFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/MediaTextWidgetMediaTextFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        mediaTextCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        mediaTextCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        mediaTextCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        mediaTextCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        mediaTextCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        mediaTextCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        mediaTextCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        mediaTextCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        mediaTextCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        mediaTextCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        mediaTextCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        mediaTextCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        mediaTextCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        mediaTextCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        mediaTextCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        mediaTextCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        mediaTextCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `media-text` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    DeviceMockWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - device-mock
          description: 'The widget’s type: always `device-mock`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        deviceMockArrangement:
          type:
            - string
            - 'null'
          title: Arrangement
          description: >-
            Which devices to show. Duo overlaps a phone on the corner of a
            desktop browser; Trio adds a TV behind them (on narrow screens Trio
            drops the TV and shows as a Duo). Each device used gets its own
            screen tab.
          default: duo
          enum:
            - duo
            - trio
            - desktop
            - phone
            - tv
            - null
        deviceMockTextPlacement:
          type:
            - string
            - 'null'
          title: Text placement
          description: >-
            Where the eyebrow / heading / intro / button sit. Left or right puts
            the text in a column beside the devices (stacked above them on
            narrow screens); None shows the devices only.
          default: above
          enum:
            - above
            - left
            - right
            - none
            - null
        deviceMockSize:
          type:
            - string
            - 'null'
          title: Device size
          description: How large the devices render within the section.
          default: normal
          enum:
            - compact
            - normal
            - large
            - null
        deviceMockBrowserRatio:
          type:
            - string
            - 'null'
          title: Desktop screen shape
          description: The browser window’s content area. Match your desktop captures.
          default: '16:10'
          enum:
            - '16:10'
            - '16:9'
            - null
        deviceMockBrowserUrl:
          type: string
          title: Browser address bar text
          description: >-
            The address shown in the browser toolbar — decoration only, not a
            link.
          default: app.example.com
        deviceMockPhoneStatusBar:
          type: boolean
          title: Draw a phone status bar
          description: >-
            Adds a time / signal / battery bar across the top of the phone
            screen. Leave off for native phone screenshots — they already
            include the real status bar.
          default: false
        deviceMockPhoneTime:
          type: string
          title: Status bar time
          default: '9:41'
          description: Status bar time.
        deviceMockMotionPause:
          type: boolean
          title: Show pause button on background motion
          description: >-
            Adds a small, unobtrusive pause/play control so visitors can stop
            the auto-playing background motion (WCAG 2.2.2). Only appears when a
            moving background is set.
          default: true
        deviceMockEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          description: A small label above the heading (e.g. "Product tour").
          default: true
        deviceMockEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Product tour
        deviceMockEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        deviceMockEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        deviceMockEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        deviceMockEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        deviceMockHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the devices.
          default: See it in action
        deviceMockHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        deviceMockHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        deviceMockHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        deviceMockHeadingSize:
          type:
            - string
            - 'null'
          title: Heading size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Heading size.
        deviceMockIntro:
          type: string
          title: Intro
          description: Optional short paragraph under the heading.
          default: >-
            A closer look at the experience — on the big screen, at the desk,
            and on the go.
        deviceMockIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        deviceMockIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        deviceMockIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        deviceMockIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Intro size.
        deviceMockCaption:
          type: string
          title: Caption (optional)
          description: A short line shown under the devices.
          default: ''
        deviceMockTvMediaType:
          type:
            - string
            - 'null'
          title: TV screen shows
          description: A still screenshot, or a short looping screen recording.
          default: image
          enum:
            - image
            - video
            - null
        _deviceMockTvImage:
          type: array
          items:
            type: object
            additionalProperties: true
          title: TV screenshot
          description: >-
            Use a native-resolution 16:9 capture of the screen with NO device
            frame (the frame is drawn for you) — e.g. 1920 × 1080 or 3840 ×
            2160. The related `@apostrophecms/image` documents, in order (empty
            when none). To set it, send a list of `{ "_id": "…" }`, one per
            document (one at most); a document the site can’t find is left out.
          maxItems: 1
        deviceMockTvImageAlt:
          type: string
          title: TV screenshot alt text
          description: >-
            Required once a screenshot is picked. Describe what the screen shows
            for visitors who can’t see it — e.g. “Dashboard with a weekly
            activity chart and a list of recent orders”. Skip the device itself
            (“a phone showing…”); the frame is decorative.
          default: ''
        _deviceMockTvVideo:
          type: array
          items:
            type: object
            additionalProperties: true
          title: TV video
          description: >-
            Pick a clip from the Videos library (⌘K → Videos). It plays as a
            short, muted, looping screen recording — keep it SHORT (about 5–15
            seconds) and SMALL (under about 10 MB; an H.264 MP4 without an audio
            track is ideal), and give the Videos item a poster image: visitors
            see the poster first, and reduced-motion visitors only ever see the
            poster. Use a native-resolution 16:9 capture of the screen with NO
            device frame (the frame is drawn for you) — e.g. 1920 × 1080 or 3840
            × 2160. The related `video` documents, in order (empty when none).
            To set it, send a list of `{ "_id": "…" }`, one per document (one at
            most); a document the site can’t find is left out.
          maxItems: 1
        deviceMockTvVideoAlt:
          type: string
          title: TV video description
          description: >-
            Recommended. A short description of what the recording shows, read
            to screen-reader users — e.g. “Creating a new project in three
            clicks”. Leave empty only if the surrounding text already says it.
          default: ''
        deviceMockTvFit:
          type:
            - string
            - 'null'
          title: TV media fit
          description: >-
            Fill crops the media to fill the whole screen (best for native
            captures). Fit shows the whole image or video, leaving bars if its
            shape differs from the screen.
          default: cover
          enum:
            - cover
            - contain
            - null
        deviceMockTvAnchor:
          type:
            - string
            - 'null'
          title: TV media anchor
          description: >-
            Which part stays visible when the media is cropped. Top keeps an
            app’s header in view — right for most screenshots.
          default: top
          enum:
            - top
            - center
            - bottom
            - null
        deviceMockDesktopMediaType:
          type:
            - string
            - 'null'
          title: Desktop screen shows
          description: A still screenshot, or a short looping screen recording.
          default: image
          enum:
            - image
            - video
            - null
        _deviceMockDesktopImage:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Desktop screenshot
          description: >-
            Use a native-resolution capture of the page content only — no
            browser toolbar and no device frame (both are drawn for you). 16:10
            (e.g. 2880 × 1800) or 16:9 (e.g. 2560 × 1440), matching the “Desktop
            screen shape” setting. The related `@apostrophecms/image` documents,
            in order (empty when none). To set it, send a list of `{ "_id": "…"
            }`, one per document (one at most); a document the site can’t find
            is left out.
          maxItems: 1
        deviceMockDesktopImageAlt:
          type: string
          title: Desktop screenshot alt text
          description: >-
            Required once a screenshot is picked. Describe what the screen shows
            for visitors who can’t see it — e.g. “Dashboard with a weekly
            activity chart and a list of recent orders”. Skip the device itself
            (“a phone showing…”); the frame is decorative.
          default: ''
        _deviceMockDesktopVideo:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Desktop video
          description: >-
            Pick a clip from the Videos library (⌘K → Videos). It plays as a
            short, muted, looping screen recording — keep it SHORT (about 5–15
            seconds) and SMALL (under about 10 MB; an H.264 MP4 without an audio
            track is ideal), and give the Videos item a poster image: visitors
            see the poster first, and reduced-motion visitors only ever see the
            poster. Use a native-resolution capture of the page content only —
            no browser toolbar and no device frame (both are drawn for you).
            16:10 (e.g. 2880 × 1800) or 16:9 (e.g. 2560 × 1440), matching the
            “Desktop screen shape” setting. The related `video` documents, in
            order (empty when none). To set it, send a list of `{ "_id": "…" }`,
            one per document (one at most); a document the site can’t find is
            left out.
          maxItems: 1
        deviceMockDesktopVideoAlt:
          type: string
          title: Desktop video description
          description: >-
            Recommended. A short description of what the recording shows, read
            to screen-reader users — e.g. “Creating a new project in three
            clicks”. Leave empty only if the surrounding text already says it.
          default: ''
        deviceMockDesktopFit:
          type:
            - string
            - 'null'
          title: Desktop media fit
          description: >-
            Fill crops the media to fill the whole screen (best for native
            captures). Fit shows the whole image or video, leaving bars if its
            shape differs from the screen.
          default: cover
          enum:
            - cover
            - contain
            - null
        deviceMockDesktopAnchor:
          type:
            - string
            - 'null'
          title: Desktop media anchor
          description: >-
            Which part stays visible when the media is cropped. Top keeps an
            app’s header in view — right for most screenshots.
          default: top
          enum:
            - top
            - center
            - bottom
            - null
        deviceMockPhoneMediaType:
          type:
            - string
            - 'null'
          title: Phone screen shows
          description: A still screenshot, or a short looping screen recording.
          default: image
          enum:
            - image
            - video
            - null
        _deviceMockPhoneImage:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Phone screenshot
          description: >-
            Use a native-resolution portrait screenshot with NO device frame
            (the frame is drawn for you) — e.g. 1179 × 2556 or 1290 × 2796
            (about 9:19.5). The related `@apostrophecms/image` documents, in
            order (empty when none). To set it, send a list of `{ "_id": "…" }`,
            one per document (one at most); a document the site can’t find is
            left out.
          maxItems: 1
        deviceMockPhoneImageAlt:
          type: string
          title: Phone screenshot alt text
          description: >-
            Required once a screenshot is picked. Describe what the screen shows
            for visitors who can’t see it — e.g. “Dashboard with a weekly
            activity chart and a list of recent orders”. Skip the device itself
            (“a phone showing…”); the frame is decorative.
          default: ''
        _deviceMockPhoneVideo:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Phone video
          description: >-
            Pick a clip from the Videos library (⌘K → Videos). It plays as a
            short, muted, looping screen recording — keep it SHORT (about 5–15
            seconds) and SMALL (under about 10 MB; an H.264 MP4 without an audio
            track is ideal), and give the Videos item a poster image: visitors
            see the poster first, and reduced-motion visitors only ever see the
            poster. Use a native-resolution portrait screenshot with NO device
            frame (the frame is drawn for you) — e.g. 1179 × 2556 or 1290 × 2796
            (about 9:19.5). The related `video` documents, in order (empty when
            none). To set it, send a list of `{ "_id": "…" }`, one per document
            (one at most); a document the site can’t find is left out.
          maxItems: 1
        deviceMockPhoneVideoAlt:
          type: string
          title: Phone video description
          description: >-
            Recommended. A short description of what the recording shows, read
            to screen-reader users — e.g. “Creating a new project in three
            clicks”. Leave empty only if the surrounding text already says it.
          default: ''
        deviceMockPhoneFit:
          type:
            - string
            - 'null'
          title: Phone media fit
          description: >-
            Fill crops the media to fill the whole screen (best for native
            captures). Fit shows the whole image or video, leaving bars if its
            shape differs from the screen.
          default: cover
          enum:
            - cover
            - contain
            - null
        deviceMockPhoneAnchor:
          type:
            - string
            - 'null'
          title: Phone media anchor
          description: >-
            Which part stays visible when the media is cropped. Top keeps an
            app’s header in view — right for most screenshots.
          default: top
          enum:
            - top
            - center
            - bottom
            - null
        deviceMockBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        deviceMockBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        deviceMockBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        deviceMockBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        deviceMockFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/DeviceMockWidgetDeviceMockFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        deviceMockCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        deviceMockCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        deviceMockCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        deviceMockCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        deviceMockCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        deviceMockCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        deviceMockCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        deviceMockCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        deviceMockCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        deviceMockCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        deviceMockCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        deviceMockCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        deviceMockCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        deviceMockCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        deviceMockCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        deviceMockCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        deviceMockCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        deviceMockCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        deviceMockCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        deviceMockCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `device-mock` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    TeamWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - team
          description: 'The widget’s type: always `team`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        teamEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Our team
        teamEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        teamEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        teamEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        teamEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        teamHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the team.
          default: Meet the team
        teamHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        teamHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        teamHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        teamIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        teamIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        teamIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        teamIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        teamIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        teamAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Header alignment.
        teamFeaturedOnly:
          type: boolean
          title: Featured members only
          description: >-
            Show only members you have flagged “Featured” in the Team Members
            manager — e.g. a short leadership row on the home page.
          default: false
        teamCount:
          type:
            - integer
            - 'null'
          title: Maximum members
          description: The most members to show, in the manager’s sort order.
          default: 12
          minimum: 1
          maximum: 50
          x-fetchski-clamped: true
        teamLayout:
          type:
            - string
            - 'null'
          title: Section layout
          description: >-
            Grid: a tidy multi-row grid (the full team page). Carousel: a
            continuous auto-scrolling marquee (needs site animations enabled —
            falls back to the grid when they are off). Spotlight: featured
            members large on top, the rest in a smaller grid. List: wide rows
            with the full bio. Scatter: a playful arrangement with varied
            spacing so the cards float freely.
          default: grid
          enum:
            - grid
            - carousel
            - spotlight
            - list
            - scatter
            - null
        teamColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many cards per row. Auto fits as many as comfortably fit (the
            Scatter layout composes on three columns when set to Auto).
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        teamSpotlightHeroes:
          type:
            - string
            - 'null'
          title: Featured spots (top row)
          description: >-
            How many members lead the section at full size. Members flagged
            “Featured” fill the spots first, in the manager’s sort order; any
            extra featured members join the rows below.
          default: '2'
          enum:
            - '1'
            - '2'
            - null
        teamSpotlightColumns:
          type:
            - string
            - 'null'
          title: Cards per row (below)
          description: >-
            How many of the remaining members sit on each row under the featured
            spots.
          default: '3'
          enum:
            - '2'
            - '3'
            - '4'
            - '5'
            - null
        teamSpeed:
          type:
            - string
            - 'null'
          title: Scroll speed
          description: How fast the carousel auto-scrolls.
          default: normal
          enum:
            - vslow
            - slow
            - normal
            - fast
            - null
        teamDirection:
          type:
            - string
            - 'null'
          title: Scroll direction
          default: left
          enum:
            - left
            - right
            - null
          description: Scroll direction.
        teamScatter:
          type:
            - string
            - 'null'
          title: Scatter amount
          description: >-
            How far the cards drift from a tidy grid. Subtle keeps a loose grid;
            Wild pushes the offsets to their playful maximum.
          default: playful
          enum:
            - subtle
            - playful
            - wild
            - null
        teamGap:
          type:
            - string
            - 'null'
          title: Gap between cards
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between cards.
        teamCardLayout:
          type:
            - string
            - 'null'
          title: Card layout
          description: >-
            Portrait: the photo on top, name/role/bio below — the classic team
            card. Overlay: a full-bleed photo with a solid color panel over its
            lower edge holding the name and role. Profile: a horizontal bar —
            avatar left, name/role/tagline right. Roster: minimal — just the
            avatar, name and role. (The List section layout always uses its own
            wide row.)
          default: portrait
          enum:
            - portrait
            - overlay
            - profile
            - roster
            - null
        teamPhotoAspect:
          type:
            - string
            - 'null'
          title: Photo shape
          description: The photo’s aspect ratio on the photo-led card layouts.
          default: portrait
          enum:
            - square
            - portrait
            - tall
            - null
        teamAvatarShape:
          type:
            - string
            - 'null'
          title: Avatar shape
          description: >-
            The photo’s outline. Squircle is a soft superellipse-style corner
            (approximated with heavy rounding).
          default: circle
          enum:
            - circle
            - rounded
            - squircle
            - square
            - null
        teamAvatarSize:
          type:
            - string
            - 'null'
          title: Avatar size
          default: large
          enum:
            - small
            - medium
            - large
            - xlarge
            - null
          description: Avatar size.
        teamAvatarBorder:
          type:
            - string
            - 'null'
          title: Avatar border
          description: A ring around the photo in the avatar color.
          default: none
          enum:
            - none
            - hairline
            - thin
            - bold
            - null
        teamAvatarTreatment:
          type:
            - string
            - 'null'
          title: Avatar backdrop
          description: >-
            A flat color accent behind the photo. Panel offsets a solid block
            behind it; Halo draws a soft concentric disc. Both use the avatar
            color.
          default: none
          enum:
            - none
            - panel
            - halo
            - null
        teamAvatarColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the border and the backdrop treatment. Leave empty to use the
            brand accent.
          title: Avatar color (dark theme)
        teamAvatarColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Avatar color (light theme)
        teamShowRole:
          type: boolean
          title: Show role / title
          default: true
          description: Show role / title.
        teamShowBio:
          type: boolean
          title: Show bio
          description: >-
            Shown on the Portrait and Profile cards and the List rows. The
            Overlay and Roster layouts stay bio-free by design.
          default: true
        teamShowTagline:
          type: boolean
          title: Show tagline / fun fact
          description: >-
            The member’s one-liner, shown on the Profile and Roster cards and
            the List rows.
          default: true
        teamHoverPhoto:
          type: boolean
          title: Swap to the alternate photo on hover
          description: >-
            Cross-fades to a member’s alternate photo on hover (set per member;
            does nothing for members without one, and stays off for visitors who
            prefer reduced motion).
          default: true
        teamCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The card treatment. Outline (the default) is a plaque frame — a
            framed-portrait look; Raised is a quiet lit card; Luxe a frosted
            glass panel; Ticket/Bracket/Inlay are the graphic showstoppers.
          default: outline
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - inlay
            - null
        teamCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        teamCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        teamCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        teamCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a card does on hover. Lift/Pop/Press/Glow/Outline are instant;
            Sheen sweeps a light across; Tilt, Magnetic and Spotlight follow the
            cursor (need site animations on). Vary it per section so the page is
            not cookie-cutter.
          default: glow
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        teamCardAlign:
          type:
            - string
            - 'null'
          title: Card content alignment
          description: >-
            How the name, role and bio align inside each card (the Profile card
            and List rows are always left-aligned beside the avatar).
          default: center
          enum:
            - center
            - left
            - null
        teamAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — the lettered-avatar fallback background and the role
            color default. Leave empty to use the brand accent. (The icon row
            has its own colors on the Social links tab.)
          title: Accent (dark theme)
        teamAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Accent (light theme)
        teamPanelColor:
          type:
            - string
            - 'null'
          description: >-
            The solid panel over the photo on the Overlay card. Leave empty to
            use the card color.
          title: Overlay panel color (dark theme)
        teamPanelColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Overlay panel color (light theme)
        teamNameSize:
          type:
            - string
            - 'null'
          title: Name size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Name size.
        teamNameWeight:
          type:
            - string
            - 'null'
          title: Name weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Name weight.
        teamNameColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Name color (dark theme)
        teamNameColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Name color (light theme)
        teamRoleSize:
          type:
            - string
            - 'null'
          title: Role size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Role size.
        teamRoleWeight:
          type:
            - string
            - 'null'
          title: Role weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Role weight.
        teamRoleColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the accent color.
          title: Role color (dark theme)
        teamRoleColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Role color (light theme)
        teamBioSize:
          type:
            - string
            - 'null'
          title: Bio size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Bio size.
        teamBioWeight:
          type:
            - string
            - 'null'
          title: Bio weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Bio weight.
        teamBioColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Bio color (dark theme)
        teamBioColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Bio color (light theme)
        teamBioClamp:
          type:
            - string
            - 'null'
          title: Bio length
          description: >-
            Cap each bio at this many lines (the rest is truncated with an
            ellipsis) so one long bio can’t blow up the card height. The List
            layout always shows the full bio.
          default: '4'
          enum:
            - none
            - '2'
            - '3'
            - '4'
            - '6'
            - null
        teamTaglineColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the faint text color.
          title: Tagline color (dark theme)
        teamTaglineColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Tagline color (light theme)
        teamShowSocials:
          type: boolean
          title: Show social profiles
          description: >-
            The member’s social profile icons (set per member in the Team
            Members manager).
          default: true
        teamShowContact:
          type: boolean
          title: Show email / phone
          description: >-
            Off by default — turns each member’s email and phone (when set) into
            icon links. Only enable when you want those details public.
          default: false
        teamSocialVariant:
          type:
            - string
            - 'null'
          title: Icon style
          default: bare
          enum:
            - bare
            - outline
            - solid
            - null
          description: Icon style.
        teamSocialSize:
          type:
            - string
            - 'null'
          title: Icon size
          default: small
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Icon size.
        teamSocialSpacing:
          type:
            - string
            - 'null'
          title: Icon spacing
          description: Gap between the icons.
          default: tight
          enum:
            - tight
            - normal
            - loose
            - null
        teamSocialHover:
          type:
            - string
            - 'null'
          title: Hover color
          description: >-
            Hover to each platform’s own brand color, or to the site accent (or
            a chosen hover color).
          default: brand
          enum:
            - brand
            - accent
            - null
        teamSocialColor:
          type:
            - string
            - 'null'
          description: Resting icon color. Leave empty for the muted default.
          title: Icon color (dark theme)
        teamSocialColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the muted default.
          title: Icon color (light theme)
        teamSocialHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Used when “Hover color” is Accent / custom. Leave empty for the site
            accent.
          title: Hover color (dark theme)
        teamSocialHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Hover color (light theme)
        teamBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        teamBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        teamBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        teamBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        teamFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/TeamWidgetTeamFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        teamCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        teamCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        teamCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        teamCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        teamCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        teamCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        teamCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        teamCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        teamCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        teamCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        teamCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        teamCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        teamCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        teamCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        teamCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        teamCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        teamCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        teamCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        teamCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        teamCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `team` widget: its `type` and its own fields. A field left out takes
        its default.
      additionalProperties: true
    FaqWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - faq
          description: 'The widget’s type: always `faq`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        faqEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: FAQ
        faqEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        faqEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        faqEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        faqEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        faqHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the questions.
          default: Frequently asked questions
        faqHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        faqHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        faqHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        faqIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        faqIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        faqIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        faqIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        faqIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        faqAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          description: The Split layout always sets its header column left.
          default: center
          enum:
            - center
            - left
            - null
        faqFeaturedOnly:
          type: boolean
          title: Featured questions only
          description: >-
            Show only questions you have flagged “Featured” in the FAQs manager
            — e.g. a short top-questions block on the home page, linking out to
            the full FAQ page.
          default: false
        faqCount:
          type:
            - integer
            - 'null'
          title: Maximum questions
          description: >-
            The most questions to show, in the manager’s sort order. Raise it
            for a full FAQ page.
          default: 12
          minimum: 1
          maximum: 50
          x-fetchski-clamped: true
        _faqCategories:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Only these categories
          description: >-
            Optional filter. Leave empty to show questions from every category.
            Manage the list under FAQ Categories. The related `faq-category`
            documents, in order (empty when none). To set it, send a list of `{
            "_id": "…" }`, one per document; a document the site can’t find is
            left out.
        faqGroupBy:
          type:
            - string
            - 'null'
          title: Group questions
          description: >-
            By category renders a subheading per FAQ category, in the order
            picked in the category filter (or, with no filter, the FAQ
            Categories sort order); questions without a category are listed
            last.
          default: none
          enum:
            - none
            - category
            - null
        faqLayout:
          type:
            - string
            - 'null'
          title: Section layout
          description: >-
            Accordion: a single centered column of collapsing questions — the
            classic FAQ. Split: the header (and button) sit in a left column
            with the accordion beside them. Two columns: the accordion flows
            across two columns. Open panels: every answer visible in a card grid
            — no collapsing.
          default: accordion
          enum:
            - accordion
            - split
            - columns
            - panels
            - null
        faqPanelColumns:
          type:
            - string
            - 'null'
          title: Panel columns
          description: How many open panels sit per row (they stack on small screens).
          default: '2'
          enum:
            - '1'
            - '2'
            - '3'
            - null
        faqOpenMode:
          type:
            - string
            - 'null'
          title: Opening behavior
          description: >-
            One at a time closes the previous answer when a new one opens;
            Independent lets visitors hold several open.
          default: single
          enum:
            - single
            - multiple
            - null
        faqFirstOpen:
          type: boolean
          title: Open the first question initially
          description: >-
            Starts the section with the first answer expanded so the block never
            reads as an empty list of rows.
          default: false
        faqMarker:
          type:
            - string
            - 'null'
          title: Toggle icon
          description: >-
            The disclosure marker on each question. Plus rotates into a close
            mark; Chevron flips.
          default: plus
          enum:
            - plus
            - chevron
            - null
        faqGap:
          type:
            - string
            - 'null'
          title: Space between questions
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Space between questions.
        faqSchema:
          type: boolean
          title: Publish FAQ structured data (JSON-LD)
          description: >-
            Adds this section’s questions to the page’s schema.org FAQPage
            markup so search engines can read them (all FAQ sections on a page
            share one FAQPage block). Costs nothing when on; turn off only to
            exclude these questions.
          default: true
        faqCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The question-row treatment. Plain (the default) is the classic
            divided list — hairlines between questions. Any other style turns
            each question into a card: Raised is a quiet lit card, Outline a
            framed row, Luxe frosted glass; Ticket/Bracket/Inlay are the graphic
            showstoppers.
          default: plain
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        faqCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        faqCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        faqCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        faqCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        faqCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        faqCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a question row does on hover. None (the default) keeps the
            accordion calm — the open/close motion is the interaction. The card
            effects (Lift/Glow/…) suit the card styles; the cursor-tracked ones
            need site animations on.
          default: none
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        faqAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — colors the toggle icon and the open question’s highlight.
            Leave empty to use the brand accent.
          title: Accent (dark theme)
        faqAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Accent (light theme)
        faqQuestionSize:
          type:
            - string
            - 'null'
          title: Question size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Question size.
        faqQuestionWeight:
          type:
            - string
            - 'null'
          title: Question weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Question weight.
        faqQuestionColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Question color (dark theme)
        faqQuestionColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Question color (light theme)
        faqAnswerSize:
          type:
            - string
            - 'null'
          title: Answer size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Answer size.
        faqAnswerWeight:
          type:
            - string
            - 'null'
          title: Answer weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Answer weight.
        faqAnswerColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Answer color (dark theme)
        faqAnswerColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Answer color (light theme)
        faqGroupHeadingWeight:
          type:
            - string
            - 'null'
          title: Category heading weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Category heading weight.
        faqGroupHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Category heading color (dark theme)
        faqGroupHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Category heading color (light theme)
        faqBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        faqBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        faqBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        faqBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        faqFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/FaqWidgetFaqFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        faqCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        faqCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        faqCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        faqCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        faqCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        faqCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        faqCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        faqCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        faqCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        faqCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        faqCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        faqCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        faqCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        faqCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        faqCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        faqCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        faqCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        faqCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        faqCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        faqCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `faq` widget: its `type` and its own fields. A field left out takes
        its default.
      additionalProperties: true
    ServiceMapWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - service-map
          description: 'The widget’s type: always `service-map`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        serviceMapEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Coverage
        serviceMapEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        serviceMapEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        serviceMapEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        serviceMapEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        serviceMapHeading:
          type: string
          title: Heading
          default: Where we serve
          description: Heading.
        serviceMapHeadingColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty for the standard ink color.
          title: Heading color (dark theme)
        serviceMapHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        serviceMapHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        serviceMapIntro:
          type: string
          title: Intro text
          description: >-
            Optional short paragraph under the heading. The data source’s own
            description (service days etc.) shows in the result panel, not here.
          default: ''
        serviceMapIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        serviceMapHeight:
          type:
            - string
            - 'null'
          title: Map height
          default: standard
          enum:
            - compact
            - standard
            - tall
            - null
          description: Map height.
        serviceMapTheme:
          type:
            - string
            - 'null'
          title: Map theme
          description: >-
            Curated light/dark basemap pairs — each follows the visitor’s theme
            toggle. “Site palette” derives the basemap from this site’s own
            colors.
          default: palette
          enum:
            - palette
            - classic
            - silver
            - retro
            - null
        serviceMapFrameRadius:
          type:
            - string
            - 'null'
          title: Map corner radius
          default: rounded
          enum:
            - square
            - slight
            - rounded
            - large
            - null
          description: Map corner radius.
        serviceMapFrameBorderColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Leave empty for the standard hairline — set it to match a
            colored border on the zone cards.
          title: Map border color (dark theme)
        serviceMapFrameBorderColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Map border color (light theme)
        serviceMapFrameGlowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional soft glow around the map frame — pairs with a glowing
            zone-card style. Leave empty for none.
          title: Map glow color (dark theme)
        serviceMapFrameGlowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Map glow color (light theme)
        serviceMapSchema:
          type: boolean
          title: Publish full service-area structured data (JSON-LD)
          description: >-
            On pages with this section, upgrades the business structured data
            from the compact site-wide form to the full detail: every public
            place name, every zip code, and area boundaries. Costs visitors
            nothing; turn off to keep this page at the compact site-wide form.
            (Requires structured data on in Site settings → SEO; demo map data
            is never published.)
          default: true
        serviceMapShowLegend:
          type: boolean
          title: Show the map key
          description: >-
            The legend card overlaid on the map. The zone cards below the map
            always carry the same information for screen readers and when the
            map can’t load.
          default: true
        serviceMapKeySwatchSize:
          type:
            - string
            - 'null'
          title: Key swatch size
          default: medium
          enum:
            - small
            - medium
            - large
            - null
          description: Key swatch size.
        serviceMapKeyJustify:
          type:
            - string
            - 'null'
          title: Key text justification
          default: left
          enum:
            - left
            - center
            - right
            - null
          description: Key text justification.
        serviceMapKeyTextSize:
          type:
            - string
            - 'null'
          title: Key text size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Key text size.
        serviceMapKeyTextWeight:
          type:
            - string
            - 'null'
          title: Key text weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Key text weight.
        serviceMapKeyTextColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty for the standard ink color.
          title: Key text color (dark theme)
        serviceMapKeyTextColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Key text color (light theme)
        serviceMapKeyRadius:
          type:
            - string
            - 'null'
          title: Key corner radius
          default: rounded
          enum:
            - square
            - slight
            - rounded
            - large
            - null
          description: Key corner radius.
        serviceMapKeyBorderColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Leave empty for the standard hairline — set it to match
            the map frame or the zone cards.
          title: Key border color (dark theme)
        serviceMapKeyBorderColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Key border color (light theme)
        serviceMapKeyGlowColor:
          type:
            - string
            - 'null'
          description: Optional soft glow around the key card. Leave empty for none.
          title: Key glow color (dark theme)
        serviceMapKeyGlowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Key glow color (light theme)
        serviceMapShowCards:
          type: boolean
          title: Show the zone cards
          description: >-
            The zone/pricing cards under the map. Turning this off hides them
            visually — they stay in the page for screen readers and
            no-JavaScript visitors (the map itself isn’t accessible).
          default: true
        serviceMapCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The card surface. Raised is a quiet lit card; Luxe is a frosted
            glass panel; Outline is a double-rule plaque frame; Plain has no
            chrome; Poster frames the card with an accent keyline; Spine embeds
            a color rail along the top; Tint washes the card in the accent
            color. Showstoppers: Ticket punches notches into the sides, Bracket
            draws only corner marks, Forge is a machined plate with an engraved
            frame, Press is a punched index card with a margin rule, Inlay
            recesses the content into a well.
          default: raised
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - inlay
            - null
        serviceMapCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        serviceMapCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        serviceMapCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        serviceMapCardsHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a card does on hover. Lift/Pop/Press/Glow/Outline are instant
            CSS effects; Sheen sweeps a soft light across; Tilt, Magnetic and
            Spotlight follow the cursor (these need site animations on —
            visitors who prefer reduced motion see the resting card). Pick a
            different one per section so a page feels varied, not cookie-cutter.
          default: border
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        serviceMapCardsSwatchSize:
          type:
            - string
            - 'null'
          title: Card swatch size
          default: medium
          enum:
            - small
            - medium
            - large
            - null
          description: Card swatch size.
        serviceMapCardsJustify:
          type:
            - string
            - 'null'
          title: Card text justification
          default: left
          enum:
            - left
            - center
            - right
            - null
          description: Card text justification.
        serviceMapCardsNameWeight:
          type:
            - string
            - 'null'
          title: Zone name weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Zone name weight.
        serviceMapCardsTextSize:
          type:
            - string
            - 'null'
          title: Card text size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Card text size.
        serviceMapCardsTextColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Colors the zone names; supporting copy stays muted. Leave
            empty for the standard ink color.
          title: Card text color (dark theme)
        serviceMapCardsTextColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card text color (light theme)
        serviceMapCardsSubSize:
          type:
            - string
            - 'null'
          title: Supporting text size
          description: >-
            The price and detail lines under each zone name — sized relative to
            the card text size.
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
        serviceMapCardsSubWeight:
          type:
            - string
            - 'null'
          title: Supporting text weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Supporting text weight.
        serviceMapCardsSubColor:
          type:
            - string
            - 'null'
          description: Optional. Leave empty for the standard muted color.
          title: Supporting text color (dark theme)
        serviceMapCardsSubColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Supporting text color (light theme)
        serviceMapIncludedLabel:
          type: string
          title: Label for zero-price zones
          description: >-
            Optional label shown instead of “$0” wherever a zone has no fee
            (key, cards, results). Clear it to show the plain price — $0 doesn’t
            always mean included.
          default: Included
        serviceMapZoneOverrides:
          type: array
          items:
            $ref: '#/components/schemas/ServiceMapWidgetServiceMapZoneOverridesItem'
          title: Zone label overrides
          description: >-
            Per-zone display overrides, matched by the zone name the data source
            provides. Rename a zone, replace its price text, or hide it entirely
            — the underlying data is never changed.
          default: []
        serviceMapShowSearch:
          type: boolean
          title: Show the “check your area” search
          default: true
          description: Show the “check your area” search.
        serviceMapSearchLabel:
          type: string
          title: Search label
          default: Check your area
          description: Search label.
        serviceMapSearchPlaceholder:
          type: string
          title: Search placeholder
          default: ZIP code or address
          description: Search placeholder.
        serviceMapSearchJustify:
          type:
            - string
            - 'null'
          title: Search justification
          description: Positions the search box and button above the map.
          default: left
          enum:
            - left
            - center
            - right
            - null
        serviceMapSearchInputRadius:
          type:
            - string
            - 'null'
          title: Search box corner radius
          description: Same radius scale as the buttons, so the box and button can match.
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
        serviceMapAutocomplete:
          type: boolean
          title: Suggest addresses while typing
          description: >-
            Google address autocomplete under the search box (needs the Places
            API enabled on the key — see the setup guide in Connections → Google
            Maps). ZIP-only typing never triggers suggestions when the data
            source is zip-based.
          default: true
        serviceMapOutsideAreaText:
          type: string
          title: Outside-area message
          description: >-
            Shown when a searched location doesn’t fall in any zone (or the
            premium radius).
          default: That location is outside our mapped service area.
        serviceMapSearchButtonText:
          type: string
          title: Search button label
          description: >-
            Leave empty for “Check”. The button’s look is configured in the
            Search button tab.
          default: ''
        serviceMapSearchButtonVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        serviceMapSearchButtonSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        serviceMapSearchButtonRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        serviceMapSearchButtonColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        serviceMapSearchButtonColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        serviceMapSearchButtonTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        serviceMapSearchButtonTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        serviceMapSearchButtonHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        serviceMapSearchButtonHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        serviceMapSearchButtonStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        serviceMapSearchButtonShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        serviceMapSearchButtonShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        serviceMapSearchButtonAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        serviceMapPanelPlacement:
          type:
            - string
            - 'null'
          title: Popup placement
          default: center
          enum:
            - center
            - corner
            - null
          description: Popup placement.
        serviceMapPanelLook:
          type:
            - string
            - 'null'
          title: Popup style
          default: overlay
          enum:
            - overlay
            - solid
            - null
          description: Popup style.
        serviceMapPanelShowQuery:
          type: boolean
          title: Show what was searched
          description: >-
            Repeats the searched ZIP code or address at the top of the result
            popup.
          default: true
        serviceMapPanelShowCity:
          type: boolean
          title: Show the city/town name
          description: >-
            Looks up the locality for a searched ZIP code (one extra Geocoding
            API call per search) and shows it beside the searched value.
          default: false
        serviceMapPanelTextSize:
          type:
            - string
            - 'null'
          title: Popup text size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Popup text size.
        serviceMapPanelTitleWeight:
          type:
            - string
            - 'null'
          title: Popup title weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Popup title weight.
        serviceMapShowPremium:
          type: boolean
          title: Show premium service pricing
          description: >-
            When the data carries a premium (distance-priced) service, include
            it in search results and the zone cards. Sources without their own
            premium block use the pricing set in Service area map → Areas and
            pricing.
          default: true
        serviceMapShowPremiumRing:
          type: boolean
          title: Draw the premium radius on the map
          description: >-
            Needs a premium range limit (miles) — with no limit there is no ring
            to draw.
          default: false
        serviceMapPremiumEstimateNote:
          type: string
          title: Premium estimate note
          default: Estimate based on driving distance.
          description: Premium estimate note.
        serviceMapPremiumUnavailableText:
          type: string
          title: Premium fallback text
          description: >-
            Shown when a distance estimate isn’t possible (e.g. the Distance
            Matrix API isn’t enabled on the key).
          default: Contact us for a quote.
        _serviceMapMarkerImage:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Marker image (dark theme)
          description: >-
            Optional logo/pin image for the business marker. Leave empty for a
            simple accent-color pin. The related `@apostrophecms/image`
            documents, in order (empty when none). To set it, send a list of `{
            "_id": "…" }`, one per document (one at most); a document the site
            can’t find is left out.
          maxItems: 1
        _serviceMapMarkerImageLight:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Marker image (light theme)
          description: >-
            Optional light-theme variant. Falls back to the dark-theme image.
            The related `@apostrophecms/image` documents, in order (empty when
            none). To set it, send a list of `{ "_id": "…" }`, one per document
            (one at most); a document the site can’t find is left out.
          maxItems: 1
        serviceMapMarkerLabel:
          type: string
          title: Marker label
          description: >-
            Accessible name + hover title for the marker. Leave empty to use the
            business name from Site settings.
          default: ''
        serviceMapMarkerSize:
          type:
            - string
            - 'null'
          title: Marker size
          default: medium
          enum:
            - small
            - medium
            - large
            - null
          description: Marker size.
        serviceMapMarkerBounce:
          type: boolean
          title: Subtle marker bounce
          description: >-
            The business marker gently bobs in place. Automatically disabled for
            visitors who prefer reduced motion.
          default: false
        serviceMapShowLocation:
          type: boolean
          title: List the business location in the key and cards
          description: >-
            Adds the business location (named by its label in Service area map →
            Your location) as the FIRST entry of the map key and zone cards.
          default: true
        serviceMapBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        serviceMapBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        serviceMapBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        serviceMapBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        serviceMapFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/ServiceMapWidgetServiceMapFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `service-map` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    BlogPreviewWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - blog-preview
          description: 'The widget’s type: always `blog-preview`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        blogHeading:
          type: string
          title: Heading
          default: From the blog
          description: Heading.
        blogSubheading:
          type: string
          title: Subheading
          default: >-
            Product news, release notes, and tips for getting the most out of
            your site.
          description: Subheading.
        blogCardImageAspect:
          type:
            - string
            - 'null'
          title: Image shape
          description: >-
            Aspect ratio of the featured image. Choose “Hidden” for text-only
            cards.
          default: 16/10
          enum:
            - 16/10
            - 4/3
            - 3/2
            - 1/1
            - none
            - null
        blogCardImageHover:
          type:
            - string
            - 'null'
          title: Image hover
          default: zoom
          enum:
            - zoom
            - none
            - null
          description: Image hover.
        blogCardImageFill:
          type: boolean
          title: Image fills the card
          description: >-
            Use the featured image as the full card background, with the title
            and meta overlaid on a dark scrim. Posts with no image fall back to
            a normal card.
          default: false
        blogCardPreset:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The card surface. Raised is a quiet lit card; Luxe a frosted glass
            panel; Outline a plaque frame; Spine adds a color rail; Tint an
            accent wash; Ticket/Bracket/Forge/Press/Inlay are the graphic
            showstoppers. (On image-led cards the photo covers the top edge.)
          default: raised
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        blogCardPresetRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        blogCardPresetAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        blogCardPresetAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        blogCardPresetForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        blogCardPresetForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        blogCardHover:
          type:
            - string
            - 'null'
          title: Card hover effect
          description: >-
            What a card does on hover. Lift/Pop/Press/Glow/Outline are instant;
            Sheen sweeps a light across; Tilt (3-D + glare), Magnetic and
            Spotlight follow the cursor (need site animations on). The Hover
            color below tints these.
          default: pop
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        blogCardHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Border / shadow / glow color on hover. Leave empty to use the site
            accent color.
          title: Hover accent color (dark theme)
        blogCardHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Hover accent color (light theme)
        blogCardShowCategory:
          type: boolean
          title: Show category
          default: true
          description: Show category.
        blogCardCategoryStyle:
          type:
            - string
            - 'null'
          title: Category badge style
          description: >-
            How the category badge uses its color (set per category under Blog
            Categories). Filled = colored background; Outline = colored border +
            text; Minimal = colored text only.
          default: filled
          enum:
            - filled
            - outline
            - minimal
            - null
        blogCardShowDate:
          type: boolean
          title: Show date
          default: true
          description: Show date.
        blogCardShowExcerpt:
          type: boolean
          title: Show excerpt
          default: true
          description: Show excerpt.
        blogCardExcerptLines:
          type:
            - string
            - 'null'
          title: Excerpt lines
          description: How many lines of the excerpt to show before truncating.
          default: '3'
          enum:
            - '2'
            - '3'
            - '4'
            - none
            - null
        blogCardShowAuthor:
          type: boolean
          title: Show author
          default: true
          description: Show author.
        blogCardShowReadMore:
          type: boolean
          title: Show “Read post” link
          default: true
          description: Show “Read post” link.
        blogCardReadMorePlacement:
          type:
            - string
            - 'null'
          title: “Read post” placement
          description: >-
            Auto puts it on the right of horizontal cards (list / compact /
            featured) and below the text on grid cards. Or force one placement
            everywhere.
          default: auto
          enum:
            - auto
            - below
            - right
            - null
        blogCardReadMoreColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the “Read post” link color. Leave empty to use
            the site accent color.
          title: “Read post” color (dark theme)
        blogCardReadMoreColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: “Read post” color (light theme)
        blogCardReadMoreHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Color of the “Read post” link when the card is hovered.
            Leave empty to use the accent color.
          title: “Read post” hover color (dark theme)
        blogCardReadMoreHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color, then the accent.
          title: “Read post” hover color (light theme)
        blogCardTitleColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the card title color. Leave empty to track the
            theme’s text color.
          title: Title color (dark theme)
        blogCardTitleColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the theme default.
          title: Title color (light theme)
        blogCardTitleWeight:
          type:
            - string
            - 'null'
          title: Title weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Title weight.
        blogCardTitleHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Title color when the card is hovered. Leave empty to use
            the site accent color.
          title: Title hover color (dark theme)
        blogCardTitleHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color, then the accent.
          title: Title hover color (light theme)
        blogCardTextColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the excerpt text color. Leave empty for the
            muted default.
          title: Excerpt color (dark theme)
        blogCardTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the muted default.
          title: Excerpt color (light theme)
        blogCardTextWeight:
          type:
            - string
            - 'null'
          title: Excerpt weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - null
          description: Excerpt weight.
        blogCardMetaColor:
          type:
            - string
            - 'null'
          description: Date / meta line color. Leave empty for the faint default.
          title: Meta color (dark theme)
        blogCardMetaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the faint default.
          title: Meta color (light theme)
        blogBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        blogBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        blogBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        blogBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        blogFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/BlogPreviewWidgetBlogFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        blogCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: All posts
        blogCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: /blog
        blogCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        blogCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        blogCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        blogCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        blogCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        blogCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        blogCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        blogCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        blogCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        blogCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        blogCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        blogCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        blogCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        blogCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        blogCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        blogCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        blogCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        blogCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `blog-preview` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    CookieDeclarationWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - cookie-declaration
          description: 'The widget’s type: always `cookie-declaration`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        cookieDeclEyebrow:
          type: string
          title: Eyebrow
          default: ''
          description: Eyebrow.
        cookieDeclHeading:
          type: string
          title: Heading
          default: What we store on your device
          description: Heading.
        cookieDeclIntro:
          type: string
          title: Introduction
          default: >-
            Everything below is either set by this website or requested from
            another company on our behalf. Each entry says who receives it, what
            it is for, and how long it lasts.
          description: Introduction.
        cookieDeclShowStatus:
          type: boolean
          title: Show the visitor’s current choices
          description: >-
            A short block naming what this visitor has allowed, with a button
            that reopens the preferences panel. Withdrawal has to be as easy as
            consent, so leave this on unless the page offers another way.
          default: true
        cookieDeclShowTable:
          type: boolean
          title: Show the details table
          description: >-
            Provider, type, duration and domain per entry. Off leaves the
            plain-language disclosures alone, which reads better but tells a
            technical reader less.
          default: true
        cookieDeclLayout:
          type:
            - string
            - 'null'
          title: Layout
          default: stacked
          enum:
            - stacked
            - compact
            - null
          description: Layout.
        cookieDeclBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        cookieDeclBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        cookieDeclBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        cookieDeclBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        cookieDeclFontOverrides:
          type: array
          items:
            $ref: >-
              #/components/schemas/CookieDeclarationWidgetCookieDeclFontOverridesItem
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `cookie-declaration` widget: its `type` and its own fields. A field
        left out takes its default.
      additionalProperties: true
    GoogleReviewsWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - google-reviews
          description: 'The widget’s type: always `google-reviews`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        reviewsEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Reviews
        reviewsEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        reviewsEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        reviewsEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        reviewsEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        reviewsHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the reviews.
          default: What people are saying
        reviewsHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        reviewsHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        reviewsHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        reviewsIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        reviewsIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        reviewsIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        reviewsIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        reviewsIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        reviewsAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Header alignment.
        reviewsMinRating:
          type:
            - string
            - 'null'
          title: Minimum rating to show
          description: Only show reviews at or above this star rating.
          default: '5'
          enum:
            - '0'
            - '3'
            - '4'
            - '5'
            - null
        reviewsFeaturedOnly:
          type: boolean
          title: Featured reviews only
          description: >-
            Show only reviews you have flagged “Featured” in the Google Reviews
            manager — hand-curate exactly which appear.
          default: false
        reviewsCount:
          type:
            - integer
            - 'null'
          title: Maximum reviews
          description: The most reviews to show (newest first).
          default: 6
          minimum: 1
          maximum: 30
          x-fetchski-clamped: true
        reviewsLayout:
          type:
            - string
            - 'null'
          title: Layout
          description: >-
            Animated carousel: a continuous, auto-scrolling marquee of cards
            (great on a home page; needs site animations enabled — falls back to
            the grid when they are off). Grid: a tidy multi-row grid. Masonry: a
            staggered, Pinterest-style grid that hugs each review’s length.
          default: carousel
          enum:
            - carousel
            - grid
            - masonry
            - null
        reviewsColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many cards per row (grid) or columns (masonry). Auto fits as
            many as comfortably fit.
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        reviewsSpeed:
          type:
            - string
            - 'null'
          title: Scroll speed
          description: >-
            How fast the carousel auto-scrolls. The review carousel runs on its
            own (gentler) speed scale than the logos/footer marquees so two
            never scroll in lockstep.
          default: normal
          enum:
            - vslow
            - slow
            - normal
            - fast
            - null
        reviewsDirection:
          type:
            - string
            - 'null'
          title: Scroll direction
          default: left
          enum:
            - left
            - right
            - null
          description: Scroll direction.
        reviewsGap:
          type:
            - string
            - 'null'
          title: Gap between cards
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between cards.
        reviewsShowAvatar:
          type: boolean
          title: Show reviewer photo
          description: >-
            Show the reviewer’s Google avatar (falls back to a lettered initial
            when missing or anonymous).
          default: true
        reviewsShowRating:
          type: boolean
          title: Show star rating
          default: true
          description: Show star rating.
        reviewsShowDate:
          type: boolean
          title: Show review date
          default: true
          description: Show review date.
        reviewsShowReply:
          type: boolean
          title: Show owner replies
          description: >-
            Include the business’s public reply beneath a review when there is
            one.
          default: false
        reviewsShowAttribution:
          type: boolean
          title: Show “Reviews from Google”
          description: >-
            A small Google attribution lockup under the section — recommended
            when showing Google reviews.
          default: true
        reviewsCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The card surface. Raised is a quiet lit card; Luxe is a frosted
            glass panel; Outline is a double-rule plaque frame; Plain has no
            chrome; Poster frames the card with an accent keyline; Spine embeds
            a color rail along the top; Tint washes the card in the accent
            color. Showstoppers: Ticket punches notches into the sides, Bracket
            draws only corner marks, Forge is a machined plate with an engraved
            frame, Press is a punched index card with a margin rule, Inlay
            recesses the content into a well.
          default: raised
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        reviewsCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        reviewsCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        reviewsCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        reviewsCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        reviewsCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        reviewsCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a card does on hover. Lift/Pop/Press/Glow/Outline are instant;
            Sheen sweeps a light across; Tilt, Magnetic and Spotlight follow the
            cursor (need site animations on). Vary it per section so the page is
            not cookie-cutter.
          default: lift
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        reviewsCardWidth:
          type:
            - string
            - 'null'
          title: Card width
          description: >-
            Sets the carousel card width and the minimum card width in the
            grid/masonry layouts.
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - null
        reviewsCardHeight:
          type:
            - string
            - 'null'
          title: Card height
          description: >-
            Auto hugs the content; the taller presets give every card a
            consistent minimum height (grid + carousel). The masonry layout
            ignores this and staggers card heights itself.
          default: auto
          enum:
            - auto
            - medium
            - tall
            - null
        reviewsCardAlign:
          type:
            - string
            - 'null'
          title: Card content alignment
          description: How the avatar, name, stars and text align inside each card.
          default: left
          enum:
            - left
            - center
            - right
            - null
        reviewsStarColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use a warm amber. Applies in both themes.
          title: Star color
        reviewsAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — background of the lettered fallback avatar. Leave empty
            to use the brand accent.
          title: Initial-avatar accent (dark theme)
        reviewsAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Initial-avatar accent (light theme)
        reviewsNameSize:
          type:
            - string
            - 'null'
          title: Name size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Name size.
        reviewsNameWeight:
          type:
            - string
            - 'null'
          title: Name weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Name weight.
        reviewsNameColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Name color (dark theme)
        reviewsNameColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Name color (light theme)
        reviewsDateSize:
          type:
            - string
            - 'null'
          title: Date size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Date size.
        reviewsDateWeight:
          type:
            - string
            - 'null'
          title: Date weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Date weight.
        reviewsDateColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the faint text color.
          title: Date color (dark theme)
        reviewsDateColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Date color (light theme)
        reviewsTextSize:
          type:
            - string
            - 'null'
          title: Review text size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Review text size.
        reviewsTextWeight:
          type:
            - string
            - 'null'
          title: Review text weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Review text weight.
        reviewsTextColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Review text color (dark theme)
        reviewsTextColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Review text color (light theme)
        reviewsTextClamp:
          type:
            - string
            - 'null'
          title: Review text length
          description: >-
            Cap each review at this many lines (the rest is truncated with an
            ellipsis) so one very long review can’t blow up the card height —
            important once real, lengthy reviews come in. Choose “Full text” to
            never truncate. Short reviews are unaffected.
          default: '8'
          enum:
            - none
            - '4'
            - '6'
            - '8'
            - '12'
            - null
        reviewsBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        reviewsBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        reviewsBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        reviewsBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        reviewsFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/GoogleReviewsWidgetReviewsFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        reviewsCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        reviewsCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        reviewsCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        reviewsCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        reviewsCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        reviewsCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        reviewsCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        reviewsCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        reviewsCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        reviewsCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        reviewsCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        reviewsCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        reviewsCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        reviewsCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        reviewsCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        reviewsCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        reviewsCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        reviewsCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        reviewsCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        reviewsCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `google-reviews` widget: its `type` and its own fields. A field left
        out takes its default.
      additionalProperties: true
    TestimonialsWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - testimonials
          description: 'The widget’s type: always `testimonials`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        testimonialsEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Testimonials
        testimonialsEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        testimonialsEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        testimonialsEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        testimonialsEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        testimonialsHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the testimonials.
          default: What our clients say
        testimonialsHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        testimonialsHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        testimonialsHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        testimonialsIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        testimonialsIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        testimonialsIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        testimonialsIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        testimonialsIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        testimonialsAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Header alignment.
        testimonialsFeaturedOnly:
          type: boolean
          title: Featured testimonials only
          description: >-
            Show only testimonials you have flagged “Featured” in the
            Testimonials manager — hand-curate exactly which appear.
          default: false
        testimonialsCount:
          type:
            - integer
            - 'null'
          title: Maximum testimonials
          description: The most testimonials to show (featured first).
          default: 6
          minimum: 1
          maximum: 30
          x-fetchski-clamped: true
        testimonialsLayout:
          type:
            - string
            - 'null'
          title: Section layout
          description: >-
            Animated carousel: a continuous, auto-scrolling marquee of cards
            (great on a home page; needs site animations enabled — falls back to
            the grid when they are off). Grid: a tidy multi-row grid. Masonry: a
            staggered, Pinterest-style grid that hugs each quote’s length.
          default: carousel
          enum:
            - carousel
            - grid
            - masonry
            - null
        testimonialsColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many cards per row (grid) or columns (masonry). Auto fits as
            many as comfortably fit.
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        testimonialsSpeed:
          type:
            - string
            - 'null'
          title: Scroll speed
          description: How fast the carousel auto-scrolls.
          default: normal
          enum:
            - vslow
            - slow
            - normal
            - fast
            - null
        testimonialsDirection:
          type:
            - string
            - 'null'
          title: Scroll direction
          default: left
          enum:
            - left
            - right
            - null
          description: Scroll direction.
        testimonialsGap:
          type:
            - string
            - 'null'
          title: Gap between cards
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between cards.
        testimonialsCardLayout:
          type:
            - string
            - 'null'
          title: Card layout
          description: >-
            Quote-led: a large quotation mark over the quote, with the author in
            a footer (the classic testimonial look). Accent bar: the quote
            beside a bold accent bar. Classic: the author on top (photo + name),
            then the quote — like a review card.
          default: quote
          enum:
            - quote
            - bar
            - classic
            - null
        testimonialsShowQuoteMark:
          type: boolean
          title: Show decorative quotation mark
          description: The oversized “ glyph on the quote-led and accent-bar layouts.
          default: true
        testimonialsShowAvatar:
          type: boolean
          title: Show author photo
          description: >-
            Show the author’s photo (falls back to a lettered initial when none
            is set).
          default: true
        testimonialsShowTitle:
          type: boolean
          title: Show author role / context
          default: true
          description: Show author role / context.
        testimonialsShowRating:
          type: boolean
          title: Show star rating
          description: >-
            Off by default — a testimonial usually leads with the quote. Turn on
            to show each testimonial’s star rating.
          default: false
        testimonialsLinkLabel:
          type: string
          title: Link label
          description: >-
            The text for a testimonial’s optional “Source link” (set per
            testimonial in the Testimonials manager). Shown only on testimonials
            that have a link.
          default: Read the full story
        testimonialsCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The card treatment. Spine (the default) embeds a color rail along
            the top; Raised is a quiet lit card; Luxe a frosted glass panel;
            Ticket/Bracket/Forge/Press/Inlay are the graphic showstoppers.
          default: edge
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        testimonialsCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        testimonialsCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        testimonialsCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        testimonialsCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        testimonialsCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        testimonialsCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a card does on hover. Lift/Pop/Press/Glow/Outline are instant;
            Sheen sweeps a light across; Tilt, Magnetic and Spotlight follow the
            cursor (need site animations on). Vary it per section so the page is
            not cookie-cutter.
          default: sheen
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        testimonialsCardWidth:
          type:
            - string
            - 'null'
          title: Card width
          description: >-
            Sets the carousel card width and the minimum card width in the
            grid/masonry layouts.
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - null
        testimonialsCardHeight:
          type:
            - string
            - 'null'
          title: Card height
          description: >-
            Auto hugs the content; the taller presets give every card a
            consistent minimum height (grid + carousel). The masonry layout
            ignores this and staggers card heights itself.
          default: auto
          enum:
            - auto
            - medium
            - tall
            - null
        testimonialsCardAlign:
          type:
            - string
            - 'null'
          title: Card content alignment
          description: How the quote and author align inside each card.
          default: left
          enum:
            - left
            - center
            - right
            - null
        testimonialsStarColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — leave empty to use a warm amber. Applies in both themes
            (only when ratings are shown).
          title: Star color
        testimonialsAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — the quotation mark, the accent bar, and the
            lettered-avatar background. Leave empty to use the brand accent.
          title: Accent (dark theme)
        testimonialsAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Accent (light theme)
        testimonialsNameSize:
          type:
            - string
            - 'null'
          title: Name size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Name size.
        testimonialsNameWeight:
          type:
            - string
            - 'null'
          title: Name weight
          default: semibold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Name weight.
        testimonialsNameColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Name color (dark theme)
        testimonialsNameColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Name color (light theme)
        testimonialsTitleSize:
          type:
            - string
            - 'null'
          title: Role size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Role size.
        testimonialsTitleWeight:
          type:
            - string
            - 'null'
          title: Role weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Role weight.
        testimonialsTitleColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the faint text color.
          title: Role color (dark theme)
        testimonialsTitleColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Role color (light theme)
        testimonialsQuoteSize:
          type:
            - string
            - 'null'
          title: Quote size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Quote size.
        testimonialsQuoteWeight:
          type:
            - string
            - 'null'
          title: Quote weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Quote weight.
        testimonialsQuoteColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the theme text color.
          title: Quote color (dark theme)
        testimonialsQuoteColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Quote color (light theme)
        testimonialsQuoteClamp:
          type:
            - string
            - 'null'
          title: Quote length
          description: >-
            Cap each quote at this many lines (the rest is truncated with an
            ellipsis) so one very long testimonial can’t blow up the card
            height. Choose “Full text” to never truncate. Short quotes are
            unaffected.
          default: '8'
          enum:
            - none
            - '4'
            - '6'
            - '8'
            - '12'
            - null
        testimonialsBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        testimonialsBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        testimonialsBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        testimonialsBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        testimonialsFontOverrides:
          type: array
          items:
            $ref: >-
              #/components/schemas/TestimonialsWidgetTestimonialsFontOverridesItem
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        testimonialsCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        testimonialsCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        testimonialsCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        testimonialsCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        testimonialsCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        testimonialsCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        testimonialsCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        testimonialsCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        testimonialsCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        testimonialsCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        testimonialsCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        testimonialsCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        testimonialsCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        testimonialsCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        testimonialsCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        testimonialsCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        testimonialsCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        testimonialsCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        testimonialsCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        testimonialsCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `testimonials` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    InstagramFeedWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - instagram-feed
          description: 'The widget’s type: always `instagram-feed`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        instagramEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Instagram
        instagramEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        instagramEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        instagramEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        instagramEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        instagramHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the feed.
          default: From the feed
        instagramHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        instagramHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        instagramHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        instagramIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        instagramIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        instagramIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        instagramIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        instagramIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        instagramAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Header alignment.
        instagramFeaturedOnly:
          type: boolean
          title: Featured posts only
          description: >-
            Show only posts you have flagged “Featured” in the Instagram Posts
            manager — hand-curate exactly which appear.
          default: false
        instagramCount:
          type:
            - integer
            - 'null'
          title: Maximum posts
          description: The most posts to show (newest first).
          default: 8
          minimum: 1
          maximum: 30
          x-fetchski-clamped: true
        instagramMediaFilter:
          type:
            - string
            - 'null'
          title: Show
          description: >-
            Filter this feed by media type. “Photos” keeps image and album
            posts; “Videos & reels” keeps only video posts. This is per-feed
            display only — it doesn’t change what gets synced.
          default: all
          enum:
            - all
            - photos
            - videos
            - null
        instagramLayout:
          type:
            - string
            - 'null'
          title: Layout
          description: >-
            Carousel: a continuous, auto-scrolling marquee strip (great on a
            home page; needs site animations enabled — falls back to the grid
            when they are off). Grid: a tidy multi-row grid. Masonry: a
            staggered grid that hugs each image’s shape. Mosaic Photo Wall: an
            edge-to-edge, gap-free photo wall where rows are scaled to a common
            height (like Flickr / Google Photos) — the richest option for
            photos.
          default: carousel
          enum:
            - carousel
            - grid
            - masonry
            - justified
            - null
        instagramColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many tiles per row (grid) or columns (masonry). Auto fits as
            many as comfortably fit. (The Mosaic Photo Wall sets its own row
            layout.)
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - '5'
            - null
        instagramJustifiedHeight:
          type:
            - string
            - 'null'
          title: Row height
          description: >-
            The target height of each row in the Mosaic Photo Wall. Taller rows
            show fewer, bigger photos per row.
          default: normal
          enum:
            - compact
            - normal
            - tall
            - null
        instagramJustifiedVary:
          type: boolean
          title: Vary photo shapes
          description: >-
            For feeds where every photo is the same shape (e.g. all square):
            assign each tile a varied shape (cropped around its focal point,
            never cutting the subject) so the wall still reads as an organic
            mosaic. Leave off when your photos already vary.
          default: false
        instagramSpeed:
          type:
            - string
            - 'null'
          title: Scroll speed
          description: >-
            How fast the carousel auto-scrolls. The feed runs on its own speed
            scale so two marquees on a page never scroll in lockstep.
          default: normal
          enum:
            - vslow
            - slow
            - normal
            - fast
            - null
        instagramDirection:
          type:
            - string
            - 'null'
          title: Scroll direction
          default: left
          enum:
            - left
            - right
            - null
          description: Scroll direction.
        instagramGap:
          type:
            - string
            - 'null'
          title: Gap between tiles
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between tiles.
        instagramAspect:
          type:
            - string
            - 'null'
          title: Tile shape
          description: >-
            Crop each image to a consistent shape. “Original” keeps each image’s
            own ratio (best with the masonry layout).
          default: square
          enum:
            - square
            - portrait
            - landscape
            - original
            - null
        instagramCardWidth:
          type:
            - string
            - 'null'
          title: Tile width
          description: >-
            Sets the carousel tile width and the minimum tile width in the
            grid/masonry layouts.
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - null
        instagramRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: rounded
          enum:
            - none
            - slight
            - rounded
            - null
          description: Corner radius.
        instagramCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a tile does on hover. Lift/Glow are best for image tiles; Tilt,
            Magnetic and Spotlight follow the cursor (need site animations on).
            This is on top of the image zoom.
          default: lift
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        instagramShowVideoBadge:
          type: boolean
          title: Show video / reel badge
          description: A small corner glyph marking a video, reel, or carousel album.
          default: true
        instagramShowPermalinkIcon:
          type: boolean
          title: Show Instagram glyph
          description: >-
            A corner Instagram glyph on each tile — the one opt-in link out to
            the post (opens in a new tab). The tile itself opens the on-site
            lightbox.
          default: true
        instagramShowCardLikes:
          type: boolean
          title: Show like count on tiles
          description: >-
            A small heart + like count in the bottom corner of each tile. Off by
            default. (A post whose account hides like counts on Instagram shows
            nothing.)
          default: false
        instagramGlyphSize:
          type:
            - string
            - 'null'
          title: Glyph & badge size
          description: >-
            Size of the corner glyph, the video/reel badge, and the play
            affordance on video tiles. All three options are larger than the old
            fixed size.
          default: large
          enum:
            - small
            - medium
            - large
            - null
        instagramShowCaption:
          type: boolean
          title: Show captions
          description: >-
            Off by default (the classic image-only grid). When on, choose where
            the caption appears below.
          default: false
        instagramCaptionMode:
          type:
            - string
            - 'null'
          title: Caption placement
          default: below
          enum:
            - below
            - hover
            - null
          description: Caption placement.
        instagramAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — color of the corner glyph + the hover wash. Leave empty
            to use the brand accent.
          title: Glyph / hover accent (dark theme)
        instagramAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Glyph / hover accent (light theme)
        instagramLikeColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — color of the like heart on the tiles and in the lightbox.
            Leave empty to use the brand coral.
          title: Like-heart color (dark theme)
        instagramLikeColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Like-heart color (light theme)
        instagramCaptionClamp:
          type:
            - string
            - 'null'
          title: Caption length
          description: >-
            Cap each caption at this many lines so a long caption can’t blow up
            the tile.
          default: '2'
          enum:
            - none
            - '1'
            - '2'
            - '3'
            - '4'
            - null
        instagramCaptionSize:
          type:
            - string
            - 'null'
          title: Caption size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Caption size.
        instagramCaptionWeight:
          type:
            - string
            - 'null'
          title: Caption weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Caption weight.
        instagramCaptionColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — leave empty to use the muted text color (below mode) /
            white (hover mode).
          title: Caption color (dark theme)
        instagramCaptionColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Caption color (light theme)
        instagramShowLikes:
          type: boolean
          title: Show like count
          description: >-
            Show the post’s like count in the lightbox. (An account that hides
            like counts on Instagram reports none — then nothing shows.)
          default: true
        instagramCommentsDisplay:
          type:
            - string
            - 'null'
          title: Comments in the lightbox
          description: >-
            How comments appear in the lightbox. “Count only” shows just the
            total. “Full list” shows the actual comments — requires “Fetch post
            comments” in Connections → Instagram to be on so the comment text is
            synced.
          default: count
          enum:
            - none
            - count
            - list
            - null
        instagramShowCommentAuthors:
          type: boolean
          title: Show comment authors
          description: >-
            Show each commenter’s Instagram handle next to their comment. Turn
            off for a cleaner, anonymous list of just the comment text.
          default: true
        instagramLightboxShowPermalink:
          type: boolean
          title: Show “View on Instagram” link
          description: >-
            The opt-in outbound link in the lightbox. Turn it off to keep
            visitors fully on your site (the corner glyph on each tile is a
            separate setting).
          default: true
        instagramBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        instagramBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        instagramBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        instagramBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        instagramFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/InstagramFeedWidgetInstagramFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        instagramCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        instagramCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        instagramCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        instagramCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        instagramCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        instagramCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        instagramCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        instagramCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        instagramCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        instagramCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        instagramCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        instagramCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        instagramCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        instagramCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        instagramCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        instagramCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        instagramCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        instagramCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        instagramCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        instagramCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `instagram-feed` widget: its `type` and its own fields. A field left
        out takes its default.
      additionalProperties: true
    GalleryPreviewWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - gallery-preview
          description: 'The widget’s type: always `gallery-preview`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        galleryEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Gallery
        galleryEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        galleryEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        galleryEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        galleryEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        galleryHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the photos.
          default: From the gallery
        galleryHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        galleryHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        galleryHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        galleryIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        galleryIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        galleryIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        galleryIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        galleryIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        galleryAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Header alignment.
        gallerySource:
          type:
            - string
            - 'null'
          title: Photo source
          description: >-
            Album: a curated set you pick and order by hand — best for a
            designed page. Folder: automatically shows every image filed in a
            media-library folder (newest first) — best for bulk collections you
            organize in the media manager. Feed: a set that refreshes itself on
            a schedule from an external photo store, so the gallery shows
            different photos over time.
          default: album
          enum:
            - album
            - folder
            - feed
            - null
        _album:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Album
          description: >-
            The Photo Album to display. Create and fill albums in the Photo
            Albums manager. The related `photo-album` documents, in order (empty
            when none). To set it, send a list of `{ "_id": "…" }`, one per
            document (one at most); a document the site can’t find is left out.
          maxItems: 1
        _galleryFolder:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Folder
          description: >-
            The media-library folder to display. Every image filed in it (and
            its subfolders, if enabled) is shown, newest first. The related
            `image-folder` documents, in order (empty when none). To set it,
            send a list of `{ "_id": "…" }`, one per document (one at most); a
            document the site can’t find is left out.
          maxItems: 1
        galleryIncludeSubfolders:
          type: boolean
          title: Include subfolders
          description: Also show images filed in folders inside the selected folder.
          default: true
        _photoFeed:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Photo Feed
          description: >-
            The Photo Feed to display. This gallery stays pointed at the feed
            while the feed replaces its photos on its own schedule. Create and
            configure feeds in the Photo Feeds manager. The related `photo-feed`
            documents, in order (empty when none). To set it, send a list of `{
            "_id": "…" }`, one per document (one at most); a document the site
            can’t find is left out.
          maxItems: 1
        galleryMaxPhotos:
          type:
            - integer
            - 'null'
          title: Maximum photos
          description: >-
            Cap the teaser to this many photos. 0 shows everything in the
            selected source (folder photos are newest-first).
          default: 8
          minimum: 0
          maximum: 200
          x-fetchski-clamped: true
        galleryLayout:
          type:
            - string
            - 'null'
          title: Layout
          description: >-
            Mosaic Photo Wall: an edge-to-edge wall where rows are scaled to a
            common height (like Flickr / Google Photos), cropped around each
            photo’s focal point — the richest option. Masonry: a staggered grid
            that hugs each photo’s shape. Grid: a tidy, uniform grid. Spotlight:
            every group of eight opens on an oversized lead photo, sides
            alternating on wide screens. Shaped Tiles: a portrait grid whose
            tiles cycle through slab, arch and orb shapes. Scrolling Banner: one
            edge-to-edge row that drifts sideways forever, so a long album reads
            as a ribbon of photos rather than a block — the option for a band
            between two sections rather than a gallery page. Panorama Wall:
            several rows, far wider than the screen, traveling sideways at
            slightly different speeds — and the visitor can push it along or
            against with a drag or a trackpad swipe. Vertical Ribbon: a band of
            columns running down the page instead of across it, neighboring
            columns traveling opposite ways, so the section reads as a moving
            curtain of photographs.
          default: justified
          enum:
            - justified
            - masonry
            - grid
            - spotlight
            - shaped
            - banner
            - panorama
            - ribbon
            - null
        galleryColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many tiles per row (grid, shaped tiles) or columns (masonry).
            Auto fits as many as comfortably fit. (The Mosaic Photo Wall sets
            its own row layout; Spotlight sets its own pattern.)
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - '5'
            - null
        galleryJustifiedHeight:
          type:
            - string
            - 'null'
          title: Row height
          description: >-
            The target height of each row in the Mosaic Photo Wall. Taller rows
            show fewer, bigger photos per row.
          default: compact
          enum:
            - compact
            - normal
            - tall
            - null
        galleryBannerHeight:
          type:
            - string
            - 'null'
          title: Banner height
          description: >-
            How tall the moving row stands. Each photo keeps its own shape, so a
            taller banner shows wider photos and fewer of them at once.
          default: normal
          enum:
            - short
            - normal
            - tall
            - null
        galleryBannerSpeed:
          type:
            - string
            - 'null'
          title: Banner speed
          description: >-
            How fast the row drifts. It also surges briefly with the page’s own
            scrolling, then settles back — so the band reacts to the visitor
            instead of ignoring them.
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
        galleryBannerDirection:
          type:
            - string
            - 'null'
          title: Banner direction
          default: left
          enum:
            - left
            - right
            - null
          description: Banner direction.
        galleryBannerFade:
          type: boolean
          title: Soften the banner edges
          description: >-
            Fades the row out at both ends so photos scroll in and out instead
            of being cut off by a hard edge.
          default: true
        galleryPanoramaRows:
          type:
            - string
            - 'null'
          title: Rows
          description: >-
            How many rows of photos the wall is dealt across. Photos go into the
            rows in turn, so consecutive shots land in different rows rather
            than stacking up together. Deep walls want a big set — a row needs
            at least three photos of its own, so a small album quietly uses
            fewer, fuller rows than you pick here.
          default: '3'
          enum:
            - '2'
            - '3'
            - '4'
            - '5'
            - '6'
            - '7'
            - '8'
            - null
        galleryPanoramaHeight:
          type:
            - string
            - 'null'
          title: Row height
          description: >-
            How tall each row stands, so the wall’s total depth is this times
            the number of rows — an eight-row Tall panorama fills a screen and
            then some. Each photo keeps its own shape, so taller rows show wider
            photos and fewer of them.
          default: normal
          enum:
            - short
            - normal
            - tall
            - null
        galleryPanoramaSpeed:
          type:
            - string
            - 'null'
          title: Travel speed
          description: >-
            How fast the wall travels. Each row takes a slightly different share
            of this, so the rows shear gently against each other and the block
            reads as depth rather than as one sliding sheet. It also surges
            briefly with the page’s own scrolling, then settles back.
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
        galleryPanoramaDirection:
          type:
            - string
            - 'null'
          title: Travel direction
          default: left
          enum:
            - left
            - right
            - null
          description: Travel direction.
        galleryPanoramaDrag:
          type: boolean
          title: Let visitors push the wall
          description: >-
            Dragging the wall (or swiping sideways on a trackpad or phone)
            pushes it along or against its travel, and it glides back into its
            own pace when let go. Vertical scrolling always still scrolls the
            page. Needs site animations on in Site design → Motion.
          default: true
        galleryPanoramaFade:
          type: boolean
          title: Soften the wall’s edges
          description: >-
            Fades the rows out at both ends so photos travel in and out instead
            of being cut off by a hard edge.
          default: true
        galleryRibbonColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many columns of photos the band is dealt across. Photos go into
            the columns in turn, so consecutive shots land in different columns
            rather than stacking up together. Narrow screens show fewer columns
            than you pick here (two on a phone, three on a tablet) — because
            photos in a 50-pixel sliver are not photos. A column needs at least
            three photos of its own, so a small album quietly uses fewer, fuller
            columns.
          default: '3'
          enum:
            - '2'
            - '3'
            - '4'
            - '5'
            - '6'
            - null
        galleryRibbonHeight:
          type:
            - string
            - 'null'
          title: Band height
          description: >-
            How tall the band stands — the window the columns travel through,
            not the columns themselves, which are always far taller than it.
            Each photo keeps its own shape and fills its column’s width, so the
            columns show more photos at once the taller the band is.
          default: normal
          enum:
            - short
            - normal
            - tall
            - null
        galleryRibbonSpeed:
          type:
            - string
            - 'null'
          title: Travel speed
          description: >-
            How fast the columns travel. Each takes a slightly different share
            of this, so the band reads as a weave rather than as one sheet
            sliding. Slower than the sideways layouts at every setting on
            purpose: this moves along the same axis the visitor scrolls in,
            where the same speed feels far more urgent. It also surges briefly
            with the page’s own scrolling, then settles back.
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
        galleryRibbonDirection:
          type:
            - string
            - 'null'
          title: Travel direction
          description: >-
            Which way the first column travels. With alternating columns on
            (below), its neighbors go the other way.
          default: up
          enum:
            - up
            - down
            - null
        galleryRibbonAlternate:
          type: boolean
          title: Alternate the columns
          description: >-
            Send neighboring columns opposite ways, which is what makes the band
            read as a weave. Turn it off and the whole band travels one way
            together — quieter, and closer to a conventional scrolling wall.
          default: true
        galleryRibbonFade:
          type: boolean
          title: Soften the band’s edges
          description: >-
            Fades the columns out at the top and bottom so photos travel in and
            out instead of being cut off by a hard edge.
          default: true
        galleryJustifiedVary:
          type: boolean
          title: Vary photo shapes
          description: >-
            For albums where every photo is the same shape (e.g. all square):
            assign each tile a varied shape (cropped around its focal point,
            never cutting the subject) so the wall still reads as an organic
            mosaic. Leave off when your photos already vary.
          default: false
        galleryGap:
          type:
            - string
            - 'null'
          title: Gap between tiles
          default: tight
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between tiles.
        galleryRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - none
            - slight
            - rounded
            - null
          description: Corner radius.
        galleryCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The tile surface. Raised floats each photo on a soft shadow
            (default); Plain is a clean edge-to-edge wall; Luxe / Outline /
            Poster frame it; Ticket / Bracket / Forge / Press add graphic
            structure. The photo fills the tile, so fill-based looks (Tint,
            Inlay) read as their frame + elevation. On the Shaped Tiles layout
            the structural looks (Ticket / Bracket / Forge / Press) fall back to
            their plain surface — their rectangular marks can’t follow an arch
            or orb.
          default: raised
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        galleryCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        galleryCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        galleryCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        galleryCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        galleryCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a tile does on hover, on top of the surface above. Glow
            (default) / Lift read best on photo tiles; Press collapses a Poster
            offset; Tilt, Magnetic and Spotlight follow the cursor (need site
            animations on). This is on top of the image zoom.
          default: glow
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        galleryShowCaption:
          type: boolean
          title: Show captions on hover
          description: >-
            Overlay each photo’s alt text on hover. Off by default (a clean
            photo wall). The caption always shows in the lightbox.
          default: false
        galleryCaptionSize:
          type:
            - string
            - 'null'
          title: Caption size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Caption size.
        galleryCaptionWeight:
          type:
            - string
            - 'null'
          title: Caption weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Caption weight.
        galleryLightbox:
          type: boolean
          title: Open photos in a lightbox
          description: >-
            Clicking a photo opens it full-size in an on-site lightbox (with
            previous / next). Turn off for a purely decorative wall that doesn’t
            enlarge.
          default: true
        galleryAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — color of the hover wash / glow. Leave empty to use the
            brand accent.
          title: Hover accent (dark theme)
        galleryAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Hover accent (light theme)
        galleryDrift:
          type:
            - string
            - 'null'
          title: Ambient drift
          description: >-
            A very slow pan-and-zoom on every photo, each tile on its own
            rhythm, so the wall stays quietly alive instead of holding perfectly
            still. Off by default: a still gallery costs nothing to keep on
            screen, and this runs continuously for as long as the page is open.
            Turn it on if you also switch on “Rotate photos automatically” below
            — a photo changing on a wall that is otherwise frozen reads as a
            glitch. Skipped for visitors who ask for reduced motion, and when
            site animations are off in Site design → Motion.
          default: 'off'
          enum:
            - 'off'
            - subtle
            - bold
            - null
        galleryParallax:
          type:
            - string
            - 'null'
          title: Scroll depth
          description: >-
            Sets every photo at its own depth: as the page scrolls, some slide
            with it and some against it, so the wall has layers instead of being
            one flat plane. It only moves while the visitor scrolls — nothing
            happens when the page is still. Skipped for visitors who ask for
            reduced motion, and when site animations are off in Site design →
            Motion.
          default: 'off'
          enum:
            - 'off'
            - subtle
            - bold
            - null
        galleryShuffle:
          type:
            - string
            - 'null'
          title: Shuffle the photos
          description: >-
            Every so often two photos trade places on the wall, gliding past
            each other into their new squares. Nothing resizes and nothing else
            on the wall moves — the grid’s squares are identical, so the photos
            simply swap seats. It holds still while a visitor’s pointer or
            keyboard is anywhere in the gallery, so nothing ever moves out from
            under a click. Skipped for visitors who ask for reduced motion, and
            when site animations are off in Site design → Motion.
          default: 'off'
          enum:
            - 'off'
            - calm
            - steady
            - lively
            - null
        galleryShuffleBatch:
          type:
            - integer
            - 'null'
          title: Photos trading places at once
          description: >-
            Two photos swap with each other; three or more pass their seats
            along in a ring, so more of the wall is moving at once. Higher
            numbers read as the wall dealing itself a new hand rather than as
            two photos changing places.
          default: 2
          minimum: 2
          maximum: 6
          x-fetchski-clamped: true
        galleryRotate:
          type: boolean
          title: Rotate photos automatically
          description: >-
            Photos fade out a few at a time and are replaced from the rest of
            the source, so the gallery keeps changing while a visitor watches.
            Needs more photos in the source than are on screen — set “Maximum
            photos” above to less than the source holds. Set “Ambient drift”
            above to Subtle as well: a photo changing on a wall that is
            otherwise perfectly still reads as a glitch rather than as movement.
            Skipped for visitors who ask for reduced motion, and when site
            animations are off in Site design → Motion.
          default: false
        galleryRotateStyle:
          type:
            - string
            - 'null'
          title: How a photo changes
          description: >-
            Cross-fade: the next photo dissolves over the old one as it eases in
            — the quietest change. Fade through a color: the tile also dips
            towards a flat color while the photos dissolve, so it reads as
            “phasing out” without ever going blank. Slide in: the next photo
            travels in over the old one, which drifts the same way behind it.
            Zoom through: the next photo settles out of a slight enlargement.
            Soften through: the photo blurs out of focus and the next one comes
            back into it. Wipe across: a clean edge travels over the tile,
            leaving the next photo behind it. Turn over: the tile turns like a
            card and comes back showing the next photo — the boldest of the
            seven.
          default: cross
          enum:
            - cross
            - veil
            - push
            - scale
            - blur
            - wipe
            - turn
            - null
        galleryRotateOrder:
          type:
            - string
            - 'null'
          title: Which photos change next
          description: >-
            Scattered spreads the changes over the whole wall, never twice in
            the same corner and never the same tile twice in a row. The other
            three move through the wall in a set direction, so the changes read
            as one gesture crossing the gallery rather than as separate events.
          default: scatter
          enum:
            - scatter
            - wave
            - columns
            - rows
            - null
        galleryRotateColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — leave empty to dip through the page background, which
            suits both themes. Set white for a brighter bloom, or the brand
            accent for a bolder pulse. The dip never reaches full strength, so
            the photo always shows through.
          title: Fade-through color (dark theme)
        galleryRotateColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Fade-through color (light theme)
        galleryRotatePace:
          type:
            - string
            - 'null'
          title: How often photos change
          description: >-
            The gap between one group of changes and the next. The real timing
            is deliberately uneven around this figure so the wall never feels
            metronomic.
          default: lively
          enum:
            - calm
            - steady
            - lively
            - rapid
            - null
        galleryRotateBatch:
          type:
            - integer
            - 'null'
          title: Photos changing at once
          description: >-
            How many tiles change per group. They never start on the same frame
            — each one follows the one before it by a beat, so a group reads as
            a ripple rather than a blink. 1 is the calmest; higher numbers keep
            more of the wall in motion.
          default: 2
          minimum: 1
          maximum: 6
          x-fetchski-clamped: true
        galleryRotateFade:
          type:
            - string
            - 'null'
          title: How long a change takes
          description: >-
            The length of one change, from the old photo to the new. Longer
            reads as a gentle phase; shorter as a snap — and short changes are
            the ones that read as choppy, so lean long.
          default: slow
          enum:
            - quick
            - normal
            - slow
            - lingering
            - null
        galleryRotateReserve:
          type:
            - integer
            - 'null'
          title: Photos held in reserve
          description: >-
            How many photos beyond the ones on screen to send to the browser for
            the rotation to draw from — the bigger this is, the longer the
            gallery goes before a visitor sees a repeat. Retired photos go back
            to the end of the queue, so it cycles the whole reserve and then
            starts over. Cheap to raise: a reserved photo is a few URLs, well
            under 100 bytes once the page is compressed, and its image file is
            only fetched when it is about to appear.
          default: 120
          minimum: 0
          maximum: 500
          x-fetchski-clamped: true
        galleryBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        galleryBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        galleryBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        galleryBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        galleryFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/GalleryPreviewWidgetGalleryFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        galleryCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        galleryCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        galleryCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        galleryCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        galleryCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        galleryCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        galleryCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        galleryCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        galleryCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        galleryCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        galleryCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        galleryCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        galleryCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        galleryCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        galleryCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        galleryCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        galleryCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        galleryCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        galleryCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        galleryCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `gallery-preview` widget: its `type` and its own fields. A field left
        out takes its default.
      additionalProperties: true
    GalleryFullWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - gallery-full
          description: 'The widget’s type: always `gallery-full`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        galleryEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Gallery
        galleryEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        galleryEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        galleryEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        galleryEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        galleryHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the photos.
          default: Photo gallery
        galleryHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        galleryHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        galleryHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        galleryIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: ''
        galleryIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        galleryIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        galleryIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        galleryIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Intro size.
        galleryAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Header alignment.
        gallerySource:
          type:
            - string
            - 'null'
          title: Photo source
          description: >-
            Album: a curated set you pick and order by hand — best for a
            designed page. Folder: automatically shows every image filed in a
            media-library folder (newest first) — best for bulk collections you
            organize in the media manager. Feed: a set that refreshes itself on
            a schedule from an external photo store, so the gallery shows
            different photos over time.
          default: album
          enum:
            - album
            - folder
            - feed
            - null
        _album:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Album
          description: >-
            The Photo Album to display. Create and fill albums in the Photo
            Albums manager. The related `photo-album` documents, in order (empty
            when none). To set it, send a list of `{ "_id": "…" }`, one per
            document (one at most); a document the site can’t find is left out.
          maxItems: 1
        _galleryFolder:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Folder
          description: >-
            The media-library folder to display. Every image filed in it (and
            its subfolders, if enabled) is shown, newest first. The related
            `image-folder` documents, in order (empty when none). To set it,
            send a list of `{ "_id": "…" }`, one per document (one at most); a
            document the site can’t find is left out.
          maxItems: 1
        galleryIncludeSubfolders:
          type: boolean
          title: Include subfolders
          description: Also show images filed in folders inside the selected folder.
          default: true
        _photoFeed:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Photo Feed
          description: >-
            The Photo Feed to display. This gallery stays pointed at the feed
            while the feed replaces its photos on its own schedule. Create and
            configure feeds in the Photo Feeds manager. The related `photo-feed`
            documents, in order (empty when none). To set it, send a list of `{
            "_id": "…" }`, one per document (one at most); a document the site
            can’t find is left out.
          maxItems: 1
        galleryMaxPhotos:
          type:
            - integer
            - 'null'
          title: Maximum photos
          description: >-
            The most photos to show. 0 (default) shows everything in the
            selected source (folder photos are newest-first).
          default: 0
          minimum: 0
          maximum: 200
          x-fetchski-clamped: true
        galleryLayout:
          type:
            - string
            - 'null'
          title: Layout
          description: >-
            Mosaic Photo Wall: an edge-to-edge wall where rows are scaled to a
            common height (like Flickr / Google Photos), cropped around each
            photo’s focal point — the richest option. Masonry: a staggered grid
            that hugs each photo’s shape. Grid: a tidy, uniform grid. Spotlight:
            every group of eight opens on an oversized lead photo, sides
            alternating on wide screens. Shaped Tiles: a portrait grid whose
            tiles cycle through slab, arch and orb shapes. Scrolling Banner: one
            edge-to-edge row that drifts sideways forever, so a long album reads
            as a ribbon of photos rather than a block — the option for a band
            between two sections rather than a gallery page. Panorama Wall:
            several rows, far wider than the screen, traveling sideways at
            slightly different speeds — and the visitor can push it along or
            against with a drag or a trackpad swipe. Vertical Ribbon: a band of
            columns running down the page instead of across it, neighboring
            columns traveling opposite ways, so the section reads as a moving
            curtain of photographs.
          default: justified
          enum:
            - justified
            - masonry
            - grid
            - spotlight
            - shaped
            - banner
            - panorama
            - ribbon
            - null
        galleryColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many tiles per row (grid, shaped tiles) or columns (masonry).
            Auto fits as many as comfortably fit. (The Mosaic Photo Wall sets
            its own row layout; Spotlight sets its own pattern.)
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - '5'
            - null
        galleryJustifiedHeight:
          type:
            - string
            - 'null'
          title: Row height
          description: >-
            The target height of each row in the Mosaic Photo Wall. Taller rows
            show fewer, bigger photos per row.
          default: normal
          enum:
            - compact
            - normal
            - tall
            - null
        galleryBannerHeight:
          type:
            - string
            - 'null'
          title: Banner height
          description: >-
            How tall the moving row stands. Each photo keeps its own shape, so a
            taller banner shows wider photos and fewer of them at once.
          default: normal
          enum:
            - short
            - normal
            - tall
            - null
        galleryBannerSpeed:
          type:
            - string
            - 'null'
          title: Banner speed
          description: >-
            How fast the row drifts. It also surges briefly with the page’s own
            scrolling, then settles back — so the band reacts to the visitor
            instead of ignoring them.
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
        galleryBannerDirection:
          type:
            - string
            - 'null'
          title: Banner direction
          default: left
          enum:
            - left
            - right
            - null
          description: Banner direction.
        galleryBannerFade:
          type: boolean
          title: Soften the banner edges
          description: >-
            Fades the row out at both ends so photos scroll in and out instead
            of being cut off by a hard edge.
          default: true
        galleryPanoramaRows:
          type:
            - string
            - 'null'
          title: Rows
          description: >-
            How many rows of photos the wall is dealt across. Photos go into the
            rows in turn, so consecutive shots land in different rows rather
            than stacking up together. Deep walls want a big set — a row needs
            at least three photos of its own, so a small album quietly uses
            fewer, fuller rows than you pick here.
          default: '3'
          enum:
            - '2'
            - '3'
            - '4'
            - '5'
            - '6'
            - '7'
            - '8'
            - null
        galleryPanoramaHeight:
          type:
            - string
            - 'null'
          title: Row height
          description: >-
            How tall each row stands, so the wall’s total depth is this times
            the number of rows — an eight-row Tall panorama fills a screen and
            then some. Each photo keeps its own shape, so taller rows show wider
            photos and fewer of them.
          default: normal
          enum:
            - short
            - normal
            - tall
            - null
        galleryPanoramaSpeed:
          type:
            - string
            - 'null'
          title: Travel speed
          description: >-
            How fast the wall travels. Each row takes a slightly different share
            of this, so the rows shear gently against each other and the block
            reads as depth rather than as one sliding sheet. It also surges
            briefly with the page’s own scrolling, then settles back.
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
        galleryPanoramaDirection:
          type:
            - string
            - 'null'
          title: Travel direction
          default: left
          enum:
            - left
            - right
            - null
          description: Travel direction.
        galleryPanoramaDrag:
          type: boolean
          title: Let visitors push the wall
          description: >-
            Dragging the wall (or swiping sideways on a trackpad or phone)
            pushes it along or against its travel, and it glides back into its
            own pace when let go. Vertical scrolling always still scrolls the
            page. Needs site animations on in Site design → Motion.
          default: true
        galleryPanoramaFade:
          type: boolean
          title: Soften the wall’s edges
          description: >-
            Fades the rows out at both ends so photos travel in and out instead
            of being cut off by a hard edge.
          default: true
        galleryRibbonColumns:
          type:
            - string
            - 'null'
          title: Columns
          description: >-
            How many columns of photos the band is dealt across. Photos go into
            the columns in turn, so consecutive shots land in different columns
            rather than stacking up together. Narrow screens show fewer columns
            than you pick here (two on a phone, three on a tablet) — because
            photos in a 50-pixel sliver are not photos. A column needs at least
            three photos of its own, so a small album quietly uses fewer, fuller
            columns.
          default: '3'
          enum:
            - '2'
            - '3'
            - '4'
            - '5'
            - '6'
            - null
        galleryRibbonHeight:
          type:
            - string
            - 'null'
          title: Band height
          description: >-
            How tall the band stands — the window the columns travel through,
            not the columns themselves, which are always far taller than it.
            Each photo keeps its own shape and fills its column’s width, so the
            columns show more photos at once the taller the band is.
          default: normal
          enum:
            - short
            - normal
            - tall
            - null
        galleryRibbonSpeed:
          type:
            - string
            - 'null'
          title: Travel speed
          description: >-
            How fast the columns travel. Each takes a slightly different share
            of this, so the band reads as a weave rather than as one sheet
            sliding. Slower than the sideways layouts at every setting on
            purpose: this moves along the same axis the visitor scrolls in,
            where the same speed feels far more urgent. It also surges briefly
            with the page’s own scrolling, then settles back.
          default: normal
          enum:
            - slow
            - normal
            - fast
            - null
        galleryRibbonDirection:
          type:
            - string
            - 'null'
          title: Travel direction
          description: >-
            Which way the first column travels. With alternating columns on
            (below), its neighbors go the other way.
          default: up
          enum:
            - up
            - down
            - null
        galleryRibbonAlternate:
          type: boolean
          title: Alternate the columns
          description: >-
            Send neighboring columns opposite ways, which is what makes the band
            read as a weave. Turn it off and the whole band travels one way
            together — quieter, and closer to a conventional scrolling wall.
          default: true
        galleryRibbonFade:
          type: boolean
          title: Soften the band’s edges
          description: >-
            Fades the columns out at the top and bottom so photos travel in and
            out instead of being cut off by a hard edge.
          default: true
        galleryJustifiedVary:
          type: boolean
          title: Vary photo shapes
          description: >-
            For albums where every photo is the same shape (e.g. all square):
            assign each tile a varied shape (cropped around its focal point,
            never cutting the subject) so the wall still reads as an organic
            mosaic. Leave off when your photos already vary.
          default: false
        galleryGap:
          type:
            - string
            - 'null'
          title: Gap between tiles
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between tiles.
        galleryRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - none
            - slight
            - rounded
            - null
          description: Corner radius.
        galleryCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The tile surface. Raised floats each photo on a soft shadow
            (default); Plain is a clean edge-to-edge wall; Luxe / Outline /
            Poster frame it; Ticket / Bracket / Forge / Press add graphic
            structure. The photo fills the tile, so fill-based looks (Tint,
            Inlay) read as their frame + elevation. On the Shaped Tiles layout
            the structural looks (Ticket / Bracket / Forge / Press) fall back to
            their plain surface — their rectangular marks can’t follow an arch
            or orb.
          default: raised
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        galleryCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        galleryCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        galleryCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        galleryCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        galleryCardHover:
          type:
            - string
            - 'null'
          title: Hover effect
          description: >-
            What a tile does on hover, on top of the surface above. Glow
            (default) / Lift read best on photo tiles; Press collapses a Poster
            offset; Tilt, Magnetic and Spotlight follow the cursor (need site
            animations on). This is on top of the image zoom.
          default: glow
          enum:
            - none
            - lift
            - pop
            - press
            - glow
            - border
            - sheen
            - tilt
            - magnetic
            - spotlight
            - null
        galleryShowCaption:
          type: boolean
          title: Show captions on hover
          description: >-
            Overlay each photo’s alt text on hover. Off by default (a clean
            photo wall). The caption always shows in the lightbox.
          default: false
        galleryCaptionSize:
          type:
            - string
            - 'null'
          title: Caption size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Caption size.
        galleryCaptionWeight:
          type:
            - string
            - 'null'
          title: Caption weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Caption weight.
        galleryLightbox:
          type: boolean
          title: Open photos in a lightbox
          description: >-
            Clicking a photo opens it full-size in an on-site lightbox (with
            previous / next). Turn off for a purely decorative wall that doesn’t
            enlarge.
          default: true
        galleryAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — color of the hover wash / glow. Leave empty to use the
            brand accent.
          title: Hover accent (dark theme)
        galleryAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Hover accent (light theme)
        galleryDrift:
          type:
            - string
            - 'null'
          title: Ambient drift
          description: >-
            A very slow pan-and-zoom on every photo, each tile on its own
            rhythm, so the wall stays quietly alive instead of holding perfectly
            still. Off by default: a still gallery costs nothing to keep on
            screen, and this runs continuously for as long as the page is open.
            Turn it on if you also switch on “Rotate photos automatically” below
            — a photo changing on a wall that is otherwise frozen reads as a
            glitch. Skipped for visitors who ask for reduced motion, and when
            site animations are off in Site design → Motion.
          default: 'off'
          enum:
            - 'off'
            - subtle
            - bold
            - null
        galleryParallax:
          type:
            - string
            - 'null'
          title: Scroll depth
          description: >-
            Sets every photo at its own depth: as the page scrolls, some slide
            with it and some against it, so the wall has layers instead of being
            one flat plane. It only moves while the visitor scrolls — nothing
            happens when the page is still. Skipped for visitors who ask for
            reduced motion, and when site animations are off in Site design →
            Motion.
          default: 'off'
          enum:
            - 'off'
            - subtle
            - bold
            - null
        galleryShuffle:
          type:
            - string
            - 'null'
          title: Shuffle the photos
          description: >-
            Every so often two photos trade places on the wall, gliding past
            each other into their new squares. Nothing resizes and nothing else
            on the wall moves — the grid’s squares are identical, so the photos
            simply swap seats. It holds still while a visitor’s pointer or
            keyboard is anywhere in the gallery, so nothing ever moves out from
            under a click. Skipped for visitors who ask for reduced motion, and
            when site animations are off in Site design → Motion.
          default: 'off'
          enum:
            - 'off'
            - calm
            - steady
            - lively
            - null
        galleryShuffleBatch:
          type:
            - integer
            - 'null'
          title: Photos trading places at once
          description: >-
            Two photos swap with each other; three or more pass their seats
            along in a ring, so more of the wall is moving at once. Higher
            numbers read as the wall dealing itself a new hand rather than as
            two photos changing places.
          default: 2
          minimum: 2
          maximum: 6
          x-fetchski-clamped: true
        galleryRotate:
          type: boolean
          title: Rotate photos automatically
          description: >-
            Photos fade out a few at a time and are replaced from the rest of
            the source, so the gallery keeps changing while a visitor watches.
            Needs more photos in the source than are on screen — set “Maximum
            photos” above to less than the source holds. Set “Ambient drift”
            above to Subtle as well: a photo changing on a wall that is
            otherwise perfectly still reads as a glitch rather than as movement.
            Skipped for visitors who ask for reduced motion, and when site
            animations are off in Site design → Motion.
          default: false
        galleryRotateStyle:
          type:
            - string
            - 'null'
          title: How a photo changes
          description: >-
            Cross-fade: the next photo dissolves over the old one as it eases in
            — the quietest change. Fade through a color: the tile also dips
            towards a flat color while the photos dissolve, so it reads as
            “phasing out” without ever going blank. Slide in: the next photo
            travels in over the old one, which drifts the same way behind it.
            Zoom through: the next photo settles out of a slight enlargement.
            Soften through: the photo blurs out of focus and the next one comes
            back into it. Wipe across: a clean edge travels over the tile,
            leaving the next photo behind it. Turn over: the tile turns like a
            card and comes back showing the next photo — the boldest of the
            seven.
          default: cross
          enum:
            - cross
            - veil
            - push
            - scale
            - blur
            - wipe
            - turn
            - null
        galleryRotateOrder:
          type:
            - string
            - 'null'
          title: Which photos change next
          description: >-
            Scattered spreads the changes over the whole wall, never twice in
            the same corner and never the same tile twice in a row. The other
            three move through the wall in a set direction, so the changes read
            as one gesture crossing the gallery rather than as separate events.
          default: scatter
          enum:
            - scatter
            - wave
            - columns
            - rows
            - null
        galleryRotateColor:
          type:
            - string
            - 'null'
          description: >-
            Optional — leave empty to dip through the page background, which
            suits both themes. Set white for a brighter bloom, or the brand
            accent for a bolder pulse. The dip never reaches full strength, so
            the photo always shows through.
          title: Fade-through color (dark theme)
        galleryRotateColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Fade-through color (light theme)
        galleryRotatePace:
          type:
            - string
            - 'null'
          title: How often photos change
          description: >-
            The gap between one group of changes and the next. The real timing
            is deliberately uneven around this figure so the wall never feels
            metronomic.
          default: lively
          enum:
            - calm
            - steady
            - lively
            - rapid
            - null
        galleryRotateBatch:
          type:
            - integer
            - 'null'
          title: Photos changing at once
          description: >-
            How many tiles change per group. They never start on the same frame
            — each one follows the one before it by a beat, so a group reads as
            a ripple rather than a blink. 1 is the calmest; higher numbers keep
            more of the wall in motion.
          default: 2
          minimum: 1
          maximum: 6
          x-fetchski-clamped: true
        galleryRotateFade:
          type:
            - string
            - 'null'
          title: How long a change takes
          description: >-
            The length of one change, from the old photo to the new. Longer
            reads as a gentle phase; shorter as a snap — and short changes are
            the ones that read as choppy, so lean long.
          default: slow
          enum:
            - quick
            - normal
            - slow
            - lingering
            - null
        galleryRotateReserve:
          type:
            - integer
            - 'null'
          title: Photos held in reserve
          description: >-
            How many photos beyond the ones on screen to send to the browser for
            the rotation to draw from — the bigger this is, the longer the
            gallery goes before a visitor sees a repeat. Retired photos go back
            to the end of the queue, so it cycles the whole reserve and then
            starts over. Cheap to raise: a reserved photo is a few URLs, well
            under 100 bytes once the page is compressed, and its image file is
            only fetched when it is about to appear.
          default: 120
          minimum: 0
          maximum: 500
          x-fetchski-clamped: true
        galleryBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        galleryBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        galleryBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        galleryBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        galleryFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/GalleryFullWidgetGalleryFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        galleryCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: ''
        galleryCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: ''
        galleryCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        galleryCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        galleryCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        galleryCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        galleryCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        galleryCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        galleryCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        galleryCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        galleryCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        galleryCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        galleryCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        galleryCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        galleryCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        galleryCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        galleryCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        galleryCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        galleryCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        galleryCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `gallery-full` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    PricingWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - pricing
          description: 'The widget’s type: always `pricing`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        pricingEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          description: A small label above the heading (e.g. "Pricing").
          default: true
        pricingEyebrow:
          type: string
          title: Eyebrow
          default: Pricing
          description: Eyebrow.
        pricingEyebrowColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the secondary (mint) color.
          title: Eyebrow color (dark theme)
        pricingEyebrowColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Eyebrow color (light theme)
        pricingEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        pricingEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        pricingHeading:
          type: string
          title: Heading
          description: Optional. Leave empty to show just the cards.
          default: Simple, transparent pricing
        pricingHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Heading color (dark theme)
        pricingHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Heading color (light theme)
        pricingHeadingWeight:
          type:
            - string
            - 'null'
          title: Heading weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Heading weight.
        pricingHeadingSize:
          type:
            - string
            - 'null'
          title: Heading size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Heading size.
        pricingIntro:
          type: string
          title: Intro line
          description: Optional short sentence under the heading.
          default: >-
            Pick the package that fits. No hidden fees — change or cancel any
            time.
        pricingIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Intro color (dark theme)
        pricingIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Intro color (light theme)
        pricingIntroWeight:
          type:
            - string
            - 'null'
          title: Intro weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Intro weight.
        pricingIntroSize:
          type:
            - string
            - 'null'
          title: Intro size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Intro size.
        pricingColumns:
          type:
            - string
            - 'null'
          title: Cards per row
          description: >-
            Auto fits as many as comfortably fit and works for any number of
            cards. Or lock a maximum per row.
          default: auto
          enum:
            - auto
            - '2'
            - '3'
            - '4'
            - null
        pricingGap:
          type:
            - string
            - 'null'
          title: Gap between cards
          default: normal
          enum:
            - tight
            - normal
            - roomy
            - null
          description: Gap between cards.
        pricingCardStyle:
          type:
            - string
            - 'null'
          title: Card style
          description: >-
            The base treatment for every tier (a highlighted tier always gets
            its own bold framed look). Raised is a quiet lit card; Luxe a
            frosted glass panel; Outline a plaque frame; Spine adds a color
            rail; Tint an accent wash; Ticket/Bracket/Forge/Press/Inlay are the
            graphic showstoppers.
          default: raised
          enum:
            - raised
            - luxe
            - outline
            - plain
            - poster
            - edge
            - tint
            - ticket
            - bracket
            - forge
            - press
            - inlay
            - null
        pricingCardStyleRadius:
          type:
            - string
            - 'null'
          title: Card corners
          description: >-
            Corner rounding for each card. Default keeps the widget’s own tuned
            corners — except Forge, which defaults to tight machined corners
            matching its engraved frame.
          default: default
          enum:
            - default
            - square
            - slight
            - rounded
            - large
            - null
        pricingCardStyleAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Colors the Spine rail, Bracket marks, Forge corner/frame and Press
            margin rule. Leave empty to use the brand accent.
          title: Card style color (dark theme)
        pricingCardStyleAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Card style color (light theme)
        pricingCardStyleForgeScope:
          type:
            - string
            - 'null'
          title: Forge color placement
          description: >-
            Where the Forge plate wears its color: a single corner mark (the
            machinist’s datum, default) or the whole engraved frame.
          default: corner
          enum:
            - corner
            - frame
            - null
        pricingCardStyleForgeWeight:
          type:
            - string
            - 'null'
          title: Forge line weight
          description: Thickness of the Forge corner mark / colored frame.
          default: fine
          enum:
            - fine
            - medium
            - bold
            - null
        pricingAlign:
          type:
            - string
            - 'null'
          title: Alignment
          description: Aligns the section header and the text inside each card.
          default: center
          enum:
            - center
            - left
            - null
        pricingEqualHeight:
          type: boolean
          title: Equal-height cards
          description: >-
            Stretch every card to the tallest one and pin each button to the
            bottom, so the cards line up even with uneven feature lists.
          default: true
        pricingFeatureMarkers:
          type: boolean
          title: Show feature check marks
          description: >-
            A check (included) or cross (not included) before each feature. Off
            = a plain list.
          default: true
        pricingCardHover:
          type:
            - string
            - 'null'
          title: Card hover effect
          description: >-
            How a card reacts to the pointer. Rise floats it up on an accent
            underglow; Selection ring previews the highlighted look + tints the
            price; Spotlight washes accent light over the price; Checklist
            lights up the ✓ marks one-by-one; Tilt is a 3-D parallax that only
            runs when site animations are on.
          default: rise
          enum:
            - none
            - rise
            - ring
            - spotlight
            - checklist
            - tilt
            - null
        pricingHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Border / glow / spotlight / checkmark color on hover. Leave empty to
            use the highlight accent (then the site accent).
          title: Hover accent (dark theme)
        pricingHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            accent.
          title: Hover accent (light theme)
        pricingEntrance:
          type:
            - string
            - 'null'
          title: Scroll-in animation
          description: >-
            How the cards animate in as they scroll into view. Featured-led
            makes the highlighted tier settle last with a little emphasis (draws
            the eye to the recommended plan); Simple stagger fades them in
            evenly. Only plays when site animations are on (Site design →
            Motion) — otherwise the cards are simply shown.
          default: featured
          enum:
            - featured
            - stagger
            - none
            - null
        pricingNameSize:
          type:
            - string
            - 'null'
          title: Card name size
          description: Size of each card’s name / title.
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
        pricingPriceSize:
          type:
            - string
            - 'null'
          title: Price size
          description: Size of the price amount (the period and price note scale with it).
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
        pricingDescSize:
          type:
            - string
            - 'null'
          title: Description size
          description: Size of each card’s description blurb.
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
        pricingFeatureSize:
          type:
            - string
            - 'null'
          title: Feature size
          description: Size of the feature list text (notes and check marks scale with it).
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
        pricingHighlightBadge:
          type: string
          title: Default highlight badge
          description: >-
            Ribbon text shown on a highlighted tier that doesn’t set its own
            badge. Each tier can override it (or badge a non-highlighted tier)
            below. Leave empty for no automatic badge.
          default: Most popular
        pricingAccentColor:
          type:
            - string
            - 'null'
          description: >-
            Color for the highlighted tier’s border + ring and each tier’s
            badge. Leave empty to use the site accent color.
          title: Highlight accent (dark theme)
        pricingAccentColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme accent.
          title: Highlight accent (light theme)
        pricingTiers:
          type: array
          items:
            $ref: '#/components/schemas/PricingWidgetPricingTiersItem'
          title: Pricing cards
          description: >-
            Each card is one tier / package / service. Toggle “Highlight” on the
            one you want to stand out.
          default:
            - name: Basic
              price: $29
              period: / month
              description: The essentials, done well.
              features:
                - text: Core service
                  included: true
                - text: Email support
                  included: true
                - text: Monthly check-in
                  included: true
                - text: Priority scheduling
                  included: false
              ctaLabel: Get started
              ctaUrl: /contact-us
            - name: Standard
              highlighted: true
              price: $59
              period: / month
              description: Our most popular choice.
              features:
                - text: Everything in Basic
                  included: true
                - text: Phone and email support
                  included: true
                - text: Weekly check-ins
                  included: true
                - text: Priority scheduling
                  included: true
              ctaLabel: Get started
              ctaUrl: /contact-us
            - name: Premium
              price: Custom
              period: ''
              priceNote: Billed annually
              description: Tailored to exactly what you need.
              features:
                - text: Everything in Standard
                  included: true
                - text: A dedicated contact
                  included: true
                - text: Flexible scheduling
                  included: true
                - text: Custom extras
                  included: true
              ctaLabel: Contact us
              ctaUrl: /contact-us
        pricingBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        pricingBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        pricingBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        pricingBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        pricingFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/PricingWidgetPricingFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        pricingFeaturedCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Get started
        pricingFeaturedCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: /contact-us
        pricingFeaturedCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        pricingFeaturedCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        pricingFeaturedCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        pricingFeaturedCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        pricingFeaturedCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        pricingFeaturedCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        pricingFeaturedCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        pricingFeaturedCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        pricingFeaturedCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        pricingFeaturedCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        pricingFeaturedCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        pricingFeaturedCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        pricingFeaturedCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        pricingFeaturedCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        pricingFeaturedCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        pricingFeaturedCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        pricingFeaturedCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        pricingFeaturedCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        pricingCtaLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Choose plan
        pricingCtaUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: /contact-us
        pricingCtaNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        pricingCtaVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        pricingCtaSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        pricingCtaRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        pricingCtaColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        pricingCtaColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        pricingCtaTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        pricingCtaTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        pricingCtaHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        pricingCtaHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        pricingCtaStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        pricingCtaShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        pricingCtaShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        pricingCtaAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        pricingCtaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        pricingCtaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        pricingCtaIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        pricingCtaIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `pricing` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    NewsletterWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - newsletter
          description: 'The widget’s type: always `newsletter`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        _newsletterForm:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Subscription form
          description: >-
            The Form (Forms manager) that receives these submissions and routes
            them — configure its destinations on the form’s Actions tab. Create
            one if you have not yet. The related `@apostrophecms/form`
            documents, in order (empty when none). To set it, send a list of `{
            "_id": "…" }`, one per document (one at most); a document the site
            can’t find is left out.
          maxItems: 1
        newsletterEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          default: true
          description: Show eyebrow.
        newsletterEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Newsletter
        newsletterEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        newsletterEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        newsletterEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        newsletterEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        newsletterHeading:
          type: string
          title: Heading
          default: Subscribe for updates
          description: Heading.
        newsletterHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Color (dark theme)
        newsletterHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Color (light theme)
        newsletterHeadingWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        newsletterHeadingSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Size.
        newsletterIntro:
          type: string
          title: Intro
          description: Optional short sentence under the heading.
          default: >-
            Get the latest news and updates delivered to your inbox. No spam,
            unsubscribe anytime.
        newsletterIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Color (dark theme)
        newsletterIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Color (light theme)
        newsletterIntroWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        newsletterIntroSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Size.
        newsletterBand:
          type:
            - string
            - 'null'
          title: Band style
          description: >-
            Plain sits on the page; Raised is a contained card; Accent is a
            solid brand-color band.
          default: raised
          enum:
            - plain
            - raised
            - accent
            - null
        newsletterAccentColor:
          type:
            - string
            - 'null'
          description: The accent band color. Leave empty to use the site accent color.
          title: Band color (dark theme)
        newsletterAccentColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Band color (light theme)
        newsletterAlign:
          type:
            - string
            - 'null'
          title: Alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Alignment.
        newsletterLayout:
          type:
            - string
            - 'null'
          title: Form layout
          description: >-
            Inline puts the field + button on one row (stacks on small screens);
            Stacked always stacks them.
          default: inline
          enum:
            - inline
            - stacked
            - null
        newsletterWidth:
          type:
            - string
            - 'null'
          title: Content width
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - null
          description: Content width.
        newsletterNameEnabled:
          type: boolean
          title: Collect a name
          default: false
          description: Collect a name.
        newsletterNameLabel:
          type: string
          title: Name label
          default: Name
          description: Name label.
        newsletterNamePlaceholder:
          type: string
          title: Name placeholder
          default: Your name
          description: Name placeholder.
        newsletterEmailLabel:
          type: string
          title: Email label
          default: Email address
          description: Email label.
        newsletterEmailPlaceholder:
          type: string
          title: Email placeholder
          default: you@example.com
          description: Email placeholder.
        newsletterConsentEnabled:
          type: boolean
          title: Show a consent checkbox
          description: Optional opt-in checkbox (e.g. for GDPR-style explicit consent).
          default: false
        newsletterConsentText:
          type: string
          title: Consent statement
          default: I agree to receive email updates and accept the privacy policy.
          description: Consent statement.
        newsletterDisclaimer:
          type: string
          title: Fine print (optional)
          description: A small line under the form, e.g. an unsubscribe note.
          default: We respect your privacy. Unsubscribe at any time.
        newsletterSuccessMessage:
          type: string
          title: Success message
          default: Thanks for subscribing! We’ll be in touch.
          description: Success message.
        newsletterErrorMessage:
          type: string
          title: Error message
          default: Sorry, something went wrong. Please try again.
          description: Error message.
        newsletterBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        newsletterBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        newsletterBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        newsletterBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        newsletterFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/NewsletterWidgetNewsletterFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        newsletterSubmitLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Subscribe
        newsletterSubmitVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        newsletterSubmitSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        newsletterSubmitRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        newsletterSubmitColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        newsletterSubmitColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        newsletterSubmitTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        newsletterSubmitTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        newsletterSubmitHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        newsletterSubmitHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        newsletterSubmitStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        newsletterSubmitShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        newsletterSubmitShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        newsletterSubmitAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        newsletterSubmitIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        newsletterSubmitIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        newsletterSubmitIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        newsletterSubmitIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `newsletter` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    SmsSignupWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - sms-signup
          description: 'The widget’s type: always `sms-signup`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        _smsSignupForm:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Subscription form
          description: >-
            The Form (Forms manager) that receives these SMS opt-ins and routes
            them — configure its destinations on the form’s Actions tab. The
            related `@apostrophecms/form` documents, in order (empty when none).
            To set it, send a list of `{ "_id": "…" }`, one per document (one at
            most); a document the site can’t find is left out.
          maxItems: 1
        smsSignupEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          default: true
          description: Show eyebrow.
        smsSignupEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Stay connected
        smsSignupEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        smsSignupEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        smsSignupEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        smsSignupEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        smsSignupHeading:
          type: string
          title: Heading
          default: Get text updates
          description: Heading.
        smsSignupHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Color (dark theme)
        smsSignupHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Color (light theme)
        smsSignupHeadingWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        smsSignupHeadingSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Size.
        smsSignupIntro:
          type: string
          title: Intro
          description: Optional short sentence under the heading.
          default: Sign up for occasional text messages. Standard rates may apply.
        smsSignupIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Color (dark theme)
        smsSignupIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Color (light theme)
        smsSignupIntroWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        smsSignupIntroSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Size.
        smsSignupBand:
          type:
            - string
            - 'null'
          title: Band style
          description: >-
            Plain sits on the page; Raised is a contained card; Accent is a
            solid brand-color band.
          default: raised
          enum:
            - plain
            - raised
            - accent
            - null
        smsSignupAccentColor:
          type:
            - string
            - 'null'
          description: The accent band color. Leave empty to use the site accent color.
          title: Band color (dark theme)
        smsSignupAccentColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Band color (light theme)
        smsSignupAlign:
          type:
            - string
            - 'null'
          title: Alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Alignment.
        smsSignupLayout:
          type:
            - string
            - 'null'
          title: Form layout
          description: >-
            Inline puts the field + button on one row (stacks on small screens);
            Stacked always stacks them.
          default: inline
          enum:
            - inline
            - stacked
            - null
        smsSignupWidth:
          type:
            - string
            - 'null'
          title: Content width
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - null
          description: Content width.
        smsSignupNameEnabled:
          type: boolean
          title: Collect a name
          default: false
          description: Collect a name.
        smsSignupNameLabel:
          type: string
          title: Name label
          default: Name
          description: Name label.
        smsSignupNamePlaceholder:
          type: string
          title: Name placeholder
          default: Your name
          description: Name placeholder.
        smsSignupPhoneLabel:
          type: string
          title: Phone label
          default: Mobile number
          description: Phone label.
        smsSignupPhonePlaceholder:
          type: string
          title: Phone placeholder
          default: (555) 555-5555
          description: Phone placeholder.
        smsSignupConsentText:
          type: string
          title: Consent statement (required checkbox)
          description: >-
            Shown beside a required checkbox; the form shows only once this is
            filled in. Be specific about what they are agreeing to. The brand
            name is added automatically from Site settings.
          default: >-
            I agree to receive recurring automated marketing text messages at
            the phone number provided. Consent is not a condition of purchase.
        smsSignupTermsText:
          type: string
          title: Program terms (fine print)
          description: Carrier-compliance fine print shown under the form.
          default: >-
            Message frequency varies. Msg & data rates may apply. Reply STOP to
            opt out, HELP for help.
        smsSignupPrivacyUrl:
          type: string
          title: Privacy policy link
          description: Optional — linked from the fine print.
          default: ''
        smsSignupTermsUrl:
          type: string
          title: SMS terms link
          description: Optional — linked from the fine print.
          default: ''
        smsSignupSuccessMessage:
          type: string
          title: Success message
          default: Thanks! Check your phone for a message to confirm your subscription.
          description: Success message.
        smsSignupErrorMessage:
          type: string
          title: Error message
          default: Sorry, something went wrong. Please try again.
          description: Error message.
        smsSignupBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        smsSignupBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        smsSignupBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        smsSignupBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        smsSignupFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/SmsSignupWidgetSmsSignupFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        smsSignupSubmitLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Sign up
        smsSignupSubmitVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        smsSignupSubmitSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        smsSignupSubmitRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        smsSignupSubmitColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        smsSignupSubmitColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        smsSignupSubmitTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        smsSignupSubmitTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        smsSignupSubmitHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        smsSignupSubmitHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        smsSignupSubmitStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        smsSignupSubmitShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        smsSignupSubmitShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        smsSignupSubmitAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        smsSignupSubmitIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        smsSignupSubmitIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        smsSignupSubmitIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        smsSignupSubmitIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
        - smsSignupConsentText
      description: >-
        A `sms-signup` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    FormRenderWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - form-render
          description: 'The widget’s type: always `form-render`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        _form:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Form
          description: >-
            The form to show here. Build and edit the form itself in the Forms
            manager (create one there first if needed). The related
            `@apostrophecms/form` documents, in order (empty when none). To set
            it, send a list of `{ "_id": "…" }`, one per document (one at most);
            a document the site can’t find is left out.
          maxItems: 1
        styleOverride:
          type: boolean
          title: Restyle for this placement
          description: >-
            Off: the form renders with the styling saved on the form itself. On:
            the styling below replaces it here only — the form’s fields and
            other placements are unaffected.
          default: false
        formFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/FormRenderWidgetFormFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this form in a different typeface. Leave empty
            to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        formEyebrowEnabled:
          type: boolean
          title: Show eyebrow
          default: true
          description: Show eyebrow.
        formEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: Get in touch
        formEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        formEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        formEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        formEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        formHeading:
          type: string
          title: Heading
          default: Send us a message
          description: Heading.
        formHeadingColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to track the theme text color.
          title: Color (dark theme)
        formHeadingColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Color (light theme)
        formHeadingWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        formHeadingSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Size.
        formIntro:
          type: string
          title: Intro
          description: Optional short sentence under the heading.
          default: Fill out the form below and we’ll get back to you shortly.
        formIntroColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the muted text color.
          title: Color (dark theme)
        formIntroColorLight:
          type:
            - string
            - 'null'
          description: Optional light-theme override. Falls back to the dark-theme color.
          title: Color (light theme)
        formIntroWeight:
          type:
            - string
            - 'null'
          title: Weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Weight.
        formIntroSize:
          type:
            - string
            - 'null'
          title: Size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - xxlarge
            - null
          description: Size.
        formBand:
          type:
            - string
            - 'null'
          title: Band style
          description: >-
            Plain sits on the page; Raised is a contained card; Accent is a
            solid brand-color band.
          default: raised
          enum:
            - plain
            - raised
            - accent
            - null
        formAccentColor:
          type:
            - string
            - 'null'
          description: The accent band color. Leave empty to use the site accent color.
          title: Band color (dark theme)
        formAccentColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Band color (light theme)
        formAlign:
          type:
            - string
            - 'null'
          title: Header alignment
          description: >-
            Alignment of the section header (the form fields stay left-aligned
            for legibility).
          default: center
          enum:
            - center
            - left
            - null
        formWidth:
          type:
            - string
            - 'null'
          title: Content width
          default: normal
          enum:
            - narrow
            - normal
            - wide
            - null
          description: Content width.
        formLabelGap:
          type:
            - string
            - 'null'
          title: Label spacing
          description: Vertical space between each field’s label and its input.
          default: normal
          enum:
            - compact
            - normal
            - roomy
            - spacious
            - null
        formBg:
          type:
            - string
            - 'null'
          title: Section background (dark theme)
          description: >-
            The section’s full-width background band in dark mode. Transparent
            lets the page background show through. The palette options track the
            site colors; choose “Custom color…” for a specific color.
          default: transparent
          enum:
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        formBgCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (dark theme)” is set to Custom color.
          title: Custom background (dark theme)
        formBgLight:
          type:
            - string
            - 'null'
          title: Section background (light theme)
          description: >-
            “Match dark theme” reuses the dark-theme choice; otherwise set the
            light-mode band independently.
          default: inherit
          enum:
            - inherit
            - transparent
            - surface
            - raised
            - sunken
            - hill
            - accent-soft
            - custom
            - null
        formBgLightCustom:
          type:
            - string
            - 'null'
          description: Used when “Section background (light theme)” is set to Custom color.
          title: Custom background (light theme)
        formSubmitLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Submit
        formSubmitVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        formSubmitSize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        formSubmitRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        formSubmitColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-accent'
        formSubmitColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        formSubmitTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-ink'
        formSubmitTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        formSubmitHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        formSubmitHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        formSubmitStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        formSubmitShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        formSubmitShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        formSubmitAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        formSubmitIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        formSubmitIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        formSubmitIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        formSubmitIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `form-render` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    FinalCtaWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - final-cta
          description: 'The widget’s type: always `final-cta`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        ctaAlign:
          type:
            - string
            - 'null'
          title: Content alignment
          default: center
          enum:
            - center
            - left
            - null
          description: Content alignment.
        ctaEyebrowEnabled:
          type: boolean
          title: Show eyebrow / kicker
          default: false
          description: Show eyebrow / kicker.
        ctaEyebrow:
          type: string
          title: Eyebrow
          description: Small label shown above the title.
          default: ''
        ctaEyebrowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the eyebrow + its dash. Leave empty to use the
            secondary (mint) color.
          title: Eyebrow color (dark theme)
        ctaEyebrowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the mint default.
          title: Eyebrow color (light theme)
        ctaEyebrowWeight:
          type:
            - string
            - 'null'
          title: Eyebrow weight
          default: bold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Eyebrow weight.
        ctaEyebrowSize:
          type:
            - string
            - 'null'
          title: Eyebrow size
          default: normal
          enum:
            - small
            - normal
            - large
            - xlarge
            - null
          description: Eyebrow size.
        ctaIconPlacement:
          type:
            - string
            - 'null'
          title: Decorative icon
          description: An optional Font Awesome icon above the headline.
          default: top
          enum:
            - none
            - top
            - null
        ctaIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: rocket
        ctaIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        ctaIconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        ctaIconAnimation:
          type:
            - string
            - 'null'
          title: Icon animation
          default: none
          enum:
            - none
            - fa-beat
            - fa-bounce
            - fa-fade
            - fa-beat-fade
            - fa-flip
            - fa-shake
            - fa-spin
            - null
          description: Icon animation.
        ctaIconSize:
          type:
            - string
            - 'null'
          title: Icon size
          description: Relative to the component’s base icon size.
          default: 3x
          enum:
            - default
            - sm
            - lg
            - xl
            - 2xl
            - 2x
            - 3x
            - 4x
            - 5x
            - null
        ctaIconTilt:
          type:
            - string
            - 'null'
          title: Icon tilt
          description: A slight rotation for a more playful look.
          default: left
          enum:
            - none
            - left
            - right
            - null
        ctaHeadline:
          type: string
          title: Headline
          default: Ready to get started?
          description: Headline.
        ctaHeadlineColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the headline color. Leave empty for the
            on-accent (legible-on-band) default.
          title: Headline color (dark theme)
        ctaHeadlineColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the on-accent default.
          title: Headline color (light theme)
        ctaHeadlineWeight:
          type:
            - string
            - 'null'
          title: Headline weight
          default: extrabold
          enum:
            - normal
            - medium
            - semibold
            - bold
            - extrabold
            - null
          description: Headline weight.
        ctaBody:
          type: string
          title: Supporting copy
          default: >-
            Tell us what you need and we’ll get back to you soon. It only takes
            a minute.
          description: Supporting copy.
        ctaBodyColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Overrides the supporting-copy color. Leave empty for the
            softened on-accent default.
          title: Body color (dark theme)
        ctaBodyColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the softened on-accent default.
          title: Body color (light theme)
        ctaBodyWeight:
          type:
            - string
            - 'null'
          title: Body weight
          default: normal
          enum:
            - normal
            - medium
            - semibold
            - bold
            - null
          description: Body weight.
        ctaBackgroundType:
          type:
            - string
            - 'null'
          title: Background type
          description: >-
            Solid keeps the loud color block; Image places a photo behind the
            text with a readability overlay.
          default: solid
          enum:
            - solid
            - image
            - null
        ctaBackgroundColor:
          type:
            - string
            - 'null'
          description: >-
            The solid band color (and the fallback behind a background image).
            Leave empty to use the site accent color.
          title: Band color (dark theme)
        ctaBackgroundColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color,
            then the accent.
          title: Band color (light theme)
        ctaImage:
          title: Background image
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/ImageArea'
        ctaOverlayColor:
          type:
            - string
            - 'null'
          description: >-
            Scrim over the image to keep the text readable. Leave empty to use
            the accent color.
          title: Overlay color (dark theme)
        ctaOverlayColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme overlay,
            then the accent.
          title: Overlay color (light theme)
        ctaOverlayOpacity:
          type:
            - number
            - 'null'
          title: Overlay opacity (%)
          default: 70
          minimum: 0
          maximum: 100
          x-fetchski-clamped: true
          description: Overlay opacity (%).
        ctaRings:
          type: boolean
          title: Show decorative rings
          description: The two large outlined circles on the band.
          default: true
        ctaRingColor:
          type:
            - string
            - 'null'
          description: >-
            Drawn at a low opacity. Leave empty to use the on-accent (white-ish)
            default.
          title: Ring color
        ctaFontOverrides:
          type: array
          items:
            $ref: '#/components/schemas/FinalCtaWidgetCtaFontOverridesItem'
          title: Font overrides
          description: >-
            Optional. Set part of this section in a different typeface. Leave
            empty to follow the site’s fonts (Site design → Typography).
          default: []
          maxItems: 4
        ctaPrimaryLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Get started
        ctaPrimaryUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: /services
        ctaPrimaryNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        ctaPrimaryVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: solid
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        ctaPrimarySize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        ctaPrimaryRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        ctaPrimaryColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-on-accent'
        ctaPrimaryColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        ctaPrimaryTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-accent'
        ctaPrimaryTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        ctaPrimaryHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        ctaPrimaryHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        ctaPrimaryStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        ctaPrimaryShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        ctaPrimaryShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        ctaPrimaryAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        ctaPrimaryIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: arrow-right
        ctaPrimaryIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        ctaPrimaryIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: after
          enum:
            - before
            - after
            - null
        ctaPrimaryIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        ctaSecondaryLabel:
          type: string
          title: Button label
          description: The visible button text. Leave empty to hide the button.
          default: Contact us
        ctaSecondaryUrl:
          type: string
          title: Button link
          description: Where the button goes — a path (/blog) or full URL.
          default: /contact-us
        ctaSecondaryNewTab:
          type: boolean
          title: Open in new tab
          description: >-
            Opens the link in a new browser tab (adds rel="noopener
            noreferrer").
          default: false
        ctaSecondaryVariant:
          type:
            - string
            - 'null'
          title: Button style
          description: >-
            Solid fills with the color; Outline / Soft / Text link use it for
            the border + text.
          default: outline
          enum:
            - solid
            - outline
            - soft
            - link
            - null
        ctaSecondarySize:
          type:
            - string
            - 'null'
          title: Button size
          default: normal
          enum:
            - small
            - normal
            - large
            - null
          description: Button size.
        ctaSecondaryRadius:
          type:
            - string
            - 'null'
          title: Corner radius
          default: slight
          enum:
            - pill
            - rounded
            - slight
            - square
            - null
          description: Corner radius.
        ctaSecondaryColor:
          type:
            - string
            - 'null'
          description: >-
            Solid fill, or the border + text for the other styles. Defaults to
            the brand accent; CLEAR it for a transparent, outline-only button.
          title: Button color (dark theme)
          default: '--fetchski-on-accent'
        ctaSecondaryColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme color.
            (Brand tokens already flip per theme.)
          title: Button color (light theme)
        ctaSecondaryTextColor:
          type:
            - string
            - 'null'
          description: >-
            The text/icon color. Clear it to derive from the button color
            (readable on solid fills).
          title: Label color (dark theme)
          default: '--fetchski-on-accent'
        ctaSecondaryTextColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme label
            color.
          title: Label color (light theme)
        ctaSecondaryHoverColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. Drives the hover treatment. Leave empty to derive it from
            the button color.
          title: Hover color (dark theme)
        ctaSecondaryHoverColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme hover
            color.
          title: Hover color (light theme)
        ctaSecondaryStyle:
          type:
            - string
            - 'null'
          title: Hover surface
          description: >-
            The hover treatment: a soft shadow, a colored offset shadow, a glow,
            a fill sweep, or a thicker border.
          default: sweep
          enum:
            - none
            - single
            - dual
            - glow
            - sweep
            - thicken
            - null
        ctaSecondaryShadowColor:
          type:
            - string
            - 'null'
          description: >-
            Optional. The offset-shadow or glow color on hover. Leave empty to
            use the site secondary color.
          title: Offset / glow color (dark theme)
        ctaSecondaryShadowColorLight:
          type:
            - string
            - 'null'
          description: >-
            Optional light-theme override. Falls back to the dark-theme shadow
            color.
          title: Offset / glow color (light theme)
        ctaSecondaryAnimation:
          type:
            - string
            - 'null'
          title: Hover motion
          default: lift-scale
          enum:
            - lift
            - scale
            - lift-scale
            - none
            - null
          description: Hover motion.
        ctaSecondaryIcon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        ctaSecondaryIconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        ctaSecondaryIconPosition:
          type:
            - string
            - 'null'
          title: Icon position
          description: Which side of the label the icon sits on (when an icon name is set).
          default: before
          enum:
            - before
            - after
            - null
        ctaSecondaryIconNudge:
          type: boolean
          title: Nudge icon on hover
          description: >-
            The icon slides toward its side on hover (e.g. an arrow edges
            outward).
          default: false
        sectionCss:
          type:
            - object
            - 'null'
          description: >-
            CSS for this one section, typed into the slot of the part it styles.
            It wins over Site design → Custom CSS. Nested rules like &:hover,
            @media (width &gt;= 48rem) and [data-theme="light"] & work inside a
            slot.
          properties:
            slots:
              type: object
              additionalProperties:
                type: string
              description: The CSS typed into each part slot, by slot name.
            css:
              type: string
              description: 'The compiled CSS (read only: rebuilt from `slots`).'
            mark:
              type: string
              description: The site’s check mark for `css` (read only).
          title: Custom CSS
      required:
        - type
      description: >-
        A `final-cta` widget: its `type` and its own fields. A field left out
        takes its default.
      additionalProperties: true
    BlogListWidgetBlogFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/BlogListWidgetBlogFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    PageHeaderWidgetPageHeaderFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/PageHeaderWidgetPageHeaderFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    HeroWidgetHeroFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/HeroWidgetHeroFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    LayoutColumnArea:
      type: object
      description: >-
        Content made of widgets, as the site stores it: send `{ "items": [ … ]
        }`, one object per widget, top to bottom. It takes
        `@apostrophecms/layout-column` widgets; an item of any other type is
        dropped. Writing it replaces the whole area.
      properties:
        metaType:
          type: string
          enum:
            - area
          description: Always `area`.
        _id:
          type: string
          description: 'The area’s id, set by the site: leave it out when you write one.'
        items:
          type: array
          description: >-
            The widgets, top to bottom. Each is an object with its `type` and
            that widget’s own fields; `_id` and `metaType` may be left out (the
            site sets them).
          items:
            $ref: '#/components/schemas/LayoutColumnWidget'
      additionalProperties: true
      example:
        items:
          - type: '@apostrophecms/layout-column'
    IntroWidgetIntroFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/IntroWidgetIntroFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    FeatureWidgetFeatureCardsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        icon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: star
        iconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        iconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        iconAnimation:
          type:
            - string
            - 'null'
          title: Icon animation
          default: none
          enum:
            - none
            - fa-beat
            - fa-bounce
            - fa-fade
            - fa-beat-fade
            - fa-flip
            - fa-shake
            - fa-spin
            - null
          description: Icon animation.
        iconSize:
          type:
            - string
            - 'null'
          title: Icon size
          description: Relative to the component’s base icon size.
          default: default
          enum:
            - default
            - sm
            - lg
            - xl
            - 2xl
            - 2x
            - 3x
            - 4x
            - 5x
            - null
        cardTitle:
          type: string
          title: Title
          default: ''
          description: Title.
        cardText:
          type: string
          title: Text
          default: ''
          description: Text.
      required:
        - cardTitle
      additionalProperties: true
    FeatureWidgetFeatureFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/FeatureWidgetFeatureFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    StatsWidgetStatsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        icon:
          type: string
          title: Icon name
          description: >-
            Optional Font Awesome icon shown above the number (e.g. star, bolt,
            chart-line). Leave empty for no icon.
          default: ''
        iconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        iconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        valuePrefix:
          type: string
          title: Prefix
          description: >-
            Optional, shown before the number (e.g. $, ~, &gt;). Kept out of the
            count-up.
          default: ''
        value:
          type: string
          title: Value
          description: >-
            The number, e.g. 500, 4.9, 12 — symbols go in the prefix/suffix so
            the count-up animates the number alone.
          default: ''
        valueSuffix:
          type: string
          title: Suffix
          description: Optional, shown after the number (e.g. +, %, k, yrs, ★).
          default: ''
        label:
          type: string
          title: Label
          default: ''
          description: Label.
        description:
          type: string
          title: Description
          description: Optional small text under the label.
          default: ''
      required:
        - value
        - label
      additionalProperties: true
    StatsWidgetStatsFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/StatsWidgetStatsFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    LogosWidgetLogosItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        _image:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Logo
          description: >-
            Pick a logo from the Images library. A transparent PNG or an SVG
            works best. The related `@apostrophecms/image` documents, in order
            (empty when none). To set it, send a list of `{ "_id": "…" }`, one
            per document (one at most); a document the site can’t find is left
            out.
          maxItems: 1
        name:
          type: string
          title: Name
          description: >-
            Company / partner / certification name — used as the image alt text
            and the link title.
          default: ''
        linkUrl:
          type: string
          title: Link (optional)
          description: >-
            Make this logo a link, e.g. to the partner’s site. Opens in a new
            tab for external URLs.
          default: ''
        invertDark:
          type: boolean
          title: Invert on dark theme
          description: >-
            For dark / black logos that would vanish on the dark theme — flips
            them to light. Leave off for full-color or white logos.
          default: false
      required:
        - _image
        - name
      additionalProperties: true
    LogosWidgetLogosFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/LogosWidgetLogosFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    StepsWidgetStepsItemsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        icon:
          type: string
          title: Icon name
          description: >-
            Optional Font Awesome icon for this step (e.g. calendar-check,
            circle-check, gear). Shown in the marker when the section marker is
            set to "Icon"; otherwise the step is numbered.
          default: ''
        iconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        iconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        number:
          type: string
          title: Marker label (optional)
          description: >-
            Overrides the auto number for this step’s marker, e.g. "01" or "A".
            Leave empty to auto-count.
          default: ''
        title:
          type: string
          title: Title
          default: ''
          description: Title.
        body:
          type: string
          title: Body
          description: Optional description under the title.
          default: ''
      required:
        - title
      additionalProperties: true
    StepsWidgetStepsFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/StepsWidgetStepsFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    MediaTextWidgetMediaTextBlocksItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        layout:
          type:
            - string
            - 'null'
          title: Layout
          description: >-
            Media left / right place the media beside the text; Stacked puts
            media above the text; Full-bleed runs the media edge-to-edge with
            the text below.
          default: media-left
          enum:
            - media-left
            - media-right
            - stacked
            - full
            - null
        mediaType:
          type:
            - string
            - 'null'
          title: Media
          description: >-
            Pick where the media comes from. “None” makes this a text-only
            block.
          default: image
          enum:
            - image
            - video
            - embed
            - none
            - null
        _image:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Image
          description: >-
            Pick an image from the Images library. The related
            `@apostrophecms/image` documents, in order (empty when none). To set
            it, send a list of `{ "_id": "…" }`, one per document (one at most);
            a document the site can’t find is left out.
          maxItems: 1
        imageAlt:
          type: string
          title: Image alt text (optional)
          description: >-
            Describe the image for screen readers and SEO. Leave empty to use
            the library image’s own alt text. Set to a single space for a purely
            decorative image.
          default: ''
        _video:
          type: array
          items:
            type: object
            additionalProperties: true
          title: Video
          description: >-
            Pick a clip from the Videos library (⌘K → Videos). The related
            `video` documents, in order (empty when none). To set it, send a
            list of `{ "_id": "…" }`, one per document (one at most); a document
            the site can’t find is left out.
          maxItems: 1
        videoAutoplay:
          type: boolean
          title: Auto-play (muted loop)
          description: >-
            Play automatically as a muted, looping background clip (a pause
            button is shown, and reduced-motion visitors get the poster image).
            Off = a normal video with play controls.
          default: false
        embedUrl:
          type: string
          title: Video URL
          description: >-
            Paste a YouTube or Vimeo link, e.g. https://youtu.be/… or
            https://vimeo.com/…
          default: ''
        eyebrow:
          type: string
          title: Eyebrow (optional)
          description: A small label above the block heading.
          default: ''
        heading:
          type: string
          title: Heading (optional)
          description: The block’s headline.
          default: ''
        body:
          type: string
          title: Body (optional)
          description: A paragraph or two. Leave a blank line between paragraphs.
          default: ''
        ctaLabel:
          type: string
          title: Button label (optional)
          description: >-
            This block’s button text. Leave empty (with no link) to hide the
            button.
          default: ''
        ctaUrl:
          type: string
          title: Button link (optional)
          description: Where the button goes — a path (/about-us) or full URL.
          default: ''
        ctaNewTab:
          type: boolean
          title: Open button in new tab
          default: false
          description: Open button in new tab.
      additionalProperties: true
    MediaTextWidgetMediaTextFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/MediaTextWidgetMediaTextFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    DeviceMockWidgetDeviceMockFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/DeviceMockWidgetDeviceMockFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    TeamWidgetTeamFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/TeamWidgetTeamFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    FaqWidgetFaqFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/FaqWidgetFaqFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    ServiceMapWidgetServiceMapZoneOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        zoneName:
          type: string
          title: Zone name (as provided by the data)
          description: Case-insensitive match against the zone name in the map data.
          default: ''
        displayName:
          type: string
          title: Display name
          description: Optional replacement name shown everywhere this zone appears.
          default: ''
        priceLabel:
          type: string
          title: Price label
          description: >-
            Optional replacement for the price text (e.g. “Included”, “Call
            us”). Overrides the zero-price label too.
          default: ''
        hide:
          type: boolean
          title: Hide this zone from the key and cards
          description: >-
            The zone stays on the map and in search results — it just leaves the
            key and cards.
          default: false
      required:
        - zoneName
      additionalProperties: true
    ServiceMapWidgetServiceMapFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/ServiceMapWidgetServiceMapFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    BlogPreviewWidgetBlogFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/BlogPreviewWidgetBlogFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    CookieDeclarationWidgetCookieDeclFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/CookieDeclarationWidgetCookieDeclFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    GoogleReviewsWidgetReviewsFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/GoogleReviewsWidgetReviewsFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    TestimonialsWidgetTestimonialsFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/TestimonialsWidgetTestimonialsFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    InstagramFeedWidgetInstagramFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/InstagramFeedWidgetInstagramFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    GalleryPreviewWidgetGalleryFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/GalleryPreviewWidgetGalleryFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    GalleryFullWidgetGalleryFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/GalleryFullWidgetGalleryFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    PricingWidgetPricingTiersItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        name:
          type: string
          title: Name
          description: Tier / package / service name — e.g. "Starter", "Studio", "Agency".
          default: ''
        icon:
          type: string
          title: Icon name
          description: >-
            Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket
            (no “fa-” prefix). Browse at fontawesome.com/icons.
          default: ''
        iconFamily:
          type:
            - string
            - 'null'
          title: Icon family
          default: classic-regular
          enum:
            - classic-regular
            - duotone-regular
            - brands
            - jelly
            - jelly-duo
            - whiteboard
            - null
          description: Icon family.
        iconColor:
          type:
            - string
            - 'null'
          description: Optional — leave empty to use the design’s own color rhythm.
          title: Icon color
        iconAnimation:
          type:
            - string
            - 'null'
          title: Icon animation
          default: none
          enum:
            - none
            - fa-beat
            - fa-bounce
            - fa-fade
            - fa-beat-fade
            - fa-flip
            - fa-shake
            - fa-spin
            - null
          description: Icon animation.
        iconSize:
          type:
            - string
            - 'null'
          title: Icon size
          description: Relative to the component’s base icon size.
          default: default
          enum:
            - default
            - sm
            - lg
            - xl
            - 2xl
            - 2x
            - 3x
            - 4x
            - 5x
            - null
        iconGap:
          type:
            - string
            - 'null'
          title: Icon spacing
          description: Breathing room below the icon, before the card name.
          default: normal
          enum:
            - none
            - small
            - normal
            - large
            - xlarge
            - null
        badge:
          type: string
          title: Badge (optional)
          description: >-
            A small ribbon on the card, e.g. "Best value", "Limited spots".
            Overrides the default highlight badge for this tier; works on any
            tier, highlighted or not. Empty on a highlighted tier falls back to
            the section’s "Default highlight badge".
          default: ''
        highlighted:
          type: boolean
          title: Highlight this card
          description: >-
            Emphasize this tier — accent border + ring, a subtle lift, and the
            Featured button look.
          default: false
        textAlign:
          type:
            - string
            - 'null'
          title: Text alignment
          description: >-
            How this card’s text lines up. Normal = the section default (a
            centered section keeps the feature list left-aligned, as now).
            Center also centers the feature list; Left / Right align everything
            that way.
          default: normal
          enum:
            - normal
            - left
            - center
            - right
            - null
        price:
          type: string
          title: Price
          description: >-
            Free text, so it fits any model — "$45", "From $200", "Custom",
            "Call for quote".
          default: ''
        period:
          type: string
          title: Period (optional)
          description: >-
            Shown after the price, e.g. "/ month", "per night", "per session".
            Leave empty for a flat price.
          default: ''
        priceNote:
          type: string
          title: Price note (optional)
          description: >-
            A small line under the price, e.g. "per seat", "billed annually", "+
            tax".
          default: ''
        description:
          type: string
          title: Description (optional)
          description: A short blurb under the name.
          default: ''
        features:
          type: array
          items:
            $ref: '#/components/schemas/PricingWidgetPricingTiersItemFeaturesItem'
          title: Features
          description: The bullet list of what’s included.
          default: []
        ctaLabel:
          type: string
          title: Button label (optional)
          description: >-
            This card’s button text. Leave empty to use the shared button label
            (set in the Pricing · Buttons tab); clear it everywhere to hide the
            button.
          default: ''
        ctaUrl:
          type: string
          title: Button link (optional)
          description: >-
            Where the button goes — a path (/contact-us) or full URL. Leave
            empty to inherit the shared button link.
          default: ''
        ctaNewTab:
          type: boolean
          title: Open button in new tab
          default: false
          description: Open button in new tab.
      required:
        - name
      additionalProperties: true
    PricingWidgetPricingFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/PricingWidgetPricingFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    NewsletterWidgetNewsletterFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/NewsletterWidgetNewsletterFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    SmsSignupWidgetSmsSignupFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/SmsSignupWidgetSmsSignupFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    FormRenderWidgetFormFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: >-
              #/components/schemas/FormRenderWidgetFormFontOverridesItemUploadsItem
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    FinalCtaWidgetCtaFontOverridesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        target:
          type:
            - string
            - 'null'
          title: Apply to
          description: >-
            Which text this typeface replaces. Rows apply in order, so a broad
            row (Everything) followed by a narrow one (Headings) gives the
            section a base face plus an exception.
          default: all
          enum:
            - all
            - heading
            - body
            - eyebrow
            - button
            - code
            - null
        source:
          type:
            - string
            - 'null'
          title: Typeface
          description: >-
            Where the typeface comes from. The first option costs nothing extra
            — those faces are already loaded. The others load an additional font
            on pages that use this section.
          default: slot
          enum:
            - slot
            - curated
            - cdn
            - upload
            - null
        slot:
          type:
            - string
            - 'null'
          title: Site typeface
          description: >-
            Set in Site design → Typography. Following the site’s own faces
            keeps a section on-brand and adds no download.
          default: display
          enum:
            - display
            - body
            - accent
            - null
        curated:
          type:
            - string
            - 'null'
          title: Curated pick
          description: >-
            Vetted families from Bunny Fonts and Fontshare, with their available
            weights already verified.
          default: archivo
          enum:
            - archivo
            - bricolage-grotesque
            - clash-display
            - courier-prime
            - dm-mono
            - dm-sans
            - fira-code
            - fraunces
            - general-sans
            - ibm-plex-mono
            - ibm-plex-sans
            - inconsolata
            - inter
            - jetbrains-mono
            - karla
            - lora
            - manrope
            - nunito-sans
            - outfit
            - playfair-display
            - public-sans
            - red-hat-mono
            - satoshi
            - sentient
            - sora
            - source-code-pro
            - source-sans-3
            - source-serif-4
            - space-grotesk
            - space-mono
            - spline-sans-mono
            - supreme
            - switzer
            - syne
            - ubuntu-mono
            - unbounded
            - victor-mono
            - work-sans
            - zodiak
            - null
        cdnProvider:
          type:
            - string
            - 'null'
          title: Provider
          description: >-
            Where to browse for the family. Pick one, then follow the link below
            to find the exact name.
          default: bunny
          enum:
            - bunny
            - fontshare
            - null
        cdnFamily:
          type: string
          title: Family name
          description: >-
            Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or
            "Clash Display". A name the provider doesn’t have loads nothing and
            this row is ignored.
          default: ''
        cdnWeights:
          type: string
          title: Weights
          description: >-
            Comma-separated weights to load, e.g. 400, 700. Empty loads 400,
            500, 700. Weights the family doesn’t ship are skipped by the CDN and
            synthesized by the browser (faux bold) — but a family that ships
            only ONE weight (Acme, for instance) loads nothing at all unless
            that weight is among these, so set it explicitly if the typeface
            doesn’t appear.
          default: ''
        uploads:
          type: array
          items:
            $ref: '#/components/schemas/FinalCtaWidgetCtaFontOverridesItemUploadsItem'
          title: Font files
          description: >-
            One file per weight/style of the SAME typeface. woff2 strongly
            recommended (smallest, universally supported); woff/ttf/otf also
            accepted.
          default: []
          maxItems: 4
        fallback:
          type:
            - string
            - 'null'
          title: Fallback style
          description: >-
            Generic system font shown while this typeface loads (and if it
            fails). Curated picks set this automatically.
          default: sans
          enum:
            - sans
            - serif
            - mono
            - null
      additionalProperties: true
    BlogListWidgetBlogFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    PageHeaderWidgetPageHeaderFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    HeroWidgetHeroFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    LayoutColumnWidget:
      type: object
      properties:
        type:
          type: string
          enum:
            - '@apostrophecms/layout-column'
          description: 'The widget’s type: always `@apostrophecms/layout-column`.'
        _id:
          type: string
          description: >-
            The widget’s id, unique on the page. Leave it out for a new widget
            (the site sets one); keep it to change a widget that is there.
        metaType:
          type: string
          enum:
            - widget
          description: Always `widget`.
        colstart:
          type:
            - integer
            - 'null'
          title: Colstart
          description: Colstart.
        colspan:
          type:
            - integer
            - 'null'
          title: Colspan
          description: Colspan.
        rowstart:
          type:
            - integer
            - 'null'
          title: Rowstart
          default: 1
          description: Rowstart.
        rowspan:
          type:
            - integer
            - 'null'
          title: Rowspan
          default: 1
          description: Rowspan.
        order:
          type:
            - integer
            - 'null'
          title: Order
          description: Order.
        content:
          title: Column content
          description: >-
            Widgets, top to bottom: send `{ "items": [ … ] }`, one object per
            widget with its `type`. Writing it replaces the whole area.
          allOf:
            - $ref: '#/components/schemas/LayoutColumnContentArea'
        showTablet:
          type: boolean
          title: Visible on tablet
          default: true
          description: Visible on tablet.
        showMobile:
          type: boolean
          title: Visible on mobile
          default: true
          description: Visible on mobile.
        justify:
          type:
            - string
            - 'null'
          title: Horizontal alignment
          enum:
            - stretch
            - start
            - end
            - center
            - null
          description: Horizontal alignment.
        align:
          type:
            - string
            - 'null'
          title: Vertical alignment
          enum:
            - stretch
            - start
            - end
            - center
            - null
          description: Vertical alignment.
      required:
        - type
      description: >-
        A `@apostrophecms/layout-column` widget: its `type` and its own fields.
        A field left out takes its default.
      additionalProperties: true
    IntroWidgetIntroFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    FeatureWidgetFeatureFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    StatsWidgetStatsFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    LogosWidgetLogosFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    StepsWidgetStepsFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    MediaTextWidgetMediaTextFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    DeviceMockWidgetDeviceMockFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    TeamWidgetTeamFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    FaqWidgetFaqFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    ServiceMapWidgetServiceMapFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    BlogPreviewWidgetBlogFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    CookieDeclarationWidgetCookieDeclFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    GoogleReviewsWidgetReviewsFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    TestimonialsWidgetTestimonialsFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    InstagramFeedWidgetInstagramFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    GalleryPreviewWidgetGalleryFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    GalleryFullWidgetGalleryFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    PricingWidgetPricingTiersItemFeaturesItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        text:
          type: string
          title: Feature
          default: ''
          description: Feature.
        included:
          type: boolean
          title: Included
          description: >-
            On = a check mark; off = a crossed-out / muted line (e.g. a feature
            this tier lacks).
          default: true
        note:
          type: string
          title: Note (optional)
          description: A small qualifier shown after the feature, e.g. "up to 5", "add-on".
          default: ''
      required:
        - text
      additionalProperties: true
    PricingWidgetPricingFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    NewsletterWidgetNewsletterFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    SmsSignupWidgetSmsSignupFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    FormRenderWidgetFormFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    FinalCtaWidgetCtaFontOverridesItemUploadsItem:
      type: object
      properties:
        _id:
          type: string
          description: The row’s id, unique in its array.
        file:
          type: object
          description: File attachment reference
          title: Font file
        weight:
          type:
            - string
            - 'null'
          title: Weight
          default: '400'
          enum:
            - '100'
            - '200'
            - '300'
            - '400'
            - '500'
            - '600'
            - '700'
            - '800'
            - '900'
            - null
          description: Weight.
        style:
          type:
            - string
            - 'null'
          title: Style
          default: normal
          enum:
            - normal
            - italic
            - null
          description: Style.
      required:
        - file
      additionalProperties: true
    LayoutColumnContentArea:
      type: object
      description: >-
        Content made of widgets, as the site stores it: send `{ "items": [ … ]
        }`, one object per widget, top to bottom. It takes
        `@apostrophecms/rich-text`, `@apostrophecms/image`,
        `@apostrophecms/video`, `intro`, `stats`, `steps`, `pricing`, `faq`,
        `device-mock` widgets; an item of any other type is dropped. Writing it
        replaces the whole area.
      properties:
        metaType:
          type: string
          enum:
            - area
          description: Always `area`.
        _id:
          type: string
          description: 'The area’s id, set by the site: leave it out when you write one.'
        items:
          type: array
          description: >-
            The widgets, top to bottom. Each is an object with its `type` and
            that widget’s own fields; `_id` and `metaType` may be left out (the
            site sets them).
          items:
            $ref: '#/components/schemas/LayoutColumnContentAreaItem'
      additionalProperties: true
      example:
        items:
          - type: '@apostrophecms/rich-text'
            content: <p>Hello from the API.</p>
    LayoutColumnContentAreaItem:
      description: >-
        A widget in an area that takes `@apostrophecms/rich-text`,
        `@apostrophecms/image`, `@apostrophecms/video`, `intro`, `stats`,
        `steps`, `pricing`, `faq`, `device-mock`: the one its `type` names.
      oneOf:
        - $ref: '#/components/schemas/RichTextWidget'
        - $ref: '#/components/schemas/ImageWidget'
        - $ref: '#/components/schemas/VideoWidget'
        - $ref: '#/components/schemas/IntroWidget'
        - $ref: '#/components/schemas/StatsWidget'
        - $ref: '#/components/schemas/StepsWidget'
        - $ref: '#/components/schemas/PricingWidget'
        - $ref: '#/components/schemas/FaqWidget'
        - $ref: '#/components/schemas/DeviceMockWidget'
      discriminator:
        propertyName: type
        mapping:
          '@apostrophecms/rich-text': '#/components/schemas/RichTextWidget'
          '@apostrophecms/image': '#/components/schemas/ImageWidget'
          '@apostrophecms/video': '#/components/schemas/VideoWidget'
          intro: '#/components/schemas/IntroWidget'
          stats: '#/components/schemas/StatsWidget'
          steps: '#/components/schemas/StepsWidget'
          pricing: '#/components/schemas/PricingWidget'
          faq: '#/components/schemas/FaqWidget'
          device-mock: '#/components/schemas/DeviceMockWidget'
  responses:
    BadRequest:
      description: 'The request is not valid: `message` says what to change.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Unauthorized:
      description: The credential is missing or not accepted.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Forbidden:
      description: The caller may not do this.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    NotFound:
      description: Nothing matches, or the caller may not see it.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    InternalServerError:
      description: 'The site failed: `message` is the generic “An error occurred.”'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Paste your API key as the CMS showed it: `fsk_<site>_<key id>_<secret>`
        (issued under API Keys). `ApiKey ` in front of it works too. Leave it
        empty to read as the public.
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        A person’s bearer token, from **Signing in (people)** → `POST
        /@apostrophecms/login/login`. Apps use an API key instead.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.