{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Single-owner editor"
  ],
  "animated": false,
  "apis": [
    {
      "name": "ctx.ui.setEditorComponent",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "CustomEditor",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#handle-keyboard-input-and-focus"
    },
    {
      "name": "Editor.setAutocompleteProvider",
      "url": null
    },
    {
      "name": "matchesKey",
      "url": null
    }
  ],
  "applicability": [
    "Use this when several features would otherwise compete to replace the main editor."
  ],
  "category": "editors",
  "categoryLabel": "Editors and drafts",
  "consequences": [
    "Several enhancements can preserve one base editor contract.",
    "They must cooperate under a single factory rather than install independently."
  ],
  "family": "structural",
  "familyLabel": "Structural",
  "id": "editor-steward",
  "implementation": [
    "Receive EditorTheme rather than the general Theme.",
    "Forward unowned keys to CustomEditor.",
    "Preserve autocomplete and restore the default factory when done."
  ],
  "intent": "Compose editor enhancements behind one replacement factory.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/editor-steward.json",
  "kind": "screen",
  "knownUses": [
    {
      "example": "editor-component",
      "moreRefs": 0,
      "refs": [
        {
          "file": "raw-paste/index.ts",
          "lines": "95-104",
          "sha": "bca5070b",
          "url": "https://github.com/nicobailon/pi-extensions/blob/bca5070b541ffa7d273e74036dcd7d5f8b63eed3/raw-paste/index.ts#L95-L104"
        }
      ],
      "repo": "pi-extensions",
      "repoUrl": "https://github.com/nicobailon/pi-extensions",
      "title": "Session-scoped editor component mount"
    },
    {
      "example": "footer-editor-hook",
      "moreRefs": 0,
      "refs": [
        {
          "file": "index.ts",
          "lines": "3402-3425",
          "sha": "859dee67",
          "url": "https://github.com/nicobailon/pi-powerline-footer/blob/859dee671b633fb533b07ceba3e6c1ab1c43360a/index.ts#L3402-L3425"
        }
      ],
      "repo": "pi-powerline-footer",
      "repoUrl": "https://github.com/nicobailon/pi-powerline-footer",
      "title": "Editor replacement and chrome"
    },
    {
      "example": "editor-composition-single-owner",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/editor-enhancements/index.ts",
          "lines": "5-11",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/editor-enhancements/index.ts#L5-L11"
        },
        {
          "file": "extensions/editor-enhancements/index.ts",
          "lines": "43-65",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/editor-enhancements/index.ts#L43-L65"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Compose editor enhancements behind one editor-component owner"
    }
  ],
  "linkedFrom": [
    {
      "how": "preserves the base editor history",
      "id": "prompt-trail",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/prompt-trail.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/prompt-trail.md",
      "name": "Prompt Trail",
      "url": "https://pi-tui.ratstack.sh/patterns/prompt-trail/"
    },
    {
      "how": "changes the editor rather than submission",
      "id": "input-switch",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/input-switch.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/input-switch.md",
      "name": "Input Switch",
      "url": "https://pi-tui.ratstack.sh/patterns/input-switch/"
    }
  ],
  "links": {
    "agentGuide": "https://pi-tui.ratstack.sh/llms.txt",
    "index": "https://pi-tui.ratstack.sh/patterns.md",
    "skill": "https://pi-tui.ratstack.sh/skills/build-pi-tui-component.md"
  },
  "mdUrl": "https://pi-tui.ratstack.sh/patterns/editor-steward.md",
  "motivation": "Dot314's editor enhancements warn that competing setEditorComponent replacements cannot safely own the same editor.",
  "name": "Editor Steward",
  "participants": [
    {
      "name": "ctx.ui.setEditorComponent",
      "role": "Installs the single custom editor factory.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "CustomEditor",
      "role": "Preserves application controls for editor replacements.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#handle-keyboard-input-and-focus"
    },
    {
      "name": "Composed features",
      "role": "Share one editor factory rather than replacing each other.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "keeps base application controls",
      "id": "action-compass",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/action-compass.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/action-compass.md",
      "name": "Action Compass",
      "url": "https://pi-tui.ratstack.sh/patterns/action-compass/"
    }
  ],
  "sampleCode": {
    "code": "// Editor Steward: one CustomEditor factory composes chrome, mode and base controls.\nimport { CustomEditor } from \"@earendil-works/pi-coding-agent\";\nimport { matchesKey, truncateToWidth, type AutocompleteProvider } from \"@earendil-works/pi-tui\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\nexport const story: PatternStory = {\n  id: \"editor-steward\", title: \"Editor Steward\", kind: \"screen\",\n  apis: [\"ctx.ui.setEditorComponent\", \"CustomEditor\", \"Editor.setAutocompleteProvider\", \"matchesKey\"],\n  states: [\n    { id: \"default\", label: \"Base editor with autocomplete\", steps: [\n      { type: \"text\", text: \"/rev\" }, { type: \"keys\", data: \"\\t\" }, { type: \"wait\", ms: 300 },\n    ] },\n    { id: \"enhanced\", label: \"Composed enhancements\", steps: [{ type: \"action\", name: \"enhance\" }] },\n    { id: \"forwarded\", label: \"Base controls retained\", steps: [\n      { type: \"keys\", data: \"\\x01\" }, { type: \"text\", text: \"Also \" },\n      { type: \"action\", name: \"assert-forwarded\" },\n    ] },\n  ],\n  setup({ ui, theme, screen, action }) {\n    // Synthetic autocomplete driver: no command execution or file completion.\n    const autocomplete: AutocompleteProvider = {\n      async getSuggestions(lines, cursorLine, cursorCol, { signal }) {\n        const prefix = lines[cursorLine]!.slice(0, cursorCol);\n        if (signal.aborted || !prefix.startsWith(\"/\")) return null;\n        const items = [\n          { value: \"/review\", label: \"/review\", description: \"Review sample code\" },\n          { value: \"/revise\", label: \"/revise\", description: \"Revise the draft\" },\n        ].filter(item => item.value.startsWith(prefix));\n        return items.length ? { items, prefix } : null;\n      },\n      applyCompletion(lines, cursorLine, cursorCol, item, prefix) {\n        const next = [...lines];\n        const start = cursorCol - prefix.length;\n        next[cursorLine] = lines[cursorLine]!.slice(0, start) + item.value + lines[cursorLine]!.slice(cursorCol);\n        return { lines: next, cursorLine, cursorCol: start + item.value.length };\n      },\n    };\n    if (!screen.editor.setAutocompleteProvider) throw new Error(\"Base editor has no autocomplete seam\");\n    screen.editor.setAutocompleteProvider(autocomplete);\n    ui.setEditorText(\"\");\n    action(\"enhance\", () => {\n      ui.setEditorComponent((tui, editorTheme, keybindings) => {\n        class StewardEditor extends CustomEditor {\n          private mode: \"draft\" | \"review\" = \"review\";\n          handleInput(data: string) {\n            if (matchesKey(data, \"f2\")) {\n              this.mode = this.mode === \"draft\" ? \"review\" : \"draft\";\n              tui.requestRender(); return;\n            }\n            super.handleInput(data); // Editing, autocomplete and app actions remain Pi's.\n          }\n          render(width: number) {\n            const words = this.getText().trim().split(/\\s+/).filter(Boolean).length;\n            const chrome = this.mode.toUpperCase() + \" · \" + words + \" words · F2 mode\";\n            return [theme.fg(\"accent\", truncateToWidth(chrome, width)), ...super.render(width)];\n          }\n        }\n        const editor = new StewardEditor(tui, editorTheme, keybindings);\n        editor.setAutocompleteProvider(autocomplete);\n        return editor;\n      });\n      ui.setEditorText(\"Review src/tasks.ts\");\n    });\n    action(\"assert-forwarded\", () => {\n      if (ui.getEditorText() !== \"Also Review src/tasks.ts\") throw new Error(\"Base cursor-line-start was not retained\");\n    });\n    return () => ui.setEditorComponent(undefined);\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/structural/editor-steward.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Editor Steward, Base editor state, 40 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-40-dark.253f512b99c8.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Editor Steward, Base editor state, 40 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-40-light.f2540543b6c2.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Editor Steward, Base editor state, 60 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-60-dark.1a9ef0c81333.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Editor Steward, Base editor state, 60 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-60-light.3804e4473ed3.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Editor Steward, Base editor state, 80 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-80-dark.0adfa7ce4309.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Editor Steward, Base editor state, 80 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-80-light.72a89c915e9a.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Editor Steward, Base editor state, 120 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-120-dark.9192cce8fd12.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Editor Steward, Base editor state, 120 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/default-120-light.a802814ff7fb.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show an ordinary synthetic draft with autocomplete.",
      "id": "default",
      "label": "Base editor",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Editor Steward, Composed enhancements state, 40 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-40-dark.398b80b3d947.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Editor Steward, Composed enhancements state, 40 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-40-light.a06d159f456c.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Editor Steward, Composed enhancements state, 60 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-60-dark.44052e8c9ced.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Editor Steward, Composed enhancements state, 60 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-60-light.4f5523186b9c.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Editor Steward, Composed enhancements state, 80 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-80-dark.fed8430bd277.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Editor Steward, Composed enhancements state, 80 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-80-light.859e4ffdc518.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Editor Steward, Composed enhancements state, 120 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-120-dark.e9377bdc3403.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Editor Steward, Composed enhancements state, 120 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/enhanced-120-light.2f842d74ab6a.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show one owned editor with extra chrome and an explicit mode.",
      "id": "enhanced",
      "label": "Composed enhancements",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Editor Steward, Base controls retained state, 40 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-40-dark.0faed973d987.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Editor Steward, Base controls retained state, 40 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-40-light.493af35a827e.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Editor Steward, Base controls retained state, 60 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-60-dark.bd91c1801bb3.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Editor Steward, Base controls retained state, 60 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-60-light.fff559b35334.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Editor Steward, Base controls retained state, 80 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-80-dark.22898d981759.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Editor Steward, Base controls retained state, 80 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-80-light.e2a934cd0e9f.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Editor Steward, Base controls retained state, 120 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-120-dark.b8fb0a93d4c3.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Editor Steward, Base controls retained state, 120 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/editor-steward/forwarded-120-light.50f617b03f08.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show an unowned key still using the base editor behavior.",
      "id": "forwarded",
      "label": "Base controls retained",
      "problems": []
    }
  ],
  "structure": "one factory -> CustomEditor\nfeatures -> shared input / render",
  "thumbnails": {
    "dark": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/editor-steward/dark.6f76c068cd02.webp"
    },
    "light": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/editor-steward/light.e047a220e64e.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/editor-steward/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
