Why menus are sheets
Every ribbon section button, the profile menu, field ☰, and the empty-cell picker is a JSON object. Metagrid already maps objects to dictionaries, so a menu is just a nested dictionary: names on the left, commands or more objects on the right.
The metasheet is that JSON, opened as a mini-sheet next to the button that launched it.
What opens as a metasheet
| Source | Root | Customizable |
|---|---|---|
| Ribbon tab (always visible) | That tab as a docked sheet in the left column | Yes — Edit on the ribbon |
| Keytips / Alt | Floating metasheet for the section (same tree) | Yes — stored in this browser |
| Profile (avatar) | Account commands | Yes |
| Field ☰ | Live Filter / Sort / Type / Format tree | No — depends on the current field |
| Empty-cell picker | From a list / Grid / Table / List / Dictionary | No |
| Profile → Menus… | Full catalog (Ribbon, Profile, Field) | Yes |
Keys
| Input | Effect |
|---|---|
| ↑ ↓ | Move the selection |
| Enter / Space / → | Open a nested menu, or run the row. Same action. |
| Letter | Jump to that hotkey and run (same as the old menu letters) |
| Esc / ← | Back one menu; at the root, close. Same action. |
| Edit | Treat the menu as a sheet: names on the left, nested dictionaries on the right. Space opens a command or submenu. Change cmd, key, kind inside the command dictionary. |
Edits persist as JSON in localStorage (metagrid:metasheet-v2). Reset restores the live tree. Field ☰ always rebuilds from the current field.
Shape
A menu is a dictionary. Each row is an option: the Name is the label you see, the Value is another dictionary.
- Submenu — value is a dictionary of more options.
- Command — value is a dictionary whose rows are command fields (
cmd,key,kind, …). In Edit, Space opens that dictionary the same way the main sheet opens a nested dictionary. There is no JSON string in the cell.
{
"Ribbon": {
"Insert": {
"Table": { "cmd": "table", "key": "T", "tone": "table" },
"Dictionary": { "cmd": "dictionary", "key": "D" }
},
"Data": {
"Sort & filter": {
"Sort A→Z": { "cmd": "sortasc", "key": "S" }
}
}
},
"Profile": { "Settings…": { "cmd": "prefs", "kind": "profile", "key": "S" } }
}
That JSON is the file/storage shape. In the app it is the same nested dictionaries you already use in the workbook. Full list of cmd names: Commands.