[{"data":1,"prerenderedAt":473},["ShallowReactive",2],{"navigation_docs":3,"-decisions-0017-deferred-templates-mouse-and-kitty":223,"-decisions-0017-deferred-templates-mouse-and-kitty-surround":468},[4,26,96,105,202],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":16,"path":17,"stem":18,"icon":19},"The first app","\u002Fgetting-started\u002Ffirst-app","1.getting-started\u002F2.first-app","i-lucide-play",{"title":21,"path":22,"stem":23,"icon":24},"The first test","\u002Fgetting-started\u002Ffirst-test","1.getting-started\u002F3.first-test","i-lucide-flask-conical",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[32,37,42,47,52,57,62,67,72,77,81,86,91],{"title":33,"path":34,"stem":35,"icon":36},"Components","\u002Fguide\u002Fcomponents","2.guide\u002F01.components","i-lucide-component",{"title":38,"path":39,"stem":40,"icon":41},"Inputs and forms","\u002Fguide\u002Finputs-and-forms","2.guide\u002F02.inputs-and-forms","i-lucide-text-cursor-input",{"title":43,"path":44,"stem":45,"icon":46},"Scrolling and viewports","\u002Fguide\u002Fscrolling","2.guide\u002F03.scrolling","i-lucide-scroll-text",{"title":48,"path":49,"stem":50,"icon":51},"Overlays and layers","\u002Fguide\u002Foverlays","2.guide\u002F04.overlays","i-lucide-layers",{"title":53,"path":54,"stem":55,"icon":56},"Styles and theme","\u002Fguide\u002Fstyles","2.guide\u002F05.styles","i-lucide-palette",{"title":58,"path":59,"stem":60,"icon":61},"Composables","\u002Fguide\u002Fcomposables","2.guide\u002F06.composables","i-lucide-puzzle",{"title":63,"path":64,"stem":65,"icon":66},"Widgets","\u002Fguide\u002Fwidgets","2.guide\u002F07.widgets","i-lucide-blocks",{"title":68,"path":69,"stem":70,"icon":71},"The assistant","\u002Fguide\u002Fassistant","2.guide\u002F08.assistant","i-lucide-message-square",{"title":73,"path":74,"stem":75,"icon":76},"The same app on the web","\u002Fguide\u002Fweb","2.guide\u002F09.web","i-lucide-globe",{"title":78,"path":79,"stem":80,"icon":24},"Testing","\u002Fguide\u002Ftesting","2.guide\u002F10.testing",{"title":82,"path":83,"stem":84,"icon":85},"Running and packaging","\u002Fguide\u002Fpackaging","2.guide\u002F11.packaging","i-lucide-package",{"title":87,"path":88,"stem":89,"icon":90},"The terminal contract","\u002Fguide\u002Fterminal","2.guide\u002F12.terminal","i-lucide-square-terminal",{"title":92,"path":93,"stem":94,"icon":95},"Benchmarks","\u002Fguide\u002Fbenchmarks","2.guide\u002F13.benchmarks","i-lucide-gauge",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":25},"AI and agents","i-lucide-bot","\u002Fai","3.ai",[102],{"title":97,"path":103,"stem":104,"icon":98},"\u002Fai\u002Fagents","3.ai\u002F1.agents",{"title":106,"icon":107,"path":108,"stem":109,"children":110},"Decisions","i-lucide-scale","\u002Fdecisions","4.decisions",[111,114,118,122,126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198],{"title":112,"path":108,"stem":113,"icon":46},"All decisions","4.decisions\u002Findex",{"title":115,"path":116,"stem":117},"0001. kyo-ui is the DSL","\u002Fdecisions\u002F0001-kyo-ui-is-the-dsl","4.decisions\u002F0001-kyo-ui-is-the-dsl",{"title":119,"path":120,"stem":121},"0002. jatatui renders the cells","\u002Fdecisions\u002F0002-jatatui-renders-the-cells","4.decisions\u002F0002-jatatui-renders-the-cells",{"title":123,"path":124,"stem":125},"0003. Pin Kyo 1.0.0-RC7 and JDK 25","\u002Fdecisions\u002F0003-pin-kyo-rc7-and-jdk-25","4.decisions\u002F0003-pin-kyo-rc7-and-jdk-25",{"title":127,"path":128,"stem":129},"0004. Public Kyo APIs only","\u002Fdecisions\u002F0004-public-kyo-apis-only","4.decisions\u002F0004-public-kyo-apis-only",{"title":131,"path":132,"stem":133},"0005. A SOFT frame contract and an own watcher loop","\u002Fdecisions\u002F0005-soft-frame-contract-and-own-watcher-loop","4.decisions\u002F0005-soft-frame-contract-and-own-watcher-loop",{"title":135,"path":136,"stem":137},"0006. Purity: edge files, lint and a pure painter","\u002Fdecisions\u002F0006-purity-edge-files-and-lint","4.decisions\u002F0006-purity-edge-files-and-lint",{"title":139,"path":140,"stem":141},"0007. Compiler flags from sbt-tpolecat","\u002Fdecisions\u002F0007-compiler-flags-from-sbt-tpolecat","4.decisions\u002F0007-compiler-flags-from-sbt-tpolecat",{"title":143,"path":144,"stem":145},"0008. The artifact split: runner, app, testkit and core","\u002Fdecisions\u002F0008-artifact-split-runner-app-testkit-core","4.decisions\u002F0008-artifact-split-runner-app-testkit-core",{"title":147,"path":148,"stem":149},"0009. tui4s-use and tui4s-widgets, cross-built","\u002Fdecisions\u002F0009-use-and-widgets-cross-built","4.decisions\u002F0009-use-and-widgets-cross-built",{"title":151,"path":152,"stem":153},"0010. The flagship assistant is the blueprint of a real app","\u002Fdecisions\u002F0010-the-flagship-assistant-as-blueprint","4.decisions\u002F0010-the-flagship-assistant-as-blueprint",{"title":155,"path":156,"stem":157},"0011. The web target: a standalone Scala.js app and one theme","\u002Fdecisions\u002F0011-web-target-standalone-scalajs-and-one-theme","4.decisions\u002F0011-web-target-standalone-scalajs-and-one-theme",{"title":159,"path":160,"stem":161},"0012. The documentation is example-first","\u002Fdecisions\u002F0012-documentation-is-example-first","4.decisions\u002F0012-documentation-is-example-first",{"title":163,"path":164,"stem":165},"0013. Benchmarks in the repository, with their own build","\u002Fdecisions\u002F0013-benchmarks-in-repo-with-own-build","4.decisions\u002F0013-benchmarks-in-repo-with-own-build",{"title":167,"path":168,"stem":169},"0014. Release per module, by tag, as 0.1.0-RC1","\u002Fdecisions\u002F0014-release-per-module-tags-and-rc1","4.decisions\u002F0014-release-per-module-tags-and-rc1",{"title":171,"path":172,"stem":173},"0015. Packaging: the AOT cache in the start scripts, native-image as an option","\u002Fdecisions\u002F0015-packaging-aot-cache-and-native-image","4.decisions\u002F0015-packaging-aot-cache-and-native-image",{"title":175,"path":176,"stem":177},"0016. Process: lean mode and agent roles","\u002Fdecisions\u002F0016-process-lean-mode-and-agent-roles","4.decisions\u002F0016-process-lean-mode-and-agent-roles",{"title":179,"path":180,"stem":181},"0017. Deferred: templates, mouse, the kitty keyboard protocol and Windows","\u002Fdecisions\u002F0017-deferred-templates-mouse-and-kitty","4.decisions\u002F0017-deferred-templates-mouse-and-kitty",{"title":183,"path":184,"stem":185},"0018. pini4s is a vendored Git submodule","\u002Fdecisions\u002F0018-pini4s-as-a-vendored-submodule","4.decisions\u002F0018-pini4s-as-a-vendored-submodule",{"title":187,"path":188,"stem":189},"0019. Upstream issues are drafts that the user posts","\u002Fdecisions\u002F0019-upstream-kyo-issues-as-drafts","4.decisions\u002F0019-upstream-kyo-issues-as-drafts",{"title":191,"path":192,"stem":193},"0020. Release from the Actions form","\u002Fdecisions\u002F0020-release-from-the-actions-form","4.decisions\u002F0020-release-from-the-actions-form",{"title":195,"path":196,"stem":197},"0021. The rulebook is CONTRIBUTING.md","\u002Fdecisions\u002F0021-the-rulebook-is-contributing-md","4.decisions\u002F0021-the-rulebook-is-contributing-md",{"title":199,"path":200,"stem":201},"0022. The logo is text","\u002Fdecisions\u002F0022-the-logo-is-text","4.decisions\u002F0022-the-logo-is-text",{"title":203,"icon":204,"path":205,"stem":206,"children":207,"page":25},"Project","i-lucide-compass","\u002Fproject","5.project",[208,213,218],{"title":209,"path":210,"stem":211,"icon":212},"Roadmap","\u002Fproject\u002Froadmap","5.project\u002F1.roadmap","i-lucide-map",{"title":214,"path":215,"stem":216,"icon":217},"Contributing","\u002Fproject\u002Fcontributing","5.project\u002F2.contributing","i-lucide-git-pull-request",{"title":219,"path":220,"stem":221,"icon":222},"Security","\u002Fproject\u002Fsecurity","5.project\u002F3.security","i-lucide-shield",{"id":224,"title":179,"body":225,"description":461,"extension":462,"links":463,"meta":464,"navigation":465,"path":180,"seo":466,"stem":181,"__hash__":467},"docs\u002F4.decisions\u002F0017-deferred-templates-mouse-and-kitty.md",{"type":226,"value":227,"toc":450},"minimark",[228,233,263,267,270,274,315,319,356,360,395,399,421,424,438,442],[229,230,232],"h2",{"id":231},"status","Status",[234,235,236,237,244,245,250,251,256,257,262],"p",{},"Accepted (deferred). Each item has a GitHub issue: templates ",[238,239,243],"a",{"href":240,"rel":241},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F21",[242],"nofollow","#21",", mouse ",[238,246,249],{"href":247,"rel":248},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F20",[242],"#20",", the kitty keyboard protocol ",[238,252,255],{"href":253,"rel":254},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F23",[242],"#23"," and Windows ",[238,258,261],{"href":259,"rel":260},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F24",[242],"#24",".",[229,264,266],{"id":265},"date","Date",[234,268,269],{},"2026-10-09 (D-30, no mouse), 2026-10-17 (D7, D9, D12), 2026-10-19 (L1c found the Shift-Enter gap).",[229,271,273],{"id":272},"context","Context",[275,276,277,281,293,299,305],"ul",{},[278,279,280],"li",{},"The budget is small (the user, 2026-10-17: \"No tengo tantos créditos\"), and 0.1 must claim only what works.",[278,282,283,287,288,292],{},[284,285,286],"strong",{},"Templates."," The user asked for a spike of single-file components or JSX for Scala (\"scalax\"). Research: a ",[289,290,291],"code",{},"ui\"\"\"...\"\"\""," Scala 3 quotes macro is feasible and runner-neutral (it expands to kyo-ui calls). XML literals are a dead end: Scala 3 drops them, and the replacement interpolator is unmaintained.",[278,294,295,298],{},[284,296,297],{},"Mouse."," Mouse capture stops the text selection of the terminal (D-30). The research ranked mouse last: it unblocks 1 of 28 common widgets.",[278,300,301,304],{},[284,302,303],{},"Kitty keyboard protocol."," Without the keyboard-enhancement flags most terminals do not report Shift with Enter. The runner pushes no flags today.",[278,306,307,310,311,314],{},[284,308,309],{},"Windows."," The crossterm jar ships a Windows x86_64 library. The PTY kit uses ",[289,312,313],{},"expect"," and runs on Linux; the Nix shell covers Linux and macOS.",[229,316,318],{"id":317},"decision","Decision",[275,320,321,338,344,350],{},[278,322,323,326,327,329,330,333,334,337],{},[284,324,325],{},"Templates: intent only (D9)."," No spike now. If it comes back: a ",[289,328,291],{}," interpolator with ",[289,331,332],{},"${...}"," holes, Metals support first, in ",[289,335,336],{},"experiments\u002Fscalax",", after L2.",[278,339,340,343],{},[284,341,342],{},"No mouse for 0.1 (D-30, D7)."," kyo-ui mouse events are dropped.",[278,345,346,349],{},[284,347,348],{},"No kitty keyboard flags for 0.1."," A textarea takes Alt-Enter and Ctrl-J for a new line, and Shift-Enter only where the terminal reports it (D7).",[278,351,352,355],{},[284,353,354],{},"Windows is experimental (D12)."," It is not in the CI matrix and not in the PTY kit.",[229,357,359],{"id":358},"alternatives-considered","Alternatives considered",[275,361,362,371,377,383,389],{},[278,363,364,367,368,370],{},[284,365,366],{},"A template spike now"," (",[289,369,291],{},"). Rejected by the user for the budget.",[278,372,373,376],{},[284,374,375],{},"XML literals for templates."," Rejected: a dead end in Scala 3.",[278,378,379,382],{},[284,380,381],{},"Mouse in 0.1."," Rejected: mouse capture breaks text selection, and it unblocks few widgets.",[278,384,385,388],{},[284,386,387],{},"Push the kitty flags in 0.1."," The reason to defer is not recorded. The notes list it as an open item of L1c, and the L5b plan defers it.",[278,390,391,394],{},[284,392,393],{},"A supported Windows port."," The reason for \"experimental\" is not recorded beyond D12.",[229,396,398],{"id":397},"consequences","Consequences",[275,400,401,404,411,414],{},[278,402,403],{},"Good: 0.1 claims only what the PTY kit checks.",[278,405,406,407,410],{},"Bad: on the web, ",[289,408,409],{},"RadioGroup"," has no click handler; a terminal user cannot click anything.",[278,412,413],{},"Bad: Shift-Enter is unreported in most terminals; the help texts name Alt-Enter and Ctrl-J.",[278,415,416,417,420],{},"Bad: the JNI copy cannot be deleted on Windows while it is loaded, so one ",[289,418,419],{},"jni-*"," folder stays in the temp directory per start there.",[234,422,423],{},"What brings each back (the notes record only the first item; the other three are PROPOSALS of this ADR):",[275,425,426,429,432,435],{},[278,427,428],{},"Templates: the budget, and a decision on where the layer lives (it emits plain kyo-ui, so it may fit upstream or in its own repository).",[278,430,431],{},"Mouse: an opt-in capture mode, so text selection still works by default, and a widget that needs it.",[278,433,434],{},"Kitty flags: a terminal-capability check, and a restore of the flags in the release stack.",[278,436,437],{},"Windows: a Windows CI job and a PTY check on ConPTY.",[229,439,441],{"id":440},"references","References",[275,443,444,447],{},[278,445,446],{},"Plan: D-30, FC-D3. Roadmap: 2.3, 2.6 (templates), D7, D9, D12, S1.",[278,448,449],{},"Handoff: L1c (open items). Upstream draft: jatatui JNI copy (Windows note).",{"title":451,"searchDepth":452,"depth":452,"links":453},"",2,[454,455,456,457,458,459,460],{"id":231,"depth":452,"text":232},{"id":265,"depth":452,"text":266},{"id":272,"depth":452,"text":273},{"id":317,"depth":452,"text":318},{"id":358,"depth":452,"text":359},{"id":397,"depth":452,"text":398},{"id":440,"depth":452,"text":441},"Four features stay out of 0.1: a ui\"\"\"...\"\"\" template interpolator (intent only), mouse input, the kitty keyboard protocol (so Shift-Enter is unreported in most terminals) and a supported Windows port.","md",null,{},true,{"title":179,"description":461},"yZaC9OnPs0WvXbN0KrxXdYOE_awuC6GgdT_TCYQzFFA",[469,471],{"title":175,"path":176,"stem":177,"description":470,"children":-1},"The session steers and agents do the work in a small shape (implementer, one reviewer, fixer); a skeptic reviews only concurrency and terminal-restore code; the working notes are not part of the product.",{"title":183,"path":184,"stem":185,"description":472,"children":-1},"The optional keyed shared-state library pini4s lives in vendor\u002Fpini4s as a Git submodule and an sbt ProjectRef; only the examples use it.",1792528757337]