{ "schemaVersion": 1, "_about": "The single declaration authority for the kernel's node types, props, style rows, enum vocabularies, and opcodes. build.rs generates the Rust types, the wire codec, the style mask, and the schema digest from this file. Nothing here is hand-mirrored anywhere else; a second copy of any table is a defect. Prop 253 (fieldStyle) was retired by LLP 1104 r8, and prop 18 (hitSlop, which nothing read) for the `hit_slop_*` style rows; never reuse either number.", "nodeTypes": [ { "id": 0, "name": "View" }, { "id": 1, "name": "Text" }, { "id": 2, "name": "Image" }, { "id": 3, "name": "ScrollView" }, { "id": 4, "name": "List" }, { "id": 5, "name": "TextInput" }, { "id": 6, "name": "Pressable" }, { "id": 7, "name": "Svg" }, { "id": 8, "name": "Control", "_comment": "@ref LLP 1069.001 D2: a form control (`input type=checkbox`, with `switch`), a measured leaf whose size the host reports; its `type` prop says which widget it is." }, { "id": 9, "name": "NativeView" }, { "id": 10, "name": "Canvas" }, { "id": 11, "name": "WebView" }, { "id": 12, "name": "Video", "_comment": "@ref LLP 1042: HTML's `video`, and its `audio` (`semanticTag` audio, LLP 1042 §8): one media node, one player per host." }, { "id": 13, "name": "Head", "_comment": "@ref LLP 1048.003 D1: the document's metadata, never laid out or painted; hosts write it into the page's head, window or scene title." }, { "id": 14, "name": "SvgGroup", "_comment": "@ref LLP 1055 D1/D3: an SVG 2 element inside an `svg`; its subtree is outside box layout." }, { "id": 15, "name": "SvgPath" }, { "id": 16, "name": "SvgPolyline" }, { "id": 17, "name": "SvgPolygon" }, { "id": 18, "name": "SvgCircle" }, { "id": 19, "name": "SvgLine" }, { "id": 20, "name": "SvgRect" }, { "id": 21, "name": "SvgEllipse", "_comment": "@ref LLP 1055.000 D4: SVG 2 `ellipse`." }, { "id": 22, "name": "SvgViewport", "_comment": "@ref LLP 1055.000 D4: an `svg` inside an `svg`, a new SVG viewport; never a box." }, { "id": 23, "name": "SvgDefs", "_comment": "@ref LLP 1055.000 D3/D7/D8: SVG 2 `defs`, gradients, `stop`, `use` and `symbol`; referenced by id, never painted where they stand (a gradient or symbol)." }, { "id": 24, "name": "SvgLinearGradient" }, { "id": 25, "name": "SvgRadialGradient" }, { "id": 26, "name": "SvgStop" }, { "id": 27, "name": "SvgUse" }, { "id": 28, "name": "SvgSymbol" }, { "id": 29, "name": "SvgClipPath", "_comment": "@ref LLP 1055.000 D10: SVG 2 `clipPath`, referenced by `clip-path: url(#…)`, never painted." }, { "id": 30, "name": "SvgText", "_comment": "@ref LLP 1055.000 D11: SVG 2 `text` and `tspan`: runs shaped by the host, placed by the kernel's positioning." }, { "id": 31, "name": "SvgTSpan" }, { "id": 32, "name": "SvgMarker", "_comment": "@ref LLP 1055.000 D9: SVG 2 `marker`, drawn at the vertices of the shapes whose marker-start/mid/end name it, never where it stands." }, { "id": 33, "name": "SvgMask", "_comment": "@ref LLP 1055.000 D10: SVG 2 `mask`, rendered only through a `mask: url(#id)` reference, as an island on native hosts." }, { "id": 34, "name": "SvgPattern", "_comment": "@ref LLP 1055.000 D7: SVG 2 `pattern`, a paint server whose tile is its content, drawn only where a fill or stroke names it." }, { "id": 35, "name": "SvgForeignObject", "_comment": "@ref LLP 1055.000 D13, §8 ruling 5: SVG 2 `foreignObject`, real HTML inside an `svg` on the web; native hosts refuse it by name and draw nothing." }, { "id": 36, "name": "SvgFilter", "_comment": "@ref LLP 1055.000 D14: SVG 2 `filter`, applied only through a `filter: url(#id)` reference." }, { "id": 37, "name": "SvgFe", "_comment": "@ref LLP 1055.000 D14: a filter primitive or one of its children (feMergeNode, feFuncR/G/B/A, the lights); its tag is the `fe` prop." } ], "_propKinds": "str | bool | int (i64) | float (f64). `measure: true` marks props whose change invalidates a text leaf's intrinsic size.", "props": [ { "id": 0, "name": "text", "snapshot": "admit", "watch": "admit", "kind": "str", "measure": true }, { "id": 1, "name": "imageSource", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 2, "name": "placeholder", "watch": "admit", "kind": "str", "measure": true }, { "id": 3, "name": "accessibilityLabel", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 4, "name": "checked", "kind": "bool" }, { "id": 5, "name": "disabled", "kind": "bool" }, { "id": 6, "name": "showsScrollIndicator", "kind": "bool" }, { "id": 7, "name": "selectable", "kind": "bool" }, { "id": 8, "name": "groupedRowSeparator", "kind": "bool", "_comment": "@ref LLP 1084 D7: set by Contract, never written by an author, on each row of a grouped list's card (`contract/lower/src/grouped.rs`). The platform's separator under the row is decoration, not a border: drawn in the platform's colour (`grouped-separator`) from the row's content edge to `grouped-separator-end` before its trailing edge, under its children, taking no layout. `Kernel::grouped_separator` says where, and whether: not under the last row, and not where its author wrote the edge (`Kernel::row_separator`'s rule)." }, { "id": 9, "name": "lang", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 10, "name": "focusable", "kind": "bool" }, { "id": 11, "name": "testId", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 12, "name": "nativeId", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 13, "name": "tabIndex", "kind": "int" }, { "id": 14, "name": "href", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 15, "name": "type", "kind": "str" }, { "id": 16, "name": "editable", "kind": "bool" }, { "id": 17, "name": "value", "snapshot": "admit", "watch": "admit", "kind": "str", "measure": true }, { "id": 19, "name": "scrollLocked", "kind": "bool" }, { "id": 20, "name": "inert", "kind": "bool" }, { "id": 21, "name": "accessibilityRole", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 22, "name": "accessibilityHint", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 23, "name": "accessibilityValueText", "kind": "str" }, { "id": 24, "name": "accessibilityChecked", "kind": "bool" }, { "id": 25, "name": "accessibilitySelected", "kind": "bool" }, { "id": 26, "name": "accessibilityExpanded", "kind": "bool" }, { "id": 27, "name": "accessibilityDisabled", "kind": "bool" }, { "id": 28, "name": "accessibilityLive", "kind": "str" }, { "id": 29, "name": "accessibilityBusy", "kind": "bool" }, { "id": 30, "name": "accessibilityHeadingLevel", "snapshot": "admit", "watch": "admit", "kind": "int" }, { "id": 31, "name": "accessibilityElementsHidden", "snapshot": "admit", "watch": "admit", "kind": "bool" }, { "id": 32, "name": "accessibilityModal", "kind": "bool", "_comment": "@ref LLP 1080.003: ARIA `aria-modal`: while true, assistive technology reaches only this element's subtree among its siblings (iOS `accessibilityViewIsModal` while exposed; the web's `aria-modal`, which ARIA honours on a `dialog` or `alertdialog` role; macOS deferred)." }, { "id": 33, "name": "semanticTag", "kind": "str", "measure": true }, { "id": 34, "name": "nativeViewModuleName", "kind": "str" }, { "id": 35, "name": "nativeViewProps", "kind": "str" }, { "id": 36, "name": "scrollTop", "kind": "float" }, { "id": 37, "name": "virtualized", "kind": "bool" }, { "id": 39, "name": "inputMode", "kind": "str" }, { "id": 40, "name": "viewportFit", "kind": "str" }, { "id": 41, "name": "interactiveWidget", "kind": "str" }, { "id": 42, "name": "src", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 43, "name": "sandbox", "kind": "str" }, { "id": 44, "name": "id", "snapshot": "admit", "watch": "admit", "kind": "str" }, { "id": 45, "name": "popover", "kind": "str" }, { "id": 46, "name": "popovertarget", "kind": "str" }, { "id": 47, "name": "popovertargetaction", "kind": "str" }, { "id": 48, "name": "accessibilityKeyShortcuts", "kind": "str" }, { "id": 49, "name": "scrollFollowEnd", "kind": "bool" }, { "id": 50, "name": "keyboardDismissMode", "kind": "str" }, { "id": 51, "name": "navigationKey", "watch": "admit", "kind": "str" }, { "id": 52, "name": "navigationBack", "watch": "admit", "kind": "str" }, { "id": 53, "name": "contextTarget", "kind": "str" }, { "id": 54, "name": "backgroundMaterial", "kind": "str" }, { "id": 55, "name": "retainFocus", "kind": "bool" }, { "id": 56, "name": "swipeIndicator", "kind": "bool" }, { "id": 57, "name": "autocapitalize", "kind": "str" }, { "id": 58, "name": "autocorrect", "kind": "str" }, { "id": 59, "name": "scrollLeft", "kind": "float" }, { "id": 60, "name": "navigationPresentation", "kind": "str" }, { "id": 61, "name": "closedby", "kind": "str" }, { "id": 62, "name": "spellcheck", "kind": "str" }, { "id": 63, "name": "emojiPicker", "kind": "bool" }, { "id": 64, "name": "contextMagnify", "kind": "bool" }, { "id": 65, "name": "swipeContent", "kind": "str" }, { "id": 66, "name": "swipeLeading", "kind": "str" }, { "id": 67, "name": "swipeTrailing", "kind": "str" }, { "id": 68, "name": "destructive", "kind": "bool" }, { "id": 69, "name": "commandfor", "kind": "str" }, { "id": 70, "name": "command", "kind": "str" }, { "id": 71, "name": "navigationSource", "kind": "str" }, { "id": 72, "name": "navigationDetent", "kind": "str" }, { "id": 73, "name": "accessibilityOrientation", "kind": "str" }, { "id": 74, "name": "toolbarPlacement", "kind": "str" }, { "id": 75, "name": "heightDragFor", "kind": "str" }, { "id": 76, "name": "transformDragFor", "kind": "str" }, { "id": 77, "name": "reorderFor", "kind": "str" }, { "id": 78, "name": "listItemKey", "kind": "str" }, { "id": 79, "name": "estimatedItemHeight", "kind": "float" }, { "id": 208, "name": "estimatedItemWidth", "kind": "float" }, { "id": 215, "name": "initialItemCount", "kind": "float" }, { "id": 219, "name": "dataset", "kind": "str", "_comment": "@ref LLP 1075.003 §3.3: a node's data-* words as one JSON object of strings, keys sorted (the NativeProps opcode); data- attributes on the web, read by a native hatch." }, { "id": 220, "name": "navigationScroll", "kind": "str", "_comment": "@ref LLP 1075.003 §3.5: the HTML id of the route's content scroll view, resolved inside the route as its Back control is." }, { "id": 262, "name": "navigationSplit", "kind": "str", "_comment": "@ref LLP 1116.004 D1.2: on a stack's root route, \"none\" keeps a wide window's stack pushed, and a positive width (CSS px, points) is the list column's when the stack splits, splitting a list the host's rule does not find; unsaid, a list whose rows push splits at 320. @ref LLP 1116.006 D2: \"placeholder\" on a box in the root route is the detail pane's while nothing is selected, in place of the platform's; the lowerer makes it `display: none`, which the web shell overrides there." }, { "id": 221, "name": "accessibilityControls", "kind": "str", "_comment": "@ref LLP 1075.003 §3.7: aria-controls, the HTML id of the element a control controls; a tab names its tabpanel." }, { "id": 222, "name": "hatch", "kind": "str", "_comment": "@ref LLP 1075.003.000: the word naming a node the app's native code receives (its view and platform object); a hatched node leaves the host's fast path. data-hatch on the web." }, { "id": 214, "name": "scrollRestoration", "kind": "str" }, { "id": 223, "name": "scrollStart", "kind": "str", "_comment": "@ref LLP 1010 §6.5: `scroll-start` on a virtualized list, `start` (the default) or `end` — where it opens." }, { "id": 224, "name": "accessibilityPressed", "kind": "str", "_comment": "ARIA `aria-pressed` on a button: a toggle button's state, `true`, `false` or `mixed`; absent (or any other word), the button is no toggle. A bool expression is written as `true`/`false`." }, { "id": 81, "name": "accessibilityPosInSet", "kind": "int" }, { "id": 82, "name": "accessibilitySetSize", "kind": "int" }, { "id": 83, "name": "poster", "kind": "str" }, { "id": 84, "name": "autoplay", "kind": "bool" }, { "id": 85, "name": "controls", "kind": "bool" }, { "id": 86, "name": "loop", "kind": "bool" }, { "id": 87, "name": "muted", "kind": "bool" }, { "id": 88, "name": "preload", "kind": "str" }, { "id": 89, "name": "playsinline", "kind": "bool" }, { "id": 90, "name": "crossorigin", "kind": "str" }, { "id": 91, "name": "controlslist", "kind": "str" }, { "id": 92, "name": "disablepictureinpicture", "kind": "bool" }, { "id": 93, "name": "disableremoteplayback", "kind": "bool" }, { "id": 94, "name": "volume", "kind": "float" }, { "id": 95, "name": "playbackRate", "kind": "float" }, { "id": 96, "name": "currentTime", "kind": "float" }, { "id": 97, "name": "paused", "kind": "bool" }, { "id": 98, "name": "preservesPitch", "kind": "bool" }, { "id": 99, "name": "allowsPictureInPicturePlayback", "kind": "bool" }, { "id": 100, "name": "canStartPictureInPictureAutomaticallyFromInline", "kind": "bool" }, { "id": 101, "name": "entersFullScreenWhenPlaybackBegins", "kind": "bool" }, { "id": 102, "name": "exitsFullScreenWhenPlaybackEnds", "kind": "bool" }, { "id": 103, "name": "showsTimecodes", "kind": "bool" }, { "id": 104, "name": "allowsVideoFrameAnalysis", "kind": "bool" }, { "id": 105, "name": "requiresLinearPlayback", "kind": "bool" }, { "id": 106, "name": "preferredPeakBitRate", "kind": "float" }, { "id": 107, "name": "preferredForwardBufferDuration", "kind": "float" }, { "id": 108, "name": "automaticallyWaitsToMinimizeStalling", "kind": "bool" }, { "id": 109, "name": "preventsDisplaySleepDuringVideoPlayback", "kind": "bool" }, { "id": 110, "name": "playbackVisibilityThreshold", "kind": "float" }, { "id": 111, "name": "markup", "kind": "str", "measure": true }, { "id": 112, "name": "autofocus", "kind": "bool" }, { "id": 113, "name": "action", "kind": "str" }, { "id": 114, "name": "headTitle", "kind": "str" }, { "id": 115, "name": "headDescription", "kind": "str" }, { "id": 116, "name": "headImage", "kind": "str" }, { "id": 117, "name": "headCanonical", "kind": "str" }, { "id": 118, "name": "headRobots", "kind": "str" }, { "id": 119, "name": "scrollDocument", "kind": "bool" }, { "id": 120, "name": "headStatus", "kind": "int" }, { "id": 121, "name": "refreshing", "kind": "bool" }, { "id": 122, "name": "viewBox", "kind": "str", "_comment": "@ref LLP 1055 D1/D2: SVG 2 attributes CSS cannot set are props; the properties it can are style rows." }, { "id": 123, "name": "preserveAspectRatio", "kind": "str" }, { "id": 124, "name": "points", "kind": "str" }, { "id": 125, "name": "d", "kind": "str" }, { "id": 126, "name": "pathLength", "kind": "float" }, { "id": 129, "name": "x1", "kind": "str", "_comment": "@ref LLP 1055.000 D4: SVG length attributes CSS cannot set: the authored text (a number, a unit, or a percentage of the viewport), parsed by kernel/src/svg/length.rs." }, { "id": 130, "name": "y1", "kind": "str" }, { "id": 131, "name": "x2", "kind": "str" }, { "id": 132, "name": "y2", "kind": "str" }, { "id": 133, "name": "bitmapWidth", "kind": "int", "_comment": "@ref LLP 1056 D6 (r3): a canvas's explicit bitmap width, the web canvas `width` attribute; the bitmap is stretched to the content box." }, { "id": 134, "name": "bitmapHeight", "kind": "int" }, { "id": 135, "name": "fx", "kind": "str", "_comment": "@ref LLP 1055.000 D7: paint-server attributes CSS cannot set, as their authored text." }, { "id": 136, "name": "fy", "kind": "str" }, { "id": 137, "name": "fr", "kind": "str" }, { "id": 138, "name": "gradientUnits", "kind": "str" }, { "id": 139, "name": "gradientTransform", "kind": "str" }, { "id": 140, "name": "spreadMethod", "kind": "str" }, { "id": 141, "name": "offset", "kind": "str" }, { "id": 142, "name": "clipPathUnits", "kind": "str" }, { "id": 143, "name": "textX", "kind": "str", "_comment": "@ref LLP 1055.000 D11: SVG text's positioning attributes x, y, dx, dy, as authored (lists; one value in stage 5)." }, { "id": 144, "name": "textY", "kind": "str" }, { "id": 145, "name": "textDx", "kind": "str" }, { "id": 146, "name": "textDy", "kind": "str" }, { "id": 147, "name": "markerWidth", "kind": "str", "_comment": "@ref LLP 1055.000 D9: a marker's viewport, reference point, orientation and units, as authored." }, { "id": 148, "name": "markerHeight", "kind": "str" }, { "id": 149, "name": "refX", "kind": "str" }, { "id": 150, "name": "refY", "kind": "str" }, { "id": 151, "name": "orient", "kind": "str" }, { "id": 152, "name": "markerUnits", "kind": "str" }, { "id": 153, "name": "maskUnits", "kind": "str", "_comment": "@ref LLP 1055.000 D7, D10: a mask's and a pattern's units and a pattern's transform, as authored." }, { "id": 154, "name": "maskContentUnits", "kind": "str" }, { "id": 155, "name": "patternUnits", "kind": "str" }, { "id": 156, "name": "patternContentUnits", "kind": "str" }, { "id": 157, "name": "patternTransform", "kind": "str" }, { "id": 158, "name": "fe", "kind": "str", "_comment": "@ref LLP 1055.000 D14: a filter primitive's tag (`fe`), and its attributes as authored; `dx`, `dy`, `scale`, `x`, `y`, `z` lower to the fe*/light* names where a row or another prop has the plain name." }, { "id": 159, "name": "in", "kind": "str" }, { "id": 160, "name": "in2", "kind": "str" }, { "id": 161, "name": "result", "kind": "str" }, { "id": 162, "name": "stdDeviation", "kind": "str" }, { "id": 163, "name": "feDx", "kind": "str" }, { "id": 164, "name": "feDy", "kind": "str" }, { "id": 165, "name": "operator", "kind": "str" }, { "id": 166, "name": "k1", "kind": "str" }, { "id": 167, "name": "k2", "kind": "str" }, { "id": 168, "name": "k3", "kind": "str" }, { "id": 169, "name": "k4", "kind": "str" }, { "id": 170, "name": "mode", "kind": "str" }, { "id": 171, "name": "values", "kind": "str" }, { "id": 172, "name": "edgeMode", "kind": "str" }, { "id": 173, "name": "feRadius", "kind": "str" }, { "id": 174, "name": "tableValues", "kind": "str" }, { "id": 175, "name": "slope", "kind": "str" }, { "id": 176, "name": "intercept", "kind": "str" }, { "id": 177, "name": "amplitude", "kind": "str" }, { "id": 178, "name": "exponent", "kind": "str" }, { "id": 179, "name": "baseFrequency", "kind": "str" }, { "id": 180, "name": "numOctaves", "kind": "str" }, { "id": 181, "name": "seed", "kind": "str" }, { "id": 182, "name": "stitchTiles", "kind": "str" }, { "id": 183, "name": "feScale", "kind": "str" }, { "id": 184, "name": "xChannelSelector", "kind": "str" }, { "id": 185, "name": "yChannelSelector", "kind": "str" }, { "id": 186, "name": "feOrder", "kind": "str" }, { "id": 187, "name": "kernelMatrix", "kind": "str" }, { "id": 188, "name": "divisor", "kind": "str" }, { "id": 189, "name": "bias", "kind": "str" }, { "id": 190, "name": "targetX", "kind": "str" }, { "id": 191, "name": "targetY", "kind": "str" }, { "id": 192, "name": "preserveAlpha", "kind": "str" }, { "id": 193, "name": "surfaceScale", "kind": "str" }, { "id": 194, "name": "diffuseConstant", "kind": "str" }, { "id": 195, "name": "specularConstant", "kind": "str" }, { "id": 196, "name": "specularExponent", "kind": "str" }, { "id": 197, "name": "azimuth", "kind": "str" }, { "id": 198, "name": "elevation", "kind": "str" }, { "id": 199, "name": "lightX", "kind": "str" }, { "id": 200, "name": "lightY", "kind": "str" }, { "id": 201, "name": "lightZ", "kind": "str" }, { "id": 202, "name": "pointsAtX", "kind": "str" }, { "id": 203, "name": "pointsAtY", "kind": "str" }, { "id": 204, "name": "pointsAtZ", "kind": "str" }, { "id": 205, "name": "limitingConeAngle", "kind": "str" }, { "id": 206, "name": "filterUnits", "kind": "str" }, { "id": 207, "name": "primitiveUnits", "kind": "str" }, { "id": 209, "name": "accept", "kind": "str", "_comment": "@ref LLP 1069.002 D1: HTML's `accept` on `input type=file`, the MIME list as HTML writes it; absent, empty or */* picks any file. Specific types are bounded to image/video and the manifest's `file_handlers`." }, { "id": 210, "name": "multiple", "kind": "bool", "_comment": "@ref LLP 1069.002 D1: HTML's `multiple` on `input type=file`: the picker may return more than one file." }, { "id": 211, "name": "min", "kind": "str", "_comment": "@ref LLP 1069.001 D1: HTML's `min` on `input type=range` (a number) and the date types (an ISO value), as HTML writes it." }, { "id": 212, "name": "max", "snapshot": "admit", "watch": "admit", "kind": "str", "_comment": "@ref LLP 1069.001 D1: HTML's `max`, as `min`." }, { "id": 213, "name": "step", "kind": "str", "_comment": "@ref LLP 1069.001 D1: HTML's `step` on `input type=range` (a number, or `any`)." }, { "id": 216, "name": "glassGroup", "kind": "float", "_comment": "@ref LLP 1053.000.000 D1: the element's subtree is one Liquid Glass group whose glass begins to merge this many points apart (UIGlassContainerEffect, NSGlassEffectContainerView). Layout-neutral; drawn only on Apple 26+." }, { "id": 217, "name": "buttonStyle", "kind": "str", "measure": true, "styleable": true, "_comment": "@ref LLP 1069.011 D2: a native button's style, a name in `buttonStyles`. Absent, the platform's own default (LLP 1115.000 D15): plain tinted text on iOS, a push button on macOS, `bordered` on the web and the hosts that paint their own. Only on a `button` whose appearance is `auto`." }, { "id": 218, "name": "symbolEffectValue", "kind": "str", "_comment": "@ref LLP 1077 D12: a symbol's discrete effect (bounce, wiggle) plays each time this value changes, as SwiftUI's `.symbolEffect(_:value:)`." }, { "id": 225, "name": "listStyle", "kind": "str", "_comment": "@ref LLP 1084 D2: a grouped list's style, `inset-grouped`, `grouped` or `plain`; set by Contract on every `list` whose appearance is `auto` (UICollectionLayoutListConfiguration.Appearance on iOS)." }, { "id": 226, "name": "sharedElement", "kind": "str", "_comment": "@ref LLP 1013.000 D1: the node's shared-element name. A name that leaves one node and arrives at another in one commit is a handoff (CommitReceipt::handoffs); the arriver flies from the leaver's box." }, { "id": 227, "name": "rows", "kind": "int", "measure": true, "_comment": "HTML textarea preferred line count; absent or invalid, two. CSS height and field-sizing override intrinsic size." }, { "id": 228, "name": "maxlength", "kind": "int", "_comment": "HTML maximum user-entered UTF-16 length; absent or negative, unlimited. Programmatic value changes are not truncated." }, { "id": 229, "name": "target", "kind": "str", "_comment": "HTML's link `target`, `_blank` or `_self`: where the web opens a link's URL. Unset, a link to an absolute URL opens in a new browsing context, as the native hosts open it in the system browser (x2apps chat F11, hn-reader F3); natively a path navigates in the app and any other URL leaves it, whatever the target." }, { "id": 230, "name": "enterKeyHint", "kind": "str", "_comment": "HTML's `enterkeyhint` (feed F25): what a software keyboard's enter key says — enter, done, go, next, previous, search or send. The web writes the attribute; iOS sets the field's return key; a host with no software keyboard (macOS, Linux, a desktop browser) has nothing to label." }, { "id": 231, "name": "accessibilityInvalid", "kind": "str", "_comment": "ARIA `aria-invalid` (x2apps onboarding F22): `true`, `false`, `grammar` or `spelling`; a bool expression is written as `true`/`false`. AppKit serves WebKit's `AXInvalid`; UIKit has no such property, so iOS exposes none." }, { "id": 232, "name": "accessibilityDescribedBy", "kind": "str", "_comment": "ARIA `aria-describedby`: the HTML ids, space-separated, of the elements whose text describes this one (accname's description), after `aria-description`'s words. AppKit's `AXHelp`, UIKit's `accessibilityHint`." }, { "id": 233, "name": "accessibilityRequired", "kind": "bool", "_comment": "ARIA `aria-required` (x2apps onboarding F22): a field the form needs filled. AppKit's `AXRequired`; UIKit has no such property, so iOS exposes none." }, { "id": 234, "name": "accessibilityHasPopup", "kind": "str", "_comment": "ARIA `aria-haspopup` (x2apps spreadsheet F20): `false`, `true`, `menu`, `listbox`, `tree`, `grid` or `dialog`; a bool expression is written as `true`/`false`. AppKit serves Chromium's `AXHasPopup` and `AXPopupValue`; UIKit has no such property, so iOS exposes none." }, { "id": 235, "name": "accessibilityLabelledBy", "kind": "str", "_comment": "ARIA `aria-labelledby` (x2apps ledger2 Rough 3): the HTML ids, space-separated, of the elements whose text names this one; accname takes it before `aria-label`. AppKit's `AXTitle`/`accessibilityLabel`, UIKit's `accessibilityLabel`." }, { "id": 236, "name": "headEdited", "kind": "bool", "_comment": "`head edited` (LLP 1069.010 D6; studio diary R17): the document has unsaved changes. A declared deviation, the web having no unsaved mark: macOS sets the window's `isDocumentEdited` (the dot in its close button); other hosts show nothing." }, { "id": 237, "name": "title", "snapshot": "admit", "watch": "admit", "kind": "str", "_comment": "HTML's global `title` attribute on any element but `head` (whose `title` is `headTitle`): advisory text, the platform's tooltip (studio diary R24). The browser's own on the web, `NSView.toolTip` on macOS; touch hosts show none." }, { "id": 238, "name": "contextPopover", "kind": "str", "_comment": "LLP 1021 §5.1: the HTML `id` of the popover a node's context menu shows (a long press, a secondary click). iOS presents it as `UIContextMenuInteraction` (its menu rows the `UIMenu`, its `contextPreview` row the preview); macOS as an `NSMenu` at the click; the web opens the popover anchored to the node; Linux shows nothing. A declared deviation: HTML retired its `contextmenu` attribute." }, { "id": 239, "name": "contextPreview", "kind": "bool", "_comment": "LLP 1021 §5.1: this row of a context popover is the menu's preview (on iOS the preview controller's view, sized by its layout), not a menu item; its `press` is what tapping the preview does (UIKit's commit). Elsewhere it is an ordinary row." }, { "id": 240, "name": "accessibilityCurrent", "kind": "str", "_comment": "ARIA `aria-current` (Depot feedback, 2026-10-05): `page`, `step`, `location`, `date`, `time`, `true` or `false`, the current item of a set (a navigation link, a wizard's step); a bool expression is written as `true`/`false`. AppKit serves WebKit's `AXARIACurrent`; UIKit has no such property, so iOS exposes none." }, { "id": 241, "name": "reorderGroup", "kind": "str", "_comment": "@ref LLP 1094 D1: SortableJS's `group` name on a vertical `list virtualized=true` with a `reorderdrop` and an `id`: the mounted lists of one session sharing a non-empty value exchange rows, the drop firing once on the target list's `reorderdrop`." }, { "id": 242, "name": "focusGuide", "kind": "str", "_comment": "`focusGuide=\"auto\"` on a container: on tvOS a focus guide over its box sends a remote move that enters it from outside to the descendant that last held the focus, else its first focusable one (react-native-tvos TVFocusGuideView `autoFocus`). Other hosts ignore it; their Tab order is sequential." }, { "id": 243, "name": "name", "kind": "str", "_comment": "HTML's `name` on `input type=radio` (x2apps survey #2): its radio button group. The radios of one non-empty name in one window are exclusive, and the arrow keys move the check among them in tree order; a radio with none is a group of its own." }, { "id": 244, "name": "mediaTitle", "kind": "str", "_comment": "@ref LLP 1098 D1: `metadata=MediaMetadata(…)`'s `title` on an `audio` or `video`, which makes the element a media session claimant. The web's `navigator.mediaSession.metadata`, Apple's `MPNowPlayingInfoCenter`; Linux and Windows keep the record." }, { "id": 245, "name": "mediaArtist", "kind": "str", "_comment": "@ref LLP 1098 D1: `MediaMetadata`'s `artist`." }, { "id": 246, "name": "mediaAlbum", "kind": "str", "_comment": "@ref LLP 1098 D1: `MediaMetadata`'s `album`." }, { "id": 247, "name": "mediaArtwork", "kind": "str", "_comment": "@ref LLP 1098 D1: `MediaMetadata`'s `artwork`, one image's source as authored (an `https:` URL or an app asset path); a host resolves it only where it publishes." }, { "id": 248, "name": "seekbackwardOffset", "kind": "float", "_comment": "@ref LLP 1098 D2: the seconds a `seekbackward` moves when the platform gives no `seekOffset` (default 10), and what Apple's lock screen shows (`skipBackwardCommand.preferredIntervals`)." }, { "id": 249, "name": "seekforwardOffset", "kind": "float", "_comment": "@ref LLP 1098 D2: `seekbackwardOffset`'s twin for `seekforward`." }, { "id": 250, "name": "colorSpace", "kind": "str", "_comment": "LLP 1100 D12a: getContext's `colorSpace`, `srgb` (default) or `display-p3`." }, { "id": 251, "name": "colorType", "kind": "str", "_comment": "LLP 1100 D12a: getContext's `colorType`, `unorm8` (default) or `float16`." }, { "id": 252, "name": "autocomplete", "kind": "str", "_comment": "HTML's `autocomplete` on an input or textarea (LLP 1102 §3.6): the web writes the attribute; iOS and macOS set the field's text content type from its last field token (`email`, `username`, `current-password`, `new-password`, `one-time-code`, `name`, `tel`, `postal-code`, ...), over the one `type` implies; `off` clears it; a token the platform has no type for leaves `type`'s." }, { "id": 254, "name": "statusBarStyle", "kind": "str", "_comment": "@ref LLP 1105 D1: the status bar's text, `light-content`, `dark-content` or `auto`, bound to state. iOS resolves one from what covers the bar (D2, D3); other hosts ignore it." }, { "id": 255, "name": "statusBarAnimation", "kind": "str", "_comment": "@ref LLP 1105 D1: `none` (default) or `fade`, the change to this node's `statusBarStyle`." }, { "id": 256, "name": "accessibilityValueNow", "kind": "str", "_comment": "@ref LLP 1116 D8: ARIA's `aria-valuenow`, a range role's current value (`progressbar`, `slider`, `meter`, `scrollbar`, `spinbutton`), a number as HTML writes it. With `aria-valuemin` and `aria-valuemax` (ARIA's defaults 0 and 100) it is the value each platform's accessibility hears: the DOM's attribute, UIKit's `accessibilityValue` as a percentage, AppKit's value with its minimum and maximum. `aria-valuetext` (`accessibilityValueText`) is spoken instead where it is set." }, { "id": 257, "name": "accessibilityValueMin", "kind": "str", "_comment": "@ref LLP 1116 D8: ARIA's `aria-valuemin`, as `accessibilityValueNow`." }, { "id": 258, "name": "accessibilityValueMax", "kind": "str", "_comment": "@ref LLP 1116 D8: ARIA's `aria-valuemax`, as `accessibilityValueNow`." }, { "id": 259, "name": "navigationBar", "kind": "str", "_comment": "@ref LLP 1115.000 D5.2: a route's say over the platform's navigation bar, `none` (a full-bleed screen: no bar, and the edge swipe still pops), `transparent` (the bar as `auto` has it, drawn clear at the top of the route's scroller, whose content starts under it as under a fixed transparent header on the web: a hero photo bleeds to the top, and the bar's material comes as the content scrolls) or `auto` (the default: the route's header as the bar, else the system Back alone on a pushed route). iOS reads it; hosts with no bar of their own ignore it." }, { "id": 260, "name": "intersectMargin", "kind": "str", "_comment": "LLP 1005 intersection visibility: literal IntersectionObserver rootMargin, default 0px; an observer option, not CSS layout." }, { "id": 261, "name": "menuPlacement", "kind": "str", "_comment": "LLP 1021 §5.3: -exact-menu on a button, a literal about|app|file|edit|view|go|window|help|none, `dock` beside one or alone, or `status` alone (LLP 1133.025 D4, D5). AppKit projects the button into that menu, with or without a chord (none: no item, the chord kept), and `dock` into the Dock menu; `status` is the app's status item on macOS and its notification-area icon on Windows. Other hosts retain the ordinary button. No layout effect." }, { "id": 263, "name": "menuRemove", "kind": "str", "_comment": "@ref LLP 1021 §5.3: root -exact-menu-remove, a literal whitespace-separated list of standard AppKit menu item ids, and status-quit, the host's quit item ending a status menu (LLP 1133.025 D7). Other hosts ignore this presentation hint." }, { "id": 264, "name": "listRows", "kind": "bool", "_comment": "@ref LLP 1115.000 D16: the list's rows are cells. Set by Contract, never written by an author, on every `list` whose rows go down the page and whose `appearance` is unsaid (`contract/lower/src/cells.rs` is the rule): each child of the list is then a row its platform draws as its own list's, with the platform's separator and press. Absent on `appearance=\"none\"` (the author's rows), on the grouped form (`listStyle`), and on a list that lays its items out sideways." }, { "id": 265, "name": "disabledStyled", "kind": "bool", "_comment": "@ref LLP 1115.000 D6 (2026-10-13, Charlie's ruling): the node styles its own disabled state, so no host lays the default disabled dim over it. Set by Contract, never written by an author (`contract/lower/src/disabled_look.rs` is the rule): a node with `disabled` that writes `opacity`, or a colour, background, border colour or filter whose expression reads a name its `disabled` reads." }, { "id": 266, "name": "navigationGrabber", "kind": "str", "_comment": "@ref LLP 1115 §2 (what the author writes wins): a sheet route's grabber, `visible`, `hidden` or `auto` (the default: the platform's, shown on a sheet with several detents, as the HIG puts one on a resizable sheet). UIKit's `prefersGrabberVisible`, SwiftUI's `presentationDragIndicator`; iOS reads it, hosts whose sheets have no grabber ignore it." }, { "id": 267, "name": "accessibilityAtomic", "kind": "bool", "_comment": "@ref LLP 1116.018 D3: WAI-ARIA's `aria-atomic`, whether a live region is announced whole. The web hosts write it; the Apple and Linux hosts announce a live region's whole text already, so `true` holds there and `false` is announced whole too (a declared deviation)." }, { "id": 268, "name": "wakelock", "kind": "str", "_comment": "@ref LLP 1125 D11: `screen` or `none` (the default), on any element. While any node that is mounted and displayed (neither it nor an ancestor `display: none`, nor under a route its navigation hides) says `screen`, the display does not dim or lock for idleness; `exact_runner::wakelock` is the rule every host reads." }, { "id": 269, "name": "midiInputs", "kind": "str", "_comment": "@ref LLP 1125 D8: the MIDI inputs an element with a `midimessage` handler hears, by `MIDIPort.id`, newline-joined from the `string[]` the author writes as `midiinputs=`. The runner reads it (`exact_runner::midi`) to open inputs and choose each message's handlers; no presenter draws it." }, { "id": 270, "name": "fontShorthand", "kind": "bool", "_comment": "@ref LLP 1115.000 D12.2: the node's text style was named through the `font` shorthand (or a type token), which resets the weight and the leading as CSS's shorthand does, so the style's beat an inherited `font-weight` and `line-height`; a bare `font-size` naming a style fills only what nothing above says. Set by Contract, never written by an author (`contract/lower/src/shorthands.rs`)." }, { "id": 271, "name": "navigationInitialDetent", "kind": "str", "_comment": "@ref LLP 1115 §2 (what the author writes wins): the word of a sheet route's `navigationDetent` the sheet opens at; unsaid, the first (the shortest), as UIKit opens a sheet at its smallest detent. UIKit's `selectedDetentIdentifier`, React Navigation's `sheetInitialDetentIndex`; iOS reads it when the detents are set, hosts whose sheets have one height ignore it." }, { "id": 272, "name": "datetime", "snapshot": "admit", "watch": "admit", "kind": "float", "_comment": "@ref LLP 1126 D6: the time element’s instant in epoch milliseconds." }, { "id": 273, "name": "timeFormat", "snapshot": "admit", "watch": "admit", "kind": "str", "_comment": "@ref LLP 1126 D6: the time element’s named presentation." }, { "id": 274, "name": "start", "snapshot": "admit", "watch": "admit", "kind": "float", "_comment": "@ref LLP 1126 D6: the progress interval’s start instant in epoch milliseconds." }, { "id": 275, "name": "end", "snapshot": "admit", "watch": "admit", "kind": "float", "_comment": "@ref LLP 1126 D6: the progress interval’s end instant in epoch milliseconds." }, { "id": 276, "name": "textReservation", "kind": "str", "measure": true, "_comment": "@ref LLP 1126 D6: newline-separated host-formatted width candidates written by the runner, never an author." }, { "id": 277, "name": "decorations", "kind": "str", "_comment": "@ref LLP 1114.007: a plain textarea's paint-only TextDecorations record as named JSON: the value it was computed for and its spans, UTF-16 ranges each naming a `decoration`. The value is part of the record's identity, so an equal span list for new text is still sent. Never measured: a decoration moves no line break." }, { "id": 278, "name": "decorationStyles", "kind": "str", "_comment": "@ref LLP 1114.007: the compiler's table of the `decoration` declarations visible in the textarea's source file, by name, each a list of [style id, literal] rows of the properties `::highlight()` admits. Not an authored attribute." }, { "id": 279, "name": "alertPart", "kind": "str", "_comment": "The part of an alert (an alert-shaped `dialog role=\"alertdialog\"`) a child is: `title` (its first text, when it has no `aria-label`), `message` (the box of its texts) or `actions` (the box of its buttons), so a host that draws the alert can scroll a long message while the title and buttons stay in view; a host that presents the platform's alert reads through the boxes. The compiler's, never authored." }, { "id": 280, "name": "defaultSurface", "kind": "bool", "_comment": "@ref LLP 1021 (theme2 2026-10-21 18:45, 19:55): the compiler's mark on a `popover` whose author wrote no surface (no background, border, box-shadow or `backgroundMaterial`, on it or its class). A host that paints the popover itself draws the platform's default popover surface under it (iOS: UIKit's popover glass, its corner the metrics' `popover-radius`; before iOS 26 the glass's ultra-thin stand-in with that corner and shadow, unmeasured against the pre-glass popover since no older runtime was installed); the web keeps the UA's popover style, the Mac its system popover, and a popover presented as a menu ignores it. Never authored." }, { "id": 281, "name": "groupedAction", "kind": "bool", "_comment": "@ref LLP 1116.019 D6: whether a grouped list's button row is an action cell, in the platform's action ink. Set by Contract's grouped sheet, never written by an author (`contract/lower/src/grouped.rs` `ink`): the sheet decides from the source, which sees every state of an `if` or a choice row, where the shown children see one. Absent on a row the sheet does not judge (no `button`), where the kernel reads the row's shape (`GroupedRow::action`)." }, { "id": 282, "name": "partition", "kind": "str", "_comment": "@ref LLP 1020.002 D1: an `iframe`'s partition: `persist:` stores across launches, `` in memory for the session; the guest is a top-level page with that partition's cookies and storage. Ignored on the web (`exactPage().iframePartition` is false there)." }, { "id": 283, "name": "appleAllowsBackForwardNavigationGestures", "kind": "bool", "_comment": "@ref LLP 1020.002 §9: `apple.allowsBackForwardNavigationGestures=` on an `iframe`, `WKWebView`'s property of that name; inert elsewhere." }, { "id": 284, "name": "appleAllowsMagnification", "kind": "bool", "_comment": "@ref LLP 1020.002 §9: `apple.allowsMagnification=` on an `iframe`, macOS `WKWebView`'s property of that name; inert elsewhere." }, { "id": 285, "name": "appleInactiveSchedulingPolicy", "kind": "str", "_comment": "@ref LLP 1020.002 §9: `apple.inactiveSchedulingPolicy=` on an `iframe`, `WKPreferences.inactiveSchedulingPolicy`: `suspend`, `throttle` or `none` (none of which lifts WebKit's clamp of a hidden page's timers); inert elsewhere." }, { "id": 286, "name": "atoms", "kind": "str", "measure": true, "_comment": "@ref LLP 1045.000 D1, D3: the inline atom kinds a `markup=\"markdown\"` text or textarea recognizes, the compiler's table of the `atom` declarations its `atoms` names, as JSON `[{name, link | prefix, role}]` (`link` a scheme with its colon, or `relative`). Not an authored value." }, { "id": 287, "name": "atomStyles", "kind": "str", "_comment": "@ref LLP 1045.000 D3: the paint of the atom kinds in `atoms`, by kind name, each a list of [style id, literal] rows of `color` and `background-color`, as `decorationStyles` carries a decoration's. Paint only: never measured." }, { "id": 288, "name": "atomFaces", "kind": "str", "measure": true, "_comment": "@ref LLP 1045.000 D2: the app's `AtomFace` records as named JSON `[{source, label, icon, title, color, backgroundColor, direction, ariaLabel}]`, keyed by each atom's whole source text, each colour the runner's wire text (`bridge::atom_face_paint`; on the JS target, what `atomFacesRecord` takes), empty where the kind's paint stands. Measured: a label changes a pill's width." }, { "id": 289, "name": "reachMargin", "kind": "str", "_comment": "@ref LLP 1145 D4: `reach-margin` on a virtualized list, a literal one or two nonnegative px or % lengths (before, after; % of the port along the list's axis), default 100%: how far past the port its edge row may be when `reachstart` or `reachend` fires. The runner reads it (and the JS target's list.js); not layout." }, { "id": 290, "name": "orientationlock", "kind": "str", "_comment": "@ref LLP 1133.029 D1: an orientation lock on any element, a Screen Orientation API `OrientationLockType` (`portrait`, `landscape`, their `-primary` and `-secondary`, `natural`, `any`), `current` (the window's orientation when the lock begins) or `none` (the default). Held while the element is mounted and displayed and outside every `dialog` and popover; `exact_runner::orientation` decides which holders count and what the session's lock is." }, { "id": 291, "name": "keepMounted", "kind": "str", "_comment": "@ref LLP 1010 §6.11: `keep-mounted` on a virtualized list, a list of row keys (each a string, number or bool, or an option of one; `none` names no row), at most 64: the rows it keeps mounted wherever its window is. The runner reads the value (and the JS target's list.js); the row holds the keys as JSON. Not layout." }, { "id": 292, "name": "menuKeys", "kind": "str", "_comment": "@ref LLP 1021 §5.3.3: root -exact-menu-keys, a literal whitespace-separated list of id=chord, where id is close-window (File ▸ Close Window) and chord is one aria-keyshortcuts chord with Meta that is not a standard one, or none. AppKit gives that item the chord, or no chord. Other hosts ignore this presentation hint." }, { "id": 293, "name": "paragraphDirs", "kind": "str", "_comment": "@ref LLP 1045 D11: a Markdown editor's base direction, one word per source line: HTML's `dir` words (`ltr`, `rtl`, `auto`) separated by white space, the first word the first line's; a line past the last word takes the last. Read where the editor draws its lines (markup-editor.js, Apple's MarkupDirections). Not measured: a base direction changes no line's length." }, { "id": 294, "name": "accessibilitySort", "kind": "str", "_comment": "ARIA `aria-sort` on a `columnheader` or `rowheader`: `ascending`, `descending`, `none` or `other`, the order its table's rows are sorted by that column (WAI-ARIA 1.2 §6.7). The DOM attribute on the web; AppKit and UIKit have no such property on a view, so the Apple hosts expose none." }, { "id": 295, "name": "colSpan", "kind": "int", "_comment": "@ref LLP 1153 D7: HTML's `colspan` on a `th` or `td` (`semanticTag`), the columns the cell covers; unset is 1, and the kernel reads a value below 1 as 1 and above 1000 as 1000, as HTML's parser does. The DOM attribute on the web; a native host's kernel places the cell by HTML's table-forming algorithm (`layout/table.rs`)." }, { "id": 296, "name": "rowSpan", "kind": "int", "_comment": "@ref LLP 1153 D7: HTML's `rowspan` on a `th` or `td`, the rows the cell covers; unset or negative is 1, 0 is the rest of its row group (HTML §4.9.11) and above 65534 is 65534. As `colSpan`." }, { "id": 297, "name": "scope", "kind": "str", "_comment": "@ref LLP 1153 D7: HTML's `scope` on a `th`: `col` makes it its column's header (ARIA `columnheader`), `row` its row's (`rowheader`). The DOM attribute on the web; the native hosts' role." }, { "id": 298, "name": "navigationHistory", "kind": "str", "_comment": "@ref LLP 1115.000 D5.5: the ways through history the navigation root offers now, `back`, `forward`, both (`back forward`, the default) or `none`. The Mac reads it: a way not offered is no swipe AppKit tracks, no `historyswipe`, and no Go ▸ Back or Forward, mouse side button or agent `back`. The web's history is the browser's, and other hosts ignore it." }, { "id": 299, "name": "returnPresses", "kind": "str", "_comment": "@ref LLP 1115.000 D7.3: `-exact-return-presses` on a container, `descendants` or `none` (the default). Under `descendants` the Mac presses a focused pressable descendant on Return as on Space, before a dialog's default button, as Chromium presses a focused `