Content model
Every content file, field by field.
Ten JSON files under source/content/ hold every word, number, link and list a visitor sees, plus one file of design tokens. Nothing user-visible is hard-coded in a template, which is why one edit reaches all four formats.
This is the field-by-field reference. For a worked walkthrough of changing things, see customizing; for how the layers fit together, see architecture.
| File | Holds |
|---|---|
site.json | Brand, navigation, footer, contact details, social links, portal |
home.json | Every band of the home page |
pages.json | Every interior page, as a hero plus a list of sections |
products.json | The catalogue and every product detail page |
collections.json | Repeated lists: leadership, facilities, pipeline, partners |
articles.json | News and briefing articles |
ui.json | Interface labels, column headings, empty states, ARIA strings |
seo.json | Titles, meta, Open Graph, robots, schema.org, sitemap |
lite.json | Which subset of the above the free edition ships |
tokens/tokens.json | Colour, type, spacing, radius, shadow, breakpoints |
Every file may carry a $comment key. The build ignores it; it is there so a file can explain itself to whoever opens it next.
site.json
The chrome. Read on every page in every format.
| Key | Type | Effect |
|---|---|---|
brand | { name, suffix } | The wordmark. suffix renders in the lighter weight beside the name |
tagline | string | Used in the footer and as a fallback description |
description | string | The footer blurb |
skin | string | Which token build to link, if you ship more than one |
nav | array | The menu. See below |
portal | object | The portal button in the navigation bar |
contact | { address_lines[], email, phone } | Footer and contact page |
social | array | Footer icons |
nav is an array of { label, children }. An entry with a children array becomes a dropdown; without one it is a plain link. The footer columns and the mobile drawer are generated from this same array, so the menu is edited once and three places follow.
home.json
Nine keys, each one band of the home page, in this order: hero, ribbon, mandate, network, pipeline, science, news, contact, partnering.
hero carries badge, title, lead, cta_primary, cta_secondary and a stats array of { count, suffix, label }. Those counts animate up from zero; the final value is in the HTML, so it reads correctly without JavaScript.
network drives the 3D globe. focus is the region it opens on, as { lat, lng }, and hubs is an array of { lat, lng, label, primary }. A hub marked primary pulses. No JavaScript is edited to move a marker.
pipeline holds programmes, each with a pct for the progress bar and a status of active, enrolling or planning.
Three of these bands can be pulled into an interior page with an include section, so they are written once: science, partners and contact.
pages.json
One key per interior page under pages. The key is the URL: mandate becomes /mandate.html.
| Field | Effect |
|---|---|
title | Page title, tab title, breadcrumb |
description | Meta description and link preview text |
hero | { eyebrow, h1, lead } |
sections | Ordered list of typed sections |
The section types are the substance of this file and have their own reference: see the section catalogue for all seventeen, their fields, the three tones and the eight interactive apps.
Adding a page is adding a key here and a link in site.json's nav.
products.json
products is an array; each object produces a catalogue row, a full detail page, a schema.org Drug block and a sitemap entry.
| Field | Effect |
|---|---|
generic | The generic name, and the row's primary label |
proprietary | Brand name, shown beside the generic |
brand_equivalent | What it is equivalent to, on the detail page |
ndc | National Drug Code. Searchable in the catalogue |
category | Filter pill. A new value creates a new pill by itself |
form | Dosage form, for example tablet or injection |
strength | Dosage strength |
route | Route of administration |
prescribing_info_url | Link to the prescribing information document |
categories is the display order for the filter pills. disclaimer is the regulatory line shown on every product page.
prescribing_info_url ships pointing at a placeholder document whose text says so. Replace it before launch: a prescribing information link is the single most consequential link on a pharmaceutical site.
collections.json
Lists that appear in more than one place. Edit a person once and every page showing them follows.
| Key | Item fields |
|---|---|
leadership | name, title, bio, photo |
facilities | name, location, capability, specs |
pipeline | name, indication, modality, phase |
pipeline_stages | The phase labels, in order |
partners | name, kind, logo |
metrics | label, value |
credentials | Certification and accreditation strings |
phase on a pipeline entry must be one of the strings in pipeline_stages; that is what positions it on the chart.
articles.json
| Field | Effect |
|---|---|
slug | URL: /article/<slug>.html |
title, excerpt, tag, date, author, read_minutes | Card and byline |
body, body2 | Prose, with pull as a pull quote between them |
This file drives the listing pages. Writing a new article as markdown in your format's own idiom is the easier route and is covered in the four formats; note that a markdown article does not appear in these listings unless you also add it here.
ui.json
Every interface string: column headings, button text, empty states, ARIA labels, form messages. Grouped by where they appear (catalog, product, feed, jobs, footer, contact_form, portal_form, article, facilities, leadership, partners, a11y).
There is no user-visible English hard-coded in the renderer. Translating the theme means editing this file and seo.json, not grepping templates.
seo.json
| Key | Effect |
|---|---|
site_url | Canonical base. Set this before you launch |
site_name, titles | Title template and per-page overrides |
lang, dir, default_locale | Language, direction, locale |
social | Open Graph and Twitter card defaults |
robots | The generated robots.txt |
organization | schema.org Organization: legal_name, type, founding_date, contact_point, same_as |
product_schema | schema.org Drug defaults for catalogue entries |
breadcrumbs | Breadcrumb structured data |
verification | Search Console and similar meta tags |
analytics | Left empty. Nothing is loaded unless you fill it in |
theme_color | Browser UI colour |
site_url is the one that matters most. Canonicals, Open Graph URLs and the sitemap are all built from it, and shipping with the demo value means every canonical on your site points somewhere else.
lite.json
The manifest for the free edition: which home sections and which pages it ships, which are withheld, and the note shown where a withheld page would have been. You do not need this file unless you are producing a cut-down build of your own.
tokens/tokens.json
Colour, type scale, spacing, radius, shadow and breakpoints. Compiled to CSS custom properties by build-core.py. Full table in theming.