{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Cancellable loader"
  ],
  "animated": true,
  "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": "BorderedLoader",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#compose-built-in-components"
    },
    {
      "name": "Container",
      "url": null
    },
    {
      "name": "ctx.ui.setWidget",
      "url": null
    }
  ],
  "applicability": [
    "Use this when a long operation needs a visible cancel control."
  ],
  "category": "dialogs",
  "categoryLabel": "Overlays and dialogs",
  "consequences": [
    "Users can cancel long foreground work.",
    "Success, failure and null cancellation need separate settlement paths."
  ],
  "family": "behavioral",
  "familyLabel": "Behavioral",
  "id": "abort-lantern",
  "implementation": [
    "Resolve success, failure and cancellation.",
    "Check the cancellation result before building the result view."
  ],
  "intent": "Settle foreground loading before opening a separate result view.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/abort-lantern.json",
  "kind": "screen",
  "knownUses": [
    {
      "example": "abortable-loader-result",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/session-ask/index.ts",
          "lines": "1645-1665",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/session-ask/index.ts#L1645-L1665"
        },
        {
          "file": "extensions/extension-stats.ts",
          "lines": "1110-1152",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/extension-stats.ts#L1110-L1152"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Separate cancellable loading from results"
    }
  ],
  "linkedFrom": [
    {
      "how": "owns cancellation during work",
      "id": "abort-tether",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/abort-tether.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/abort-tether.md",
      "name": "Abort Tether",
      "url": "https://pi-tui.ratstack.sh/patterns/abort-tether/"
    }
  ],
  "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/abort-lantern.md",
  "motivation": "Dot314's session-ask operation must settle its foreground loader before showing analysis results.",
  "name": "Abort Lantern",
  "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": "BorderedLoader",
      "role": "Presents cancellable foreground loading inside a border.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#compose-built-in-components"
    },
    {
      "name": "Owning operation",
      "role": "Settles work before constructing a separate result view.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "cancels a prompt instead of a loader",
      "id": "abort-tether",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/abort-tether.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/abort-tether.md",
      "name": "Abort Tether",
      "url": "https://pi-tui.ratstack.sh/patterns/abort-tether/"
    }
  ],
  "sampleCode": {
    "code": "// Abort Lantern: settle cancellable loading before constructing a result view.\nimport { BorderedLoader } from \"@earendil-works/pi-coding-agent\";\nimport { Container, Text } from \"@earendil-works/pi-tui\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\ntype WorkResult = { status: \"success\"; summary: string } | { status: \"failed\"; message: string } | null;\n\nexport const story: PatternStory = {\n  id: \"abort-lantern\", title: \"Abort Lantern\", kind: \"screen\",\n  apis: [\"ctx.ui.custom\", \"BorderedLoader\", \"Container\", \"ctx.ui.setWidget\"],\n  states: [\n    { id: \"loading\", label: \"Loading\", animated: true, steps: [{ type: \"tick\", ms: 400 }] },\n    { id: \"success\", label: \"Result view\", steps: [{ type: \"action\", name: \"succeed\" }] },\n    { id: \"cancelled\", label: \"Cancelled\", steps: [\n      { type: \"keys\", data: \"\\x1b\" }, { type: \"action\", name: \"retry\" },\n      { type: \"tick\", ms: 200 }, { type: \"keys\", data: \"\\x1b\" },\n    ] },\n    { id: \"failed\", label: \"Failure\", steps: [\n      { type: \"action\", name: \"retry\" }, { type: \"tick\", ms: 200 },\n      { type: \"action\", name: \"fail\" },\n    ] },\n  ],\n  setup({ ui, action, theme }) {\n    ui.setEditorText(\"Review the task summary\");\n    let finishWork: (result: WorkResult) => void = () => {};\n    action(\"succeed\", () => finishWork({ status: \"success\", summary: \"3 tasks · 2 ready · 1 needs review\" }));\n    action(\"fail\", () => finishWork({ status: \"failed\", message: \"Analysis failed · fixture unavailable\" }));\n    function load() {\n      ui.setWidget(\"analysis\", [theme.fg(\"muted\", \"Analysis pending · escape cancels\")]);\n      void ui.custom<WorkResult>((tui, theme, _keys, done) => {\n        const loader = new BorderedLoader(tui, theme, \"Analyzing 3 synthetic tasks…\");\n        let settlement: \"pending\" | \"settled\" = \"pending\";\n        function settle(result: WorkResult) {\n          if (settlement === \"settled\") return;\n          settlement = \"settled\";\n          done(result);\n        }\n        loader.onAbort = () => settle(null);\n        // Synthetic driver: no model, files, network, or real work.\n        finishWork = result => { if (!loader.signal.aborted) settle(result); };\n        return loader;\n      }).then(result => {\n        if (result === null) {\n          ui.setWidget(\"analysis\", [theme.fg(\"muted\", \"Cancelled · no result view opened\")]);\n          return;\n        }\n        if (result.status === \"failed\") {\n          ui.setWidget(\"analysis\", [theme.fg(\"error\", result.message)]);\n          return;\n        }\n        ui.setWidget(\"analysis\", [theme.fg(\"success\", \"Loader settled · results ready\")]);\n        // Only a successful, settled operation may open this second interaction.\n        void ui.custom<void>((_tui, theme, keys, done) => {\n          const results = new Container();\n          results.addChild(new Text(theme.fg(\"accent\", \"Task analysis\"), 0, 0));\n          results.addChild(new Text(result.summary, 0, 0));\n          results.addChild(new Text(theme.fg(\"muted\", \"Review task: document the retry path\"), 0, 0));\n          results.addChild(new Text(theme.fg(\"dim\", \"escape returns to the draft\"), 0, 0));\n          return {\n            invalidate() { results.invalidate(); },\n            render: width => results.render(width),\n            handleInput(data) { if (keys.matches(data, \"tui.select.cancel\")) done(); },\n          };\n        });\n      });\n    }\n    action(\"retry\", load);\n    load();\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/behavioral/abort-lantern.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Abort Lantern, Loading state, 40 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-40-dark.anim.26645163d26a.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-40-dark.5bc57715d511.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Loading state, 40 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-40-light.anim.1d8a6a198736.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-40-light.9b2e353746e6.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Loading state, 60 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-60-dark.anim.ed216dabe03f.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-60-dark.9835bb0aa58c.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Loading state, 60 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-60-light.anim.29034ca19285.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-60-light.e1fcd0a0c39e.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Loading state, 80 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-80-dark.anim.5c343dad0f1c.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-80-dark.883aee2d2719.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Loading state, 80 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-80-light.anim.557e7ef556d0.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-80-light.e3d8cce3e0a8.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Loading state, 120 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-120-dark.anim.81a10f581f3c.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-120-dark.c694c1791a16.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Abort Lantern, Loading state, 120 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-120-light.anim.37b4b6d4d193.webp",
          "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": 616,
          "rows": 14,
          "still": "https://pi-tui.ratstack.sh/frames/abort-lantern/loading-120-light.947093436a4e.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show the animated loader and its cancel hint.",
      "id": "loading",
      "label": "Loading",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-40-dark.369beeca0c1d.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-40-light.b990b6bc3403.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-60-dark.558755f39703.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-60-light.2ce973b2b6ed.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-80-dark.a80213de2972.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-80-light.cc7d6920f968.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-120-dark.03cff3ec6b95.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Abort Lantern, Result view 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/abort-lantern/success-120-light.a9a59334354e.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Replace the completed loader with synthetic results.",
      "id": "success",
      "label": "Result view",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-40-dark.87d5739c1765.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-40-light.6300c67550d2.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-60-dark.3e6b4fcfdd3d.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-60-light.b9eedc71d2f2.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-80-dark.0c65cdbaa854.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-80-light.59d19c7f0292.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-120-dark.00ae1908fbca.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Abort Lantern, Cancelled 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/abort-lantern/cancelled-120-light.6ba2896e8cdf.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Return to the host without opening results.",
      "id": "cancelled",
      "label": "Cancelled",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-40-dark.2ce8feb1dea0.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-40-light.029050e1ea49.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-60-dark.f65ecdb3cd08.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-60-light.e0cdd2640e4b.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-80-dark.32b705a6ee9a.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-80-light.5a18ff7d7e72.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-120-dark.be4491937201.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Abort Lantern, Failure 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/abort-lantern/failed-120-light.beacfe5501a8.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Settle loading and show a concise error.",
      "id": "failed",
      "label": "Failure",
      "problems": []
    }
  ],
  "structure": "work -> bordered loader\nescape -> cancel -> done(null)\nsuccess -> done -> result view",
  "thumbnails": {
    "dark": {
      "animation": "https://pi-tui.ratstack.sh/thumbs/abort-lantern/dark.anim.561c7b0b38a6.webp",
      "src": "https://pi-tui.ratstack.sh/thumbs/abort-lantern/dark.3a755c710ce2.webp"
    },
    "light": {
      "animation": "https://pi-tui.ratstack.sh/thumbs/abort-lantern/light.anim.588825931b26.webp",
      "src": "https://pi-tui.ratstack.sh/thumbs/abort-lantern/light.449ad30037ac.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/abort-lantern/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
