> ## 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.

# Create a global document

> Update global document site configuration and content (requires editor permissions or higher)

```ts TypeScript wrap theme={"dark"}
import { createSiteClient } from '@fetchski/attract-cms-sdk';

const site = createSiteClient();
const globalContent = await site.globalContent().createGlobal({ cookiePolicyVersion: '1', cookieMessage: 'This website uses cookies to supplement a balanced diet and provide a much deserved reward to the senses after consuming bland but nutritious meals. Accepting our cookies is optional but recommended, as they are delicious.', cookieAcceptLabel: 'Accept all', cookieRejectLabel: 'Reject all', cookiePrefsTitle: 'Cookie preferences' });
```

```json 200 wrap theme={"dark"}
{
  "_id": "global",
  "slug": "global",
  "type": "@apostrophecms/global",
  "cookiePolicyVersion": "1",
  "cookieMessage": "This website uses cookies to supplement a balanced diet and provide a much deserved reward to the senses after consuming bland but nutritious meals. Accepting our cookies is optional but recommended, as they are delicious.",
  "cookieAcceptLabel": "Accept all",
  "cookieRejectLabel": "Reject all",
  "cookiePrefsTitle": "Cookie preferences",
  "createdAt": "2026-10-24T09:30:00.000Z",
  "updatedAt": "2026-10-24T09:30:00.000Z"
}
```

## In your app

A function makes the call on the client it is given, so your code passes the real one and a test passes a fake.

**1. Add the function**

```ts src/attract/create-global.ts theme={"dark"}
import type { SiteClient } from '@fetchski/attract-cms-sdk';

export async function createGlobal(site: SiteClient) {
  return site.globalContent().createGlobal({ cookiePolicyVersion: '1', cookieMessage: 'This website uses cookies to supplement a balanced diet and provide a much deserved reward to the senses after consuming bland but nutritious meals. Accepting our cookies is optional but recommended, as they are delicious.', cookieAcceptLabel: 'Accept all', cookieRejectLabel: 'Reject all', cookiePrefsTitle: 'Cookie preferences' });
}
```

The other values are the example’s: take yours from the request, a form or your database.

**2. Call it**

A script makes the client once and calls the function:

```ts scripts/create-global.ts theme={"dark"}
import { createSiteClient } from '@fetchski/attract-cms-sdk';
import { createGlobal } from '../src/attract/create-global.ts';

const site = createSiteClient();
console.log(await createGlobal(site));
```

```bash Terminal theme={"dark"}
node --env-file=.env scripts/create-global.ts
```

A route handler, a job or a queue worker calls it the same way.

> [accordion] Required parameters
>
> One object, e.g. `createGlobal({ cookiePolicyVersion })`; leave out the optional fields.
>
> **cookiePolicyVersion** `string` *required*
>
> **Required.** Change this — to “2”, a date, anything — and every visitor is asked again. Do that whenever what you do with the data materially changes; consent given under the old terms does not carry over.
>
> **cookieMessage** `string` *required*
>
> **Required.** Banner message.
>
> **cookieAcceptLabel** `string` *required*
>
> **Required.** Accept button.
>
> **cookieRejectLabel** `string` *required*
>
> **Required.** Give this the same visual weight as Accept. A reject option that is harder to find than accept is the single most commonly penalized banner design.
>
> **cookiePrefsTitle** `string` *required*
>
> **Required.** Preferences panel heading.

> [accordion] Optional parameters
>
> **aposMode** `AposMode | null | undefined`
>
> **Optional.** Leave it out and the site uses `"published"`. `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. One of `draft`, `published`.
>
> **aposLocale** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. The locale to read or write, e.g. `en` (default: the site’s default locale).
>
> **copyOfId** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. The `_id` of the piece/page that was copied to create this document (only present if created via `_copyingId`)
>
> **businessName** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Fetchski Attract"`. Business name.
>
> **tagline** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"The website platform for modern businesses"`. Tagline.
>
> **logo** `readonly Readonly\<Record\<string, unknown\>\>[] | null | undefined`
>
> **Optional.** Shown in the site header on the dark theme (and over the hero). Upload to the Images library first. 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. At most 1 items.
>
> **logoLight** `readonly Readonly\<Record\<string, unknown\>\>[] | null | undefined`
>
> **Optional.** Optional darker logo for the light theme. If empty, the white logo is auto-inverted. 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. At most 1 items.
>
> **favicon** `readonly Readonly\<Record\<string, unknown\>\>[] | null | undefined`
>
> **Optional.** Browser tab icon — the default, also used when the browser is in dark mode. Upload a square PNG or SVG (at least 64×64) to the Images library. If empty, the bundled default icon is used. 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. At most 1 items.
>
> **faviconLight** `readonly Readonly\<Record\<string, unknown\>\>[] | null | undefined`
>
> **Optional.** Optional. Used when the visitor’s BROWSER or device is in light mode — this follows the browser’s color scheme, not the site’s own theme toggle. If empty, the main favicon is used everywhere. 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. At most 1 items.
>
> **addressLine1** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Your City, ST"`. Shown in the footer. Use up to three lines for a full street address, or just one for a town/region.
>
> **addressLine2** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Address line 2.
>
> **addressLine3** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Address line 3.
>
> **phone** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"(555) 000-0000"`. Phone.
>
> **email** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"hello@example.com"`. Email.
>
> **legalName** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. The registered name of the company, e.g. “Example Holdings LLC”. Fills \[Business legal name].
>
> **tradeNames** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Any other names the business operates under, e.g. “Example Studio and Example Supply”. Fills \[Trade names].
>
> **legalRegion** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Where the business is based, for governing law. Fills \[State or region].
>
> **legalCountry** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Fills \[Country].
>
> **legalVenue** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Where legal disputes are heard. Fills \[County or venue].
>
> **minimumAge** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. The youngest age your website is intended for, e.g. “13”. Fills \[Minimum age].
>
> **paletteAccent** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Your main brand color — buttons, links, accents. Hover + soft tints are derived automatically. Leave empty for the built-in design color.
>
> **paletteAccentLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteOnAccent** `string | null | undefined`
>
> **Optional.** Text/icon color shown ON primary-colored buttons. Defaults to white — set a dark color if your primary is pale.
>
> **paletteOnAccentLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSecondary** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Supporting color — eyebrows, offset shadows, secondary accents.
>
> **paletteSecondaryLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteTertiary** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Warm accent, used sparingly.
>
> **paletteTertiaryLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteLink** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Body-text link color (rich-text content). Leave empty to track the primary color.
>
> **paletteLinkLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSurface** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. The base page background.
>
> **paletteSurfaceLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteRaised** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Cards and raised panels that sit above the page background.
>
> **paletteRaisedLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSunken** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Recessed / inset bands.
>
> **paletteSunkenLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteInk** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Primary text color. Mind contrast against the page background.
>
> **paletteInkLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteInkMuted** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Secondary / muted text color.
>
> **paletteInkMutedLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteLine** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Borders and dividers.
>
> **paletteLineLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSuccess** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Positive / confirmation state (forms, alerts).
>
> **paletteSuccessLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteWarning** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Caution state.
>
> **paletteWarningLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteDanger** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Error / destructive state.
>
> **paletteDangerLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteInfo** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Informational state.
>
> **paletteInfoLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **fontDisplaySource** `FontDisplaySource | null | undefined`
>
> **Optional.** Leave it out and the site uses `"default"`. Typeface used for headings and display type. Default is the built-in design font; the other sources replace it site-wide. One of `default`, `curated`, `cdn`, `upload`.
>
> **fontDisplayCurated** `FontDisplayCurated | null | undefined`
>
> **Optional.** Leave it out and the site uses `"clash-display"`. Display font — curated pick. One of `clash-display`, `satoshi`, `general-sans`, `space-grotesk`, `bricolage-grotesque`, `archivo`, `sora`, `syne`, `outfit`, `unbounded`, `fraunces`, `playfair-display`, `zodiak`, `sentient`.
>
> **fontDisplayCdnProvider** `FontDisplayCdnProvider | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bunny"`. Where to browse for the family. Pick one, then follow the link below to find the exact name. One of `bunny`, `fontshare`.
>
> **fontDisplayCdnFamily** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or "Clash Display".
>
> **fontDisplayCdnWeights** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Comma-separated weights to load, e.g. 400, 700. Empty loads 500, 700, 800. Weights the family doesn’t ship are skipped by the CDN and synthesized by the browser (faux bold).
>
> **fontDisplayUploads** `readonly GlobalFontDisplayUploadsItem[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. One file per weight/style of the SAME typeface. woff2 strongly recommended (smallest, universally supported); woff/ttf/otf also accepted. At most 8 items.
>
> **GlobalFontDisplayUploadsItem**
>
> **file** `Readonly\<Record\<string, unknown\>\>` *required*
>
> **Required.** File attachment reference.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **weight** `Weight | null`
>
> Weight. One of `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900`.
>
> **style** `Style | null`
>
> Style. One of `normal`, `italic`.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **fontDisplayFallback** `FontDisplayFallback | null | undefined`
>
> **Optional.** Leave it out and the site uses `"sans"`. Generic system fonts shown while the font loads (and if it fails). Curated picks set this automatically. One of `sans`, `serif`, `mono`.
>
> **fontBodySource** `FontBodySource | null | undefined`
>
> **Optional.** Leave it out and the site uses `"default"`. Typeface used for body text and UI. Default is the built-in design font; the other sources replace it site-wide. One of `default`, `curated`, `cdn`, `upload`.
>
> **fontBodyCurated** `FontBodyCurated | null | undefined`
>
> **Optional.** Leave it out and the site uses `"inter"`. Body font — curated pick. One of `inter`, `manrope`, `public-sans`, `work-sans`, `nunito-sans`, `ibm-plex-sans`, `source-sans-3`, `dm-sans`, `karla`, `switzer`, `supreme`, `satoshi`, `general-sans`, `lora`, `source-serif-4`.
>
> **fontBodyCdnProvider** `FontBodyCdnProvider | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bunny"`. Where to browse for the family. Pick one, then follow the link below to find the exact name. One of `bunny`, `fontshare`.
>
> **fontBodyCdnFamily** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or "Clash Display".
>
> **fontBodyCdnWeights** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Comma-separated weights to load, e.g. 400, 700. Empty loads 400, 500, 600, 700. Weights the family doesn’t ship are skipped by the CDN and synthesized by the browser (faux bold).
>
> **fontBodyUploads** `readonly GlobalFontBodyUploadsItem[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. One file per weight/style of the SAME typeface. woff2 strongly recommended (smallest, universally supported); woff/ttf/otf also accepted. At most 8 items.
>
> **GlobalFontBodyUploadsItem**
>
> **file** `Readonly\<Record\<string, unknown\>\>` *required*
>
> **Required.** File attachment reference.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **weight** `Weight | null`
>
> Weight. One of `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900`.
>
> **style** `Style | null`
>
> Style. One of `normal`, `italic`.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **fontBodyFallback** `FontBodyFallback | null | undefined`
>
> **Optional.** Leave it out and the site uses `"sans"`. Generic system fonts shown while the font loads (and if it fails). Curated picks set this automatically. One of `sans`, `serif`, `mono`.
>
> **fontAccentSource** `FontAccentSource | null | undefined`
>
> **Optional.** Leave it out and the site uses `"default"`. Typeface used for code blocks and monospace accents. Default is the built-in design font; the other sources replace it site-wide. One of `default`, `curated`, `cdn`, `upload`.
>
> **fontAccentCurated** `FontAccentCurated | null | undefined`
>
> **Optional.** Leave it out and the site uses `"jetbrains-mono"`. Accent / mono font — curated pick. One of `jetbrains-mono`, `ibm-plex-mono`, `fira-code`, `space-mono`, `source-code-pro`, `dm-mono`, `inconsolata`, `ubuntu-mono`, `courier-prime`, `red-hat-mono`, `spline-sans-mono`, `victor-mono`.
>
> **fontAccentCdnProvider** `FontAccentCdnProvider | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bunny"`. Where to browse for the family. Pick one, then follow the link below to find the exact name. One of `bunny`, `fontshare`.
>
> **fontAccentCdnFamily** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or "Clash Display".
>
> **fontAccentCdnWeights** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Comma-separated weights to load, e.g. 400, 700. Empty loads 400, 700. Weights the family doesn’t ship are skipped by the CDN and synthesized by the browser (faux bold).
>
> **fontAccentUploads** `readonly GlobalFontAccentUploadsItem[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. One file per weight/style of the SAME typeface. woff2 strongly recommended (smallest, universally supported); woff/ttf/otf also accepted. At most 8 items.
>
> **GlobalFontAccentUploadsItem**
>
> **file** `Readonly\<Record\<string, unknown\>\>` *required*
>
> **Required.** File attachment reference.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **weight** `Weight | null`
>
> Weight. One of `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900`.
>
> **style** `Style | null`
>
> Style. One of `normal`, `italic`.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **fontAccentFallback** `FontAccentFallback | null | undefined`
>
> **Optional.** Leave it out and the site uses `"mono"`. Generic system fonts shown while the font loads (and if it fails). Curated picks set this automatically. One of `sans`, `serif`, `mono`.
>
> **contentWidth** `ContentWidth | null | undefined`
>
> **Optional.** Leave it out and the site uses `"wide"`. The widest the page content gets: sections, layouts, the header and the footer all line up to it. Smaller screens always use their full width, minus the side margins. One of `standard`, `wide`, `xwide`.
>
> **socialLinks** `readonly GlobalSocialLinksItem[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Each profile is optional — add only the networks you use. A link only appears once it has a URL. Pick a platform for its brand icon, or “Other / custom” to choose any icon.
>
> **GlobalSocialLinksItem**
>
> **platform** `Platform` *required*
>
> **Required.** Platform. One of `instagram`, `facebook`, `x-twitter`, `youtube`, `tiktok`, `linkedin`, `github`, `pinterest`, `whatsapp`, `snapchat`, `threads`, `bluesky`, `mastodon`, `yelp`, `google`, `spotify`, `vimeo`, `custom`.
>
> **url** `string` *required*
>
> **Required.** Full link to the profile, e.g. [https://instagram.com/yourbusiness](https://instagram.com/yourbusiness). Format: an absolute URL.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **label** `string`
>
> Overrides the screen-reader / tooltip label. Recommended for a custom platform — defaults to the icon name (e.g. “discord” → “Discord”).
>
> **icon** `string`
>
> Font Awesome icon name (no “fa-” prefix), e.g. discord. Browse fontawesome.com/icons.
>
> **iconFamily** `IconFamily | null`
>
> Custom icon family. One of `classic-regular`, `duotone-regular`, `brands`, `jelly`, `jelly-duo`, `whiteboard`.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **seoImage** `ImageArea | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Site-wide fallback for link previews (Open Graph): used on any page that has neither its own Social share image nor a featured image. Recommended 1200×630. Widgets, top to bottom: send `{ "items": [ … ] }`, one object per widget with its `type`. Writing it replaces the whole area.
>
> **ImageArea**
>
> Widgets, top to bottom: send `{ "items": [ … ] }`, one object per widget with its `type`. Writing it replaces the whole area.
>
> **metaType** `AfterContentAreaMetaType`
>
> Always `area`. One of `area`.
>
> **id** `string`
>
> The area’s id, set by the site: leave it out when you write one.
>
> **items** `readonly ImageWidget[]`
>
> A list of `ImageWidget`. 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). At most 1 items.
>
> **ImageWidget**
>
> A `@apostrophecms/image` widget: its `type` and its own fields. A field left out takes its default.
>
> **type** `ImageWidgetType` *required*
>
> **Required.** The widget’s type: always `@apostrophecms/image`. One of `@apostrophecms/image`.
>
> **id** `string`
>
> 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** `MetaType`
>
> Always `widget`. One of `widget`.
>
> **image** `readonly Readonly\<Record\<string, unknown\>\>[]`
>
> 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. At most 1 items.
>
> **caption** `string`
>
> Caption.
>
> **linkTo** `LinkTo | null`
>
> Link To... One of `none`, `@apostrophecms/any-page-type`, `_url`.
>
> **apostrophecmsAnyPageType** `readonly Readonly\<Record\<string, unknown\>\>[]`
>
> 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. At most 1 items.
>
> **linkHref** `string | null`
>
> apostrophe:linkHrefHelp When set, a URL; empty or null when not.
>
> **linkHrefTitle** `string`
>
> Link Title.
>
> **linkTitle** `string`
>
> If empty, the title of the related document will be used.
>
> **linkTarget** `readonly LinkTarget[] | null`
>
> Link Target. Each one of `_blank`.
>
> **sectionCss** `CustomCSS | null`
>
> A `CustomCSS`. 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 >= 48rem) and \[data-theme="light"] & work inside a slot.
>
> **CustomCSS**
>
> **slots** `Readonly\<Record\<string, string\>\>`
>
> The CSS typed into each part slot, by slot name.
>
> **css** `string`
>
> The compiled CSS (read only: rebuilt from `slots`).
>
> **mark** `string`
>
> The site’s check mark for `css` (read only).
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **seoStructuredData** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. Adds schema.org structured data about the business to every page, built from the Brand tab’s business name, address, phone and email plus the Social Links list. Helps search engines show rich results. Nothing is published until this is on and a business name is set.
>
> **seoStructuredDataType** `SeoStructuredDataType | null | undefined`
>
> **Optional.** Leave it out and the site uses `"LocalBusiness"`. The schema.org type that best describes the business. “Local business” fits most sites with a physical location or service area. One of `LocalBusiness`, `Organization`, `ProfessionalService`, `Store`.
>
> **seoServiceAreas** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Adds the Service Area Map’s coverage (place names, service radius) to the business structured data on every page, and the full zip-code/boundary detail on pages with a Service Area Map section. Helps search engines and AI answers understand where the business serves — there is no visual search result for this, and it never affects map-pack ranking. Keep it consistent with the areas on the business’s Google Business Profile. Demo map data is never published.
>
> **seoServiceType** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Optional, plain words — e.g. “House cleaning” or “Airport transfers”. When set, the structured data pairs it with the service areas as a schema.org Service; when empty the areas attach directly to the business.
>
> **analyticsProvider** `AnalyticsProvider | null | undefined`
>
> **Optional.** Leave it out and the site uses `"none"`. Plausible is a privacy-friendly, cookieless analytics service. Visitor page views are counted anonymously; logged-in editors are never tracked. One of `none`, `plausible`.
>
> **plausibleScriptUrl** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Paste the script address from your site's snippet in Plausible → Site Settings → Site Installation (it looks like [https://plausible.io/js/pa-XXXXXXXX.js](https://plausible.io/js/pa-XXXXXXXX.js) and is unique per site). Analytics stay off until this is set. Optional measurements (outbound links, file downloads, form submissions) are toggled in the Plausible dashboard — no change needed here. When set, a URL; empty or null when not.
>
> **cookieBannerEnabled** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Off hides the banner AND stops every non-essential cookie and third-party embed — declining is the only safe reading of "never asked". Turn it off only on a site that sets nothing beyond the strictly necessary.
>
> **cookieEnforcement** `CookieEnforcement | null | undefined`
>
> **Optional.** Leave it out and the site uses `"eu"`. Where opt-in applies, nothing non-essential runs until the visitor agrees. Everyone else sees the same banner as a notice: analytics and embedded content work immediately, and declining switches them off. The first option follows the law that is strictest about being asked first, without putting a wall in front of visitors whose law does not require one. One of `eu`, `all`, `notice`.
>
> **cookieUnknownRegion** `CookieUnknownRegion | null | undefined`
>
> **Optional.** Leave it out and the site uses `"lenient"`. Country comes from your CDN or proxy (Cloudflare’s header, or one you configure). Without it the site falls back to this, plus a browser time-zone check that quietly upgrades an apparently European visitor to opt-in. Put Cloudflare or a GeoIP header in front of the site and this setting stops mattering. One of `lenient`, `strict`.
>
> **cookieLayout** `CookieLayout | null | undefined`
>
> **Optional.** Leave it out and the site uses `"left"`. Banner position. One of `left`, `right`, `center`, `full`.
>
> **cookieShowCustomize** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Opens the per-category preferences panel. Leaving it on is the safer choice: accept-or-reject with no middle option is what regulators have been fining sites over.
>
> **cookieShowLauncher** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. A small button pinned to the bottom corner, over the page. Off by default because the footer link below already offers this — turn it on if you want the control visible without scrolling.
>
> **cookieShowFooterLink** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Puts the reopen control at the bottom of every page, under the “Powered by” line — where visitors look for it. Uses the reopen label from the Cookie banner wording tab. Leave this on unless the floating button above is on instead: consent must stay as easy to withdraw as it was to give.
>
> **cookieRespectGpc** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. GPC is a browser-level "do not sell or share my data" signal, legally binding in several US states. When on, a visitor sending it starts with everything non-essential switched off — they can still turn categories on by hand.
>
> **cookieReloadOnWithdraw** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. A third-party script that has already run cannot be switched off in place: it keeps running until the next full page load (each vendor is still told about the withdrawal straight away). On, the page reloads as soon as a visitor switches a category OFF, so nothing they declined keeps running. Off by default: the reload interrupts whatever the visitor was doing, and most visitors are not in a region that requires it.
>
> **cookieLifetimeDays** `number | null | undefined`
>
> **Optional.** Leave it out and the site uses `180`. How long a visitor’s answer stands before the banner returns. Six months is the common practice and twelve is the usual ceiling. 1 to 365.
>
> **cookieConsentLogRecords** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Stores a receipt for each decision (which categories, when, under which policy version) so you can show consent was given. Kept for two years, then deleted automatically.
>
> **cookieTitle** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Optional. Leave empty for the message alone, which is how most banners read best.
>
> **cookiePolicyLinkText** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"See our cookie policy."`. Rendered after the message as a link to the policy page. Leave empty to omit it.
>
> **cookiePolicyUrl** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"/cookie-policy"`. A path on this site or a full URL. The default matches the parked Cookie Policy page.
>
> **cookieCustomizeLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Customize"`. Customize button.
>
> **cookieSaveLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Save my choices"`. Save-choices button.
>
> **cookieLauncherLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Cookie preferences"`. Reopen control label.
>
> **cookiePrefsIntro** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Choose which cookies we may use. You can change your mind at any time — nothing here is permanent."`. Preferences panel intro.
>
> **cookieCatNecessaryLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Strictly necessary"`. Strictly necessary — label.
>
> **cookieCatNecessaryDescription** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Required for the site to work — security, load balancing, remembering your cookie choices. These are never used to track you and cannot be switched off."`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieCatFunctionalLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Functional"`. Functional — label.
>
> **cookieCatFunctionalDescription** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Remember your preferences and power embedded features such as maps, media and social content. Turning these off may leave parts of a page unavailable."`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieCatAnalyticsLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Analytics"`. Analytics — label.
>
> **cookieCatAnalyticsDescription** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Help us understand which pages are visited and how people move through the site, so we can improve it. Aggregate only — never used to identify you personally."`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieCatMarketingLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Marketing"`. Marketing — label.
>
> **cookieCatMarketingDescription** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Measure whether an advertisement or campaign brought you here, and let us tailor what we show you. These are the cookies most people mean by \"tracking\"."`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieBlockedTitle** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Content not loaded"`. Shown in place of an embed (a map, a social video) that is waiting on consent.
>
> **cookieBlockedBody** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"This content is served by another company, which would receive your IP address and browser details. It loads once you accept functional cookies — or just for this one item, if you press the button."`. Blocked-content message.
>
> **cookieBlockedButton** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Load this content"`. Blocked-content button.
>
> **maintenanceMode** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Takes the public site offline. Visitors and search engines see a “be right back” page (served with the correct temporary-outage signals, so search rankings are preserved); logged-in editors keep the full site and can continue editing. A new site starts with this on: turn it off when the site is ready to go live.
>
> **maintenanceRetryAfter** `MaintenanceRetryAfter | null | undefined`
>
> **Optional.** Leave it out and the site uses `"3600"`. How long search engines should wait before checking back (the Retry-After hint). A rough estimate is fine — it is a hint, not a promise, and nothing switches back automatically. One of `3600`, `14400`, `43200`, `86400`, `259200`, `604800`.
>
> **maintenanceMessage** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Optional short message shown on the maintenance page (e.g. what is happening or when you expect to be back). Leave empty for a generic “we’ll be back soon” line.
>
> **animationsEnabled** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Master switch for the site’s scroll and entrance motion (section reveals, count-ups, marquees, the hero). When off, no animation code is loaded and every section appears in its final, static state. Visitors whose device requests reduced motion always get the static experience regardless of this setting.
>
> **designCss** `DesignLayer | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Site-wide CSS for every section of a type and for shared elements (buttons, the header, the footer…). Type into the slot of the part you want to style; a section’s own CSS tab wins over this.
>
> **DesignLayer**
>
> **slots** `Readonly\<Record\<string, string\>\>`
>
> The CSS typed into each part slot, by slot name.
>
> **css** `string`
>
> The compiled CSS (read only: rebuilt from `slots`).
>
> **mark** `string`
>
> The site’s check mark for `css` (read only).
>
> **headerStyle** `HeaderStyle | null | undefined`
>
> **Optional.** Leave it out and the site uses `"floating"`. Floating rests transparent over the hero and morphs to glass on scroll; Glass is frosted from the top; Solid is an opaque bar (uses the bar background color). One of `floating`, `glass`, `solid`.
>
> **headerWidth** `HeaderWidth | null | undefined`
>
> **Optional.** Leave it out and the site uses `"island"`. Island floats as a contained pill; Full width spans edge-to-edge (squared corners, content still centered). Full width ignores the corner radius below. One of `island`, `full`.
>
> **headerBarRadius** `HeaderBarRadius | null | undefined`
>
> **Optional.** Leave it out and the site uses `"rounded"`. Applies to the Island bar (Full width is always squared). One of `pill`, `rounded`, `slight`, `square`.
>
> **headerBackgroundColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. The bar fill for Glass / Solid styles (and the glass tint when scrolled). Leave empty to use the raised surface color.
>
> **headerBackgroundColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerBorder** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. A hairline outline around the bar (shown when glass / solid / scrolled).
>
> **headerShadow** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. A soft drop shadow under the bar (when glass / solid / scrolled).
>
> **headerHideOnScroll** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. The bar slides away when scrolling down and returns when scrolling up.
>
> **headerGlassOnScroll** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. The floating bar stays transparent at the top and becomes a glass pill once the page scrolls. Turn off to keep it transparent.
>
> **headerDarkBothThemes** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. Keeps the whole navbar (bar, logo, wordmark, links, dropdown, button and mobile menu) in its dark-theme look even when a visitor switches to the light theme, e.g. a header that always sits over a dark hero photo. While on, the light-theme header colors and the light-theme logo are not used. Off follows the site theme.
>
> **headerNavBreakpoint** `HeaderNavBreakpoint | null | undefined`
>
> **Optional.** Leave it out and the site uses `"lg"`. Below this width the links collapse into the mobile menu (hamburger). Raise it if you have many or long links. One of `md`, `lg`, `xl`.
>
> **headerLogoHeight** `HeaderLogoHeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"medium"`. Logo height. One of `small`, `medium`, `large`.
>
> **headerLogoHover** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. A subtle tilt + scale when the cursor is over the logo lockup.
>
> **headerShowWordmark** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. The business name in type beside the logo. Turn off when the logo already includes the name.
>
> **headerWordmarkText** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Optional override of the text wordmark. Leave empty to use the business name.
>
> **headerWordmarkSplit** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Render the first word large and the rest as a small tracked-out caption beneath it. Off renders the whole wordmark on one line.
>
> **headerNameColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNameColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNameWeight** `HeaderNameWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"extrabold"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **headerNameSize** `HeaderNameSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Size. One of `small`, `normal`, `large`.
>
> **headerSublineColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerSublineColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerSublineWeight** `HeaderSublineWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bold"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **headerNav** `readonly GlobalHeaderNavItem[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Header navigation.
>
> **GlobalHeaderNavItem**
>
> **label** `string` *required*
>
> **Required.** Label.
>
> **url** `string` *required*
>
> **Required.** URL.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **placement** `Placement | null`
>
> Desktop only — every link is listed in the mobile menu. One of `visible`, `more`.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **headerMoreLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"More"`. Label for the overflow dropdown that holds links placed in “More”.
>
> **headerNavLinkColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNavLinkColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNavLinkWeight** `HeaderNavLinkWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"extrabold"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **headerNavLinkSize** `HeaderNavLinkSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Size. One of `small`, `normal`, `large`.
>
> **headerNavIndicator** `HeaderNavIndicator | null | undefined`
>
> **Optional.** Leave it out and the site uses `"sweep"`. How the hovered / active link is marked. One of `sweep`, `grow`, `pill`, `none`.
>
> **headerNavHoverColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Leave empty to use the site accent color.
>
> **headerNavHoverColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNavActiveColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Color + indicator for the current page’s link. Leave empty to use the secondary (mint) color.
>
> **headerNavActiveColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaLabel** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"Member Portal"`. The visible button text. Leave empty to hide the button.
>
> **headerCtaUrl** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"https://fetchski.com"`. Where the button goes — a path (/blog) or full URL.
>
> **headerCtaNewTab** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. Opens the link in a new browser tab (adds rel="noopener noreferrer").
>
> **headerCtaVariant** `HeaderCtaVariant | null | undefined`
>
> **Optional.** Leave it out and the site uses `"solid"`. Solid fills with the color; Outline / Soft / Text link use it for the border + text. One of `solid`, `outline`, `soft`, `link`.
>
> **headerCtaSize** `HeaderCtaSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Button size. One of `small`, `normal`, `large`.
>
> **headerCtaRadius** `HeaderCtaRadius | null | undefined`
>
> **Optional.** Leave it out and the site uses `"slight"`. Corner radius. One of `pill`, `rounded`, `slight`, `square`.
>
> **headerCtaColor** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"--fetchski-accent"`. Solid fill, or the border + text for the other styles. Defaults to the brand accent; CLEAR it for a transparent, outline-only button.
>
> **headerCtaColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaTextColor** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"--fetchski-ink"`. The text/icon color. Clear it to derive from the button color (readable on solid fills).
>
> **headerCtaTextColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaHoverColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Drives the hover treatment. Leave empty to derive it from the button color.
>
> **headerCtaHoverColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaStyle** `HeaderCtaStyle | null | undefined`
>
> **Optional.** Leave it out and the site uses `"sweep"`. The hover treatment: a soft shadow, a colored offset shadow, a glow, a fill sweep, or a thicker border. One of `none`, `single`, `dual`, `glow`, `sweep`, `thicken`.
>
> **headerCtaShadowColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. The offset-shadow or glow color on hover. Leave empty to use the site secondary color.
>
> **headerCtaShadowColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaAnimation** `HeaderCtaAnimation | null | undefined`
>
> **Optional.** Leave it out and the site uses `"lift-scale"`. Hover motion. One of `lift`, `scale`, `lift-scale`, `none`.
>
> **headerCtaIcon** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket (no “fa-” prefix). Browse at fontawesome.com/icons.
>
> **headerCtaIconFamily** `HeaderCtaIconFamily | null | undefined`
>
> **Optional.** Leave it out and the site uses `"classic-regular"`. Icon family. One of `classic-regular`, `duotone-regular`, `brands`, `jelly`, `jelly-duo`, `whiteboard`.
>
> **headerCtaIconPosition** `HeaderCtaIconPosition | null | undefined`
>
> **Optional.** Leave it out and the site uses `"before"`. Which side of the label the icon sits on (when an icon name is set). One of `before`, `after`.
>
> **headerCtaIconNudge** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. The icon slides toward its side on hover (e.g. an arrow edges outward).
>
> **headerMobileSide** `HeaderMobileSide | null | undefined`
>
> **Optional.** Leave it out and the site uses `"right"`. Drawer side. One of `right`, `left`.
>
> **headerMobileWidth** `HeaderMobileWidth | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Drawer width. One of `narrow`, `normal`, `wide`.
>
> **headerMobileBackgroundColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Leave empty to use the site surface color.
>
> **headerMobileBackgroundColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerMobileShowLogo** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Show logo in drawer.
>
> **headerMobileShowCta** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Repeat the header button at the bottom of the mobile drawer.
>
> **headerMobileShowScrollCue** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. A small animated hint shown when the menu links overflow.
>
> **headerMobileLinkColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerMobileLinkColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerMobileLinkWeight** `HeaderMobileLinkWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bold"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **headerMobileLinkSize** `HeaderMobileLinkSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Size. One of `small`, `normal`, `large`.
>
> **headerMobileLinkHoverColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Leave empty to use the site accent color.
>
> **headerMobileLinkHoverColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerBackgroundType** `FooterBackgroundType | null | undefined`
>
> **Optional.** Leave it out and the site uses `"default"`. Site default keeps the footer’s sunken surface; Solid color and Image override it. The site surface color is the fallback when a color is left empty. One of `default`, `solid`, `image`.
>
> **footerBackgroundColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Used for a Solid background (and as the fallback behind an Image). Leave empty to use the site surface color.
>
> **footerBackgroundColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerImage** `ImageArea | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Widgets, top to bottom: send `{ "items": [ … ] }`, one object per widget with its `type`. Writing it replaces the whole area.
>
> **footerOverlayColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Scrim over the image to keep the footer legible. Leave empty to use the surface color.
>
> **footerOverlayColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerOverlayOpacity** `number | null | undefined`
>
> **Optional.** Leave it out and the site uses `85`. Overlay opacity (%). 0 to 100.
>
> **footerPadding** `FooterPadding | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Vertical padding. One of `tight`, `normal`, `roomy`.
>
> **footerTopBorder** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. A hairline rule along the top edge of the footer.
>
> **footerBackToTop** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Show “Back to top” button.
>
> **footerLogo** `readonly Readonly\<Record\<string, unknown\>\>[] | null | undefined`
>
> **Optional.** Optional logo shown at the top of the company column, used on the dark theme. Leave both footer logos empty to use the site logo (Site settings → Brand); with no logo at all the business name leads. Upload to the Images library first. 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. At most 1 items.
>
> **footerLogoLight** `readonly Readonly\<Record\<string, unknown\>\>[] | null | undefined`
>
> **Optional.** Optional darker logo for the light theme. If empty, the white logo is auto-inverted. 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. At most 1 items.
>
> **footerLogoHeight** `FooterLogoHeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"medium"`. Logo height. One of `small`, `medium`, `large`.
>
> **footerLogoAlign** `FooterLogoAlign | null | undefined`
>
> **Optional.** Leave it out and the site uses `"left"`. Aligns the logo within the company column (e.g. centered above the business name). One of `left`, `center`, `right`.
>
> **footerShowName** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. The business name as a heading at the top of the column. Turn off when the logo already carries the name.
>
> **footerShowTagline** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Show tagline.
>
> **footerShowContact** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Show address, phone & email.
>
> **footerNameColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerNameColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerNameWeight** `FooterNameWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bold"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **footerNameSize** `FooterNameSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Size. One of `small`, `normal`, `large`.
>
> **footerBrandColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerBrandColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerBrandWeight** `FooterBrandWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **footerBrandSize** `FooterBrandSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Size. One of `small`, `normal`, `large`.
>
> **footerLinkGroups** `readonly GlobalFooterLinkGroupsItem[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Each group becomes a column in the footer. Add a Legal group for Terms & Privacy, etc.
>
> **GlobalFooterLinkGroupsItem**
>
> **heading** `string` *required*
>
> **Required.** Group heading.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **links** `readonly GlobalFooterLinkGroupsItemLinksItem[]`
>
> A list of `GlobalFooterLinkGroupsItemLinksItem`. Links.
>
> **GlobalFooterLinkGroupsItemLinksItem**
>
> **label** `string` *required*
>
> **Required.** Label.
>
> **url** `string` *required*
>
> **Required.** URL.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **external** `boolean`
>
> Opens in a new tab with an arrow indicator.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **footerLinkColumns** `FooterLinkColumns | null | undefined`
>
> **Optional.** Leave it out and the site uses `"2"`. How many columns the link groups flow into. Auto fits to the available width; a fixed count packs shorter groups together (e.g. Legal stacked under Elsewhere). Groups are never split across columns. One of `auto`, `2`, `3`, `4`.
>
> **footerHeadingColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerHeadingColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerHeadingWeight** `FooterHeadingWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bold"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **footerHeadingSize** `FooterHeadingSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Size. One of `small`, `normal`, `large`, `xlarge`.
>
> **footerLinkColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerLinkColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerLinkWeight** `FooterLinkWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **footerLinkSize** `FooterLinkSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Size. One of `small`, `normal`, `large`.
>
> **footerLinkHoverColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Leave empty to use the site accent color.
>
> **footerLinkHoverColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerLinkHoverEffect** `FooterLinkHoverEffect | null | undefined`
>
> **Optional.** Leave it out and the site uses `"slide"`. Hover effect. One of `none`, `slide`, `underline`.
>
> **footerMarqueeEnabled** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. A slow ribbon of phrases scrolling across the top of the footer. Any page can override this for itself in Page Settings → Footer.
>
> **footerMarquee** `readonly GlobalFooterMarqueeItem[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Each phrase can carry its own icon; without one, a dot separates it from the next phrase.
>
> **GlobalFooterMarqueeItem**
>
> **phrase** `string` *required*
>
> **Required.** Phrase.
>
> **id** `string`
>
> The row’s id, unique in its array.
>
> **icon** `string`
>
> Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket (no “fa-” prefix). Browse at fontawesome.com/icons.
>
> **iconFamily** `IconFamily | null`
>
> Icon family. One of `classic-regular`, `duotone-regular`, `brands`, `jelly`, `jelly-duo`, `whiteboard`.
>
> **iconColor** `string | null`
>
> Optional — leave empty to use the design’s own color rhythm.
>
> **iconAnimation** `IconAnimation | null`
>
> Icon animation. One of `none`, `fa-beat`, `fa-bounce`, `fa-fade`, `fa-beat-fade`, `fa-flip`, `fa-shake`, `fa-spin`.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> Optional: any keys not listed above, by their wire names; they are sent with the rest.
>
> **footerMarqueeSpeed** `FooterMarqueeSpeed | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Marquee speed. One of `slow`, `normal`, `fast`.
>
> **footerMarqueeMotionPause** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. 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.
>
> **footerMarqueeColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Leave empty for the muted default.
>
> **footerMarqueeColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerMarqueeWeight** `FooterMarqueeWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"bold"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **footerWordmarkEnabled** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. A giant outlined word along the bottom of the footer. Reveals/fills on hover.
>
> **footerWordmark** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Keep it to one short word — it renders at display size. Leave empty to use the business name.
>
> **footerWordmarkSize** `FooterWordmarkSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"display"`. Watermark size. One of `display`, `large`, `medium`.
>
> **footerWordmarkAlign** `FooterWordmarkAlign | null | undefined`
>
> **Optional.** Leave it out and the site uses `"left"`. Watermark alignment. One of `left`, `center`, `right`.
>
> **footerWordmarkFill** `FooterWordmarkFill | null | undefined`
>
> **Optional.** Leave it out and the site uses `"letter"`. Outlined letters that fill on hover one at a time, all at once, or always-solid (no ghost effect). One of `letter`, `word`, `solid`.
>
> **footerWordmarkColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Overrides the wordmark fill + outline tint. Leave empty to track the theme’s text color.
>
> **footerWordmarkColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerCopyrightText** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `"© {year} {business}. All rights reserved."`. Type \{year} where this year goes (it updates itself every January) and \{business} for the business name. Left empty, the site shows “© \{year} \{business}. All rights reserved.”
>
> **footerNote** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Optional short line shown beside the copyright (e.g. a slogan or license number).
>
> **footerCopyrightColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerCopyrightColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerCopyrightWeight** `FooterCopyrightWeight | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`.
>
> **footerCopyrightSize** `FooterCopyrightSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"small"`. Size. One of `small`, `normal`, `large`.
>
> **footerShowSocial** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `true`. Render the site’s social profiles (configured in the “Social Links” tab) in the footer.
>
> **footerSocialHeading** `string | null | undefined`
>
> **Optional.** Leave it out and the site uses `""`. Optional small heading above the icons (e.g. “Follow us”). Leave empty for none.
>
> **footerSocialPlacement** `FooterSocialPlacement | null | undefined`
>
> **Optional.** Leave it out and the site uses `"brand"`. In the company column (under the contact details) or as its own centered row above the copyright bar. One of `brand`, `bar`.
>
> **footerSocialBarBorder** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. A hairline rule above the dedicated social row, for a touch of separation from the watermark.
>
> **footerSocialVariant** `FooterSocialVariant | null | undefined`
>
> **Optional.** Leave it out and the site uses `"outline"`. Icon style. One of `bare`, `outline`, `solid`.
>
> **footerSocialSize** `FooterSocialSize | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Icon size. One of `small`, `normal`, `large`, `xlarge`.
>
> **footerSocialSpacing** `FooterSocialSpacing | null | undefined`
>
> **Optional.** Leave it out and the site uses `"normal"`. Gap between the icons. One of `tight`, `normal`, `loose`.
>
> **footerSocialHeadingColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Optional. Leave empty to match the footer’s other group headings (Footer: Links tab).
>
> **footerSocialHeadingColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerSocialColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Resting icon color. Leave empty for the muted default.
>
> **footerSocialColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerSocialHover** `FooterSocialHover | null | undefined`
>
> **Optional.** Leave it out and the site uses `"brand"`. Hover to each platform’s own brand color, or to the site accent (or a chosen hover color). One of `brand`, `accent`.
>
> **footerSocialHoverColor** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Used when “Hover color” is Accent / custom. Leave empty for the site accent.
>
> **footerSocialHoverColorLight** `string | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **formUploadsEnabled** `boolean | null | undefined`
>
> **Optional.** Leave it out and the site uses `false`. OFF by default. While off, the server rejects every file submitted through a public form, regardless of the form’s fields. Turn on only after setting the limits below — anonymous file uploads are a deliberate, security-sensitive choice.
>
> **formUploadMaxFiles** `number | null | undefined`
>
> **Optional.** Leave it out and the site uses `3`. How many files one submission may include (hard ceiling 8). 1 to 8.
>
> **formUploadMaxSizeMb** `number | null | undefined`
>
> **Optional.** Leave it out and the site uses `5`. Largest single file accepted, in megabytes (hard ceiling 10 MB). 1 to 10.
>
> **formUploadAllowedTypes** `readonly FormUploadAllowedTypes[] | null | undefined`
>
> **Optional.** Leave it out (or pass `null`) and it isn’t sent: the site’s default applies. Only these categories are accepted. Each file’s actual contents are verified by signature (magic bytes), not just its extension, so a renamed file is rejected. SVG and other script-capable formats can never be enabled here. Each one of `image`, `pdf`, `office`, `text`.

> [accordion] Returns
>
> A `GlobalContent`. The site-wide settings document (one per site and locale), with the fields this site adds. Read its properties (`globalContent.id`): each says whether the site always sends it. The example answer is the site’s wire JSON: some keys differ from the property names (`_id` → `id`, `_logo` → `logo`, `_logoLight` → `logoLight` …).
>
> **id** `string`
>
> **Always sent.** Unique identifier.
>
> **slug** `string`
>
> **Always sent.** Default slug field.
>
> **type** `string`
>
> **Always sent.**
>
> **cookiePolicyVersion** `string`
>
> **Always sent.** Change this — to “2”, a date, anything — and every visitor is asked again. Do that whenever what you do with the data materially changes; consent given under the old terms does not carry over.
>
> **cookieMessage** `string`
>
> **Always sent.** Banner message.
>
> **cookieAcceptLabel** `string`
>
> **Always sent.** Accept button.
>
> **cookieRejectLabel** `string`
>
> **Always sent.** Give this the same visual weight as Accept. A reject option that is harder to find than accept is the single most commonly penalized banner design.
>
> **cookiePrefsTitle** `string`
>
> **Always sent.** Preferences panel heading.
>
> **createdAt** `Date`
>
> **Always sent.** Created At. Format: an ISO 8601 date and time.
>
> **updatedAt** `Date`
>
> **Always sent.** Updated At. Format: an ISO 8601 date and time.
>
> **title** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Default title field.
>
> **copyOfId** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The `_id` of the piece/page that was copied to create this document (only present if created via `_copyingId`)
>
> **businessName** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Business name.
>
> **tagline** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Tagline.
>
> **logo** `readonly Readonly\<Record\<string, unknown\>\>[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Shown in the site header on the dark theme (and over the hero). Upload to the Images library first. 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. At most 1 items.
>
> **logoLight** `readonly Readonly\<Record\<string, unknown\>\>[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional darker logo for the light theme. If empty, the white logo is auto-inverted. 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. At most 1 items.
>
> **favicon** `readonly Readonly\<Record\<string, unknown\>\>[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Browser tab icon — the default, also used when the browser is in dark mode. Upload a square PNG or SVG (at least 64×64) to the Images library. If empty, the bundled default icon is used. 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. At most 1 items.
>
> **faviconLight** `readonly Readonly\<Record\<string, unknown\>\>[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Used when the visitor’s BROWSER or device is in light mode — this follows the browser’s color scheme, not the site’s own theme toggle. If empty, the main favicon is used everywhere. 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. At most 1 items.
>
> **addressLine1** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Shown in the footer. Use up to three lines for a full street address, or just one for a town/region.
>
> **addressLine2** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Address line 2.
>
> **addressLine3** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Address line 3.
>
> **phone** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Phone.
>
> **email** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Email.
>
> **legalName** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The registered name of the company, e.g. “Example Holdings LLC”. Fills \[Business legal name].
>
> **tradeNames** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Any other names the business operates under, e.g. “Example Studio and Example Supply”. Fills \[Trade names].
>
> **legalRegion** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Where the business is based, for governing law. Fills \[State or region].
>
> **legalCountry** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Fills \[Country].
>
> **legalVenue** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Where legal disputes are heard. Fills \[County or venue].
>
> **minimumAge** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The youngest age your website is intended for, e.g. “13”. Fills \[Minimum age].
>
> **paletteAccent** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Your main brand color — buttons, links, accents. Hover + soft tints are derived automatically. Leave empty for the built-in design color.
>
> **paletteAccentLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteOnAccent** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Text/icon color shown ON primary-colored buttons. Defaults to white — set a dark color if your primary is pale.
>
> **paletteOnAccentLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSecondary** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Supporting color — eyebrows, offset shadows, secondary accents.
>
> **paletteSecondaryLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteTertiary** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Warm accent, used sparingly.
>
> **paletteTertiaryLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteLink** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Body-text link color (rich-text content). Leave empty to track the primary color.
>
> **paletteLinkLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSurface** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The base page background.
>
> **paletteSurfaceLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteRaised** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Cards and raised panels that sit above the page background.
>
> **paletteRaisedLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSunken** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Recessed / inset bands.
>
> **paletteSunkenLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteInk** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Primary text color. Mind contrast against the page background.
>
> **paletteInkLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteInkMuted** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Secondary / muted text color.
>
> **paletteInkMutedLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteLine** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Borders and dividers.
>
> **paletteLineLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteSuccess** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Positive / confirmation state (forms, alerts).
>
> **paletteSuccessLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteWarning** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Caution state.
>
> **paletteWarningLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteDanger** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Error / destructive state.
>
> **paletteDangerLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **paletteInfo** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Informational state.
>
> **paletteInfoLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **fontDisplaySource** `FontDisplaySource | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Typeface used for headings and display type. Default is the built-in design font; the other sources replace it site-wide. One of `default`, `curated`, `cdn`, `upload`; a newer site may send others, so keep a fallback.
>
> **fontDisplayCurated** `FontDisplayCurated | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Display font — curated pick. One of `clash-display`, `satoshi`, `general-sans`, `space-grotesk`, `bricolage-grotesque`, `archivo`, `sora`, `syne`, `outfit`, `unbounded`, `fraunces`, `playfair-display`, `zodiak`, `sentient`; a newer site may send others, so keep a fallback.
>
> **fontDisplayCdnProvider** `FontDisplayCdnProvider | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Where to browse for the family. Pick one, then follow the link below to find the exact name. One of `bunny`, `fontshare`; a newer site may send others, so keep a fallback.
>
> **fontDisplayCdnFamily** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or "Clash Display".
>
> **fontDisplayCdnWeights** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Comma-separated weights to load, e.g. 400, 700. Empty loads 500, 700, 800. Weights the family doesn’t ship are skipped by the CDN and synthesized by the browser (faux bold).
>
> **fontDisplayUploads** `readonly GlobalFontDisplayUploadsItem[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A list of `GlobalFontDisplayUploadsItem`. One file per weight/style of the SAME typeface. woff2 strongly recommended (smallest, universally supported); woff/ttf/otf also accepted. At most 8 items.
>
> **GlobalFontDisplayUploadsItem**
>
> **file** `Readonly\<Record\<string, unknown\>\>`
>
> **Always sent.** File attachment reference.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **weight** `Weight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900`; a newer site may send others, so keep a fallback.
>
> **style** `Style | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Style. One of `normal`, `italic`; a newer site may send others, so keep a fallback.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **fontDisplayFallback** `FontDisplayFallback | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Generic system fonts shown while the font loads (and if it fails). Curated picks set this automatically. One of `sans`, `serif`, `mono`; a newer site may send others, so keep a fallback.
>
> **fontBodySource** `FontBodySource | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Typeface used for body text and UI. Default is the built-in design font; the other sources replace it site-wide. One of `default`, `curated`, `cdn`, `upload`; a newer site may send others, so keep a fallback.
>
> **fontBodyCurated** `FontBodyCurated | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Body font — curated pick. One of `inter`, `manrope`, `public-sans`, `work-sans`, `nunito-sans`, `ibm-plex-sans`, `source-sans-3`, `dm-sans`, `karla`, `switzer`, `supreme`, `satoshi`, `general-sans`, `lora`, `source-serif-4`; a newer site may send others, so keep a fallback.
>
> **fontBodyCdnProvider** `FontBodyCdnProvider | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Where to browse for the family. Pick one, then follow the link below to find the exact name. One of `bunny`, `fontshare`; a newer site may send others, so keep a fallback.
>
> **fontBodyCdnFamily** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or "Clash Display".
>
> **fontBodyCdnWeights** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Comma-separated weights to load, e.g. 400, 700. Empty loads 400, 500, 600, 700. Weights the family doesn’t ship are skipped by the CDN and synthesized by the browser (faux bold).
>
> **fontBodyUploads** `readonly GlobalFontBodyUploadsItem[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A list of `GlobalFontBodyUploadsItem`. One file per weight/style of the SAME typeface. woff2 strongly recommended (smallest, universally supported); woff/ttf/otf also accepted. At most 8 items.
>
> **GlobalFontBodyUploadsItem**
>
> **file** `Readonly\<Record\<string, unknown\>\>`
>
> **Always sent.** File attachment reference.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **weight** `Weight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900`; a newer site may send others, so keep a fallback.
>
> **style** `Style | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Style. One of `normal`, `italic`; a newer site may send others, so keep a fallback.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **fontBodyFallback** `FontBodyFallback | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Generic system fonts shown while the font loads (and if it fails). Curated picks set this automatically. One of `sans`, `serif`, `mono`; a newer site may send others, so keep a fallback.
>
> **fontAccentSource** `FontAccentSource | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Typeface used for code blocks and monospace accents. Default is the built-in design font; the other sources replace it site-wide. One of `default`, `curated`, `cdn`, `upload`; a newer site may send others, so keep a fallback.
>
> **fontAccentCurated** `FontAccentCurated | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Accent / mono font — curated pick. One of `jetbrains-mono`, `ibm-plex-mono`, `fira-code`, `space-mono`, `source-code-pro`, `dm-mono`, `inconsolata`, `ubuntu-mono`, `courier-prime`, `red-hat-mono`, `spline-sans-mono`, `victor-mono`; a newer site may send others, so keep a fallback.
>
> **fontAccentCdnProvider** `FontAccentCdnProvider | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Where to browse for the family. Pick one, then follow the link below to find the exact name. One of `bunny`, `fontshare`; a newer site may send others, so keep a fallback.
>
> **fontAccentCdnFamily** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Exactly as the provider’s catalog spells it, e.g. "Space Grotesk" or "Clash Display".
>
> **fontAccentCdnWeights** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Comma-separated weights to load, e.g. 400, 700. Empty loads 400, 700. Weights the family doesn’t ship are skipped by the CDN and synthesized by the browser (faux bold).
>
> **fontAccentUploads** `readonly GlobalFontAccentUploadsItem[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A list of `GlobalFontAccentUploadsItem`. One file per weight/style of the SAME typeface. woff2 strongly recommended (smallest, universally supported); woff/ttf/otf also accepted. At most 8 items.
>
> **GlobalFontAccentUploadsItem**
>
> **file** `Readonly\<Record\<string, unknown\>\>`
>
> **Always sent.** File attachment reference.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **weight** `Weight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `100`, `200`, `300`, `400`, `500`, `600`, `700`, `800`, `900`; a newer site may send others, so keep a fallback.
>
> **style** `Style | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Style. One of `normal`, `italic`; a newer site may send others, so keep a fallback.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **fontAccentFallback** `FontAccentFallback | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Generic system fonts shown while the font loads (and if it fails). Curated picks set this automatically. One of `sans`, `serif`, `mono`; a newer site may send others, so keep a fallback.
>
> **contentWidth** `ContentWidth | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The widest the page content gets: sections, layouts, the header and the footer all line up to it. Smaller screens always use their full width, minus the side margins. One of `standard`, `wide`, `xwide`; a newer site may send others, so keep a fallback.
>
> **socialLinks** `readonly GlobalSocialLinksItem[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A list of `GlobalSocialLinksItem`. Each profile is optional — add only the networks you use. A link only appears once it has a URL. Pick a platform for its brand icon, or “Other / custom” to choose any icon.
>
> **GlobalSocialLinksItem**
>
> **platform** `Platform`
>
> **Always sent.** Platform. One of `instagram`, `facebook`, `x-twitter`, `youtube`, `tiktok`, `linkedin`, `github`, `pinterest`, `whatsapp`, `snapchat`, `threads`, `bluesky`, `mastodon`, `yelp`, `google`, `spotify`, `vimeo`, `custom`; a newer site may send others, so keep a fallback.
>
> **url** `string`
>
> **Always sent.** Full link to the profile, e.g. [https://instagram.com/yourbusiness](https://instagram.com/yourbusiness). Format: an absolute URL.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **label** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Overrides the screen-reader / tooltip label. Recommended for a custom platform — defaults to the icon name (e.g. “discord” → “Discord”).
>
> **icon** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Font Awesome icon name (no “fa-” prefix), e.g. discord. Browse fontawesome.com/icons.
>
> **iconFamily** `IconFamily | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Custom icon family. One of `classic-regular`, `duotone-regular`, `brands`, `jelly`, `jelly-duo`, `whiteboard`; a newer site may send others, so keep a fallback.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **seoImage** `ImageArea`
>
> **Sometimes sent:** `undefined` when the site leaves it out. An `ImageArea`. Site-wide fallback for link previews (Open Graph): used on any page that has neither its own Social share image nor a featured image. Recommended 1200×630. Widgets, top to bottom: send `{ "items": [ … ] }`, one object per widget with its `type`. Writing it replaces the whole area.
>
> **ImageArea**
>
> Widgets, top to bottom: send `{ "items": [ … ] }`, one object per widget with its `type`. Writing it replaces the whole area.
>
> **metaType** `AfterContentAreaMetaType`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Always `area`. One of `area`; a newer site may send others, so keep a fallback.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The area’s id, set by the site: leave it out when you write one.
>
> **items** `readonly ImageWidget[]`
>
> **Sometimes sent:** `undefined` when the site leaves it out. A list of `ImageWidget`. 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). At most 1 items.
>
> **ImageWidget**
>
> A `@apostrophecms/image` widget: its `type` and its own fields. A field left out takes its default.
>
> **type** `ImageWidgetType`
>
> **Always sent.** The widget’s type: always `@apostrophecms/image`. One of `@apostrophecms/image`; a newer site may send others, so keep a fallback.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. 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** `MetaType`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Always `widget`. One of `widget`; a newer site may send others, so keep a fallback.
>
> **image** `readonly Readonly\<Record\<string, unknown\>\>[]`
>
> **Sometimes sent:** `undefined` when the site leaves it out. 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. At most 1 items.
>
> **caption** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Caption.
>
> **linkTo** `LinkTo | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Link To... One of `none`, `@apostrophecms/any-page-type`, `_url`; a newer site may send others, so keep a fallback.
>
> **apostrophecmsAnyPageType** `readonly Readonly\<Record\<string, unknown\>\>[]`
>
> **Sometimes sent:** `undefined` when the site leaves it out. 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. At most 1 items.
>
> **linkHref** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. apostrophe:linkHrefHelp When set, a URL; empty or null when not.
>
> **linkHrefTitle** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Link Title.
>
> **linkTitle** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. If empty, the title of the related document will be used.
>
> **linkTarget** `readonly LinkTarget[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Link Target. Each one of `_blank`.
>
> **sectionCss** `CustomCSS | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A `CustomCSS`. 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 >= 48rem) and \[data-theme="light"] & work inside a slot.
>
> **CustomCSS**
>
> **slots** `Readonly\<Record\<string, string\>\>`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The CSS typed into each part slot, by slot name.
>
> **css** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The compiled CSS (read only: rebuilt from `slots`).
>
> **mark** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The site’s check mark for `css` (read only).
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **seoStructuredData** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Adds schema.org structured data about the business to every page, built from the Brand tab’s business name, address, phone and email plus the Social Links list. Helps search engines show rich results. Nothing is published until this is on and a business name is set.
>
> **seoStructuredDataType** `SeoStructuredDataType | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The schema.org type that best describes the business. “Local business” fits most sites with a physical location or service area. One of `LocalBusiness`, `Organization`, `ProfessionalService`, `Store`; a newer site may send others, so keep a fallback.
>
> **seoServiceAreas** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Adds the Service Area Map’s coverage (place names, service radius) to the business structured data on every page, and the full zip-code/boundary detail on pages with a Service Area Map section. Helps search engines and AI answers understand where the business serves — there is no visual search result for this, and it never affects map-pack ranking. Keep it consistent with the areas on the business’s Google Business Profile. Demo map data is never published.
>
> **seoServiceType** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional, plain words — e.g. “House cleaning” or “Airport transfers”. When set, the structured data pairs it with the service areas as a schema.org Service; when empty the areas attach directly to the business.
>
> **analyticsProvider** `AnalyticsProvider | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Plausible is a privacy-friendly, cookieless analytics service. Visitor page views are counted anonymously; logged-in editors are never tracked. One of `none`, `plausible`; a newer site may send others, so keep a fallback.
>
> **plausibleScriptUrl** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Paste the script address from your site's snippet in Plausible → Site Settings → Site Installation (it looks like [https://plausible.io/js/pa-XXXXXXXX.js](https://plausible.io/js/pa-XXXXXXXX.js) and is unique per site). Analytics stay off until this is set. Optional measurements (outbound links, file downloads, form submissions) are toggled in the Plausible dashboard — no change needed here. When set, a URL; empty or null when not.
>
> **cookieBannerEnabled** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Off hides the banner AND stops every non-essential cookie and third-party embed — declining is the only safe reading of "never asked". Turn it off only on a site that sets nothing beyond the strictly necessary.
>
> **cookieEnforcement** `CookieEnforcement | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Where opt-in applies, nothing non-essential runs until the visitor agrees. Everyone else sees the same banner as a notice: analytics and embedded content work immediately, and declining switches them off. The first option follows the law that is strictest about being asked first, without putting a wall in front of visitors whose law does not require one. One of `eu`, `all`, `notice`; a newer site may send others, so keep a fallback.
>
> **cookieUnknownRegion** `CookieUnknownRegion | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Country comes from your CDN or proxy (Cloudflare’s header, or one you configure). Without it the site falls back to this, plus a browser time-zone check that quietly upgrades an apparently European visitor to opt-in. Put Cloudflare or a GeoIP header in front of the site and this setting stops mattering. One of `lenient`, `strict`; a newer site may send others, so keep a fallback.
>
> **cookieLayout** `CookieLayout | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Banner position. One of `left`, `right`, `center`, `full`; a newer site may send others, so keep a fallback.
>
> **cookieShowCustomize** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Opens the per-category preferences panel. Leaving it on is the safer choice: accept-or-reject with no middle option is what regulators have been fining sites over.
>
> **cookieShowLauncher** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A small button pinned to the bottom corner, over the page. Off by default because the footer link below already offers this — turn it on if you want the control visible without scrolling.
>
> **cookieShowFooterLink** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Puts the reopen control at the bottom of every page, under the “Powered by” line — where visitors look for it. Uses the reopen label from the Cookie banner wording tab. Leave this on unless the floating button above is on instead: consent must stay as easy to withdraw as it was to give.
>
> **cookieRespectGpc** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. GPC is a browser-level "do not sell or share my data" signal, legally binding in several US states. When on, a visitor sending it starts with everything non-essential switched off — they can still turn categories on by hand.
>
> **cookieReloadOnWithdraw** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A third-party script that has already run cannot be switched off in place: it keeps running until the next full page load (each vendor is still told about the withdrawal straight away). On, the page reloads as soon as a visitor switches a category OFF, so nothing they declined keeps running. Off by default: the reload interrupts whatever the visitor was doing, and most visitors are not in a region that requires it.
>
> **cookieLifetimeDays** `number | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. How long a visitor’s answer stands before the banner returns. Six months is the common practice and twelve is the usual ceiling. 1 to 365.
>
> **cookieConsentLogRecords** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Stores a receipt for each decision (which categories, when, under which policy version) so you can show consent was given. Kept for two years, then deleted automatically.
>
> **cookieTitle** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Leave empty for the message alone, which is how most banners read best.
>
> **cookiePolicyLinkText** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Rendered after the message as a link to the policy page. Leave empty to omit it.
>
> **cookiePolicyUrl** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A path on this site or a full URL. The default matches the parked Cookie Policy page.
>
> **cookieCustomizeLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Customize button.
>
> **cookieSaveLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Save-choices button.
>
> **cookieLauncherLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Reopen control label.
>
> **cookiePrefsIntro** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Preferences panel intro.
>
> **cookieCatNecessaryLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Strictly necessary — label.
>
> **cookieCatNecessaryDescription** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieCatFunctionalLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Functional — label.
>
> **cookieCatFunctionalDescription** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieCatAnalyticsLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Analytics — label.
>
> **cookieCatAnalyticsDescription** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieCatMarketingLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Marketing — label.
>
> **cookieCatMarketingDescription** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Shown beside this category’s switch in the preferences panel. Say what the visitor gains or loses, not which vendors are involved.
>
> **cookieBlockedTitle** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Shown in place of an embed (a map, a social video) that is waiting on consent.
>
> **cookieBlockedBody** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Blocked-content message.
>
> **cookieBlockedButton** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Blocked-content button.
>
> **maintenanceMode** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Takes the public site offline. Visitors and search engines see a “be right back” page (served with the correct temporary-outage signals, so search rankings are preserved); logged-in editors keep the full site and can continue editing. A new site starts with this on: turn it off when the site is ready to go live.
>
> **maintenanceRetryAfter** `MaintenanceRetryAfter | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. How long search engines should wait before checking back (the Retry-After hint). A rough estimate is fine — it is a hint, not a promise, and nothing switches back automatically. One of `3600`, `14400`, `43200`, `86400`, `259200`, `604800`; a newer site may send others, so keep a fallback.
>
> **maintenanceMessage** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional short message shown on the maintenance page (e.g. what is happening or when you expect to be back). Leave empty for a generic “we’ll be back soon” line.
>
> **recaptchaSiteKey** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Public reCAPTCHA v3 site key. Managed automatically from Connections → Spam protection — edit it there, not here.
>
> **requestLogEnabled** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Whether anonymous page views are being recorded. Managed automatically from Visitor data → Request log — edit it there, not here.
>
> **requestLogVisitorCookie** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Whether anonymous visitors get the first-party visitor-ID cookie. Managed automatically from Visitor data → Request log — edit it there, not here.
>
> **conversionsEnabled** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Whether conversions and ad attribution are being recorded. Managed automatically from Visitor data → Conversions — edit it there, not here.
>
> **conversionLinkedDomains** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Sites visitors continue to (a booking site), for cross-domain ad attribution. Managed automatically from Visitor data → Conversions — edit it there, not here.
>
> **googleMapsApiKey** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Public (referrer-restricted) Maps JavaScript key — the Service Area Map loads Google Maps with it. Managed automatically from Connections → Google Maps — edit it there, not here.
>
> **animationsEnabled** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Master switch for the site’s scroll and entrance motion (section reveals, count-ups, marquees, the hero). When off, no animation code is loaded and every section appears in its final, static state. Visitors whose device requests reduced motion always get the static experience regardless of this setting.
>
> **designCss** `DesignLayer | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A `DesignLayer`. Site-wide CSS for every section of a type and for shared elements (buttons, the header, the footer…). Type into the slot of the part you want to style; a section’s own CSS tab wins over this.
>
> **DesignLayer**
>
> **slots** `Readonly\<Record\<string, string\>\>`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The CSS typed into each part slot, by slot name.
>
> **css** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The compiled CSS (read only: rebuilt from `slots`).
>
> **mark** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The site’s check mark for `css` (read only).
>
> **headerStyle** `HeaderStyle | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Floating rests transparent over the hero and morphs to glass on scroll; Glass is frosted from the top; Solid is an opaque bar (uses the bar background color). One of `floating`, `glass`, `solid`; a newer site may send others, so keep a fallback.
>
> **headerWidth** `HeaderWidth | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Island floats as a contained pill; Full width spans edge-to-edge (squared corners, content still centered). Full width ignores the corner radius below. One of `island`, `full`; a newer site may send others, so keep a fallback.
>
> **headerBarRadius** `HeaderBarRadius | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Applies to the Island bar (Full width is always squared). One of `pill`, `rounded`, `slight`, `square`; a newer site may send others, so keep a fallback.
>
> **headerBackgroundColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The bar fill for Glass / Solid styles (and the glass tint when scrolled). Leave empty to use the raised surface color.
>
> **headerBackgroundColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerBorder** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A hairline outline around the bar (shown when glass / solid / scrolled).
>
> **headerShadow** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A soft drop shadow under the bar (when glass / solid / scrolled).
>
> **headerHideOnScroll** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The bar slides away when scrolling down and returns when scrolling up.
>
> **headerGlassOnScroll** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The floating bar stays transparent at the top and becomes a glass pill once the page scrolls. Turn off to keep it transparent.
>
> **headerDarkBothThemes** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Keeps the whole navbar (bar, logo, wordmark, links, dropdown, button and mobile menu) in its dark-theme look even when a visitor switches to the light theme, e.g. a header that always sits over a dark hero photo. While on, the light-theme header colors and the light-theme logo are not used. Off follows the site theme.
>
> **headerNavBreakpoint** `HeaderNavBreakpoint | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Below this width the links collapse into the mobile menu (hamburger). Raise it if you have many or long links. One of `md`, `lg`, `xl`; a newer site may send others, so keep a fallback.
>
> **headerLogoHeight** `HeaderLogoHeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Logo height. One of `small`, `medium`, `large`; a newer site may send others, so keep a fallback.
>
> **headerLogoHover** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A subtle tilt + scale when the cursor is over the logo lockup.
>
> **headerShowWordmark** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The business name in type beside the logo. Turn off when the logo already includes the name.
>
> **headerWordmarkText** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional override of the text wordmark. Leave empty to use the business name.
>
> **headerWordmarkSplit** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Render the first word large and the rest as a small tracked-out caption beneath it. Off renders the whole wordmark on one line.
>
> **headerNameColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNameColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNameWeight** `HeaderNameWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **headerNameSize** `HeaderNameSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **headerSublineColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerSublineColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerSublineWeight** `HeaderSublineWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **headerNav** `readonly GlobalHeaderNavItem[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A list of `GlobalHeaderNavItem`. Header navigation.
>
> **GlobalHeaderNavItem**
>
> **label** `string`
>
> **Always sent.** Label.
>
> **url** `string`
>
> **Always sent.** URL.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **placement** `Placement | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Desktop only — every link is listed in the mobile menu. One of `visible`, `more`; a newer site may send others, so keep a fallback.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **headerMoreLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Label for the overflow dropdown that holds links placed in “More”.
>
> **headerNavLinkColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNavLinkColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNavLinkWeight** `HeaderNavLinkWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **headerNavLinkSize** `HeaderNavLinkSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **headerNavIndicator** `HeaderNavIndicator | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. How the hovered / active link is marked. One of `sweep`, `grow`, `pill`, `none`; a newer site may send others, so keep a fallback.
>
> **headerNavHoverColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Leave empty to use the site accent color.
>
> **headerNavHoverColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerNavActiveColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Color + indicator for the current page’s link. Leave empty to use the secondary (mint) color.
>
> **headerNavActiveColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaLabel** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The visible button text. Leave empty to hide the button.
>
> **headerCtaUrl** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Where the button goes — a path (/blog) or full URL.
>
> **headerCtaNewTab** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Opens the link in a new browser tab (adds rel="noopener noreferrer").
>
> **headerCtaVariant** `HeaderCtaVariant | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Solid fills with the color; Outline / Soft / Text link use it for the border + text. One of `solid`, `outline`, `soft`, `link`; a newer site may send others, so keep a fallback.
>
> **headerCtaSize** `HeaderCtaSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Button size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **headerCtaRadius** `HeaderCtaRadius | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Corner radius. One of `pill`, `rounded`, `slight`, `square`; a newer site may send others, so keep a fallback.
>
> **headerCtaColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Solid fill, or the border + text for the other styles. Defaults to the brand accent; CLEAR it for a transparent, outline-only button.
>
> **headerCtaColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaTextColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The text/icon color. Clear it to derive from the button color (readable on solid fills).
>
> **headerCtaTextColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaHoverColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Drives the hover treatment. Leave empty to derive it from the button color.
>
> **headerCtaHoverColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaStyle** `HeaderCtaStyle | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The hover treatment: a soft shadow, a colored offset shadow, a glow, a fill sweep, or a thicker border. One of `none`, `single`, `dual`, `glow`, `sweep`, `thicken`; a newer site may send others, so keep a fallback.
>
> **headerCtaShadowColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. The offset-shadow or glow color on hover. Leave empty to use the site secondary color.
>
> **headerCtaShadowColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerCtaAnimation** `HeaderCtaAnimation | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Hover motion. One of `lift`, `scale`, `lift-scale`, `none`; a newer site may send others, so keep a fallback.
>
> **headerCtaIcon** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket (no “fa-” prefix). Browse at fontawesome.com/icons.
>
> **headerCtaIconFamily** `HeaderCtaIconFamily | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Icon family. One of `classic-regular`, `duotone-regular`, `brands`, `jelly`, `jelly-duo`, `whiteboard`; a newer site may send others, so keep a fallback.
>
> **headerCtaIconPosition** `HeaderCtaIconPosition | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Which side of the label the icon sits on (when an icon name is set). One of `before`, `after`; a newer site may send others, so keep a fallback.
>
> **headerCtaIconNudge** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The icon slides toward its side on hover (e.g. an arrow edges outward).
>
> **headerMobileSide** `HeaderMobileSide | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Drawer side. One of `right`, `left`; a newer site may send others, so keep a fallback.
>
> **headerMobileWidth** `HeaderMobileWidth | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Drawer width. One of `narrow`, `normal`, `wide`; a newer site may send others, so keep a fallback.
>
> **headerMobileBackgroundColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Leave empty to use the site surface color.
>
> **headerMobileBackgroundColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerMobileShowLogo** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Show logo in drawer.
>
> **headerMobileShowCta** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Repeat the header button at the bottom of the mobile drawer.
>
> **headerMobileShowScrollCue** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A small animated hint shown when the menu links overflow.
>
> **headerMobileLinkColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerMobileLinkColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **headerMobileLinkWeight** `HeaderMobileLinkWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **headerMobileLinkSize** `HeaderMobileLinkSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **headerMobileLinkHoverColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Leave empty to use the site accent color.
>
> **headerMobileLinkHoverColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerBackgroundType** `FooterBackgroundType | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Site default keeps the footer’s sunken surface; Solid color and Image override it. The site surface color is the fallback when a color is left empty. One of `default`, `solid`, `image`; a newer site may send others, so keep a fallback.
>
> **footerBackgroundColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Used for a Solid background (and as the fallback behind an Image). Leave empty to use the site surface color.
>
> **footerBackgroundColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerImage** `ImageArea`
>
> **Sometimes sent:** `undefined` when the site leaves it out. An `ImageArea`. Widgets, top to bottom: send `{ "items": [ … ] }`, one object per widget with its `type`. Writing it replaces the whole area. Its fields are listed under the first `ImageArea` above.
>
> **footerOverlayColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Scrim over the image to keep the footer legible. Leave empty to use the surface color.
>
> **footerOverlayColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerOverlayOpacity** `number | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Overlay opacity (%). 0 to 100.
>
> **footerPadding** `FooterPadding | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Vertical padding. One of `tight`, `normal`, `roomy`; a newer site may send others, so keep a fallback.
>
> **footerTopBorder** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A hairline rule along the top edge of the footer.
>
> **footerBackToTop** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Show “Back to top” button.
>
> **footerLogo** `readonly Readonly\<Record\<string, unknown\>\>[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional logo shown at the top of the company column, used on the dark theme. Leave both footer logos empty to use the site logo (Site settings → Brand); with no logo at all the business name leads. Upload to the Images library first. 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. At most 1 items.
>
> **footerLogoLight** `readonly Readonly\<Record\<string, unknown\>\>[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional darker logo for the light theme. If empty, the white logo is auto-inverted. 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. At most 1 items.
>
> **footerLogoHeight** `FooterLogoHeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Logo height. One of `small`, `medium`, `large`; a newer site may send others, so keep a fallback.
>
> **footerLogoAlign** `FooterLogoAlign | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Aligns the logo within the company column (e.g. centered above the business name). One of `left`, `center`, `right`; a newer site may send others, so keep a fallback.
>
> **footerShowName** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. The business name as a heading at the top of the column. Turn off when the logo already carries the name.
>
> **footerShowTagline** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Show tagline.
>
> **footerShowContact** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Show address, phone & email.
>
> **footerNameColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerNameColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerNameWeight** `FooterNameWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **footerNameSize** `FooterNameSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **footerBrandColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerBrandColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerBrandWeight** `FooterBrandWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **footerBrandSize** `FooterBrandSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **footerLinkGroups** `readonly GlobalFooterLinkGroupsItem[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A list of `GlobalFooterLinkGroupsItem`. Each group becomes a column in the footer. Add a Legal group for Terms & Privacy, etc.
>
> **GlobalFooterLinkGroupsItem**
>
> **heading** `string`
>
> **Always sent.** Group heading.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **links** `readonly GlobalFooterLinkGroupsItemLinksItem[]`
>
> **Sometimes sent:** `undefined` when the site leaves it out. A list of `GlobalFooterLinkGroupsItemLinksItem`. Links.
>
> **GlobalFooterLinkGroupsItemLinksItem**
>
> **label** `string`
>
> **Always sent.** Label.
>
> **url** `string`
>
> **Always sent.** URL.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **external** `boolean`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Opens in a new tab with an arrow indicator.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **footerLinkColumns** `FooterLinkColumns | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. How many columns the link groups flow into. Auto fits to the available width; a fixed count packs shorter groups together (e.g. Legal stacked under Elsewhere). Groups are never split across columns. One of `auto`, `2`, `3`, `4`; a newer site may send others, so keep a fallback.
>
> **footerHeadingColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerHeadingColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerHeadingWeight** `FooterHeadingWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **footerHeadingSize** `FooterHeadingSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`, `xlarge`; a newer site may send others, so keep a fallback.
>
> **footerLinkColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerLinkColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerLinkWeight** `FooterLinkWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **footerLinkSize** `FooterLinkSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **footerLinkHoverColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Leave empty to use the site accent color.
>
> **footerLinkHoverColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerLinkHoverEffect** `FooterLinkHoverEffect | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Hover effect. One of `none`, `slide`, `underline`; a newer site may send others, so keep a fallback.
>
> **footerMarqueeEnabled** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A slow ribbon of phrases scrolling across the top of the footer. Any page can override this for itself in Page Settings → Footer.
>
> **footerMarquee** `readonly GlobalFooterMarqueeItem[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A list of `GlobalFooterMarqueeItem`. Each phrase can carry its own icon; without one, a dot separates it from the next phrase.
>
> **GlobalFooterMarqueeItem**
>
> **phrase** `string`
>
> **Always sent.** Phrase.
>
> **id** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. The row’s id, unique in its array.
>
> **icon** `string`
>
> **Sometimes sent:** `undefined` when the site leaves it out. Any Font Awesome icon name, e.g. star, bolt, arrow-left-to-bracket (no “fa-” prefix). Browse at fontawesome.com/icons.
>
> **iconFamily** `IconFamily | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Icon family. One of `classic-regular`, `duotone-regular`, `brands`, `jelly`, `jelly-duo`, `whiteboard`; a newer site may send others, so keep a fallback.
>
> **iconColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional — leave empty to use the design’s own color rhythm.
>
> **iconAnimation** `IconAnimation | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Icon animation. One of `none`, `fa-beat`, `fa-bounce`, `fa-fade`, `fa-beat-fade`, `fa-flip`, `fa-shake`, `fa-spin`; a newer site may send others, so keep a fallback.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.
>
> **footerMarqueeSpeed** `FooterMarqueeSpeed | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Marquee speed. One of `slow`, `normal`, `fast`; a newer site may send others, so keep a fallback.
>
> **footerMarqueeMotionPause** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. 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.
>
> **footerMarqueeColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Leave empty for the muted default.
>
> **footerMarqueeColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerMarqueeWeight** `FooterMarqueeWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **footerWordmarkEnabled** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A giant outlined word along the bottom of the footer. Reveals/fills on hover.
>
> **footerWordmark** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Keep it to one short word — it renders at display size. Leave empty to use the business name.
>
> **footerWordmarkSize** `FooterWordmarkSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Watermark size. One of `display`, `large`, `medium`; a newer site may send others, so keep a fallback.
>
> **footerWordmarkAlign** `FooterWordmarkAlign | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Watermark alignment. One of `left`, `center`, `right`; a newer site may send others, so keep a fallback.
>
> **footerWordmarkFill** `FooterWordmarkFill | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Outlined letters that fill on hover one at a time, all at once, or always-solid (no ghost effect). One of `letter`, `word`, `solid`; a newer site may send others, so keep a fallback.
>
> **footerWordmarkColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Overrides the wordmark fill + outline tint. Leave empty to track the theme’s text color.
>
> **footerWordmarkColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerCopyrightText** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Type \{year} where this year goes (it updates itself every January) and \{business} for the business name. Left empty, the site shows “© \{year} \{business}. All rights reserved.”
>
> **footerNote** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional short line shown beside the copyright (e.g. a slogan or license number).
>
> **footerCopyrightColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerCopyrightColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerCopyrightWeight** `FooterCopyrightWeight | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Weight. One of `normal`, `medium`, `semibold`, `bold`, `extrabold`; a newer site may send others, so keep a fallback.
>
> **footerCopyrightSize** `FooterCopyrightSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Size. One of `small`, `normal`, `large`; a newer site may send others, so keep a fallback.
>
> **footerShowSocial** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Render the site’s social profiles (configured in the “Social Links” tab) in the footer.
>
> **footerSocialHeading** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional small heading above the icons (e.g. “Follow us”). Leave empty for none.
>
> **footerSocialPlacement** `FooterSocialPlacement | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. In the company column (under the contact details) or as its own centered row above the copyright bar. One of `brand`, `bar`; a newer site may send others, so keep a fallback.
>
> **footerSocialBarBorder** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A hairline rule above the dedicated social row, for a touch of separation from the watermark.
>
> **footerSocialVariant** `FooterSocialVariant | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Icon style. One of `bare`, `outline`, `solid`; a newer site may send others, so keep a fallback.
>
> **footerSocialSize** `FooterSocialSize | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Icon size. One of `small`, `normal`, `large`, `xlarge`; a newer site may send others, so keep a fallback.
>
> **footerSocialSpacing** `FooterSocialSpacing | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Gap between the icons. One of `tight`, `normal`, `loose`; a newer site may send others, so keep a fallback.
>
> **footerSocialHeadingColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Optional. Leave empty to match the footer’s other group headings (Footer: Links tab).
>
> **footerSocialHeadingColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerSocialColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Resting icon color. Leave empty for the muted default.
>
> **footerSocialColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **footerSocialHover** `FooterSocialHover | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Hover to each platform’s own brand color, or to the site accent (or a chosen hover color). One of `brand`, `accent`; a newer site may send others, so keep a fallback.
>
> **footerSocialHoverColor** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Used when “Hover color” is Accent / custom. Leave empty for the site accent.
>
> **footerSocialHoverColorLight** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. A CSS color (`#625bff`, `#625bffff`, `rgb(…)`, `hsl(…)`, a color name) or a palette token’s name (`--fetchski-accent`).
>
> **formUploadsEnabled** `boolean | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. OFF by default. While off, the server rejects every file submitted through a public form, regardless of the form’s fields. Turn on only after setting the limits below — anonymous file uploads are a deliberate, security-sensitive choice.
>
> **formUploadMaxFiles** `number | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. How many files one submission may include (hard ceiling 8). 1 to 8.
>
> **formUploadMaxSizeMb** `number | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Largest single file accepted, in megabytes (hard ceiling 10 MB). 1 to 10.
>
> **formUploadAllowedTypes** `readonly FormUploadAllowedTypes[] | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. Only these categories are accepted. Each file’s actual contents are verified by signature (magic bytes), not just its extension, so a renamed file is rejected. SVG and other script-capable formats can never be enabled here. Each one of `image`, `pdf`, `office`, `text`.
>
> **aposShareKey** `string | null`
>
> **Sometimes sent:** `undefined` when the site leaves it out, and it can be `null`. 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.
>
> **fields** `Readonly\<Record\<string, unknown\>\>`
>
> **Always there:** `{}` when there are none. Any keys the site sent that aren’t listed above (such as one added after this SDK was built), by their wire names, as sent. Pass this model to a write and they are sent too.

> [accordion] Errors
>
> Nothing to catch: the SDK retries what is safe, and throws the rest as the classes below; catch only what you want to react to (see [Errors and testing](https://docs.fetchski-attract.com/typescript/errors.md)).
>
> **ValidationFailed** `400`
>
> The site refused what was sent: `errors` lists each field’s problem, `siteMessage` the first.
>
> **Retried first:** No. **Read:** `errors` (field → messages), `siteMessage`.
>
> **AuthenticationFailed** `401`
>
> The API key is missing or refused (malformed, revoked, expired), or a signature its signing mode needs is missing or stale.
>
> **Retried first:** No. **Read:** `siteMessage`, `errorName`, `data`.
>
> **Forbidden** `403`
>
> The key may not do this: a scope it lacks, or an address outside its allowlist. `siteMessage` names it.
>
> **Retried first:** No. **Read:** `siteMessage`, `errorName`, `data`.
>
> **NotFound** `404`
>
> Nothing matches, or the caller may not see it.
>
> **Retried first:** No. **Read:** `siteMessage`, `errorName`, `data`.
>
> **SiteError** `5xx`
>
> The site failed (or something in front of it did). Its logs say why.
>
> **Retried first:** No: a write may have landed. **Read:** `siteMessage`, `errorName`, `data`.
>
> **SiteUnreachable** `no answer`
>
> No answer: DNS, a refused connection, TLS, or the timeout (15 s per attempt by default).
>
> **Retried first:** Only when nothing reached the site (`neverConnected()`); never after a timeout, when it may have landed. **Read:** `reason`, `neverConnected`.
>
> **RequestNotSent** `not sent`
>
> The client refused to send it (e.g. a path segment of `..`); the site never saw it.
>
> **Retried first:** No. **Read:** `reason` (what to change).
>
> **SiteRequestFailed** `any other`
>
> Any other status, or a success whose JSON doesn’t match this SDK version’s types (update the SDK).
>
> **Retried first:** No. **Read:** `reason`, `status`.
>
> **UnknownSite** `setup`
>
> `sites.forSite('acme')` named a slug your sites (`createSiteClients()`) don’t have.
>
> **Retried first:** No: nothing was sent. **Read:** `message`, `slug`.
>
> **SiteConfigurationError** `setup`
>
> The client’s settings are wrong: no `FETCHSKI_ATTRACT_URL` (or `baseUrl`), or a malformed API key.
>
> **Retried first:** No: nothing was sent. **Read:** `message` (what to fix).

## Behavior

* **Access:** an API key with `global:write` (or a master above it: `global:all`, `admin:all`). In published mode (the default) it goes live too, so the key also needs `global:publish` (or a master above it); send `aposMode=draft` to change only the draft. Custom CSS fields also need `global:css`. 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`. The client waits and retries for you; you see `RateLimited` only if that runs out.
* **Retries:** a write is sent again only after a 429 (refused before it acted) or when it never reached the site. After a timeout or a 5xx it may have landed: check before you send it again.
* **Timeout:** 15 s per attempt by default; raise `timeout` (milliseconds) on the client for longer.

## Test it

It calls the function above with a fake client: the fake answers every call with a valid example, so nothing leaves your machine and no settings or key are needed. Run it with `node --test`.

```ts tests/globalContent-createGlobal.test.ts theme={"dark"}
import { test } from 'node:test';
import { fakeSite } from '@fetchski/attract-cms-sdk/testing';
import { createGlobal } from '../src/attract/create-global.ts';

test('globalContent.createGlobal', async () => {
  const site = fakeSite();
  await createGlobal(site);
  site.assertCalled('globalContent.createGlobal');
});
```

**Answer with your own values:** fake `globalContent.createGlobal` with `factories.GlobalContent({...})`, the fields you give over a valid example.

```ts tests/globalContent-createGlobal-answer.test.ts theme={"dark"}
import assert from 'node:assert/strict';
import { test } from 'node:test';
import { factories, fakeSite } from '@fetchski/attract-cms-sdk/testing';

test('globalContent.createGlobal answers your values', async () => {
  const site = fakeSite({
    'globalContent.createGlobal': factories.GlobalContent({ id: 'Your value' })
  });
  const globalContent = await site.globalContent().createGlobal({ cookiePolicyVersion: '1', cookieMessage: 'This website uses cookies to supplement a balanced diet and provide a much deserved reward to the senses after consuming bland but nutritious meals. Accepting our cookies is optional but recommended, as they are delicious.', cookieAcceptLabel: 'Accept all', cookieRejectLabel: 'Reject all', cookiePrefsTitle: 'Cookie preferences' });
  assert.equal(globalContent.id, 'Your value');
});
```

## Related

> [card] [List global documents](https://docs.fetchski-attract.com/typescript/reference/global-content/list-global-content.md)
>
> `site.globalContent().listGlobalContent()`

> [card] [Archive global documents](https://docs.fetchski-attract.com/typescript/reference/global-content/archive-globals.md)
>
> `site.globalContent().archiveGlobals()`

> [card] [Copy global documents to another locale](https://docs.fetchski-attract.com/typescript/reference/global-content/localize-globals.md)
>
> `site.globalContent().localizeGlobals()`

> [card] [Publish global documents](https://docs.fetchski-attract.com/typescript/reference/global-content/publish-globals.md)
>
> `site.globalContent().publishGlobals()`

> [card] [Restore global documents](https://docs.fetchski-attract.com/typescript/reference/global-content/restore-globals.md)
>
> `site.globalContent().restoreGlobals()`

> [card] [Get a global document](https://docs.fetchski-attract.com/typescript/reference/global-content/get-global.md)
>
> `site.globalContent().getGlobal()`

> [card] [POST /@apostrophecms/global](https://docs.fetchski-attract.com/api-reference/global-content/create-a-global-document.md)
>
> The endpoint this calls, in the API reference: the HTTP request and answer, and every rule the site checks.


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