# Type: Facebook Post

Changes to how this Type behaves are requested through a GitHub Issue and implemented, together with this reference page, through the repository's normal workflow. See /_docs/posts for how Post Types and Content Types work in general, and docs/Internal/type-doc-templates.md for the Post Type Doc template this file follows.

A standalone Post Type for an owner-authored Facebook post — text-only, media-only, a shared link, or any mix — imported by an external converter (out of scope for this Type; see /_docs/json-import). No PostType inheritance: this Type reuses the ordinary Post/Version/Content Element/Role/Slot/Stage model exactly as every other Type does. An imported Facebook Post normally starts PrePub, same as any other import.

## Schema

```
Slots:
- text        : text       | optional | single
- images      : image      | optional | repeatable
- videos      : video      | optional | repeatable
- links       : link       | optional | repeatable
- attachments : attachment | optional | repeatable
- audios      : audio      | optional | repeatable
- contacts    : contact    | optional | repeatable
- geospatials : geospatial | optional | repeatable
- timelines   : timeline   | optional | repeatable
```

`text` is this Type's one featured Text role — the owner's own post text, when present. `images`/`videos`/`links`/`attachments`/`audios`/`contacts`/`geospatials`/`timelines` are wildcard slots (the same "any role of this kind" meaning as Article's own `images`/`videos` rows — see /_docs/posts): every element of that kind the Post holds, regardless of its own Role, counts toward this Slot, letting a converter tag elements with whatever Role fits the source data. No Slot is required — a Facebook Post supports text-only, media-only, a shared link, or any mix, without ever forcing an empty element to satisfy a requirement (see /_docs/json-import's own "Missing optional source values must not block import").

Shared/quoted third-party material is represented through a Link element (plus its own source-provenance metadata) and the owner's own commentary in `text`, never as if the quoted material were itself owner-authored.

## Content placement (Full rendering)

`text` and every eligible Image/Video are this Type's own primary content. `images`/`videos` are combined into one ordered Media grid — Image and Video interleaved by Rank, not grouped by kind, so a real source order (e.g. an image followed by a video in the same post) is preserved; see "Mixed-media order," below. Every other eligible Content Element the Post holds (Links, Attachments, Contacts, Geospatial, Timelines) flows into the shared "Additional Information" container, same fixed group order every other Post Type uses — empty groups omitted, Text/Free-form HTML never shown there. Image is the one documented duplication exception: every Image the Post holds also appears in the Additional Information Media group even though it's already shown in the primary grid.

### Mixed-media order

The Media Slot has no separate ordering field of its own — it reuses each element's existing per-(Role, kind) Rank column, the same mechanism every other repeatable Slot in this codebase already uses. Image and Video are still two separate Content Types with two separate Rank sequences; when a real source post genuinely interleaves an image and a video, the converter assigns Rank from one shared incrementing counter across both kinds for that Role, and rendering merges the Post's Images and Videos sharing that Role and sorts the combined list by Rank.

## Rendering contracts

### Summary (in a list of posts)

Title, the first Image/Video (combined Rank order) as a thumbnail, a short excerpt of `text`, published date.

### Full (its own page)

The normal compact Post header (title, Published/Updated/Original/History line, Tags), `text` (if present) directly below it, then the ordered Media grid, then the shared Additional Information container for Links/Attachments/Contacts/Geospatial/Timelines.

## Page regions (Full rendering)

- **Header** — the Hidden/PrePub/Private banner (if applicable), the title, the compact Published/Updated/Original/History metadata line (see /_docs/article's own "Metadata line" for the full item-by-item detail), and a row of Tag links (if the Version has any).
- **Introduction** — `text`, then the Media grid.
- **Supplementary** — the Additional Information container, when eligible content exists.
- **Main**, **Footer** — not currently used by Facebook Post.

Responsive order: Header, Introduction, Supplementary — unchanged across viewport sizes (no reading-column primary presentation).

## Public metadata exposure

Title, type, Stage, Category, published/updated timestamps, Version ordinal, Tags (as JSON-LD `keywords`), every Content Element the Post holds, and this Version's own source-provenance facts (platform, source account identity, stable source-post ID, canonical URL, original publish timestamp, converter provenance, checksum — see docs/Internal/data-model.md's "Source provenance") are all exposed via the Metadata page, JSON-LD export, and native JSON export, same as every Type.

## Admin editor

Every Content Element section is available here, same as every Type. `text` is this Type's one standard Text role; any Image/Video you add is shown in the Media grid, in Rank order; anything else you add is still saved and shown in the Additional Information container afterward. Any element can also be referenced inline in a text block via content references, e.g. `{{role}}` or `{{link:role}}`.
