[{"data":1,"prerenderedAt":571},["ShallowReactive",2],{"navigation_docs":3,"-project-contributing":223,"-project-contributing-surround":566},[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":214,"body":225,"description":559,"extension":560,"links":561,"meta":562,"navigation":563,"path":215,"seo":564,"stem":216,"__hash__":565},"docs\u002F5.project\u002F2.contributing.md",{"type":226,"value":227,"toc":552},"minimark",[228,276,281,322,326,479,494,498,509,513,533,537,548],[229,230,235],"pre",{"className":231,"code":232,"language":233,"meta":234,"style":234},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone --recurse-submodules https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\ncd tui4s\nnix develop                 # JDK 25, sbt, Node.js and the terminal test tools\nsbt fmt                     # format the Scala and sbt files\nsbt check                   # format, compile, lint, test, compatibility\nexamples\u002Fptycheck\u002Frun.sh    # the real-terminal checklist in a pseudo-terminal\n","sh","",[236,237,238,246,252,258,264,270],"code",{"__ignoreMap":234},[239,240,243],"span",{"class":241,"line":242},"line",1,[239,244,245],{},"git clone --recurse-submodules https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\n",[239,247,249],{"class":241,"line":248},2,[239,250,251],{},"cd tui4s\n",[239,253,255],{"class":241,"line":254},3,[239,256,257],{},"nix develop                 # JDK 25, sbt, Node.js and the terminal test tools\n",[239,259,261],{"class":241,"line":260},4,[239,262,263],{},"sbt fmt                     # format the Scala and sbt files\n",[239,265,267],{"class":241,"line":266},5,[239,268,269],{},"sbt check                   # format, compile, lint, test, compatibility\n",[239,271,273],{"class":241,"line":272},6,[239,274,275],{},"examples\u002Fptycheck\u002Frun.sh    # the real-terminal checklist in a pseudo-terminal\n",[277,278,280],"h2",{"id":279},"the-rules","The rules",[282,283,284,295,303,311],"ul",{},[285,286,287,294],"li",{},[288,289,293],"a",{"href":290,"rel":291},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fblob\u002Fmain\u002FCONTRIBUTING.md",[292],"nofollow","CONTRIBUTING.md"," is the rulebook, for humans and for agents. It starts with a quick path. Then it gives the toolchain, the commands, the rules for code, the purity rules, the versions and the release process.",[285,296,297,302],{},[288,298,301],{"href":299,"rel":300},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fblob\u002Fmain\u002FARCHITECTURE.md",[292],"ARCHITECTURE.md"," tells how the runner works: the modules, the keys, the components, the layout and the scroll.",[285,304,305,310],{},[288,306,309],{"href":307,"rel":308},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fblob\u002Fmain\u002FAGENTS.md",[292],"AGENTS.md"," holds the rules for AI agents only. It imports the two other files.",[285,312,313,314,317,318,321],{},"The ",[288,315,316],{"href":108},"decision records"," give the reason for each rule. ",[288,319,320],{"href":196},"ADR 0021"," gives the reason for the three files.",[277,323,325],{"id":324},"the-checks","The checks",[327,328,329,345],"table",{},[330,331,332],"thead",{},[333,334,335,339,342],"tr",{},[336,337,338],"th",{},"Check",[336,340,341],{},"Command",[336,343,344],{},"What it checks",[346,347,348,362,379,396,424,437,458],"tbody",{},[333,349,350,354,359],{},[351,352,353],"td",{},"The sbt checks",[351,355,356],{},[236,357,358],{},"sbt check",[351,360,361],{},"The format, the compile with no warning in CI, the scalafix lint, all the tests, the binary compatibility.",[333,363,364,367,372],{},[351,365,366],{},"The edge files",[351,368,369],{},[236,370,371],{},"bash scripts\u002Fedge-check.sh",[351,373,374,375,378],{},"The headers of the edge files and the ",[236,376,377],{},"scalafix:ok"," comments.",[333,380,381,384,389],{},[351,382,383],{},"The release rules",[351,385,386],{},[236,387,388],{},"bash scripts\u002Fversion-order-test.sh",[351,390,391,392,395],{},"The version form and order, the modules and the last tag of a module (",[236,393,394],{},"scripts\u002Frelease-lib.sh",").",[333,397,398,401,406],{},[351,399,400],{},"The release notes",[351,402,403],{},[236,404,405],{},"bash scripts\u002Fchangelog-section-test.sh",[351,407,408,409,412,413,416,417,420,421,423],{},"The extraction of the notes of a module from ",[236,410,411],{},"CHANGELOG.md"," (",[236,414,415],{},"scripts\u002Fchangelog-section.sh","), and that each subsection ",[236,418,419],{},"### tui4s-\u003Cmodule>"," under the first heading of ",[236,422,411],{}," has text.",[333,425,426,429,434],{},[351,427,428],{},"The PTY kit",[351,430,431],{},[236,432,433],{},"examples\u002Fptycheck\u002Frun.sh",[351,435,436],{},"Each example in a real pseudo-terminal: the keys, the signals and the restore of the terminal. Run it after a change to the terminal code.",[333,438,439,442,451],{},[351,440,441],{},"The Markdown regions",[351,443,444,447,448,450],{},[236,445,446],{},"MarkdownRegionsSuite"," (in ",[236,449,358],{},")",[351,452,453,454,457],{},"Each Scala block of ",[236,455,456],{},"README.md"," and of these pages is the text of a region of a source file.",[333,459,460,463,472],{},[351,461,462],{},"The docs build",[351,464,465,468,469],{},[236,466,467],{},"pnpm install --frozen-lockfile && pnpm run build"," in ",[236,470,471],{},"docs",[351,473,474,475,478],{},"The site builds with no network access. Set ",[236,476,477],{},"NUXT_TELEMETRY_DISABLED=1",".",[480,481,482,483,486,487,490,491,395],"p",{},"Use JDK 25, and run one sbt process at a time in one checkout. Never start a terminal UI with ",[236,484,485],{},"sbt run",": use the start scripts (",[236,488,489],{},"sbt examples\u002Flaunchers",", then ",[236,492,493],{},"examples\u002Ftarget\u002Fbin\u002F\u003Capp>",[277,495,497],{"id":496},"write-docs","Write docs",[282,499,500,503],{},[285,501,502],{},"Write the docs, the comments and the Scaladoc in ASD-STE100 (Simplified Technical English): short sentences, one instruction in each.",[285,504,505,506,508],{},"A Scala block of a docs page is the text of a region of a compiled source. Add the region to the source first, then copy its text. ",[236,507,446],{}," checks it.",[277,510,512],{"id":511},"releases","Releases",[480,514,515,516,412,519,522,523,526,527,529,530,532],{},"The maintainer starts a release from the Actions form on ",[236,517,518],{},"main",[288,520,521],{"href":192},"ADR 0020","). The workflow checks everything before it creates a tag, waits for one approval, and then publishes each module to Maven Central in the order of the dependencies. A pull request that changes a published module adds a line under ",[236,524,525],{},"## [Unreleased]"," of ",[236,528,411],{},", in the subsection ",[236,531,419],{},": that text becomes the release notes.",[277,534,536],{"id":535},"report-a-problem","Report a problem",[480,538,539,540,543,544,478],{},"Use the issue forms. A security problem goes to the ",[288,541,542],{"href":220},"security policy",". The planned features are issues: ",[288,545,546],{"href":546,"rel":547},"https:\u002F\u002Fgithub.com\u002Fyuri4n\u002Ftui4s\u002Fissues",[292],[549,550,551],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":234,"searchDepth":248,"depth":248,"links":553},[554,555,556,557,558],{"id":279,"depth":248,"text":280},{"id":324,"depth":248,"text":325},{"id":496,"depth":248,"text":497},{"id":511,"depth":248,"text":512},{"id":535,"depth":248,"text":536},"How to build tui4s, the checks that a change must pass, and where the rules are.","md",null,{},{"icon":217},{"title":214,"description":559},"DOHy9s38BYRVjibGyphPFduX6RzLrP8q0K8zrsy12so",[567,569],{"title":209,"path":210,"stem":211,"description":568,"icon":212,"children":-1},"The planned and deferred features of tui4s, each with its GitHub issue.",{"title":219,"path":220,"stem":221,"description":570,"icon":222,"children":-1},"How to report a security problem in tui4s.",1792528758011]