[{"data":1,"prerenderedAt":736},["ShallowReactive",2],{"navigation_docs":3,"-project-roadmap":223,"-project-roadmap-surround":731},[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":209,"body":225,"description":724,"extension":725,"links":726,"meta":727,"navigation":728,"path":210,"seo":729,"stem":211,"__hash__":730},"docs\u002F5.project\u002F1.roadmap.md",{"type":226,"value":227,"toc":709},"minimark",[228,249,254,290,294,339,343,392,396,425,429,467,471,478,547,551,616,619,645,649,667,670,696,700],[229,230,231,232,236,237,241,242,248],"p",{},"No version of tui4s is published yet. The first release is ",[233,234,235],"code",{},"0.1.0-RC1"," (",[238,239,240],"a",{"href":168},"ADR 0014","). Each line below is an open issue on GitHub. The issue has the details and the decision that it waits for. The ",[238,243,247],{"href":244,"rel":245},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues",[246],"nofollow","issue list"," is the current state.",[250,251,253],"h2",{"id":252},"integrations","Integrations",[255,256,257,271,282],"ul",{},[258,259,260,261,264,265,270],"li",{},"A ZIO DSL module (",[233,262,263],{},"tui4s-zio",") over kyo-ui: ",[238,266,269],{"href":267,"rel":268},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F18",[246],"#18",".",[258,272,273,274,264,277,270],{},"A Cats Effect DSL module (",[233,275,276],{},"tui4s-cats",[238,278,281],{"href":279,"rel":280},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F19",[246],"#19",[258,283,284,285,270],{},"The assistant: Codex app-server as a provider: ",[238,286,289],{"href":287,"rel":288},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F48",[246],"#48",[250,291,293],{"id":292},"input","Input",[255,295,296,304,312,327],{},[258,297,298,299,270],{},"Mouse input (click, wheel) as an opt-in: ",[238,300,303],{"href":301,"rel":302},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F20",[246],"#20",[258,305,306,307,270],{},"The kitty keyboard protocol, so that the terminal reports Shift-Enter: ",[238,308,311],{"href":309,"rel":310},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F23",[246],"#23",[258,313,314,317,318,321,322,270],{},[233,315,316],{},"inputFilter"," and ",[233,319,320],{},"inputMask"," on text inputs: ",[238,323,326],{"href":324,"rel":325},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F31",[246],"#31",[258,328,329,330,333,334,270],{},"One-line inputs: ",[233,331,332],{},"onChange"," on each edit, not only on Enter: ",[238,335,338],{"href":336,"rel":337},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F32",[246],"#32",[250,340,342],{"id":341},"rendering","Rendering",[255,344,345,353,361,369,384],{},[258,346,347,348,270],{},"The terminal cursor shows under an overlay that does not trap the focus: ",[238,349,352],{"href":350,"rel":351},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F30",[246],"#30",[258,354,355,356,270],{},"Viewports: a stick-to-bottom mode: ",[238,357,360],{"href":358,"rel":359},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F43",[246],"#43",[258,362,363,364,270],{},"The painter: a wide glyph that the right edge of a clip cuts: ",[238,365,368],{"href":366,"rel":367},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F44",[246],"#44",[258,370,371,372,317,375,378,379,270],{},"The rendering cost: the scroll of a list is O(rows); ",[233,373,374],{},"Toasts",[233,376,377],{},"Spinner"," render on each tick: ",[238,380,383],{"href":381,"rel":382},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F33",[246],"#33",[258,385,386,387,270],{},"The runtime cost of tui4s (from the bench numbers): ",[238,388,391],{"href":389,"rel":390},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F50",[246],"#50",[250,393,395],{"id":394},"api","API",[255,397,398,414],{},[258,399,400,401,404,405,408,409,270],{},"A ",[233,402,403],{},"ui\"\"\"...\"\"\""," template interpolator (intent only, ",[238,406,407],{"href":180},"ADR 0017","): ",[238,410,413],{"href":411,"rel":412},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F21",[246],"#21",[258,415,416,419,420,270],{},[233,417,418],{},"Tui.run",": the promise copy of the run result: ",[238,421,424],{"href":422,"rel":423},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F46",[246],"#46",[250,426,428],{"id":427},"widgets-and-composables","Widgets and composables",[255,430,431,443,459],{},[258,432,433,434,437,438,270],{},"tui4s-widgets on the web: the unit scale, a click on ",[233,435,436],{},"RadioGroup",", a list that follows: ",[238,439,442],{"href":440,"rel":441},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F25",[246],"#25",[258,444,445,446,449,450,453,454,270],{},"tui4s-use: ",[233,447,448],{},"useProcess"," holds a scheduler thread; a ",[233,451,452],{},"LocalStorage"," test; CRLF: ",[238,455,458],{"href":456,"rel":457},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F45",[246],"#45",[258,460,461,462,270],{},"More widgets: form validation, a file picker, a Markdown viewer, a calendar, a line chart: ",[238,463,466],{"href":464,"rel":465},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F47",[246],"#47",[250,468,470],{"id":469},"web-and-kyo-ui","Web and kyo-ui",[229,472,473,474,477],{},"These issues are drafts for kyo-ui. The maintainer posts them upstream (",[238,475,476],{"href":188},"ADR 0019",").",[255,479,480,488,496,504,515,523,535],{},[258,481,482,483,270],{},"A keydown on a field in a nested region is lost (kyo-ui JS): ",[238,484,487],{"href":485,"rel":486},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F26",[246],"#26",[258,489,490,491,270],{},"A handled keydown cannot prevent the default (kyo-ui JS): ",[238,492,495],{"href":493,"rel":494},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F27",[246],"#27",[258,497,498,499,270],{},"Each Enter submits the form that holds the field (kyo-ui JS): ",[238,500,503],{"href":501,"rel":502},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F28",[246],"#28",[258,505,400,506,509,510,270],{},[233,507,508],{},"Stylesheet"," cannot override inline styles (kyo-ui): ",[238,511,514],{"href":512,"rel":513},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F29",[246],"#29",[258,516,517,518,270],{},"Bound inputs lose keys that come fast (kyo-ui JS): ",[238,519,522],{"href":520,"rel":521},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F37",[246],"#37",[258,524,525,526,529,530,270],{},"A bound value goes into the DOM ",[233,527,528],{},"value"," attribute (kyo-ui JS): ",[238,531,534],{"href":532,"rel":533},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F38",[246],"#38",[258,536,537,538,541,542,270],{},"A cell or ",[233,539,540],{},"ch"," length unit (kyo-ui): ",[238,543,546],{"href":544,"rel":545},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F39",[246],"#39",[250,548,550],{"id":549},"kyo-and-jatatui","Kyo and jatatui",[255,552,553,565,577,585,600],{},[258,554,555,556,559,560,270],{},"Remove the own signal watcher of the runner when Kyo fixes the ",[233,557,558],{},"Signal.observe"," leak: ",[238,561,564],{"href":562,"rel":563},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F8",[246],"#8",[258,566,567,568,571,572,270],{},"Measure the split frames again when Kyo closes the lost wakeup of ",[233,569,570],{},"observe",": ",[238,573,576],{"href":574,"rel":575},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F9",[246],"#9",[258,578,579,580,270],{},"kyo-kernel 1.0.0-RC7 has JMH in compile scope: ",[238,581,584],{"href":582,"rel":583},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F40",[246],"#40",[258,586,587,588,591,592,571,595,270],{},"A runner outside the package ",[233,589,590],{},"kyo"," cannot honour ",[233,593,594],{},"UI.scrollIntoView",[238,596,599],{"href":597,"rel":598},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F41",[246],"#41",[258,601,602,603,606,607,610,611,270],{},"jatatui: ",[233,604,605],{},"NativeLoader"," leaves one ",[233,608,609],{},"\u002Ftmp\u002Fjni-*"," directory per start: ",[238,612,615],{"href":613,"rel":614},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F42",[246],"#42",[250,617,92],{"id":618},"benchmarks",[255,620,621,629,637],{},[258,622,623,624,270],{},"Stage 2: Form, Todo, Log viewer, Chat, Cells: ",[238,625,628],{"href":626,"rel":627},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F22",[246],"#22",[258,630,631,632,270],{},"A person of each ecosystem reviews each implementation: ",[238,633,636],{"href":634,"rel":635},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F34",[246],"#34",[258,638,639,640,270],{},"One run on a dedicated machine, with the published numbers: ",[238,641,644],{"href":642,"rel":643},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F51",[246],"#51",[250,646,648],{"id":647},"platforms","Platforms",[255,650,651,659],{},[258,652,653,654,270],{},"A supported Windows port: ",[238,655,658],{"href":656,"rel":657},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F24",[246],"#24",[258,660,661,662,270],{},"An inline viewport (a run in N rows below the prompt): ",[238,663,666],{"href":664,"rel":665},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F49",[246],"#49",[250,668,68],{"id":669},"the-assistant",[255,671,672,680],{},[258,673,674,675,270],{},"Document the provider defaults of the assistant: ",[238,676,679],{"href":677,"rel":678},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F35",[246],"#35",[258,681,682,683,686,687,690,691,270],{},"Split ",[233,684,685],{},"Surface"," into data and a ",[233,688,689],{},"KeyVault"," capability: ",[238,692,695],{"href":693,"rel":694},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002F36",[246],"#36",[250,697,699],{"id":698},"propose-a-feature","Propose a feature",[229,701,702,703,708],{},"Open an ",[238,704,707],{"href":705,"rel":706},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues\u002Fnew\u002Fchoose",[246],"issue on GitHub",". Give the use case, a small kyo-ui example of the UI, and what tui4s does today.",{"title":710,"searchDepth":711,"depth":711,"links":712},"",2,[713,714,715,716,717,718,719,720,721,722,723],{"id":252,"depth":711,"text":253},{"id":292,"depth":711,"text":293},{"id":341,"depth":711,"text":342},{"id":394,"depth":711,"text":395},{"id":427,"depth":711,"text":428},{"id":469,"depth":711,"text":470},{"id":549,"depth":711,"text":550},{"id":618,"depth":711,"text":92},{"id":647,"depth":711,"text":648},{"id":669,"depth":711,"text":68},{"id":698,"depth":711,"text":699},"The planned and deferred features of tui4s, each with its GitHub issue.","md",null,{},{"icon":212},{"title":209,"description":724},"TK6Lp-597gUXQUds5yfCY-ociEqbFf9vBzhLs1lPkZ0",[732,734],{"title":199,"path":200,"stem":201,"description":733,"children":-1},"The ASCII logotype of the maintainer is the logo of tui4s, and its 4 is the isomark. One script makes all the logo assets from the text file, and CI checks them.",{"title":214,"path":215,"stem":216,"description":735,"icon":217,"children":-1},"How to build tui4s, the checks that a change must pass, and where the rules are.",1792528757934]