{"_id":"@opentui-ui/dialog","_rev":"8-0471521558df0d73d799835d93f68a41","name":"@opentui-ui/dialog","dist-tags":{"latest":"0.1.3"},"versions":{"0.0.2":{"name":"@opentui-ui/dialog","version":"0.0.2","keywords":["dialog","modal","tui","terminal","cli","opentui"],"author":{"name":"Matt Simpson"},"license":"MIT","_id":"@opentui-ui/dialog@0.0.2","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"homepage":"https://github.com/msmps/opentui-ui#readme","bugs":{"url":"https://github.com/msmps/opentui-ui/issues"},"dist":{"shasum":"e64352b1f63261bf6020afec3e914ee7f97a8a17","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.0.2.tgz","fileCount":17,"integrity":"sha512-z7LgBYTetJmFtyfouUk3ocwqv5VqTByeF4Ydb8QaLnj4ldX5euOjJL43S/0WJSCg8nC2cU9pNgW5puz9pH5Ayw==","signatures":[{"sig":"MEYCIQDDaKSPhy5pUyZYIW1WciiRwiIeytr7sgrLBZlkGPEJCQIhAMvUXH7qZ5Qxdl5EK/OHzyjJi/y5nlVvPKL/6nP138XL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":120158},"type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"}},"gitHead":"d77567db240a5c6200d16caf0c7c3d92ee6ea183","scripts":{"build":"tsdown","clean":"rm -rf dist"},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"repository":{"url":"git+https://github.com/msmps/opentui-ui.git","type":"git","directory":"packages/dialog"},"_npmVersion":"10.8.2","description":"A dialog/modal library for terminal UIs built on OpenTUI","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","tsdown":"^0.18.2","solid-js":"1.9.9","@types/bun":"latest","typescript":"^5","@babel/core":"^7.28.5","@types/react":"^19","@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65","@opentui-ui/utils":"workspace:^","babel-preset-solid":"1.9.9","@babel/preset-typescript":"^7.28.5"},"peerDependencies":{"@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dialog_0.0.2_1767288533355_0.8702437823864391","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@opentui-ui/dialog","version":"0.0.3","keywords":["dialog","modal","tui","terminal","cli","opentui"],"author":{"name":"Matt Simpson"},"license":"MIT","_id":"@opentui-ui/dialog@0.0.3","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"homepage":"https://github.com/msmps/opentui-ui#readme","bugs":{"url":"https://github.com/msmps/opentui-ui/issues"},"dist":{"shasum":"87efa350be6ab9c878934f4c616cd628522ce36d","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.0.3.tgz","fileCount":17,"integrity":"sha512-3jS0joPgym/1/y+6wRZfhPAjGN89zo2fTJwSjPkyfMHy3HHMYwceBWlHYYUGK1G4IO9kQBJN3qUfNsfQptra6w==","signatures":[{"sig":"MEUCIQCFeAH0oYkpsGUHu8Kc9lUq0NR9MHJmzmh9aG+kS6CjoQIgPDslry6hRF27mGJEKQkt3dwxfiCURt/gnNvr5ECm7zA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":120075},"type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"}},"gitHead":"5c8d5a03e4f6255451666c143c4c26e5b98cb7e0","scripts":{"build":"tsdown","clean":"rm -rf dist"},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"repository":{"url":"git+https://github.com/msmps/opentui-ui.git","type":"git","directory":"packages/dialog"},"_npmVersion":"10.8.2","description":"A dialog/modal library for terminal UIs built on OpenTUI","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","tsdown":"^0.18.2","solid-js":"1.9.9","@types/bun":"latest","typescript":"^5","@babel/core":"^7.28.5","@types/react":"^19","@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65","@opentui-ui/utils":"workspace:^","babel-preset-solid":"1.9.9","@babel/preset-typescript":"^7.28.5"},"peerDependencies":{"@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dialog_0.0.3_1767292968860_0.7037142346602896","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@opentui-ui/dialog","version":"0.0.4","keywords":["dialog","modal","tui","terminal","cli","opentui"],"author":{"name":"Matt Simpson"},"license":"MIT","_id":"@opentui-ui/dialog@0.0.4","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"homepage":"https://github.com/msmps/opentui-ui#readme","bugs":{"url":"https://github.com/msmps/opentui-ui/issues"},"dist":{"shasum":"8c198da695dfb767300bd66a41a8f3fdaa7af0b6","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.0.4.tgz","fileCount":22,"integrity":"sha512-b/2ZEu8QBquqO2Ww2oa5i0jiN4CcZ2nzrbRPOQpQem+C+8B82DCOjEr1pgDU+lMDX56Dj9qEr3orIUs8lmyg0A==","signatures":[{"sig":"MEUCIFzQrallKGrK/Hm5Y3DAs4eU3zEuJfL+Xj0x1NRopEIwAiEA0IPjPjbfwjeLDXNEh6rSzqFongahkZ76oRwsf2dttL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":138329},"type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"},"./themes":{"types":"./dist/themes.d.mts","import":"./dist/themes.mjs"}},"gitHead":"f91f02ed28ce0d1133e9544ab0afce14f5580e8f","scripts":{"build":"tsdown","clean":"rm -rf dist"},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"repository":{"url":"git+https://github.com/msmps/opentui-ui.git","type":"git","directory":"packages/dialog"},"_npmVersion":"10.8.2","description":"A dialog/modal library for terminal UIs built on OpenTUI","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","tsdown":"^0.18.2","solid-js":"1.9.9","@types/bun":"latest","typescript":"^5","@babel/core":"^7.28.5","@types/react":"^19","@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65","@opentui-ui/utils":"workspace:^","babel-preset-solid":"1.9.9","@babel/preset-typescript":"^7.28.5"},"peerDependencies":{"@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dialog_0.0.4_1767302366216_0.28133139381836214","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@opentui-ui/dialog","version":"0.0.5","keywords":["dialog","modal","tui","terminal","cli","opentui"],"author":{"name":"Matt Simpson"},"license":"MIT","_id":"@opentui-ui/dialog@0.0.5","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"homepage":"https://github.com/msmps/opentui-ui#readme","bugs":{"url":"https://github.com/msmps/opentui-ui/issues"},"dist":{"shasum":"e8964da3a21e4a04f6899f313834bc63a6beea26","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.0.5.tgz","fileCount":22,"integrity":"sha512-bxtc7K5GjEbiyv/cv8tALWX0hvkDlzSuizX3a0ZEYdJSEZzi1DXBUsqiCXDkYh6KQWnYYgzQ6xzy4RO7uLP8yg==","signatures":[{"sig":"MEQCIHeqIpYqa5ZZaBSNlNsF7u1878rNUbwrqNQ29ea053N6AiA1JElgho2nOegx5Z4WVeP7i6xI49AOYIg+n9xd0LT+pQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":198289},"type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"},"./themes":{"types":"./dist/themes.d.mts","import":"./dist/themes.mjs"}},"gitHead":"1df9c10a6a93ee93bc4d96fb448654552640c3c9","scripts":{"build":"tsdown","clean":"rm -rf dist"},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"repository":{"url":"git+https://github.com/msmps/opentui-ui.git","type":"git","directory":"packages/dialog"},"_npmVersion":"10.8.2","description":"A dialog/modal library for terminal UIs built on OpenTUI","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","tsdown":"^0.18.2","solid-js":"1.9.9","@types/bun":"latest","typescript":"^5","@babel/core":"^7.28.5","@types/react":"^19","@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65","@opentui-ui/utils":"workspace:^","babel-preset-solid":"1.9.9","@babel/preset-typescript":"^7.28.5"},"peerDependencies":{"@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dialog_0.0.5_1767533269504_0.13967997776678187","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@opentui-ui/dialog","version":"0.1.0","keywords":["dialog","modal","tui","terminal","cli","opentui"],"author":{"name":"Matt Simpson"},"license":"MIT","_id":"@opentui-ui/dialog@0.1.0","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"homepage":"https://github.com/msmps/opentui-ui#readme","bugs":{"url":"https://github.com/msmps/opentui-ui/issues"},"dist":{"shasum":"5bf2efec6692fd33935d5cffbc38883a5fd4b105","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.1.0.tgz","fileCount":22,"integrity":"sha512-guVEp9RdGm34wvsdY04Rc2/mCFzGUxbqgq0hh8qKGD2w+sBD7eN6ab9eI26feOx+SmlyMbzFCRrbkTdJkyu04g==","signatures":[{"sig":"MEUCIBIfPFtde94SSdr5fldF6TKdRHauOifDli3PJR37Dp4OAiEA6CrjNkRrONR/FAXtDx7C87jmHnUzSYSu0dZky0AO1Ek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":197398},"type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"},"./themes":{"types":"./dist/themes.d.mts","import":"./dist/themes.mjs"}},"gitHead":"a1906afe5fbb793a7e3cf307c74763fe3b023517","scripts":{"build":"tsdown","clean":"rm -rf dist"},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"repository":{"url":"git+https://github.com/msmps/opentui-ui.git","type":"git","directory":"packages/dialog"},"_npmVersion":"10.8.2","description":"A dialog/modal library for terminal UIs built on OpenTUI","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","tsdown":"^0.18.2","solid-js":"1.9.9","@types/bun":"latest","typescript":"^5","@babel/core":"^7.28.5","@types/react":"^19","@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65","@opentui-ui/utils":"workspace:^","babel-preset-solid":"1.9.9","@babel/preset-typescript":"^7.28.5"},"peerDependencies":{"@opentui/core":"^0.1.65","@opentui/react":"^0.1.65","@opentui/solid":"^0.1.65"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dialog_0.1.0_1767646795439_0.11595964287291705","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@opentui-ui/dialog","version":"0.1.1","keywords":["dialog","modal","tui","terminal","cli","opentui"],"author":{"name":"Matt Simpson"},"license":"MIT","_id":"@opentui-ui/dialog@0.1.1","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"homepage":"https://github.com/msmps/opentui-ui#readme","bugs":{"url":"https://github.com/msmps/opentui-ui/issues"},"dist":{"shasum":"5ab658d87116557da480ce5014ba34699f568520","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.1.1.tgz","fileCount":22,"integrity":"sha512-etZn98T3TVrh98LRf0opv1ZV3L0A7z3lLDv3R47ql8INyDIEVEY/+yKNlblxqrNrvcJsry97JTVJgfom5S0Clg==","signatures":[{"sig":"MEUCIFQM1AMR8XHEeaw9bDBc87nnB+P+CWX2kXk4LTYEdXyHAiEAoFrUyiKRW5K92tpW7xUPx5Qe6yi2VFQjgJ8TZ3Sc7pY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":197493},"type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"},"./themes":{"types":"./dist/themes.d.mts","import":"./dist/themes.mjs"}},"gitHead":"e0b2d93aed7e9ce538ee9e92ad727ca682f53b4e","scripts":{"build":"tsdown","clean":"rm -rf dist"},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"repository":{"url":"git+https://github.com/msmps/opentui-ui.git","type":"git","directory":"packages/dialog"},"_npmVersion":"10.8.2","description":"A dialog/modal library for terminal UIs built on OpenTUI","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","tsdown":"^0.18.2","solid-js":"1.9.9","@types/bun":"latest","typescript":"^5","@babel/core":"^7.28.5","@types/react":"^19","@opentui/core":"^0.1.69","@opentui/react":"^0.1.69","@opentui/solid":"^0.1.69","@opentui-ui/utils":"workspace:^","babel-preset-solid":"1.9.9","@babel/preset-typescript":"^7.28.5"},"peerDependencies":{"@opentui/core":"^0.1.69","@opentui/react":"^0.1.69","@opentui/solid":"^0.1.69"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dialog_0.1.1_1767717621928_0.10431549997169576","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@opentui-ui/dialog","version":"0.1.2","keywords":["dialog","modal","tui","terminal","cli","opentui"],"author":{"name":"Matt Simpson"},"license":"MIT","_id":"@opentui-ui/dialog@0.1.2","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"homepage":"https://github.com/msmps/opentui-ui#readme","bugs":{"url":"https://github.com/msmps/opentui-ui/issues"},"dist":{"shasum":"34fb5a3e59d6b5648fa582ea856404d57f9aefee","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.1.2.tgz","fileCount":22,"integrity":"sha512-EZ4FG5u5sxU75+6pcsJsLzsD5JqO05So/1ceZUKUu7nxZ9IF7gcZEi+MU4HnYC9cb2Q7w6hM9y3/iW+jE1C53w==","signatures":[{"sig":"MEYCIQDpXWG2YFys79INQ/TlTI2piqfYQfn4sozpYEtulP5gSwIhALMojpJjC5UEk//NvG6FAtqVqszkEOhih61JXhHIlLX4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":197796},"type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"},"./themes":{"types":"./dist/themes.d.mts","import":"./dist/themes.mjs"}},"gitHead":"1ea2b2405989276384cc799e9210bcc166b20547","scripts":{"build":"tsdown","clean":"rm -rf dist"},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"repository":{"url":"git+https://github.com/msmps/opentui-ui.git","type":"git","directory":"packages/dialog"},"_npmVersion":"10.8.2","description":"A dialog/modal library for terminal UIs built on OpenTUI","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^19.2.3","tsdown":"^0.18.2","solid-js":"1.9.9","@types/bun":"latest","typescript":"^5","@babel/core":"^7.28.5","@types/react":"^19","@opentui/core":"^0.1.69","@opentui/react":"^0.1.69","@opentui/solid":"^0.1.69","@opentui-ui/utils":"workspace:^","babel-preset-solid":"1.9.9","@babel/preset-typescript":"^7.28.5"},"peerDependencies":{"@opentui/core":"^0.1.69","@opentui/react":"^0.1.69","@opentui/solid":"^0.1.69"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/dialog_0.1.2_1767740320033_0.9951182100862104","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@opentui-ui/dialog","version":"0.1.3","description":"A dialog/modal library for terminal UIs built on OpenTUI","author":{"name":"Matt Simpson"},"license":"MIT","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/tuiparts/tuiparts.git","directory":"packages/dialog"},"type":"module","module":"./dist/index.mjs","types":"./dist/index.d.mts","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs"},"./themes":{"types":"./dist/themes.d.mts","import":"./dist/themes.mjs"},"./react":{"types":"./dist/react.d.mts","import":"./dist/react.mjs"},"./solid":{"types":"./dist/solid.d.mts","import":"./dist/solid.mjs"}},"bugs":{"url":"https://github.com/tuiparts/tuiparts/issues"},"homepage":"https://github.com/tuiparts/tuiparts#readme","keywords":["dialog","modal","tui","terminal","cli","opentui"],"devDependencies":{"@babel/core":"^7.29.7","@babel/preset-typescript":"^7.29.7","@opentui/core":"^0.5.10","@opentui/react":"^0.5.10","@opentui/solid":"^0.5.10","@types/bun":"^1.3.14","@types/node":"^24.13.3","@types/react":"^19.2.17","babel-preset-solid":"1.9.12","react":"^19.2.7","solid-js":"1.9.12","tsdown":"^0.22.5","typescript":"^5.9.3","ws":"^8.21.0","@tuiparts/utils":"^0.0.1"},"peerDependencies":{"@opentui/core":">=0.4.3 <0.6.0","@opentui/react":">=0.4.3 <0.6.0","@opentui/solid":">=0.4.3 <0.6.0","react":"^19.2.0","solid-js":"^1.9.0"},"peerDependenciesMeta":{"@opentui/react":{"optional":true},"@opentui/solid":{"optional":true},"react":{"optional":true},"solid-js":{"optional":true}},"scripts":{"build":"tsdown","test":"bun run test:core && bun run test:react && bun run test:solid","test:core":"bun test src/dialog.test.ts","test:react":"bun test src/react.test.tsx","test:solid":"bun test --preload @opentui/solid/preload src/solid.test.tsx","typecheck":"tsc --noEmit","clean":"rm -rf dist"},"_id":"@opentui-ui/dialog@0.1.3","_integrity":"sha512-CXg+OYlMjYsoF8K1mfJS6epPj/R/Ox/ByxQig+hMAUOO6SPNytB0+xiWYcYBTcp4JQ4k4gEisy+TF1zKQl5/OQ==","_resolved":"/tmp/61ac2fcbe37cb9c6f3cec3bbe36c125e/opentui-ui-dialog-0.1.3.tgz","_from":"file:opentui-ui-dialog-0.1.3.tgz","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-CXg+OYlMjYsoF8K1mfJS6epPj/R/Ox/ByxQig+hMAUOO6SPNytB0+xiWYcYBTcp4JQ4k4gEisy+TF1zKQl5/OQ==","shasum":"a319077e03bbcb2d25819a1a161aaf09707c1a3f","tarball":"https://registry.npmjs.org/@opentui-ui/dialog/-/dialog-0.1.3.tgz","fileCount":13,"unpackedSize":93684,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@opentui-ui%2fdialog@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCRfJWN/UrP2XQ1t8Zg3c6FDfFkyQQA2nS2+NKme6A/TQIgcyKlCcVXYl1Am5tJwYBceqn+cdnTNFDZR0OtKtfsjoU="}]},"_npmUser":{"name":"msmps","email":"hello@msmp.me"},"directories":{},"maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dialog_0.1.3_1788383779108_0.16565201743075275"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-01T17:28:53.270Z","modified":"2026-09-02T21:16:19.582Z","0.0.2":"2026-01-01T17:28:53.513Z","0.0.3":"2026-01-01T18:42:49.008Z","0.0.4":"2026-01-01T21:19:26.349Z","0.0.5":"2026-01-04T13:27:49.669Z","0.1.0":"2026-01-05T20:59:55.586Z","0.1.1":"2026-01-06T16:40:22.070Z","0.1.2":"2026-01-06T22:58:40.183Z","0.1.3":"2026-09-02T21:16:19.221Z"},"bugs":{"url":"https://github.com/tuiparts/tuiparts/issues"},"author":{"name":"Matt Simpson"},"license":"MIT","homepage":"https://github.com/tuiparts/tuiparts#readme","keywords":["dialog","modal","tui","terminal","cli","opentui"],"repository":{"type":"git","url":"git+https://github.com/tuiparts/tuiparts.git","directory":"packages/dialog"},"description":"A dialog/modal library for terminal UIs built on OpenTUI","maintainers":[{"name":"msmps","email":"hello@msmp.me"}],"readme":"<div align=\"center\">\n  <img width=\"512\" src=\"https://github.com/tuiparts/tuiparts/raw/main/packages/dialog/assets/banner.png\" />\n</div>\n\n<br />\n\n<div align=\"center\"><strong>A dialog/modal library for terminal UIs built on OpenTUI</strong></div>\n<div align=\"center\">\n  <sub>Built by <a href=\"https://x.com/msmps_\">Matt Simpson</a></sub>\n</div>\n\n<br />\n\n## Features\n\n- Lightweight default styling\n- Size presets (small, medium, large, full)\n- Click-to-close backdrop (opt-in)\n- ESC key to close\n- Dialog stack support (multiple dialogs)\n- Focus management (saves/restores focus on open/close)\n- Theme presets (minimal, unstyled)\n- React and Solid.js integrations\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Core Usage](#core-usage)\n  - [Quick Start](#quick-start)\n  - [Quick Reference](#quick-reference)\n  - [Choosing the Right Method](#choosing-the-right-method)\n  - [Async Prompts](#async-prompts)\n  - [API Reference](#api-reference)\n- [Framework Adapters (React & Solid)](#framework-adapters-react--solid)\n  - [Setup](#setup)\n  - [Choosing the Right Method](#choosing-the-right-method-1)\n  - [Async Prompts (Framework)](#async-prompts-framework)\n  - [useDialog() Hook](#usedialog-hook)\n  - [useDialogState() Hook](#usedialogstate-hook)\n  - [useDialogKeyboard() Hook](#usedialogkeyboard-hook)\n  - [Full Example](#full-example)\n- [Customization](#customization)\n  - [Default Styling](#default-styling)\n  - [Themes](#themes)\n  - [Unstyled Mode](#unstyled-mode)\n  - [Size Presets](#size-presets)\n- [TypeScript](#typescript)\n- [License](#license)\n\n## Installation\n\n```bash\nbun add @opentui-ui/dialog\n```\n\n---\n\n## Core Usage\n\nUse the core API when working directly with `@opentui/core` renderables without a framework.\n\n### Quick Start\n\n```ts\nimport { DialogContainerRenderable, DialogManager } from \"@opentui-ui/dialog\";\nimport { TextRenderable } from \"@opentui/core\";\n\n// 1. Create the manager and container\nconst manager = new DialogManager(renderer);\nconst container = new DialogContainerRenderable(renderer, { manager });\nrenderer.root.add(container);\n\n// 2. Show dialogs from anywhere!\nmanager.show({\n  content: (ctx) => new TextRenderable(ctx, { content: \"Hello World!\" }),\n});\n```\n\n### Quick Reference\n\n```ts\n// Show dialogs\nmanager.show({ content: (ctx) => new TextRenderable(ctx, { content: \"Hello\" }) });\nmanager.show({ content: fn, size: \"large\" });        // With size preset\nmanager.show({ content: fn, id: \"my-dialog\" });      // With custom ID\n\n// Close dialogs\nmanager.close();        // Close top-most\nmanager.close(id);      // Close specific\nmanager.closeAll();     // Close all\nmanager.replace({...}); // Close all and show new\n\n// Query state\nmanager.isOpen();       // boolean\nmanager.getDialogs();   // readonly Dialog[]\nmanager.getTopDialog(); // Dialog | undefined\n```\n\n### Choosing the Right Method\n\n| Method | Best For | `dialogId` Available | Keyboard Handling |\n|--------|----------|---------------------|-------------------|\n| `confirm()` | Yes/No decisions | ✅ via context | ✅ `useDialogKeyboard` works |\n| `alert()` | Acknowledgments | ✅ via context | ✅ `useDialogKeyboard` works |\n| `prompt<T>()` | Getting user input | ✅ via context | ✅ `useDialogKeyboard` works |\n| `choice<K>()` | Multiple options | ✅ via context | ✅ `useDialogKeyboard` works |\n| `show()` | Non-interactive display | ❌ | ❌ Manual workarounds needed |\n\n**Use async methods** for any dialog requiring user interaction or keyboard handling. They provide `dialogId` in the content context, enabling proper keyboard event scoping.\n\n**Use `show()`** only for non-interactive dialogs that need external lifecycle control:\n\n```ts\n// Loading dialog pattern - close from outside\nconst loadingId = manager.show({\n  content: (ctx) => new TextRenderable(ctx, { content: \"Loading...\" }),\n});\n\nawait performOperation();\n\nmanager.close(loadingId);\n```\n\n### Async Prompts\n\nFor common dialog patterns, use the built-in async methods that return Promises. Content functions receive **both** `renderCtx` and the dialog context, with `renderCtx` first to match the OpenTUI pattern:\n\n```ts\nimport { BoxRenderable, TextRenderable } from \"@opentui/core\";\n\n// Confirmation dialog - returns boolean\nconst confirmed = await manager.confirm({\n  content: (renderCtx, { resolve, dismiss }) => {\n    const box = new BoxRenderable(renderCtx, { flexDirection: \"column\" });\n    const title = new TextRenderable(renderCtx, { content: \"Delete file?\" });\n    box.add(title);\n\n    const buttons = new BoxRenderable(renderCtx, { flexDirection: \"row\" });\n    const cancelBtn = new TextRenderable(renderCtx, { content: \"Cancel\" });\n    cancelBtn.on(\"mouseUp\", dismiss);\n    const confirmBtn = new TextRenderable(renderCtx, { content: \"Confirm\" });\n    confirmBtn.on(\"mouseUp\", () => resolve(true));\n    buttons.add(cancelBtn);\n    buttons.add(confirmBtn);\n    box.add(buttons);\n\n    return box;\n  },\n  fallback: false, // Optional: value when dismissed via ESC/backdrop (default: false)\n});\n\n// Alert dialog - returns void\nawait manager.alert({\n  content: (renderCtx, { dismiss }) => {\n    const box = new BoxRenderable(renderCtx, { flexDirection: \"column\" });\n    const text = new TextRenderable(renderCtx, { content: \"Operation complete!\" });\n    box.add(text);\n    const okBtn = new TextRenderable(renderCtx, { content: \"OK\" });\n    okBtn.on(\"mouseUp\", dismiss);\n    box.add(okBtn);\n    return box;\n  },\n});\n\n// Choice dialog - returns selected key or undefined\nconst action = await manager.choice<\"save\" | \"discard\">({\n  content: (renderCtx, { resolve, dismiss }) => {\n    const box = new BoxRenderable(renderCtx, { flexDirection: \"column\" });\n    // ... build UI\n    return box;\n  },\n  fallback: \"discard\", // Optional: value when dismissed via ESC/backdrop\n});\n\n// Generic prompt - returns typed value or undefined\nconst value = await manager.prompt<string>({\n  content: (renderCtx, { resolve, dismiss }) => {\n    const box = new BoxRenderable(renderCtx, { flexDirection: \"column\" });\n    // ... build UI\n    return box;\n  },\n  fallback: \"default\", // Optional: value when dismissed via ESC/backdrop\n});\n```\n\n#### Context Methods at a Glance\n\n| Method | Returns | Context Properties | Notes |\n| ------ | ------- | ------------------ | ----- |\n| `confirm()` | `Promise<boolean>` | `resolve(boolean)`, `dismiss()`, `dialogId` | `resolve(true)` = confirm, `dismiss()` = cancel |\n| `alert()` | `Promise<void>` | `dismiss()`, `dialogId` | Just acknowledge and close |\n| `choice<K>()` | `Promise<K \\| undefined>` | `resolve(key)`, `dismiss()`, `dialogId` | `dismiss()` returns `undefined` |\n| `prompt<T>()` | `Promise<T \\| undefined>` | `resolve(value)`, `dismiss()`, `dialogId` | `dismiss()` returns `undefined` |\n\n> **Pattern summary:**\n> - `resolve(value)` — complete the dialog with a value\n> - `dismiss()` — close without a value (or acknowledge for alerts)\n> - `dialogId` — unique ID for this dialog\n\n> **Programmatic close:** If you need to close an async dialog externally (e.g., from a timer or external event), capture the `dialogId` from the context. Calling `manager.close(dialogId)` will close the dialog and resolve the promise with the fallback value (`undefined`, `false`, etc.) — the promise will not be left pending.\n\n### API Reference\n\n#### `DialogManager`\n\n```typescript\nconst manager = new DialogManager(renderer);\n\n// Show a dialog - returns the dialog ID\nconst id = manager.show({\n  content: (ctx) => new TextRenderable(ctx, { content: \"Hello\" }),\n  size?: \"small\" | \"medium\" | \"large\" | \"full\",\n  style?: DialogStyle,\n  unstyled?: boolean,\n  backdropColor?: string, // default: \"#000000\"\n  backdropOpacity?: number | string, // 0-1 or \"50%\" (default: 0.35)\n  closeOnEscape?: boolean, // default: true (per-dialog override)\n  closeOnClickOutside?: boolean, // default: false\n  onClose?: () => void,\n  onOpen?: () => void,\n  onBackdropClick?: () => void,\n  id?: string | number, // optional custom ID\n});\n\n// Close dialogs\nmanager.close();        // Close top-most\nmanager.close(id);      // Close specific\nmanager.closeAll();     // Close all\nmanager.replace({...}); // Close all and show new\n\n// Query state\nmanager.isOpen();       // boolean\nmanager.getDialogs();   // readonly Dialog[]\nmanager.getTopDialog(); // Dialog | undefined\n\n// Async prompt methods\nconst confirmed = await manager.confirm({ content: ... });\nconst value = await manager.prompt<string>({ content: ... });\nawait manager.alert({ content: ... });\nconst choice = await manager.choice<\"a\" | \"b\">({ content: ... });\n\n// Subscribe to changes\nconst unsubscribe = manager.subscribe((data) => {\n  // Called when dialogs change\n});\n\n// Cleanup\nmanager.destroy();\n```\n\n#### `DialogContainerRenderable`\n\n```typescript\nconst container = new DialogContainerRenderable(renderer, {\n  manager, // Required: DialogManager instance\n  size: \"medium\", // Default size preset\n  dialogOptions: {\n    // Default style options for all dialogs\n    style: DialogStyle,\n  },\n  sizePresets: {\n    // Custom size presets (terminal columns)\n    small: 40,\n    medium: 60,\n    large: 80,\n  },\n  backdropColor: \"#000000\", // Default backdrop color\n  backdropOpacity: 0.35, // 0-1 or \"50%\" (default: 0.35)\n  closeOnEscape: true, // ESC key closes top dialog (default: true)\n  closeOnClickOutside: false, // Backdrop click closes top dialog (default: false)\n  unstyled: false, // Disable default styles (default: false)\n});\n\n// Add to render tree\nrenderer.root.add(container);\n```\n\n#### `DialogStyle`\n\n```typescript\ninterface DialogStyle {\n  // Content panel\n  backgroundColor?: string; // Default: \"#262626\"\n  borderColor?: string;\n  borderStyle?: BorderStyle;\n  border?: boolean; // Default: false\n\n  // Sizing\n  width?: number | string;\n  maxWidth?: number;\n  minWidth?: number;\n  maxHeight?: number;\n\n  // Padding (default: 1 cell all around)\n  padding?: number;\n  paddingX?: number;\n  paddingY?: number;\n  paddingTop?: number;\n  paddingRight?: number;\n  paddingBottom?: number;\n  paddingLeft?: number;\n}\n```\n\n---\n\n## Framework Adapters (React & Solid)\n\nBoth frameworks share the same API pattern with `DialogProvider`, `useDialog()`, and `useDialogState()`.\n\n### Setup\n\n```tsx\n// React\nimport {\n  DialogProvider,\n  useDialog,\n  useDialogKeyboard,\n  useDialogState,\n} from \"@opentui-ui/dialog/react\";\n\n// Solid\nimport {\n  DialogProvider,\n  useDialog,\n  useDialogKeyboard,\n  useDialogState,\n} from \"@opentui-ui/dialog/solid\";\n\nfunction App() {\n  return (\n    <DialogProvider size=\"medium\">\n      <MyContent />\n    </DialogProvider>\n  );\n}\n```\n\n#### Using Themes\n\n```tsx\nimport { DialogProvider } from \"@opentui-ui/dialog/react\";\nimport { themes } from \"@opentui-ui/dialog/themes\";\n\nfunction App() {\n  return (\n    <DialogProvider {...themes.minimal}>\n      <MyContent />\n    </DialogProvider>\n  );\n}\n```\n\n### Choosing the Right Method\n\nSee the [comparison table in Core Usage](#choosing-the-right-method) for when to use `show()` vs async methods.\n\n**TL;DR:** Use async methods (`confirm`, `alert`, `prompt`, `choice`) for interactive dialogs. Use `show()` only for non-interactive display (loading spinners) that need external lifecycle control:\n\n```tsx\n// Loading dialog - close from outside\nconst loadingId = dialog.show({ content: () => <LoadingSpinner /> });\nawait performOperation();\ndialog.close(loadingId);\n```\n\n### Async Prompts (Framework)\n\nContent functions receive only the **dialog context** (`resolve`, `dismiss`, `dialogId`) — no `renderCtx` needed:\n\n```tsx\n// Confirmation dialog - returns boolean\nconst confirmed = await dialog.confirm({\n  content: (ctx) => (\n    <box flexDirection=\"column\">\n      <text>Delete this file?</text>\n      <box flexDirection=\"row\" gap={1}>\n        <text onMouseUp={ctx.dismiss}>Cancel</text>\n        <text onMouseUp={() => ctx.resolve(true)}>Confirm</text>\n      </box>\n    </box>\n  ),\n  fallback: false, // Optional: value when dismissed via ESC/backdrop (default: false)\n});\n\n// Alert dialog - returns void (just acknowledgment)\nawait dialog.alert({\n  content: (ctx) => (\n    <box flexDirection=\"column\">\n      <text>Operation complete!</text>\n      <text onMouseUp={ctx.dismiss}>OK</text>\n    </box>\n  ),\n});\n\n// Choice dialog - returns selected key or undefined\nconst action = await dialog.choice<\"save\" | \"discard\">({\n  content: (ctx) => (\n    <box flexDirection=\"column\">\n      <text>Unsaved changes</text>\n      <text onMouseUp={() => ctx.resolve(\"save\")}>Save</text>\n      <text onMouseUp={() => ctx.resolve(\"discard\")}>Discard</text>\n      <text onMouseUp={ctx.dismiss}>Cancel</text>\n    </box>\n  ),\n  fallback: \"discard\", // Optional: value when dismissed via ESC/backdrop\n});\n\n// Generic prompt - returns typed value or undefined\nconst name = await dialog.prompt<string>({\n  content: (ctx) => (\n    <box flexDirection=\"column\">\n      <text>Enter your name:</text>\n      <input onSubmit={(value) => ctx.resolve(value)} />\n      <text onMouseUp={ctx.dismiss}>Cancel</text>\n    </box>\n  ),\n  fallback: \"Anonymous\", // Optional: value when dismissed via ESC/backdrop\n});\n```\n\n#### Building Custom Async Dialogs\n\nThe `confirm()`, `alert()`, and `choice()` methods are convenience wrappers. For custom patterns, use `prompt<T>()` directly:\n\n```tsx\n// Example: A rating dialog that returns 1-5\nconst rating = await dialog.prompt<number>({\n  content: (ctx) => (\n    <box flexDirection=\"column\">\n      <box flexDirection=\"row\" gap={1}>\n        {[1, 2, 3, 4, 5].map((n) => (\n          <text key={n} onMouseUp={() => ctx.resolve(n)}>\n            {n}\n          </text>\n        ))}\n      </box>\n      <text onMouseUp={ctx.dismiss}>Skip rating</text>\n    </box>\n  ),\n  fallback: 0, // Return 0 if dismissed via ESC/backdrop\n});\n```\n\n### `useDialog()` Hook\n\nReturns dialog actions for imperatively controlling dialogs.\n\n```tsx\nconst dialog = useDialog();\n\n// Show a dialog (content must be a function for both React and Solid)\ndialog.show({\n  content: () => <MyContent />,\n  size: \"medium\",\n  style: { backgroundColor: \"#1a1a1a\" },\n  unstyled: false,\n  backdropColor: \"#000000\",\n  backdropOpacity: 0.5,\n  closeOnEscape: true,\n  closeOnClickOutside: true,\n  onClose: () => {},\n  onOpen: () => {},\n  id: \"my-dialog\",\n});\n\n// Close dialogs\ndialog.close();        // Close top-most\ndialog.close(id);      // Close specific\ndialog.closeAll();     // Close all\ndialog.replace({...}); // Close all and show new\n\n// Async prompt methods\nconst confirmed = await dialog.confirm({ content: ... });\nconst value = await dialog.prompt<string>({ content: ... });\nawait dialog.alert({ content: ... });\nconst choice = await dialog.choice<\"a\" | \"b\">({ content: ... });\n```\n\n### `useDialogState()` Hook\n\nSubscribe to reactive dialog state using a selector.\n\n```typescript\ninterface DialogState {\n  isOpen: boolean; // Whether any dialog is open\n  count: number; // Number of open dialogs\n  dialogs: readonly Dialog[]; // All active dialogs (oldest first)\n  topDialog: Dialog | undefined; // The top-most dialog\n}\n\nconst isOpen = useDialogState((s) => s.isOpen);\nconst count = useDialogState((s) => s.count);\nconst topDialog = useDialogState((s) => s.topDialog);\n```\n\n> [!WARNING]\n> Always select primitives not new objects.\n\n```ts\n// Good - selects primitives\nconst isOpen = useDialogState((s) => s.isOpen);\nconst count = useDialogState((s) => s.count);\n\n// Bad - creates new object every time, always re-renders\nconst state = useDialogState((s) => ({ isOpen: s.isOpen, count: s.count }));\n```\n\n**Key difference:** React returns values directly, Solid returns accessors you must call.\n\n```tsx\n// React - values directly\nif (isOpen) {\n  console.log(`${count} dialog(s) open`);\n}\n\n// Solid - call accessors\nif (isOpen()) {\n  console.log(`${count()} dialog(s) open`);\n}\n```\n\n### `useDialogKeyboard()` Hook\n\nWhen using `useKeyboard` from `@opentui/react` or `@opentui/solid` inside dialog content, keyboard events fire for **all** stacked dialogs simultaneously. This is because `useKeyboard` registers global listeners with no focus scoping.\n\n`useDialogKeyboard` solves this by only firing the handler when the dialog is the topmost in the stack:\n\n```tsx\nimport { useDialogKeyboard, type ConfirmContext } from \"@opentui-ui/dialog/react\";\n\nfunction DeleteConfirmDialog({ resolve, dialogId }: ConfirmContext) {\n  const [selected, setSelected] = useState<\"cancel\" | \"delete\">(\"cancel\");\n\n  // Only fires when THIS dialog is topmost\n  useDialogKeyboard((key) => {\n    if (key.name === \"tab\") {\n      setSelected((prev) => (prev === \"cancel\" ? \"delete\" : \"cancel\"));\n    }\n    if (key.name === \"return\") {\n      resolve(selected === \"delete\");\n    }\n    if (key.name === \"escape\") {\n      resolve(false);\n    }\n  }, dialogId);\n\n  return (\n    <box flexDirection=\"column\">\n      <text>Delete this file?</text>\n      <box flexDirection=\"row\" gap={1}>\n        <text bg={selected === \"cancel\" ? \"#333\" : undefined}>Cancel</text>\n        <text bg={selected === \"delete\" ? \"#c00\" : undefined}>Delete</text>\n      </box>\n    </box>\n  );\n}\n```\n\n#### Manual Implementation with `dialogId`\n\nIf you need more control, use `dialogId` with `useDialogState` and the standard `useKeyboard` hook:\n\n```tsx\nimport { useKeyboard } from \"@opentui/react\";\nimport { useDialogState, type ConfirmContext } from \"@opentui-ui/dialog/react\";\n\nfunction MyDialog({ resolve, dialogId }: ConfirmContext) {\n  // Reactively check if this dialog is topmost\n  const isTopmost = useDialogState((s) => s.topDialog?.id === dialogId);\n\n  useKeyboard((key) => {\n    // Guard: only handle events when topmost\n    if (!isTopmost) return;\n\n    if (key.name === \"return\") {\n      resolve(true);\n    }\n  });\n\n  return <text>Press Enter to confirm</text>;\n}\n```\n\n### Full Example\n\n```tsx\n// React (content must be a function)\nfunction MyContent() {\n  const dialog = useDialog();\n  const isOpen = useDialogState((s) => s.isOpen);\n\n  return (\n    <box>\n      <text>{isOpen ? \"Dialog open\" : \"No dialog\"}</text>\n      <box onMouseUp={() => dialog.show({ content: () => <text>Hello!</text> })}>\n        <text>Open Dialog</text>\n      </box>\n    </box>\n  );\n}\n\n// Solid - note: content is a function, accessors are called\nfunction MyContent() {\n  const dialog = useDialog();\n  const isOpen = useDialogState((s) => s.isOpen);\n\n  return (\n    <box>\n      <text>{isOpen() ? \"Dialog open\" : \"No dialog\"}</text>\n      <box\n        onMouseUp={() => dialog.show({ content: () => <text>Hello!</text> })}\n      >\n        <text>Open Dialog</text>\n      </box>\n    </box>\n  );\n}\n```\n\n---\n\n## Customization\n\nThese options work with both core and framework usage.\n\n### Default Styling\n\nOut of the box, dialogs use the **minimal** theme:\n\n- Lighter backdrop (35% opacity)\n- No borders\n- Tighter padding (1 cell all around)\n\nThis provides a clean, unobtrusive appearance while still being usable immediately.\n\n### Themes\n\nTheme presets provide alternative visual styles. Import from `@opentui-ui/dialog/themes`:\n\n```ts\nimport { DialogContainerRenderable, DialogManager } from \"@opentui-ui/dialog\";\nimport { themes } from \"@opentui-ui/dialog/themes\";\n\nconst container = new DialogContainerRenderable(renderer, {\n  manager,\n  ...themes.unstyled, // Start from scratch with no default styles\n});\n```\n\n| Theme | Description |\n| ----- | ----------- |\n| `minimal` | Lighter backdrop (35%), no borders, tighter padding (default) |\n| `unstyled` | No backdrop, no background, no border, no padding |\n\nCustomize a theme:\n\n```ts\nconst container = new DialogContainerRenderable(renderer, {\n  manager,\n  ...themes.minimal,\n  size: \"large\", // Override specific options\n});\n```\n\n### Unstyled Mode\n\nFor full control over dialog styling, use `unstyled: true`. This disables all default styles (backdrop, background, border, padding):\n\n```ts\nconst container = new DialogContainerRenderable(renderer, {\n  manager,\n  unstyled: true,\n  dialogOptions: {\n    style: {\n      // Add your own styles\n      backgroundColor: \"#262626\",\n      border: true,\n      borderColor: \"#525252\",\n    },\n  },\n});\n```\n\n### Size Presets\n\nDefault size presets (in terminal columns):\n\n| Size   | Width              |\n| ------ | ------------------ |\n| small  | 40                 |\n| medium | 60                 |\n| large  | 80                 |\n| full   | terminal width - 4 |\n\nOverride with `sizePresets` option:\n\n```ts\nconst container = new DialogContainerRenderable(renderer, {\n  manager,\n  sizePresets: {\n    small: 35,\n    medium: 55,\n    large: 75,\n  },\n});\n```\n\n---\n\n## TypeScript\n\nFull TypeScript support with exported types:\n\n```ts\n// Core types\nimport type {\n  // Dialog types\n  Dialog,\n  DialogContainerOptions,\n  DialogContentFactory,\n  DialogId,\n  DialogShowOptions,\n  DialogSize,\n  DialogState,\n  DialogStyle,\n  DialogTheme,\n  DialogToClose,\n  // Async prompt contexts\n  AlertContext,\n  ChoiceContext,\n  ConfirmContext,\n  PromptContext,\n  // Async dialog options (for imperative usage)\n  AlertOptions,\n  ChoiceOptions,\n  ConfirmOptions,\n  PromptOptions,\n  // Base types (for building custom adapters)\n  AsyncDialogOptions,\n  BaseAlertOptions,\n  BaseChoiceOptions,\n  BaseConfirmOptions,\n  BaseDialogActions,\n  BasePromptOptions,\n} from \"@opentui-ui/dialog\";\n\n// Type guard for close events\nimport { isDialogToClose } from \"@opentui-ui/dialog\";\n\n// Themes and default style constants\nimport {\n  DEFAULT_BACKDROP_COLOR,\n  DEFAULT_BACKDROP_OPACITY,\n  DEFAULT_PADDING,\n  DEFAULT_STYLE,\n  themes,\n  type DialogTheme,\n} from \"@opentui-ui/dialog/themes\";\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}