{
"id": "place.mode.standard.defs",
"defs": {
"aspects": {
"type": "object",
"properties": {
"color": {
"ref": "lex:place.mode.standard.defs#colorAspect",
"type": "ref",
"description": "The color aspect (21 intents). Optional, but complete when present."
},
"typography": {
"ref": "lex:place.mode.standard.defs#typographyAspect",
"type": "ref",
"description": "The typography aspect (12 text intents). Optional, but complete when present."
}
},
"description": "A theme's renderable style, grouped by aspect. Each aspect is optional but complete when present; a theme SHOULD carry at least one."
},
"textIntent": {
"type": "object",
"required": [
"size",
"weight",
"family",
"lineHeight"
],
"properties": {
"size": {
"type": "string",
"maxLength": 128,
"description": "A valid CSS <length-percentage> font size (e.g. '1.25rem')."
},
"family": {
"type": "string",
"maxLength": 256,
"description": "A CSS font-family value; should match a `family` in the theme's `fonts` array."
},
"weight": {
"type": "string",
"maxLength": 128,
"description": "A valid CSS <font-weight> (e.g. '400', '600')."
},
"lineHeight": {
"type": "string",
"maxLength": 128,
"description": "A valid CSS line-height value (e.g. '1.4')."
}
},
"description": "Typography metrics for a single text priority. Color is intentionally excluded (it belongs to the containing surface)."
},
"colorAspect": {
"type": "object",
"required": [
"control",
"action",
"surface"
],
"properties": {
"action": {
"ref": "lex:place.mode.standard.defs#actionPriorities",
"type": "ref",
"description": "Interactive element (button/link) color, by priority."
},
"control": {
"ref": "lex:place.mode.standard.defs#colorIntent",
"type": "ref",
"description": "Form fields. No priority — all controls are peers."
},
"surface": {
"ref": "lex:place.mode.standard.defs#surfacePriorities",
"type": "ref",
"description": "Non-interactive container (surface) color, by how far above the page the surface sits."
}
},
"description": "The complete color aspect of a theme: control + action + surface (21 intents)."
},
"colorIntent": {
"type": "object",
"required": [
"background",
"foreground",
"border"
],
"properties": {
"border": {
"type": "string",
"maxLength": 128,
"description": "Any valid CSS <color> for the element's border."
},
"background": {
"type": "string",
"maxLength": 128,
"description": "Any valid CSS <color> for the element's background."
},
"foreground": {
"type": "string",
"maxLength": 128,
"description": "Any valid CSS <color> for the element's foreground (text/icon)."
}
},
"description": "The three color values for a single intent (a purpose, or a purpose+priority)."
},
"fontDescriptor": {
"type": "object",
"required": [
"family"
],
"properties": {
"src": {
"type": "string",
"maxLength": 1024,
"description": "A URL to the font file, or a CSS `src` value (e.g. 'url(https://...) format(woff2)'). Alternative to `file`."
},
"file": {
"type": "blob",
"accept": [
"font/woff2",
"font/woff",
"font/ttf",
"font/otf",
"application/octet-stream"
],
"maxSize": 5000000,
"description": "A font file stored as a blob on the author's PDS. Takes precedence over `src` when both are present."
},
"style": {
"type": "string",
"maxLength": 32,
"description": "CSS font-style descriptor (e.g. 'normal', 'italic', 'oblique 0deg 20deg')."
},
"family": {
"type": "string",
"maxLength": 256,
"description": "The font-family name as it should appear in CSS (e.g. 'Inter')."
},
"weight": {
"type": "string",
"maxLength": 32,
"description": "CSS font-weight descriptor or range (e.g. '400', '100 900')."
},
"display": {
"type": "string",
"maxLength": 32,
"description": "CSS font-display descriptor (e.g. 'swap', 'fallback')."
},
"stretch": {
"type": "string",
"maxLength": 64,
"description": "CSS font-stretch/font-width descriptor or range (e.g. 'normal', '75% 125%')."
},
"unicodeRange": {
"type": "string",
"maxLength": 2048,
"description": "CSS unicode-range descriptor (e.g. 'U+0000-00FF, U+0131'). Lets several entries share one `family` for subsetting."
}
},
"description": "One @font-face declaration. Only `family` is schema-required; a source (`src` or `file`) is required by the standard."
},
"textPriorities": {
"type": "object",
"required": [
"primary",
"secondary",
"auxiliary"
],
"properties": {
"primary": {
"ref": "lex:place.mode.standard.defs#textIntent",
"type": "ref",
"description": "Headlines and titles."
},
"auxiliary": {
"ref": "lex:place.mode.standard.defs#textIntent",
"type": "ref",
"description": "Detail and help: captions, hints, legal."
},
"secondary": {
"ref": "lex:place.mode.standard.defs#textIntent",
"type": "ref",
"description": "Body copy — the text a page is mostly made of."
}
},
"description": "The three Mise en Mode priorities for `text`, counting down from the text that claims most of a reader's attention to the text that claims least."
},
"actionPriorities": {
"type": "object",
"required": [
"primary",
"secondary",
"auxiliary"
],
"properties": {
"primary": {
"ref": "lex:place.mode.standard.defs#colorIntent",
"type": "ref",
"description": "The one thing the screen most wants you to do."
},
"auxiliary": {
"ref": "lex:place.mode.standard.defs#colorIntent",
"type": "ref",
"description": "The quietest choice."
},
"secondary": {
"ref": "lex:place.mode.standard.defs#colorIntent",
"type": "ref",
"description": "A supporting choice."
}
},
"description": "The three Mise en Mode priorities for `action`, counting down from the thing a screen most wants you to do to the thing it least insists on."
},
"typographyAspect": {
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"ref": "lex:place.mode.standard.defs#textPriorities",
"type": "ref",
"description": "Typography by priority."
}
},
"description": "The typography aspect of a theme: text (12 intents), complete when present."
},
"surfacePriorities": {
"type": "object",
"required": [
"primary",
"secondary",
"auxiliary"
],
"properties": {
"primary": {
"ref": "lex:place.mode.standard.defs#colorIntent",
"type": "ref",
"description": "A surface that interrupts the page: modal, dialog, alert, sheet."
},
"auxiliary": {
"ref": "lex:place.mode.standard.defs#colorIntent",
"type": "ref",
"description": "The page itself — the layer everything else sits on."
},
"secondary": {
"ref": "lex:place.mode.standard.defs#colorIntent",
"type": "ref",
"description": "A surface over the page, not instead of it: flyout, menu, card."
}
},
"description": "The three Mise en Mode priorities for `surface`, counting down from the layer that claims most of a reader's attention to the one that claims least. Because priority counts down, the page is `auxiliary` and not `primary`: a page is what a modal interrupts."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}