{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Idle dismissal"
  ],
  "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": "Component",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "TUI.requestRender",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "SelectList",
      "url": null
    },
    {
      "name": "Box",
      "url": null
    }
  ],
  "applicability": [
    "Use this when an unattended picker should eventually close."
  ],
  "category": "dialogs",
  "categoryLabel": "Overlays and dialogs",
  "consequences": [
    "An abandoned picker does not remain open indefinitely.",
    "Every input and completion path must manage the owned timer."
  ],
  "family": "behavioral",
  "familyLabel": "Behavioral",
  "id": "idle-fuse",
  "implementation": [
    "Clear the timer on completion and disposal.",
    "Do not confuse idle timeout with a fixed countdown."
  ],
  "intent": "Reset a component-owned inactivity timer after every input.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/idle-fuse.json",
  "kind": "screen",
  "knownUses": [
    {
      "example": "skill-palette-inactivity-cleanup",
      "moreRefs": 0,
      "refs": [
        {
          "file": "index.ts",
          "lines": "625-660",
          "sha": "a5c4429b",
          "url": "https://github.com/nicobailon/pi-skill-palette/blob/a5c4429b8c2e33ab903d07856497014f3d5ad34e/index.ts#L625-L660"
        },
        {
          "file": "index.ts",
          "lines": "829-842",
          "sha": "a5c4429b",
          "url": "https://github.com/nicobailon/pi-skill-palette/blob/a5c4429b8c2e33ab903d07856497014f3d5ad34e/index.ts#L829-L842"
        }
      ],
      "repo": "pi-skill-palette",
      "repoUrl": "https://github.com/nicobailon/pi-skill-palette",
      "title": "Dismiss an idle palette and clean its timer"
    }
  ],
  "linkedFrom": [
    {
      "how": "expires from inactivity instead",
      "id": "dialog-fuse",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/dialog-fuse.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/dialog-fuse.md",
      "name": "Dialog Fuse",
      "url": "https://pi-tui.ratstack.sh/patterns/dialog-fuse/"
    }
  ],
  "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/idle-fuse.md",
  "motivation": "Skill Palette resets a 60-second timer on input and cancels the picker when the user stops interacting.",
  "name": "Idle Fuse",
  "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": "TUI.requestRender",
      "role": "Requests a coalesced redraw after state changes.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/tui.md#understand-the-component-model"
    },
    {
      "name": "Idle timer",
      "role": "Resets on input and cancels the abandoned interaction.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "uses a fixed expiry deadline",
      "id": "dialog-fuse",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/dialog-fuse.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/dialog-fuse.md",
      "name": "Dialog Fuse",
      "url": "https://pi-tui.ratstack.sh/patterns/dialog-fuse/"
    }
  ],
  "sampleCode": {
    "code": "// Idle Fuse: every input resets a component-owned inactivity deadline.\nimport { getSelectListTheme } from \"@earendil-works/pi-coding-agent\";\nimport { Box, SelectList, Text } from \"@earendil-works/pi-tui\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\nexport const story: PatternStory = {\n  id: \"idle-fuse\", title: \"Idle Fuse\", kind: \"screen\",\n  apis: [\"ctx.ui.custom\", \"SelectList\", \"Box\", \"TUI.requestRender\"],\n  states: [\n    { id: \"waiting\", label: \"Idle timer\", animated: true, steps: [{ type: \"tick\", ms: 1100 }] },\n    { id: \"input\", label: \"Timer reset\", animated: true, steps: [\n      { type: \"keys\", data: \"\\x1b[B\" }, { type: \"tick\", ms: 100 },\n    ] },\n    { id: \"expired\", label: \"Idle cancellation\", steps: [\n      { type: \"tick\", ms: 1900 }, { type: \"resize\", rows: 12 },\n    ] },\n  ],\n  setup({ ui, theme }) {\n    ui.setEditorText(\"Keep drafting here\");\n    ui.setWidget(\"palette\", [theme.fg(\"muted\", \"Palette open · idle resets on input\")]);\n    void ui.custom<string | undefined>((tui, theme, keys, done) => {\n      const idleMs = 2000; // A short synthetic interval for the story, not source policy.\n      const choices = new SelectList([\"Build\", \"Review\", \"Test\"].map(label => ({\n        value: label, label,\n      })), 3, getSelectListTheme());\n      let lifecycle: \"open\" | \"closed\" = \"open\";\n      let deadline = Date.now() + idleMs;\n      let timeout: ReturnType<typeof setTimeout>;\n      const pulse = setInterval(() => tui.requestRender(), 100);\n      function dispose() {\n        lifecycle = \"closed\";\n        clearTimeout(timeout);\n        clearInterval(pulse);\n      }\n      function finish(value: string | undefined) {\n        if (lifecycle === \"closed\") return;\n        dispose();\n        done(value);\n      }\n      function resetIdle() {\n        clearTimeout(timeout);\n        deadline = Date.now() + idleMs;\n        timeout = setTimeout(() => finish(undefined), idleMs);\n      }\n      resetIdle();\n      choices.onSelect = item => finish(item.value);\n      choices.onCancel = () => finish(undefined);\n      return {\n        dispose,\n        invalidate() { choices.invalidate(); },\n        handleInput(data) {\n          resetIdle(); // All input counts, including keys the chooser does not own.\n          if (keys.matches(data, \"tui.select.cancel\")) finish(undefined);\n          else choices.handleInput(data);\n          tui.requestRender();\n        },\n        render(width) {\n          const panel = new Box(1, 1, text => theme.bg(\"customMessageBg\", text));\n          panel.addChild(new Text(theme.fg(\"accent\", \"Idle palette · \" + Math.ceil((deadline - Date.now()) / 1000) + \"s left\"), 0, 0));\n          panel.addChild(choices);\n          panel.addChild(new Text(theme.fg(\"dim\", \"↑↓ select · input resets 2s\"), 0, 0));\n          return panel.render(width);\n        },\n      };\n    }).then(selection => {\n      ui.setWidget(\"palette\", [\n        theme.fg(\"success\", selection === undefined ? \"Idle cancellation · palette closed\" : \"Selected: \" + selection),\n        theme.fg(\"muted\", \"Owned timers cleared · draft kept\"),\n      ]);\n    });\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/behavioral/idle-fuse.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Idle Fuse, Idle timer state, 40 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-40-dark.anim.d89ea4ef96e9.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/idle-fuse/waiting-40-dark.dcaa7ecc48db.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Idle Fuse, Idle timer state, 40 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-40-light.anim.e54783dcef56.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/idle-fuse/waiting-40-light.8d23a2cf628a.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Idle Fuse, Idle timer state, 60 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-60-dark.anim.ef7cfd73c336.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/idle-fuse/waiting-60-dark.f5d4b4087889.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Idle Fuse, Idle timer state, 60 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-60-light.anim.e48c8f2a9e93.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/idle-fuse/waiting-60-light.3c5e4d797c63.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Idle Fuse, Idle timer state, 80 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-80-dark.anim.d23f69574037.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/idle-fuse/waiting-80-dark.adbc9723acd8.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Idle Fuse, Idle timer state, 80 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-80-light.anim.d20e8a46cf24.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/idle-fuse/waiting-80-light.4fea8802fe53.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Idle Fuse, Idle timer state, 120 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-120-dark.anim.ffee1c2d59c6.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/idle-fuse/waiting-120-dark.598da2559a7c.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Idle Fuse, Idle timer state, 120 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/waiting-120-light.anim.53b9f6cd0766.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/idle-fuse/waiting-120-light.0981dcc2033f.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show a synthetic palette and remaining idle time.",
      "id": "waiting",
      "label": "Idle timer",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Idle Fuse, Timer reset state, 40 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-40-dark.anim.e49ae627ea10.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/idle-fuse/input-40-dark.a33eea136ef2.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Idle Fuse, Timer reset state, 40 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-40-light.anim.7578bce44364.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/idle-fuse/input-40-light.72a1189b0a6e.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Idle Fuse, Timer reset state, 60 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-60-dark.anim.029534580059.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/idle-fuse/input-60-dark.ded5e53a3217.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Idle Fuse, Timer reset state, 60 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-60-light.anim.4744fe4c128c.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/idle-fuse/input-60-light.7b9a17add26e.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Idle Fuse, Timer reset state, 80 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-80-dark.anim.915b4d49da1c.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/idle-fuse/input-80-dark.e5e87b966417.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Idle Fuse, Timer reset state, 80 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-80-light.anim.dfb643732e9b.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/idle-fuse/input-80-light.5c98770eb2c7.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Idle Fuse, Timer reset state, 120 columns, dark theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-120-dark.anim.e497a09d7cb7.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/idle-fuse/input-120-dark.2f38242438de.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Idle Fuse, Timer reset state, 120 columns, light theme, 14 rows, animated",
          "animated": true,
          "animation": "https://pi-tui.ratstack.sh/frames/idle-fuse/input-120-light.anim.c1c6583e7c40.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/idle-fuse/input-120-light.37beaab05eb3.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Navigate once and reset the visible idle timer.",
      "id": "input",
      "label": "Timer reset",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-40-dark.93f7a12cfb05.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-40-light.79a7b13317e9.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-60-dark.b4b7effd93df.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-60-light.2adc8dd66d6f.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-80-dark.28e88e0497d6.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-80-light.7fc62a3bf988.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-120-dark.66947330c148.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Idle Fuse, Idle cancellation 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/idle-fuse/expired-120-light.6c4132e0da2b.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Close the palette after the next uninterrupted idle interval.",
      "id": "expired",
      "label": "Idle cancellation",
      "problems": []
    }
  ],
  "structure": "input -> reset idle timer\nidle deadline -> done(cancel)",
  "thumbnails": {
    "dark": {
      "animation": "https://pi-tui.ratstack.sh/thumbs/idle-fuse/dark.anim.0bc0e62842f1.webp",
      "src": "https://pi-tui.ratstack.sh/thumbs/idle-fuse/dark.665216222c82.webp"
    },
    "light": {
      "animation": "https://pi-tui.ratstack.sh/thumbs/idle-fuse/light.anim.d57f03e4bcc3.webp",
      "src": "https://pi-tui.ratstack.sh/thumbs/idle-fuse/light.6ada899954a3.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/idle-fuse/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
