joule-ui takes in OpenUI Lang 1.0 the way it takes in A2UI: a model writes a surface as a program, one widget a line, and joule-ui-lang builds a widget tree against the host's registry as the program streams. After every chunk a snapshot holds the tree as far as it can be built, each widget checked by joule-ui's own validate, and every error with its source line and reason code. State, queries, operators, conditionals, built-in functions and sequences of actions are parsed and refused not-declarative. A canonical writer turns a tree back into the language; it parses back to the same tree. - joule-ui-core: WidgetSchema::positional, the order a positional call passes props in (SPEC §3); absent from the wire form when undeclared. - joule-ui-interaction: begin_interaction and Pending::finish, the lifecycle's three phases in two steps for a host whose handler is asynchronous (SPEC §6); run_interaction is built on them and seals what it sealed before. - conformance/lang/v1: L1 statements, L2 ingest, L3 streaming, L4 the canonical form, L5 refusals, with an independent Python verifier written from §11. - docs/create.md: the design of Create. Co-Authored-By: Claude Opus 5.5 <[email protected]>
178 lines
3.3 KiB
JSON
178 lines
3.3 KiB
JSON
{
|
|
"root": "Page",
|
|
"widgets": {
|
|
"Button": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "a button",
|
|
"name": "Button",
|
|
"positional": [
|
|
"label",
|
|
"action",
|
|
"primary"
|
|
],
|
|
"props": {
|
|
"action": {
|
|
"required": false,
|
|
"ty": "action"
|
|
},
|
|
"label": {
|
|
"required": true,
|
|
"ty": "text"
|
|
},
|
|
"primary": {
|
|
"required": false,
|
|
"ty": "bool"
|
|
}
|
|
}
|
|
},
|
|
"Card": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "any"
|
|
},
|
|
"description": "a titled container",
|
|
"name": "Card",
|
|
"positional": [
|
|
"title",
|
|
"children",
|
|
"subtitle"
|
|
],
|
|
"props": {
|
|
"subtitle": {
|
|
"required": false,
|
|
"ty": "text"
|
|
},
|
|
"title": {
|
|
"required": true,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Chart": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "a chart of values",
|
|
"name": "Chart",
|
|
"positional": [
|
|
"labels",
|
|
"values",
|
|
"options"
|
|
],
|
|
"props": {
|
|
"labels": {
|
|
"required": true,
|
|
"ty": "list"
|
|
},
|
|
"options": {
|
|
"required": false,
|
|
"ty": "object"
|
|
},
|
|
"values": {
|
|
"required": true,
|
|
"ty": "list"
|
|
}
|
|
}
|
|
},
|
|
"Note": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "any"
|
|
},
|
|
"description": "a note",
|
|
"name": "Note",
|
|
"positional": [
|
|
"author",
|
|
"body",
|
|
"children"
|
|
],
|
|
"props": {
|
|
"author": {
|
|
"required": false,
|
|
"ty": "text"
|
|
},
|
|
"body": {
|
|
"required": true,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Page": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "any"
|
|
},
|
|
"description": "the page",
|
|
"name": "Page",
|
|
"positional": [
|
|
"children",
|
|
"title"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": false,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Tab": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "any"
|
|
},
|
|
"description": "one tab",
|
|
"name": "Tab",
|
|
"positional": [
|
|
"title",
|
|
"children"
|
|
],
|
|
"props": {
|
|
"title": {
|
|
"required": true,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
},
|
|
"Tabs": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "only_of",
|
|
"value": [
|
|
"Tab"
|
|
]
|
|
},
|
|
"description": "a strip of tabs",
|
|
"name": "Tabs",
|
|
"positional": [
|
|
"children"
|
|
],
|
|
"props": {}
|
|
},
|
|
"Text": {
|
|
"allow_extra_props": false,
|
|
"children": {
|
|
"kind": "none"
|
|
},
|
|
"description": "a run of text",
|
|
"name": "Text",
|
|
"positional": [
|
|
"text",
|
|
"size"
|
|
],
|
|
"props": {
|
|
"size": {
|
|
"required": false,
|
|
"ty": "number"
|
|
},
|
|
"text": {
|
|
"required": true,
|
|
"ty": "text"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|