{"_id":"@termuijs/jsx","_rev":"8-149cca258e279b66d9501eb61bf4fc03","name":"@termuijs/jsx","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"@termuijs/jsx","version":"0.1.0","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","_id":"@termuijs/jsx@0.1.0","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"dist":{"shasum":"6684de00add66ce4c59cd52ba487ee7f81103841","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.0.tgz","fileCount":15,"integrity":"sha512-cCS81Jgbyki5WPvYHxD4yAxT0z+53UnJoZrmexxL7ajCrrLSw5b7CKP/xwK4vRV0Q9h7vgIKrA2jw8gCmmthWw==","signatures":[{"sig":"MEQCIAbGi8G5cXeCdYpOK1sXi19OGnskI/JlS9/WOTkm/3bpAiA2I6Uad0kq0mshZTVYJz2ywyuP3hSNaJMc+6GnK9G6Xg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115846},"main":"./dist/index.cjs","type":"module","_from":"file:termuijs-jsx-0.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"_resolved":"/private/var/folders/70/kw570tnj79z5rm8hcwyhbnqm0000gn/T/a89ba0326865585a5119f87d491865dd/termuijs-jsx-0.1.0.tgz","_integrity":"sha512-cCS81Jgbyki5WPvYHxD4yAxT0z+53UnJoZrmexxL7ajCrrLSw5b7CKP/xwK4vRV0Q9h7vgIKrA2jw8gCmmthWw==","_npmVersion":"11.10.0","description":"TSX component runtime for TermUI — React-like hooks & JSX for the terminal","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@termuijs/core":"0.1.0","@termuijs/widgets":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/jsx_0.1.0_1772422414417_0.06616666240498725","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@termuijs/jsx","version":"0.1.1","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","_id":"@termuijs/jsx@0.1.1","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"dist":{"shasum":"b5697ba54b243b434854978c037e7b17f9bb34f8","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.1.tgz","fileCount":16,"integrity":"sha512-8mhZE1bf+XefPUHjCCq0vT1hSy4ZhmdSLB0R6lkgPVBEt1q9rVJDhHFScRnyeV9ALbyvl2m+7gHyUrOyth8fIg==","signatures":[{"sig":"MEYCIQDrRfAdrSEhYmecGzUaASQx5pwE278SdKx/40IHJ+/QwQIhAMUlpaoISS8Wh0277mjNbCNWr42JMABOK39RYOjl6WJn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117173},"main":"./dist/index.cjs","type":"module","_from":"file:termuijs-jsx-0.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"_resolved":"/private/var/folders/70/kw570tnj79z5rm8hcwyhbnqm0000gn/T/da7a3ca7152c50a342fee751ce60045a/termuijs-jsx-0.1.1.tgz","_integrity":"sha512-8mhZE1bf+XefPUHjCCq0vT1hSy4ZhmdSLB0R6lkgPVBEt1q9rVJDhHFScRnyeV9ALbyvl2m+7gHyUrOyth8fIg==","_npmVersion":"11.10.0","description":"TSX component runtime for TermUI — React-like hooks & JSX for the terminal","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@termuijs/core":"0.1.1","@termuijs/widgets":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/jsx_0.1.1_1772422943626_0.9338938570685527","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@termuijs/jsx","version":"0.1.2","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","_id":"@termuijs/jsx@0.1.2","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"dist":{"shasum":"6ad1ed5f34f3ad98463a7b85711db78ea2a9e145","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.2.tgz","fileCount":17,"integrity":"sha512-kYi920gMQNn6s90LA8k2QQBox5UNYYhoAJfasRWyqhbYD45DqBZJztD4lKs1Fd5OnwB4F13klg+bvQj2+uwpzw==","signatures":[{"sig":"MEYCIQDwiGAH0+d8i2oDwkwzb2YLDc2PInDPb4Mk0ui/kQ43QAIhAIuSOAJo20NcK6ABHZORTfpmtDFvH018LVie3Uy9afl1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156472},"main":"./dist/index.cjs","type":"module","_from":"file:termuijs-jsx-0.1.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"_resolved":"/private/var/folders/70/kw570tnj79z5rm8hcwyhbnqm0000gn/T/a27367f523ba907cf025a995ec0a77ab/termuijs-jsx-0.1.2.tgz","_integrity":"sha512-kYi920gMQNn6s90LA8k2QQBox5UNYYhoAJfasRWyqhbYD45DqBZJztD4lKs1Fd5OnwB4F13klg+bvQj2+uwpzw==","_npmVersion":"11.12.0","description":"JSX runtime for TermUI with useState, useEffect, useContext, useAsync, and memo()","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@termuijs/core":"0.1.2","@termuijs/widgets":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/jsx_0.1.2_1775112450044_0.8029395785677096","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@termuijs/jsx","version":"0.1.3","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","_id":"@termuijs/jsx@0.1.3","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"homepage":"https://www.termui.io/docs/jsx/context","bugs":{"url":"https://github.com/Karanjot786/TermUI/issues"},"dist":{"shasum":"d82077c4355968fe9fc55ca653f34f5e91be5a41","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.3.tgz","fileCount":17,"integrity":"sha512-zCTfMCEaQpQ6Px66M3msipTsLPNETrd3KX1FbE810/O1T8kC+c4JKJgGgk/v5oBV3aULh/TaT2nZ+bnEvvytjw==","signatures":[{"sig":"MEUCIQD4e02gB1xNrBNimGraDvmYPxBGJIeVFc0N38kRUl26DAIgTGrpoEmrmt0j4bOAx2lcV/qSuPav8Wsz+rFwJWs8j3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156728},"main":"./dist/index.cjs","type":"module","_from":"file:termuijs-jsx-0.1.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"_resolved":"/private/var/folders/70/kw570tnj79z5rm8hcwyhbnqm0000gn/T/addd1799db63c308221679b072e96dfc/termuijs-jsx-0.1.3.tgz","_integrity":"sha512-zCTfMCEaQpQ6Px66M3msipTsLPNETrd3KX1FbE810/O1T8kC+c4JKJgGgk/v5oBV3aULh/TaT2nZ+bnEvvytjw==","repository":{"url":"git+https://github.com/Karanjot786/TermUI.git","type":"git"},"_npmVersion":"11.12.0","description":"JSX runtime for TermUI with useState, useEffect, useContext, useAsync, and memo()","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@termuijs/core":"0.1.3","@termuijs/widgets":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/jsx_0.1.3_1775570001962_0.026818946051071935","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@termuijs/jsx","version":"0.1.4","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","_id":"@termuijs/jsx@0.1.4","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"homepage":"https://www.termui.io/docs/jsx/context","bugs":{"url":"https://github.com/Karanjot786/TermUI/issues"},"dist":{"shasum":"fca2e753faf0e3bb3f89635f5601b94e3a04f444","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.4.tgz","fileCount":17,"integrity":"sha512-wIJzqCgPHW9YGlxuw8a+UzWyQlaudy1+Jl/KUfYlv9usVI9LSqALlpmK/kN5+wWPnLxsvXqH3ncUdRt3wLCigA==","signatures":[{"sig":"MEUCIQC9tBRJGN9L1qHnAAn1ThWkvu2S1SZC9ByiW0SNe2RTzAIgKI4kQYfZcNIlbX1f3iPX1PO+5M7mWQPz0QltOteay4Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289687},"main":"./dist/index.cjs","type":"module","_from":"file:termuijs-jsx-0.1.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"_resolved":"/private/var/folders/70/kw570tnj79z5rm8hcwyhbnqm0000gn/T/54ba1a393286463e7a8fee3e3abeecf1/termuijs-jsx-0.1.4.tgz","_integrity":"sha512-wIJzqCgPHW9YGlxuw8a+UzWyQlaudy1+Jl/KUfYlv9usVI9LSqALlpmK/kN5+wWPnLxsvXqH3ncUdRt3wLCigA==","repository":{"url":"git+https://github.com/Karanjot786/TermUI.git","type":"git"},"_npmVersion":"11.12.0","description":"JSX runtime for TermUI with useState, useEffect, useContext, useAsync, and memo()","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@termuijs/core":"0.1.4","@termuijs/motion":"0.1.4","@termuijs/widgets":"0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/jsx_0.1.4_1778474548925_0.17567636777971085","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@termuijs/jsx","version":"0.1.5","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","_id":"@termuijs/jsx@0.1.5","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"homepage":"https://www.termui.io/docs/jsx/context","dist":{"shasum":"73836fd5539489a16c3a36d4cb1a8faefb9857df","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.5.tgz","fileCount":16,"integrity":"sha512-y4/Zrtb+LHjiEGJrbTAI+TTEWAQW6MRIc/Km/5188y90qLbN7LMXSMnJ8bLgb/rt247zCY8m8Y5skbwI4s48+w==","signatures":[{"sig":"MEQCIEiJwdw2yglpV5i5Hgs2fG/rLyDOGK7IPsOqYe/L5FIyAiAeQ1Opk27+MWsU+IoS5zJsqtj/v1Um+1A5sdH0zxOMXA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288682},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"73836fd5539489a16c3a36d4cb1a8faefb9857df","engines":{"bun":">=1.3.0","node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"_integrity":"sha512-y4/Zrtb+LHjiEGJrbTAI+TTEWAQW6MRIc/Km/5188y90qLbN7LMXSMnJ8bLgb/rt247zCY8m8Y5skbwI4s48+w==","repository":{"url":"https://github.com/Karanjot786/TermUI","type":"git"},"_npmVersion":"10.8.3","description":"JSX runtime for TermUI with useState, useEffect, useContext, useAsync, and memo()","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@termuijs/core":"0.1.4","@termuijs/motion":"0.1.4","@termuijs/widgets":"0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/jsx_0.1.5_1779776197200_0.8316969146534812","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@termuijs/jsx","version":"0.1.6","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","_id":"@termuijs/jsx@0.1.6","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"homepage":"https://www.termui.io/docs/jsx/context","dist":{"shasum":"e18cc77a2b15247577599f45b0dc44233ce68eb0","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.6.tgz","fileCount":16,"integrity":"sha512-BuVfdpCsk2eRP3YVV5VN/CUCmvSRel5Z/xXWwj4MWA0MNmRReHQQJd/C99WyKOSCcSm+8S18gTVcV2EtXGpENA==","signatures":[{"sig":"MEQCIBOhSncfTz8A/olZsSotvvOE+bk4ihaxwepz39WVfoXfAiAyVI0l+K7GcLyHBdtCym+p3Oj/paOmeAdPtME+0hKGxg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":570304},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","shasum":"e18cc77a2b15247577599f45b0dc44233ce68eb0","engines":{"bun":">=1.3.0","node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"},"./jsx-dev-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"scripts":{"dev":"tsup --watch","build":"tsup"},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"_integrity":"sha512-BuVfdpCsk2eRP3YVV5VN/CUCmvSRel5Z/xXWwj4MWA0MNmRReHQQJd/C99WyKOSCcSm+8S18gTVcV2EtXGpENA==","repository":{"url":"https://github.com/Karanjot786/TermUI","type":"git"},"_npmVersion":"10.8.3","description":"JSX runtime for TermUI with useState, useEffect, useContext, useAsync, and memo()","directories":{},"_nodeVersion":"24.3.0","dependencies":{"@termuijs/core":"0.1.5","@termuijs/motion":"0.1.5","@termuijs/widgets":"0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/jsx_0.1.6_1781506787059_0.926869551712393","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@termuijs/jsx","homepage":"https://www.termui.io/docs/jsx/context","repository":{"type":"git","url":"https://github.com/Karanjot786/TermUI"},"version":"0.1.7","description":"JSX runtime for TermUI with useState, useEffect, useContext, useAsync, and memo()","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./jsx-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"},"./jsx-dev-runtime":{"types":"./dist/jsx-runtime.d.ts","import":"./dist/jsx-runtime.js","require":"./dist/jsx-runtime.cjs"}},"publishConfig":{"access":"public"},"scripts":{"build":"tsup","dev":"tsup --watch"},"dependencies":{"@termuijs/core":"0.1.7","@termuijs/motion":"0.1.7","@termuijs/widgets":"0.1.7"},"devDependencies":{"tsup":"^8.0.0","typescript":"^5.4.0"},"keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"license":"MIT","engines":{"bun":">=1.3.0","node":">=18.0.0"},"_id":"@termuijs/jsx@0.1.7","_integrity":"sha512-oTL1AQGZwUM8k12sV8PT2DAuuolFqTaJ3A+wgltdrtRR0kreODq0EDjHQ6iZWb4BQV3/5VyBHHykK/9yGkMr4w==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"c166bede24531e33dde4e6c44f1469976211a0c8","dist":{"integrity":"sha512-oTL1AQGZwUM8k12sV8PT2DAuuolFqTaJ3A+wgltdrtRR0kreODq0EDjHQ6iZWb4BQV3/5VyBHHykK/9yGkMr4w==","shasum":"c166bede24531e33dde4e6c44f1469976211a0c8","tarball":"https://registry.npmjs.org/@termuijs/jsx/-/jsx-0.1.7.tgz","fileCount":16,"unpackedSize":553120,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCcMZxwGzaZhNnBV4do2k73H85ca1j/PlYDwBvGxHAwzgIhAOi0xCgyRdq9DzibpYQ67m9wjqB9jkynnL7yuKXSlthF"}]},"_npmUser":{"name":"karanjot786","email":"Karanjots801@gmail.com"},"directories":{},"maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jsx_0.1.7_1782721239903_0.07895493014466104"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-02T03:33:34.324Z","modified":"2026-06-29T08:20:40.170Z","0.1.0":"2026-03-02T03:33:34.561Z","0.1.1":"2026-03-02T03:42:23.769Z","0.1.2":"2026-04-02T06:47:30.189Z","0.1.3":"2026-04-07T13:53:22.096Z","0.1.4":"2026-05-11T04:42:29.065Z","0.1.5":"2026-05-26T06:16:37.363Z","0.1.6":"2026-06-15T06:59:47.210Z","0.1.7":"2026-06-29T08:20:40.033Z"},"license":"MIT","homepage":"https://www.termui.io/docs/jsx/context","keywords":["terminal","tui","cli","jsx","tsx","react","hooks"],"repository":{"type":"git","url":"https://github.com/Karanjot786/TermUI"},"description":"JSX runtime for TermUI with useState, useEffect, useContext, useAsync, and memo()","maintainers":[{"name":"karanjot786","email":"Karanjots801@gmail.com"}],"readme":"# @termuijs/jsx\n\nWrite terminal apps with JSX and React-style hooks. This package is the TSX runtime for TermUI. It handles component lifecycle, reconciliation, hooks, focus management, and error handling.\n\n## Install\n\n```bash\nnpm install @termuijs/jsx\n```\n\nRequires `@termuijs/core` and `@termuijs/widgets`.\n\n## Setup\n\nAdd this to your `tsconfig.json`:\n\n```json\n{\n    \"compilerOptions\": {\n        \"jsx\": \"react-jsx\",\n        \"jsxImportSource\": \"@termuijs/jsx\"\n    }\n}\n```\n\n## Usage\n\n```tsx\nimport { render, useState, useEffect } from '@termuijs/jsx'\nimport { Box, Text } from '@termuijs/widgets'\n\nfunction App() {\n    const [time, setTime] = useState(new Date().toLocaleTimeString())\n\n    useEffect(() => {\n        const id = setInterval(() => {\n            setTime(new Date().toLocaleTimeString())\n        }, 1000)\n        return () => clearInterval(id)\n    }, [])\n\n    return (\n        <Box border=\"rounded\" padding={1}>\n            <Text bold>Current time: {time}</Text>\n        </Box>\n    )\n}\n\nrender(<App />)\n```\n\n## Hooks\n\n| Hook | What it does |\n|------|-------------|\n| `useState` | Component state. Triggers a re-render when the value changes |\n| `useToggle` | Boolean state with `toggle`, `on`, and `off` helpers |\n| `useEffect` | Side effects with cleanup. Runs after render, re-runs when deps change |\n| `useRef` | Mutable ref that persists across renders without causing re-renders |\n| `useInput` | Register a keyboard handler for this component |\n| `useKeymap` | Declare named key bindings. Cleaner than `useInput` for multiple keys |\n| `useInterval` | Set an interval that auto-cleans on unmount |\n| `useContext` | Read a value from the nearest Provider ancestor |\n| `useAsync` | Load async data with built-in loading, error, and refetch tracking |\n| `useMotion` | Read motion preference. Returns `{ prefersReducedMotion }` |\n\n## useKeymap\n\nDeclare key bindings as an array of objects. More readable than chained if-statements. All bindings from multiple `useKeymap` calls in the same component are additive.\n\n```tsx\nimport { useKeymap } from '@termuijs/jsx'\n\nfunction App() {\n    useKeymap([\n        { key: 'c', ctrl: true, action: () => process.exit(0) },\n        { key: 'q', action: () => goBack() },\n        { key: '/', action: () => openSearch() },\n        { key: 's', ctrl: true, action: () => save() },\n    ])\n\n    // Bindings with modifier access\n    useKeymap([\n        { key: 'k', ctrl: true, action: () => console.log('ctrl+k pressed') },\n    ])\n\n    return <Box>...</Box>\n}\n```\n\nModifier syntax: `ctrl+`, `alt+`, `shift+`, `meta+`. Combine them: `ctrl+shift+k`.\n\n## useMotion\n\nRead the user's motion preference before starting animations.\n\n```tsx\nimport { useMotion } from '@termuijs/jsx'\nimport { timerPoolSubscribe } from '@termuijs/core'\n\nfunction AnimatedWidget() {\n    const { prefersReducedMotion } = useMotion()\n\n    useEffect(() => {\n        if (prefersReducedMotion) return\n        return timerPoolSubscribe(16, () => tick())\n    }, [prefersReducedMotion])\n\n    return <Box>...</Box>\n}\n```\n\n## useToggle\n\nManage a simple boolean state with helpers to flip, enable, or disable it.\n\n```tsx\nimport { useToggle } from '@termuijs/jsx'\nimport { Box, Text, Button } from '@termuijs/widgets'\n\nfunction ToggleExample() {\n    const [isOpen, controls] = useToggle()\n\n    return (\n        <Box>\n            <Text>{isOpen ? 'Open' : 'Closed'}</Text>\n            <Button onPress={controls.toggle}>Toggle</Button>\n            <Button onPress={controls.on}>Open</Button>\n            <Button onPress={controls.off}>Close</Button>\n        </Box>\n    )\n}\n```\n\n## ErrorBoundary\n\nWrap any subtree. Errors show a fallback instead of crashing the app.\n\n```tsx\nimport { ErrorBoundary } from '@termuijs/jsx'\n\nfunction App() {\n    return (\n        <ErrorBoundary\n            fallback={(err) => (\n                <Box border=\"single\" borderColor=\"red\">\n                    <Text color=\"red\">Error: {err.message}</Text>\n                </Box>\n            )}\n            onError={(err) => logError(err)}\n        >\n            <Dashboard />\n        </ErrorBoundary>\n    )\n}\n```\n\nPlace one at the app root and one around each major section. Call `boundary.reset()` to clear the error state and re-render children.\n\n## Focus management\n\nFour hooks for building keyboard-accessible interfaces:\n\n```tsx\nimport {\n    useFocusManager,\n    useFocus,\n    useFocusTrap,\n    useKeyboardNavigation,\n} from '@termuijs/jsx'\n\n// App root: provides the focus context\nfunction App() {\n    const { FocusContext, focus, blur, focused } = useFocusManager()\n    return (\n        <FocusContext.Provider value={{ focus, blur, focused }}>\n            <Screen />\n        </FocusContext.Provider>\n    )\n}\n\n// Individual widget: reads focus state\nfunction Input({ id }) {\n    const { isFocused, focus } = useFocus({ id, autoFocus: false })\n    return <Box borderColor={isFocused ? 'cyan' : 'white'}>...</Box>\n}\n\n// Modal: traps Tab/Shift+Tab within a set of IDs\nfunction Modal({ fieldIds }) {\n    useFocusTrap(fieldIds)\n    return <Box>...</Box>\n}\n\n// List: standard arrow key navigation\nfunction List({ items }) {\n    const { selectedIndex, select } = useKeyboardNavigation({\n        items,\n        loop: true,\n        pageSize: 10,\n    })\n    return <Box>...</Box>\n}\n```\n\n## Context\n\nShare state across the component tree without prop drilling.\n\n```tsx\nimport { createContext, useContext } from '@termuijs/jsx'\n\nconst ThemeCtx = createContext({ primary: '#00ff88', bg: '#0a0a0f' })\n\nfunction App() {\n    return (\n        <ThemeCtx.Provider value={{ primary: '#ff0088', bg: '#1a1a2e' }}>\n            <Dashboard />\n        </ThemeCtx.Provider>\n    )\n}\n\nfunction StatusBar() {\n    const theme = useContext(ThemeCtx)\n    return <Text color={theme.primary}>Ready</Text>\n}\n```\n\n## memo()\n\nSkip re-renders when props have not changed.\n\n```tsx\nimport { memo } from '@termuijs/jsx'\n\nconst Row = memo(function Row({ name, cpu }) {\n    return <Text>{name}: {cpu}%</Text>\n})\n```\n\n## Fiber identity reuse\n\nThe reconciler reuses existing fiber instances when a component type and its position in the tree both match. Hook state (`useState`, `useRef`) survives parent re-renders. Animated components like `Spinner` and `Skeleton` no longer reset when a sibling updates.\n\n## Documentation\n\nFull docs at [www.termui.io/docs/jsx/context](https://www.termui.io/docs/jsx/context).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}