{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Custom completion"
  ],
  "animated": false,
  "apis": [
    {
      "name": "ctx.ui.custom",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#use-custom-screens-and-overlays"
    },
    {
      "name": "Component",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "custom",
      "url": null
    },
    {
      "name": "ExtensionSelectorComponent",
      "url": null
    }
  ],
  "applicability": [
    "Use this when built-in dialogs cannot express the required view."
  ],
  "category": "dialogs",
  "categoryLabel": "Overlays and dialogs",
  "consequences": [
    "Selection and cancellation settle one typed interaction.",
    "A missing or duplicate completion can leave the caller pending or settle incorrectly."
  ],
  "family": "lifecycle",
  "familyLabel": "Lifecycle",
  "id": "done-contract",
  "implementation": [
    "Call done on every exit path.",
    "Do not permanently hide a custom-owned overlay instead of resolving it.",
    "Make completion idempotent."
  ],
  "intent": "Resolve each custom interaction with a typed selection or cancellation.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/done-contract.json",
  "kind": "screen",
  "knownUses": [
    {
      "example": "custom-picker-completion",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/session-switch/picker.ts",
          "lines": "439-470",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/session-switch/picker.ts#L439-L470"
        },
        {
          "file": "extensions/tool-horizon/boundary-picker.ts",
          "lines": "470-500",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/tool-horizon/boundary-picker.ts#L470-L500"
        },
        {
          "file": "extensions/screenshots-picker/index.ts",
          "lines": "807-830",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/screenshots-picker/index.ts#L807-L830"
        },
        {
          "file": "extensions/code-actions/ui.ts",
          "lines": "25-75",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/code-actions/ui.ts#L25-L75"
        },
        {
          "file": "extensions/sandbox/index.ts",
          "lines": "340-370",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/sandbox/index.ts#L340-L370"
        },
        {
          "file": "extensions/tools/index.ts",
          "lines": "260-290",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/tools/index.ts#L260-L290"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Resolve custom selectors through done"
    },
    {
      "example": "custom-picker-completion",
      "moreRefs": 0,
      "refs": [
        {
          "file": "code-actions/ui.ts",
          "lines": "34-96",
          "sha": "bca5070b",
          "url": "https://github.com/nicobailon/pi-extensions/blob/bca5070b541ffa7d273e74036dcd7d5f8b63eed3/code-actions/ui.ts#L34-L96"
        }
      ],
      "repo": "pi-extensions",
      "repoUrl": "https://github.com/nicobailon/pi-extensions",
      "title": "Resolve custom selectors through done"
    },
    {
      "example": "custom-picker-completion",
      "moreRefs": 0,
      "refs": [],
      "repo": "pi-mcp-adapter",
      "repoUrl": "https://github.com/nicobailon/pi-mcp-adapter",
      "title": "Resolve custom selectors through done"
    },
    {
      "example": "custom-picker-completion",
      "moreRefs": 0,
      "refs": [
        {
          "file": "quote-reply.ts",
          "lines": "241-267",
          "sha": "859dee67",
          "url": "https://github.com/nicobailon/pi-powerline-footer/blob/859dee671b633fb533b07ceba3e6c1ab1c43360a/quote-reply.ts#L241-L267"
        }
      ],
      "repo": "pi-powerline-footer",
      "repoUrl": "https://github.com/nicobailon/pi-powerline-footer",
      "title": "Resolve custom selectors through done"
    },
    {
      "example": "files-touched-custom-inspection",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/files-touched.ts",
          "lines": "55-90",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/files-touched.ts#L55-L90"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Open a custom inspection view for touched files"
    },
    {
      "example": "upstream-preset-picker",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/preset.ts",
          "lines": "1-18",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/preset.ts#L1-L18"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Upstream-derived preset picker and status"
    }
  ],
  "linkedFrom": [
    {
      "how": "settles terminal-only custom interactions",
      "id": "mode-fence",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/mode-fence.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/mode-fence.md",
      "name": "Mode Fence",
      "url": "https://pi-tui.ratstack.sh/patterns/mode-fence/"
    }
  ],
  "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/done-contract.md",
  "motivation": "Nico's custom selectors await a result until their component calls done.",
  "name": "Done Contract",
  "participants": [
    {
      "name": "ctx.ui.custom",
      "role": "Mounts one interaction and resolves through done.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#use-custom-screens-and-overlays"
    },
    {
      "name": "Component",
      "role": "Renders width-bounded lines and invalidates cached output.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "Completion callback",
      "role": "Returns one typed selection or cancellation to the caller.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "moves focus without completion",
      "id": "focus-baton",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/focus-baton.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/focus-baton.md",
      "name": "Focus Baton",
      "url": "https://pi-tui.ratstack.sh/patterns/focus-baton/"
    }
  ],
  "sampleCode": {
    "code": "// Done Contract: settle each custom interaction with selection or cancellation.\nimport { ExtensionSelectorComponent } from \"@earendil-works/pi-coding-agent\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\ntype InspectionResult = { kind: \"selected\"; file: string } | { kind: \"cancelled\" };\n\nexport const story: PatternStory = {\n  id: \"done-contract\", title: \"Done Contract\", kind: \"screen\",\n  apis: [\"custom\", \"ExtensionSelectorComponent\"],\n  states: [\n    { id: \"open\", label: \"Focused view\" },\n    { id: \"selected\", label: \"Selection result\", steps: [{ type: \"keys\", data: \"\\r\" }] },\n    { id: \"cancelled\", label: \"Cancelled result\", steps: [\n      { type: \"action\", name: \"inspect\" }, { type: \"keys\", data: \"\\x1b\" },\n    ] },\n  ],\n  setup({ ui, theme, action }) {\n    ui.setEditorText(\"Explain the selected change.\");\n    const inspect = () => {\n      ui.setWidget(\"result\", [theme.fg(\"muted\", \"Inspection pending · caller awaits done\")]);\n      void ui.custom<InspectionResult>((tui, _theme, _keys, done) => {\n        // Lifecycle: open -> settled. Every exit uses the same guarded callback.\n        let settled = false;\n        const complete = (result: InspectionResult) => {\n          if (settled) return;\n          settled = true;\n          done(result);\n        };\n        return new ExtensionSelectorComponent(\"Inspect changed file\", [\"src/parser.ts\", \"test/parser.test.ts\"],\n          file => complete({ kind: \"selected\", file }),\n          () => complete({ kind: \"cancelled\" }), { tui });\n      }).then(result => {\n        ui.setWidget(\"result\", [result.kind === \"selected\"\n          ? theme.fg(\"success\", \"Selected: \" + result.file)\n          : theme.fg(\"warning\", \"Cancelled · no file selected\")]);\n      });\n    };\n    action(\"inspect\", inspect);\n    inspect();\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/lifecycle/done-contract.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Done Contract, Focused view state, 40 columns, dark theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-40-dark.6fde93176556.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Done Contract, Focused view state, 40 columns, light theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-40-light.3520e1676c47.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Done Contract, Focused view state, 60 columns, dark theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-60-dark.f01a3eac2e03.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Done Contract, Focused view state, 60 columns, light theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-60-light.b633250fe4a3.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Done Contract, Focused view state, 80 columns, dark theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-80-dark.583049872d78.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Done Contract, Focused view state, 80 columns, light theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-80-light.38bc857d7e08.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Done Contract, Focused view state, 120 columns, dark theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-120-dark.ad93b9dacd75.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Done Contract, Focused view state, 120 columns, light theme, 18 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": 792,
          "rows": 18,
          "still": "https://pi-tui.ratstack.sh/frames/done-contract/open-120-light.f8e34e4b35cc.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show a small read-only inspection list with selection and cancel hints.",
      "id": "open",
      "label": "Focused view",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-40-dark.5f76cc6f8554.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-40-light.dd8a51715254.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-60-dark.0c5b76c09095.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-60-light.3b38a23c1950.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-80-dark.e7b2b02037e1.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-80-light.d2db00a0fa22.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-120-dark.76e4246c6338.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Done Contract, Selection result 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/done-contract/selected-120-light.777119e2f6f2.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Close the view and show its typed result in the host.",
      "id": "selected",
      "label": "Selection result",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-40-dark.f337fa64be06.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-40-light.c0b87977df1c.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-60-dark.f0fcdff7c274.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-60-light.42c7712a8652.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-80-dark.213c4afa5cb9.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-80-light.c1d4cca5ea30.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-120-dark.8b8b4ecd4289.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Done Contract, Cancelled result 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/done-contract/cancelled-120-light.c124f742c23d.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Close through cancellation and show that no action was selected.",
      "id": "cancelled",
      "label": "Cancelled result",
      "problems": []
    }
  ],
  "structure": "ctx.ui.custom -> component\ncomponent -> done(result)\ndone -> dispose + return",
  "thumbnails": {
    "dark": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/done-contract/dark.782833598c71.webp"
    },
    "light": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/done-contract/light.c588b1bd0a51.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/done-contract/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
