open-standards/wai/wai-app/widgets/library.json
Transaction Science 1ec418dfaa The widget registry publishes a catalogue and a library from one source
joule-ui-a2ui writes any registry as a JSON Schema of the nodes its ingest
takes, refuses a registry that declares what no node can state, and holds a
catalogue to a registry through the validated ingest. joule-ui-lang writes a
library as a file. wai-app calls both on its registry; its two files are
committed under widgets/, and tests/exports.rs fails while they differ from it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 03:08:05 -05:00

247 lines
6.3 KiB
JSON

{
"root": "App",
"widgets": {
"App": {
"allow_extra_props": false,
"children": {
"kind": "only_of",
"value": [
"Room",
"WatchTogether",
"Show",
"Text",
"Receipts",
"EnergyMeter"
]
},
"description": "The app: its title and what it holds. An app holds one room (a Room, a WatchTogether or a Show), and text, receipts and an energy meter beside it.",
"name": "App",
"positional": [
"children",
"title"
],
"props": {
"title": {
"required": false,
"ty": "text"
}
}
},
"Chat": {
"allow_extra_props": false,
"children": {
"kind": "none"
},
"description": "The room's chat: each message a signed event, verified before it is shown. Those who joined write; those who watch read.",
"name": "Chat",
"positional": [
"title"
],
"props": {
"title": {
"required": false,
"ty": "text"
}
}
},
"EnergyMeter": {
"allow_extra_props": false,
"children": {
"kind": "none"
},
"description": "What each action cost in energy, and how the figure was obtained (a page has no meter, so its figures are estimates, labelled so).",
"name": "EnergyMeter",
"positional": [
"title"
],
"props": {
"title": {
"required": false,
"ty": "text"
}
}
},
"Participants": {
"allow_extra_props": false,
"children": {
"kind": "none"
},
"description": "Who is in the room now, from the room's signed lifecycle.",
"name": "Participants",
"positional": [
"title"
],
"props": {
"title": {
"required": false,
"ty": "text"
}
}
},
"Player": {
"allow_extra_props": false,
"children": {
"kind": "none"
},
"description": "The room's video: each participant's camera laid out from the room's signed record, every frame checked before it is shown.",
"name": "Player",
"positional": [
"title"
],
"props": {
"title": {
"required": false,
"ty": "text"
}
}
},
"Poll": {
"allow_extra_props": false,
"children": {
"kind": "none"
},
"description": "A vote in a Show: the lead opens it, each viewer chooses one option, and the room's clock closes it and signs the result. `options` is a list of 2 to 32 texts; `seconds` how long it stays open (5 to 300; 30 when left out).",
"name": "Poll",
"positional": [
"question",
"options",
"seconds"
],
"props": {
"options": {
"required": true,
"ty": "list"
},
"question": {
"required": true,
"ty": "text"
},
"seconds": {
"required": false,
"ty": "number"
}
}
},
"Receipts": {
"allow_extra_props": false,
"children": {
"kind": "none"
},
"description": "This page's receipts: every action a person takes here is sealed into a hash-chained log this page signs and verifies, and the room's objects checked against their receipts are counted.",
"name": "Receipts",
"positional": [
"title"
],
"props": {
"title": {
"required": false,
"ty": "text"
}
}
},
"Room": {
"allow_extra_props": false,
"children": {
"kind": "only_of",
"value": [
"Player",
"Chat",
"Participants",
"Receipts",
"EnergyMeter",
"Text"
]
},
"description": "A live room: people join with their camera and microphone, or watch. Every audio and video object is checked against its signed receipt before it is shown. Holds a Player for the room's video and a Chat; those who join can chat, those who watch read it.",
"name": "Room",
"positional": [
"children",
"title"
],
"props": {
"title": {
"required": false,
"ty": "text"
}
}
},
"Show": {
"allow_extra_props": false,
"children": {
"kind": "only_of",
"value": [
"Player",
"Chat",
"Poll",
"Participants",
"Receipts",
"EnergyMeter",
"Text"
]
},
"description": "A show: hosts on camera, the first of them leading; an audience that watches and votes. Holds a Player for the hosts' video, a Chat for the hosts, and Polls the lead opens and the audience answers. `audience` is how many inputs each viewer may send to one poll (1 to 255; 1 when left out).",
"name": "Show",
"positional": [
"children",
"title",
"audience"
],
"props": {
"audience": {
"required": false,
"ty": "number"
},
"title": {
"required": false,
"ty": "text"
}
}
},
"Text": {
"allow_extra_props": false,
"children": {
"kind": "none"
},
"description": "A paragraph of text.",
"name": "Text",
"positional": [
"text"
],
"props": {
"text": {
"required": true,
"ty": "text"
}
}
},
"WatchTogether": {
"allow_extra_props": false,
"children": {
"kind": "only_of",
"value": [
"Participants",
"Receipts",
"EnergyMeter",
"Text"
]
},
"description": "A watch room: everyone watches one file together, in sync; anyone may play, pause, seek or change the speed for everyone. `source` is the file's name within the app (for example \"film.mp4\"). A watch room carries the shared controls alone: it holds no Chat and no Poll.",
"name": "WatchTogether",
"positional": [
"source",
"children",
"title"
],
"props": {
"source": {
"required": true,
"ty": "text"
},
"title": {
"required": false,
"ty": "text"
}
}
}
}
}