@posthog/wizard 1.36.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (464) hide show
  1. package/README.md +79 -0
  2. package/dist/bin.js +199 -12
  3. package/dist/bin.js.map +1 -1
  4. package/dist/src/__tests__/cli.test.js +7 -18
  5. package/dist/src/__tests__/cli.test.js.map +1 -1
  6. package/dist/src/__tests__/run.test.js +50 -5
  7. package/dist/src/__tests__/run.test.js.map +1 -1
  8. package/dist/src/__tests__/wizard-abort.test.js +127 -0
  9. package/dist/src/__tests__/wizard-abort.test.js.map +1 -0
  10. package/dist/src/{android → frameworks/android}/android-wizard-agent.d.ts +1 -1
  11. package/dist/src/{android → frameworks/android}/android-wizard-agent.js +2 -2
  12. package/dist/src/frameworks/android/android-wizard-agent.js.map +1 -0
  13. package/dist/src/{android → frameworks/android}/utils.d.ts +1 -1
  14. package/dist/src/{android → frameworks/android}/utils.js +1 -1
  15. package/dist/src/frameworks/android/utils.js.map +1 -0
  16. package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.d.ts +1 -1
  17. package/dist/src/{angular → frameworks/angular}/angular-wizard-agent.js +9 -7
  18. package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -0
  19. package/dist/src/{angular → frameworks/angular}/utils.js +1 -1
  20. package/dist/src/frameworks/angular/utils.js.map +1 -0
  21. package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.d.ts +1 -1
  22. package/dist/src/{astro → frameworks/astro}/astro-wizard-agent.js +9 -7
  23. package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -0
  24. package/dist/src/{astro → frameworks/astro}/utils.d.ts +2 -5
  25. package/dist/src/{astro → frameworks/astro}/utils.js +3 -52
  26. package/dist/src/frameworks/astro/utils.js.map +1 -0
  27. package/dist/src/{django → frameworks/django}/django-wizard-agent.d.ts +1 -1
  28. package/dist/src/{django → frameworks/django}/django-wizard-agent.js +3 -3
  29. package/dist/src/frameworks/django/django-wizard-agent.js.map +1 -0
  30. package/dist/src/{django → frameworks/django}/utils.d.ts +1 -1
  31. package/dist/src/{django → frameworks/django}/utils.js +6 -6
  32. package/dist/src/frameworks/django/utils.js.map +1 -0
  33. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.d.ts +5 -0
  34. package/dist/src/{fastapi → frameworks/fastapi}/fastapi-wizard-agent.js +3 -32
  35. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js.map +1 -0
  36. package/dist/src/{fastapi → frameworks/fastapi}/utils.d.ts +1 -1
  37. package/dist/src/{fastapi → frameworks/fastapi}/utils.js +4 -4
  38. package/dist/src/frameworks/fastapi/utils.js.map +1 -0
  39. package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.d.ts +1 -1
  40. package/dist/src/{flask → frameworks/flask}/flask-wizard-agent.js +3 -3
  41. package/dist/src/frameworks/flask/flask-wizard-agent.js.map +1 -0
  42. package/dist/src/{flask → frameworks/flask}/utils.d.ts +1 -1
  43. package/dist/src/{flask → frameworks/flask}/utils.js +7 -7
  44. package/dist/src/frameworks/flask/utils.js.map +1 -0
  45. package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.d.ts +1 -1
  46. package/dist/src/{javascript-node → frameworks/javascript-node}/javascript-node-wizard-agent.js +4 -4
  47. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js.map +1 -0
  48. package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.d.ts +1 -1
  49. package/dist/src/{javascript-web → frameworks/javascript-web}/javascript-web-wizard-agent.js +16 -14
  50. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js.map +1 -0
  51. package/dist/src/{javascript-web → frameworks/javascript-web}/utils.d.ts +6 -1
  52. package/dist/src/{javascript-web → frameworks/javascript-web}/utils.js +49 -1
  53. package/dist/src/frameworks/javascript-web/utils.js.map +1 -0
  54. package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.d.ts +1 -1
  55. package/dist/src/{laravel → frameworks/laravel}/laravel-wizard-agent.js +2 -2
  56. package/dist/src/frameworks/laravel/laravel-wizard-agent.js.map +1 -0
  57. package/dist/src/{laravel → frameworks/laravel}/utils.d.ts +1 -1
  58. package/dist/src/{laravel → frameworks/laravel}/utils.js +5 -5
  59. package/dist/src/frameworks/laravel/utils.js.map +1 -0
  60. package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.d.ts +1 -1
  61. package/dist/src/{nextjs → frameworks/nextjs}/nextjs-wizard-agent.js +30 -8
  62. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -0
  63. package/dist/src/{nextjs → frameworks/nextjs}/utils.d.ts +5 -2
  64. package/dist/src/{nextjs → frameworks/nextjs}/utils.js +6 -20
  65. package/dist/src/frameworks/nextjs/utils.js.map +1 -0
  66. package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.d.ts +1 -1
  67. package/dist/src/{nuxt → frameworks/nuxt}/nuxt-wizard-agent.js +11 -9
  68. package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -0
  69. package/dist/src/{python → frameworks/python}/python-wizard-agent.d.ts +1 -1
  70. package/dist/src/{python → frameworks/python}/python-wizard-agent.js +3 -3
  71. package/dist/src/frameworks/python/python-wizard-agent.js.map +1 -0
  72. package/dist/src/{python → frameworks/python}/utils.d.ts +1 -1
  73. package/dist/src/frameworks/python/utils.js.map +1 -0
  74. package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.d.ts +1 -1
  75. package/dist/src/{rails → frameworks/rails}/rails-wizard-agent.js +2 -2
  76. package/dist/src/frameworks/rails/rails-wizard-agent.js.map +1 -0
  77. package/dist/src/{rails → frameworks/rails}/utils.d.ts +1 -1
  78. package/dist/src/{rails → frameworks/rails}/utils.js +4 -4
  79. package/dist/src/frameworks/rails/utils.js.map +1 -0
  80. package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.d.ts +1 -1
  81. package/dist/src/{react-native → frameworks/react-native}/react-native-wizard-agent.js +9 -7
  82. package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -0
  83. package/dist/src/{react-native → frameworks/react-native}/utils.d.ts +1 -1
  84. package/dist/src/{react-native → frameworks/react-native}/utils.js +7 -10
  85. package/dist/src/frameworks/react-native/utils.js.map +1 -0
  86. package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.d.ts +1 -1
  87. package/dist/src/{react-router → frameworks/react-router}/react-router-wizard-agent.js +15 -8
  88. package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -0
  89. package/dist/src/frameworks/react-router/utils.d.ts +13 -0
  90. package/dist/src/{react-router → frameworks/react-router}/utils.js +14 -111
  91. package/dist/src/frameworks/react-router/utils.js.map +1 -0
  92. package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.d.ts +1 -1
  93. package/dist/src/{ruby → frameworks/ruby}/ruby-wizard-agent.js +2 -2
  94. package/dist/src/frameworks/ruby/ruby-wizard-agent.js.map +1 -0
  95. package/dist/src/{ruby → frameworks/ruby}/utils.d.ts +1 -1
  96. package/dist/src/{ruby → frameworks/ruby}/utils.js +1 -1
  97. package/dist/src/frameworks/ruby/utils.js.map +1 -0
  98. package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.d.ts +1 -1
  99. package/dist/src/{svelte → frameworks/svelte}/svelte-wizard-agent.js +5 -5
  100. package/dist/src/frameworks/svelte/svelte-wizard-agent.js.map +1 -0
  101. package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.d.ts +1 -1
  102. package/dist/src/{swift → frameworks/swift}/swift-wizard-agent.js +2 -2
  103. package/dist/src/frameworks/swift/swift-wizard-agent.js.map +1 -0
  104. package/dist/src/{swift → frameworks/swift}/utils.d.ts +1 -1
  105. package/dist/src/frameworks/swift/utils.js.map +1 -0
  106. package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.d.ts +1 -1
  107. package/dist/src/{tanstack-router → frameworks/tanstack-router}/tanstack-router-wizard-agent.js +15 -8
  108. package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -0
  109. package/dist/src/frameworks/tanstack-router/utils.d.ts +11 -0
  110. package/dist/src/{tanstack-router → frameworks/tanstack-router}/utils.js +4 -47
  111. package/dist/src/frameworks/tanstack-router/utils.js.map +1 -0
  112. package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.d.ts +1 -1
  113. package/dist/src/{tanstack-start → frameworks/tanstack-start}/tanstack-start-wizard-agent.js +9 -7
  114. package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
  115. package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.js +1 -1
  116. package/dist/src/frameworks/tanstack-start/utils.js.map +1 -0
  117. package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.d.ts +1 -1
  118. package/dist/src/{vue → frameworks/vue}/vue-wizard-agent.js +8 -8
  119. package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -0
  120. package/dist/src/lib/__tests__/agent-interface.test.js +91 -19
  121. package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
  122. package/dist/src/lib/agent-interface.d.ts +49 -2
  123. package/dist/src/lib/agent-interface.js +254 -40
  124. package/dist/src/lib/agent-interface.js.map +1 -1
  125. package/dist/src/lib/agent-runner.d.ts +4 -2
  126. package/dist/src/lib/agent-runner.js +132 -126
  127. package/dist/src/lib/agent-runner.js.map +1 -1
  128. package/dist/src/lib/api.d.ts +4 -4
  129. package/dist/src/lib/commandments.js +1 -0
  130. package/dist/src/lib/commandments.js.map +1 -1
  131. package/dist/src/lib/constants.d.ts +22 -9
  132. package/dist/src/lib/constants.js +35 -11
  133. package/dist/src/lib/constants.js.map +1 -1
  134. package/dist/src/lib/framework-config.d.ts +26 -0
  135. package/dist/src/lib/framework-config.js.map +1 -1
  136. package/dist/src/lib/health-checks/__tests__/health-checks.test.d.ts +18 -0
  137. package/dist/src/lib/health-checks/__tests__/health-checks.test.js +752 -0
  138. package/dist/src/lib/health-checks/__tests__/health-checks.test.js.map +1 -0
  139. package/dist/src/lib/health-checks/endpoints.d.ts +3 -0
  140. package/dist/src/lib/health-checks/endpoints.js +46 -0
  141. package/dist/src/lib/health-checks/endpoints.js.map +1 -0
  142. package/dist/src/lib/health-checks/index.d.ts +4 -0
  143. package/dist/src/lib/health-checks/index.js +23 -0
  144. package/dist/src/lib/health-checks/index.js.map +1 -0
  145. package/dist/src/lib/health-checks/readiness.d.ts +24 -0
  146. package/dist/src/lib/health-checks/readiness.js +119 -0
  147. package/dist/src/lib/health-checks/readiness.js.map +1 -0
  148. package/dist/src/lib/health-checks/statuspage.d.ts +9 -0
  149. package/dist/src/lib/health-checks/statuspage.js +105 -0
  150. package/dist/src/lib/health-checks/statuspage.js.map +1 -0
  151. package/dist/src/lib/health-checks/types.d.ts +31 -0
  152. package/dist/src/lib/health-checks/types.js +10 -0
  153. package/dist/src/lib/health-checks/types.js.map +1 -0
  154. package/dist/src/lib/middleware/benchmark.d.ts +2 -2
  155. package/dist/src/lib/middleware/benchmark.js +3 -3
  156. package/dist/src/lib/middleware/benchmark.js.map +1 -1
  157. package/dist/src/lib/middleware/benchmarks/json-writer.js +2 -2
  158. package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -1
  159. package/dist/src/lib/middleware/benchmarks/summary.d.ts +2 -2
  160. package/dist/src/lib/middleware/benchmarks/summary.js +9 -9
  161. package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -1
  162. package/dist/src/lib/middleware/types.d.ts +2 -2
  163. package/dist/src/lib/middleware/types.js.map +1 -1
  164. package/dist/src/lib/package-manager-detection.js +1 -1
  165. package/dist/src/lib/package-manager-detection.js.map +1 -1
  166. package/dist/src/lib/registry.js +21 -21
  167. package/dist/src/lib/registry.js.map +1 -1
  168. package/dist/src/lib/version.d.ts +1 -1
  169. package/dist/src/lib/version.js +1 -1
  170. package/dist/src/lib/version.js.map +1 -1
  171. package/dist/src/lib/wizard-session.d.ts +115 -0
  172. package/dist/src/lib/wizard-session.js +104 -0
  173. package/dist/src/lib/wizard-session.js.map +1 -0
  174. package/dist/src/lib/wizard-tools.js +13 -0
  175. package/dist/src/lib/wizard-tools.js.map +1 -1
  176. package/dist/src/run.d.ts +3 -1
  177. package/dist/src/run.js +73 -55
  178. package/dist/src/run.js.map +1 -1
  179. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js +18 -22
  180. package/dist/src/steps/add-mcp-server-to-clients/clients/__tests__/codex.test.js.map +1 -1
  181. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +6 -6
  182. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
  183. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +7 -7
  184. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +8 -9
  185. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js.map +1 -1
  186. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +6 -6
  187. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +6 -6
  188. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +6 -6
  189. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +6 -6
  190. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +5 -2
  191. package/dist/src/steps/add-mcp-server-to-clients/index.js +24 -107
  192. package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
  193. package/dist/src/steps/add-or-update-environment-variables.js +15 -20
  194. package/dist/src/steps/add-or-update-environment-variables.js.map +1 -1
  195. package/dist/src/steps/index.d.ts +0 -1
  196. package/dist/src/steps/index.js +0 -1
  197. package/dist/src/steps/index.js.map +1 -1
  198. package/dist/src/steps/run-prettier.js +9 -11
  199. package/dist/src/steps/run-prettier.js.map +1 -1
  200. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +6 -3
  201. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -1
  202. package/dist/src/steps/upload-environment-variables/index.d.ts +3 -3
  203. package/dist/src/steps/upload-environment-variables/index.js +7 -35
  204. package/dist/src/steps/upload-environment-variables/index.js.map +1 -1
  205. package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +3 -2
  206. package/dist/src/steps/upload-environment-variables/providers/vercel.js +2 -2
  207. package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -1
  208. package/dist/src/ui/index.d.ts +8 -0
  209. package/dist/src/ui/index.js +17 -0
  210. package/dist/src/ui/index.js.map +1 -0
  211. package/dist/src/ui/logging-ui.d.ts +44 -0
  212. package/dist/src/ui/logging-ui.js +103 -0
  213. package/dist/src/ui/logging-ui.js.map +1 -0
  214. package/dist/src/ui/tui/App.d.ts +6 -0
  215. package/dist/src/ui/tui/App.js +10 -0
  216. package/dist/src/ui/tui/App.js.map +1 -0
  217. package/dist/src/ui/tui/__tests__/layout-helpers.test.js +68 -0
  218. package/dist/src/ui/tui/__tests__/layout-helpers.test.js.map +1 -0
  219. package/dist/src/ui/tui/__tests__/store.test.d.ts +1 -0
  220. package/dist/src/ui/tui/__tests__/store.test.js +723 -0
  221. package/dist/src/ui/tui/__tests__/store.test.js.map +1 -0
  222. package/dist/src/ui/tui/components/LearnCard.d.ts +10 -0
  223. package/dist/src/ui/tui/components/LearnCard.js +217 -0
  224. package/dist/src/ui/tui/components/LearnCard.js.map +1 -0
  225. package/dist/src/ui/tui/components/TipsCard.d.ts +9 -0
  226. package/dist/src/ui/tui/components/TipsCard.js +55 -0
  227. package/dist/src/ui/tui/components/TipsCard.js.map +1 -0
  228. package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
  229. package/dist/src/ui/tui/components/TitleBar.js +17 -0
  230. package/dist/src/ui/tui/components/TitleBar.js.map +1 -0
  231. package/dist/src/ui/tui/flows.d.ts +38 -0
  232. package/dist/src/ui/tui/flows.js +82 -0
  233. package/dist/src/ui/tui/flows.js.map +1 -0
  234. package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
  235. package/dist/src/ui/tui/hooks/useStdoutDimensions.js +37 -0
  236. package/dist/src/ui/tui/hooks/useStdoutDimensions.js.map +1 -0
  237. package/dist/src/ui/tui/ink-ui.d.ts +50 -0
  238. package/dist/src/ui/tui/ink-ui.js +108 -0
  239. package/dist/src/ui/tui/ink-ui.js.map +1 -0
  240. package/dist/src/ui/tui/package.json +1 -0
  241. package/dist/src/ui/tui/playground/PlaygroundApp.d.ts +12 -0
  242. package/dist/src/ui/tui/playground/PlaygroundApp.js +32 -0
  243. package/dist/src/ui/tui/playground/PlaygroundApp.js.map +1 -0
  244. package/dist/src/ui/tui/playground/demos/InputDemo.d.ts +4 -0
  245. package/dist/src/ui/tui/playground/demos/InputDemo.js +53 -0
  246. package/dist/src/ui/tui/playground/demos/InputDemo.js.map +1 -0
  247. package/dist/src/ui/tui/playground/demos/LayoutDemo.d.ts +5 -0
  248. package/dist/src/ui/tui/playground/demos/LayoutDemo.js +25 -0
  249. package/dist/src/ui/tui/playground/demos/LayoutDemo.js.map +1 -0
  250. package/dist/src/ui/tui/playground/demos/LogDemo.d.ts +5 -0
  251. package/dist/src/ui/tui/playground/demos/LogDemo.js +53 -0
  252. package/dist/src/ui/tui/playground/demos/LogDemo.js.map +1 -0
  253. package/dist/src/ui/tui/playground/demos/ProgressDemo.d.ts +5 -0
  254. package/dist/src/ui/tui/playground/demos/ProgressDemo.js +58 -0
  255. package/dist/src/ui/tui/playground/demos/ProgressDemo.js.map +1 -0
  256. package/dist/src/ui/tui/playground/demos/RunScreenDemo.d.ts +11 -0
  257. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js +159 -0
  258. package/dist/src/ui/tui/playground/demos/RunScreenDemo.js.map +1 -0
  259. package/dist/src/ui/tui/playground/demos/WelcomeDemo.d.ts +9 -0
  260. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js +15 -0
  261. package/dist/src/ui/tui/playground/demos/WelcomeDemo.js.map +1 -0
  262. package/dist/src/ui/tui/playground/start-playground.d.ts +4 -0
  263. package/dist/src/ui/tui/playground/start-playground.js +24 -0
  264. package/dist/src/ui/tui/playground/start-playground.js.map +1 -0
  265. package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
  266. package/dist/src/ui/tui/primitives/CardLayout.js +10 -0
  267. package/dist/src/ui/tui/primitives/CardLayout.js.map +1 -0
  268. package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
  269. package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
  270. package/dist/src/ui/tui/primitives/ConfirmationInput.js.map +1 -0
  271. package/dist/src/ui/tui/primitives/ContentSequencer.d.ts +42 -0
  272. package/dist/src/ui/tui/primitives/ContentSequencer.js +137 -0
  273. package/dist/src/ui/tui/primitives/ContentSequencer.js.map +1 -0
  274. package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
  275. package/dist/src/ui/tui/primitives/DissolveTransition.js +149 -0
  276. package/dist/src/ui/tui/primitives/DissolveTransition.js.map +1 -0
  277. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
  278. package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
  279. package/dist/src/ui/tui/primitives/EventPlanViewer.js.map +1 -0
  280. package/dist/src/ui/tui/primitives/HNViewer.d.ts +7 -0
  281. package/dist/src/ui/tui/primitives/HNViewer.js +63 -0
  282. package/dist/src/ui/tui/primitives/HNViewer.js.map +1 -0
  283. package/dist/src/ui/tui/primitives/LinesBlock.d.ts +16 -0
  284. package/dist/src/ui/tui/primitives/LinesBlock.js +37 -0
  285. package/dist/src/ui/tui/primitives/LinesBlock.js.map +1 -0
  286. package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
  287. package/dist/src/ui/tui/primitives/LoadingBox.js +10 -0
  288. package/dist/src/ui/tui/primitives/LoadingBox.js.map +1 -0
  289. package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
  290. package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
  291. package/dist/src/ui/tui/primitives/LogViewer.js.map +1 -0
  292. package/dist/src/ui/tui/primitives/NodeBlock.d.ts +13 -0
  293. package/dist/src/ui/tui/primitives/NodeBlock.js +17 -0
  294. package/dist/src/ui/tui/primitives/NodeBlock.js.map +1 -0
  295. package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
  296. package/dist/src/ui/tui/primitives/PickerMenu.js +134 -0
  297. package/dist/src/ui/tui/primitives/PickerMenu.js.map +1 -0
  298. package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
  299. package/dist/src/ui/tui/primitives/ProgressList.js +30 -0
  300. package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -0
  301. package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
  302. package/dist/src/ui/tui/primitives/PromptLabel.js +13 -0
  303. package/dist/src/ui/tui/primitives/PromptLabel.js.map +1 -0
  304. package/dist/src/ui/tui/primitives/ScreenContainer.d.ts +16 -0
  305. package/dist/src/ui/tui/primitives/ScreenContainer.js +36 -0
  306. package/dist/src/ui/tui/primitives/ScreenContainer.js.map +1 -0
  307. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +22 -0
  308. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +35 -0
  309. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js.map +1 -0
  310. package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
  311. package/dist/src/ui/tui/primitives/SplitView.js +9 -0
  312. package/dist/src/ui/tui/primitives/SplitView.js.map +1 -0
  313. package/dist/src/ui/tui/primitives/TabContainer.d.ts +23 -0
  314. package/dist/src/ui/tui/primitives/TabContainer.js +45 -0
  315. package/dist/src/ui/tui/primitives/TabContainer.js.map +1 -0
  316. package/dist/src/ui/tui/primitives/TextBlock.d.ts +41 -0
  317. package/dist/src/ui/tui/primitives/TextBlock.js +144 -0
  318. package/dist/src/ui/tui/primitives/TextBlock.js.map +1 -0
  319. package/dist/src/ui/tui/primitives/content-types.d.ts +37 -0
  320. package/dist/src/ui/tui/primitives/content-types.js +19 -0
  321. package/dist/src/ui/tui/primitives/content-types.js.map +1 -0
  322. package/dist/src/ui/tui/primitives/index.d.ts +24 -0
  323. package/dist/src/ui/tui/primitives/index.js +21 -0
  324. package/dist/src/ui/tui/primitives/index.js.map +1 -0
  325. package/dist/src/ui/tui/primitives/layout-helpers.d.ts +36 -0
  326. package/dist/src/ui/tui/primitives/layout-helpers.js +95 -0
  327. package/dist/src/ui/tui/primitives/layout-helpers.js.map +1 -0
  328. package/dist/src/ui/tui/primitives/text-helpers.d.ts +10 -0
  329. package/dist/src/ui/tui/primitives/text-helpers.js +43 -0
  330. package/dist/src/ui/tui/primitives/text-helpers.js.map +1 -0
  331. package/dist/src/ui/tui/router.d.ts +56 -0
  332. package/dist/src/ui/tui/router.js +94 -0
  333. package/dist/src/ui/tui/router.js.map +1 -0
  334. package/dist/src/ui/tui/screen-registry.d.ts +19 -0
  335. package/dist/src/ui/tui/screen-registry.js +34 -0
  336. package/dist/src/ui/tui/screen-registry.js.map +1 -0
  337. package/dist/src/ui/tui/screens/AuthScreen.d.ts +13 -0
  338. package/dist/src/ui/tui/screens/AuthScreen.js +20 -0
  339. package/dist/src/ui/tui/screens/AuthScreen.js.map +1 -0
  340. package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
  341. package/dist/src/ui/tui/screens/IntroScreen.js +63 -0
  342. package/dist/src/ui/tui/screens/IntroScreen.js.map +1 -0
  343. package/dist/src/ui/tui/screens/McpScreen.d.ts +24 -0
  344. package/dist/src/ui/tui/screens/McpScreen.js +112 -0
  345. package/dist/src/ui/tui/screens/McpScreen.js.map +1 -0
  346. package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
  347. package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
  348. package/dist/src/ui/tui/screens/OutageScreen.js.map +1 -0
  349. package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
  350. package/dist/src/ui/tui/screens/OutroScreen.js +22 -0
  351. package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -0
  352. package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
  353. package/dist/src/ui/tui/screens/RunScreen.js +73 -0
  354. package/dist/src/ui/tui/screens/RunScreen.js.map +1 -0
  355. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
  356. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +24 -0
  357. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -0
  358. package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
  359. package/dist/src/ui/tui/screens/SetupScreen.js +74 -0
  360. package/dist/src/ui/tui/screens/SetupScreen.js.map +1 -0
  361. package/dist/src/ui/tui/services/mcp-installer.d.ts +21 -0
  362. package/dist/src/ui/tui/services/mcp-installer.js +58 -0
  363. package/dist/src/ui/tui/services/mcp-installer.js.map +1 -0
  364. package/dist/src/ui/tui/start-tui.d.ts +9 -0
  365. package/dist/src/ui/tui/start-tui.js +41 -0
  366. package/dist/src/ui/tui/start-tui.js.map +1 -0
  367. package/dist/src/ui/tui/store.d.ts +132 -0
  368. package/dist/src/ui/tui/store.js +320 -0
  369. package/dist/src/ui/tui/store.js.map +1 -0
  370. package/dist/src/ui/tui/styles.d.ts +31 -0
  371. package/dist/src/ui/tui/styles.js +34 -0
  372. package/dist/src/ui/tui/styles.js.map +1 -0
  373. package/dist/src/ui/wizard-ui.d.ts +64 -0
  374. package/dist/src/ui/wizard-ui.js +19 -0
  375. package/dist/src/ui/wizard-ui.js.map +1 -0
  376. package/dist/src/utils/__tests__/setup-utils.test.d.ts +1 -0
  377. package/dist/src/utils/__tests__/{clack-utils.test.js → setup-utils.test.js} +31 -22
  378. package/dist/src/utils/__tests__/setup-utils.test.js.map +1 -0
  379. package/dist/src/utils/analytics.d.ts +18 -0
  380. package/dist/src/utils/analytics.js +53 -0
  381. package/dist/src/utils/analytics.js.map +1 -1
  382. package/dist/src/utils/anthropic-status.d.ts +1 -12
  383. package/dist/src/utils/anthropic-status.js +4 -56
  384. package/dist/src/utils/anthropic-status.js.map +1 -1
  385. package/dist/src/utils/custom-headers.d.ts +9 -0
  386. package/dist/src/utils/custom-headers.js +24 -0
  387. package/dist/src/utils/custom-headers.js.map +1 -0
  388. package/dist/src/utils/debug.js +2 -2
  389. package/dist/src/utils/debug.js.map +1 -1
  390. package/dist/src/utils/environment.js +4 -2
  391. package/dist/src/utils/environment.js.map +1 -1
  392. package/dist/src/utils/oauth.js +9 -10
  393. package/dist/src/utils/oauth.js.map +1 -1
  394. package/dist/src/utils/package-manager.js +13 -13
  395. package/dist/src/utils/package-manager.js.map +1 -1
  396. package/dist/src/utils/setup-utils.d.ts +76 -0
  397. package/dist/src/utils/setup-utils.js +364 -0
  398. package/dist/src/utils/setup-utils.js.map +1 -0
  399. package/dist/src/utils/wizard-abort.d.ts +13 -0
  400. package/dist/src/utils/wizard-abort.js +57 -0
  401. package/dist/src/utils/wizard-abort.js.map +1 -0
  402. package/package.json +19 -7
  403. package/dist/src/android/android-wizard-agent.js.map +0 -1
  404. package/dist/src/android/utils.js.map +0 -1
  405. package/dist/src/angular/angular-wizard-agent.js.map +0 -1
  406. package/dist/src/angular/utils.js.map +0 -1
  407. package/dist/src/astro/astro-wizard-agent.js.map +0 -1
  408. package/dist/src/astro/utils.js.map +0 -1
  409. package/dist/src/django/django-wizard-agent.js.map +0 -1
  410. package/dist/src/django/utils.js.map +0 -1
  411. package/dist/src/fastapi/fastapi-wizard-agent.d.ts +0 -7
  412. package/dist/src/fastapi/fastapi-wizard-agent.js.map +0 -1
  413. package/dist/src/fastapi/utils.js.map +0 -1
  414. package/dist/src/flask/flask-wizard-agent.js.map +0 -1
  415. package/dist/src/flask/utils.js.map +0 -1
  416. package/dist/src/javascript-node/javascript-node-wizard-agent.js.map +0 -1
  417. package/dist/src/javascript-web/javascript-web-wizard-agent.js.map +0 -1
  418. package/dist/src/javascript-web/utils.js.map +0 -1
  419. package/dist/src/laravel/laravel-wizard-agent.js.map +0 -1
  420. package/dist/src/laravel/utils.js.map +0 -1
  421. package/dist/src/mcp.d.ts +0 -8
  422. package/dist/src/mcp.js +0 -44
  423. package/dist/src/mcp.js.map +0 -1
  424. package/dist/src/nextjs/nextjs-wizard-agent.js.map +0 -1
  425. package/dist/src/nextjs/utils.js.map +0 -1
  426. package/dist/src/nuxt/nuxt-wizard-agent.js.map +0 -1
  427. package/dist/src/python/python-wizard-agent.js.map +0 -1
  428. package/dist/src/python/utils.js.map +0 -1
  429. package/dist/src/rails/rails-wizard-agent.js.map +0 -1
  430. package/dist/src/rails/utils.js.map +0 -1
  431. package/dist/src/react-native/react-native-wizard-agent.js.map +0 -1
  432. package/dist/src/react-native/utils.js.map +0 -1
  433. package/dist/src/react-router/react-router-wizard-agent.js.map +0 -1
  434. package/dist/src/react-router/utils.d.ts +0 -19
  435. package/dist/src/react-router/utils.js.map +0 -1
  436. package/dist/src/ruby/ruby-wizard-agent.js.map +0 -1
  437. package/dist/src/ruby/utils.js.map +0 -1
  438. package/dist/src/steps/__tests__/add-editor-rules.test.js +0 -208
  439. package/dist/src/steps/__tests__/add-editor-rules.test.js.map +0 -1
  440. package/dist/src/steps/add-editor-rules.d.ts +0 -8
  441. package/dist/src/steps/add-editor-rules.js +0 -71
  442. package/dist/src/steps/add-editor-rules.js.map +0 -1
  443. package/dist/src/svelte/svelte-wizard-agent.js.map +0 -1
  444. package/dist/src/swift/swift-wizard-agent.js.map +0 -1
  445. package/dist/src/swift/utils.js.map +0 -1
  446. package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +0 -1
  447. package/dist/src/tanstack-router/utils.d.ts +0 -17
  448. package/dist/src/tanstack-router/utils.js.map +0 -1
  449. package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +0 -1
  450. package/dist/src/tanstack-start/utils.js.map +0 -1
  451. package/dist/src/utils/__tests__/clack-utils.test.js.map +0 -1
  452. package/dist/src/utils/clack-utils.d.ts +0 -188
  453. package/dist/src/utils/clack-utils.js +0 -705
  454. package/dist/src/utils/clack-utils.js.map +0 -1
  455. package/dist/src/utils/clack.d.ts +0 -2
  456. package/dist/src/utils/clack.js +0 -9
  457. package/dist/src/utils/clack.js.map +0 -1
  458. package/dist/src/vue/vue-wizard-agent.js.map +0 -1
  459. /package/dist/src/{steps/__tests__/add-editor-rules.test.d.ts → __tests__/wizard-abort.test.d.ts} +0 -0
  460. /package/dist/src/{angular → frameworks/angular}/utils.d.ts +0 -0
  461. /package/dist/src/{python → frameworks/python}/utils.js +0 -0
  462. /package/dist/src/{swift → frameworks/swift}/utils.js +0 -0
  463. /package/dist/src/{tanstack-start → frameworks/tanstack-start}/utils.d.ts +0 -0
  464. /package/dist/src/{utils/__tests__/clack-utils.test.d.ts → ui/tui/__tests__/layout-helpers.test.d.ts} +0 -0
@@ -0,0 +1,144 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * TextBlock — Animates a single string paragraph.
4
+ *
5
+ * Self-contained: owns its own animIdx and timer.
6
+ * Calls onComplete() when the animation finishes.
7
+ *
8
+ * Five animation modes:
9
+ * 1. Typewriter — character-by-character reveal
10
+ * 2. Word by word — each word appears in order
11
+ * 3. Sentence by sentence — sentences appear one at a time
12
+ * 4. Paragraph fade — paragraph appears at full opacity immediately
13
+ * 5. Sentence fade — paragraph dim, sentences light up in order
14
+ */
15
+ import { Text } from 'ink';
16
+ import { useState, useEffect, useRef, useMemo } from 'react';
17
+ import { Colors } from '../styles.js';
18
+ import { splitSentences, sentenceEndChars, sentenceEndWords, } from './text-helpers.js';
19
+ import { wrapAndTruncate } from './layout-helpers.js';
20
+ export var TextRevealMode;
21
+ (function (TextRevealMode) {
22
+ TextRevealMode[TextRevealMode["Typewriter"] = 0] = "Typewriter";
23
+ TextRevealMode[TextRevealMode["WordByWord"] = 1] = "WordByWord";
24
+ TextRevealMode[TextRevealMode["SentenceBySentence"] = 2] = "SentenceBySentence";
25
+ TextRevealMode[TextRevealMode["ParagraphFade"] = 3] = "ParagraphFade";
26
+ TextRevealMode[TextRevealMode["SentenceFade"] = 4] = "SentenceFade";
27
+ })(TextRevealMode || (TextRevealMode = {}));
28
+ export const TEXT_REVEAL_MODE_LABELS = [
29
+ 'Typewriter',
30
+ 'Word by word',
31
+ 'Sentence by sentence',
32
+ 'Paragraph fade',
33
+ 'Sentence fade',
34
+ ];
35
+ export const TEXT_REVEAL_MODE_COUNT = 5;
36
+ /** Default interval per mode (ms) */
37
+ export const TEXT_REVEAL_MODE_DEFAULTS = {
38
+ [TextRevealMode.WordByWord]: 240,
39
+ [TextRevealMode.Typewriter]: 32,
40
+ [TextRevealMode.SentenceBySentence]: 1800,
41
+ [TextRevealMode.ParagraphFade]: 4800,
42
+ [TextRevealMode.SentenceFade]: 2400,
43
+ };
44
+ export const TextBlock = ({ text, active, completed, onComplete, mode, bullet, animationInterval, sentenceInterval = 1600, maxHeight, availableWidth, }) => {
45
+ const speed = animationInterval ?? TEXT_REVEAL_MODE_DEFAULTS[mode];
46
+ const [animIdx, setAnimIdx] = useState(mode === TextRevealMode.SentenceFade ? 1 : 0);
47
+ // Reset synchronously during render to avoid a one-frame flash
48
+ const resetRef = useRef(0);
49
+ const prevMode = useRef(mode);
50
+ if (prevMode.current !== mode) {
51
+ prevMode.current = mode;
52
+ resetRef.current += 1;
53
+ setAnimIdx(mode === TextRevealMode.SentenceFade ? 1 : 0);
54
+ }
55
+ const words = text.split(/\s+/);
56
+ const sentences = splitSentences(text);
57
+ const sentenceCharEnds = useMemo(() => sentenceEndChars(text), [text]);
58
+ const sentenceWordEnds = useMemo(() => sentenceEndWords(text), [text]);
59
+ const isDone = mode === TextRevealMode.Typewriter
60
+ ? animIdx >= text.length
61
+ : mode === TextRevealMode.ParagraphFade
62
+ ? true
63
+ : mode === TextRevealMode.WordByWord
64
+ ? animIdx >= words.length
65
+ : mode === TextRevealMode.SentenceFade ||
66
+ mode === TextRevealMode.SentenceBySentence
67
+ ? animIdx >= sentences.length
68
+ : true;
69
+ // Fire onComplete when done
70
+ useEffect(() => {
71
+ if (isDone && active)
72
+ onComplete();
73
+ }, [isDone, active, onComplete]);
74
+ // Animate: single effect for all tick-based modes
75
+ useEffect(() => {
76
+ if (!active || mode === TextRevealMode.ParagraphFade || isDone)
77
+ return;
78
+ const token = resetRef.current;
79
+ const isFirstTick = animIdx === 0;
80
+ let delay = isFirstTick ? 0 : speed;
81
+ if (!isFirstTick &&
82
+ mode === TextRevealMode.Typewriter &&
83
+ animIdx > 0 &&
84
+ sentenceCharEnds.has(animIdx - 1)) {
85
+ delay = sentenceInterval;
86
+ }
87
+ else if (!isFirstTick &&
88
+ mode === TextRevealMode.WordByWord &&
89
+ animIdx > 0 &&
90
+ sentenceWordEnds.has(animIdx - 1)) {
91
+ delay = sentenceInterval;
92
+ }
93
+ const timer = setTimeout(() => {
94
+ if (token !== resetRef.current)
95
+ return;
96
+ setAnimIdx((c) => c + 1);
97
+ }, delay);
98
+ return () => clearTimeout(timer);
99
+ }, [
100
+ active,
101
+ mode,
102
+ animIdx,
103
+ isDone,
104
+ speed,
105
+ sentenceInterval,
106
+ sentenceCharEnds,
107
+ sentenceWordEnds,
108
+ ]);
109
+ // Pre-wrap text ourselves to avoid Ink's native wrap leaving leading spaces
110
+ // on continuation lines. When maxHeight is set, also truncates to last N rows.
111
+ const wrap = (visibleText) => {
112
+ if (availableWidth == null)
113
+ return visibleText;
114
+ if (maxHeight == null) {
115
+ return wrapAndTruncate(visibleText, availableWidth, Infinity);
116
+ }
117
+ return wrapAndTruncate(visibleText, availableWidth, maxHeight);
118
+ };
119
+ // Completed: dimmed text
120
+ if (completed) {
121
+ return (_jsxs(Text, { dimColor: true, children: [bullet, wrap(text)] }));
122
+ }
123
+ // Active: mode-specific rendering
124
+ if (mode === TextRevealMode.Typewriter) {
125
+ const revealed = text.slice(0, animIdx);
126
+ const atSentenceEnd = /[.!?]\s*$/.test(revealed);
127
+ const display = atSentenceEnd ? revealed.trimEnd() : revealed;
128
+ return (_jsxs(Text, { children: [bullet, wrap(display), _jsx(Text, { color: Colors.muted, children: '\u258C' })] }));
129
+ }
130
+ if (mode === TextRevealMode.WordByWord) {
131
+ const visible = words.slice(0, animIdx).join(' ');
132
+ return (_jsxs(Text, { children: [bullet, wrap(visible)] }));
133
+ }
134
+ if (mode === TextRevealMode.ParagraphFade) {
135
+ return (_jsxs(Text, { children: [bullet, wrap(text)] }));
136
+ }
137
+ if (mode === TextRevealMode.SentenceBySentence) {
138
+ const visible = sentences.slice(0, animIdx).join('');
139
+ return (_jsxs(Text, { children: [bullet, wrap(visible)] }));
140
+ }
141
+ // SentenceFade
142
+ return (_jsxs(Text, { children: [bullet, sentences.map((s, si) => (_jsx(Text, { dimColor: si >= animIdx, children: s }, si)))] }));
143
+ };
144
+ //# sourceMappingURL=TextBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextBlock.js","sourceRoot":"","sources":["../../../../../src/ui/tui/primitives/TextBlock.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAN,IAAY,cAMX;AAND,WAAY,cAAc;IACxB,+DAAc,CAAA;IACd,+DAAc,CAAA;IACd,+EAAsB,CAAA;IACtB,qEAAiB,CAAA;IACjB,mEAAgB,CAAA;AAClB,CAAC,EANW,cAAc,KAAd,cAAc,QAMzB;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,YAAY;IACZ,cAAc;IACd,sBAAsB;IACtB,gBAAgB;IAChB,eAAe;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,qCAAqC;AACrC,MAAM,CAAC,MAAM,yBAAyB,GAAmC;IACvE,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,GAAG;IAChC,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE;IAC/B,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,IAAI;IACzC,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,IAAI;IACpC,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,IAAI;CACpC,CAAC;AAiBF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,IAAI,EACJ,MAAM,EACN,SAAS,EACT,UAAU,EACV,IAAI,EACJ,MAAM,EACN,iBAAiB,EACjB,gBAAgB,GAAG,IAAI,EACvB,SAAS,EACT,cAAc,GACC,EAAE,EAAE;IACnB,MAAM,KAAK,GAAG,iBAAiB,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAEnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,IAAI,KAAK,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7C,CAAC;IAEF,+DAA+D;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;QACtB,UAAU,CAAC,IAAI,KAAK,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAEvC,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,MAAM,MAAM,GACV,IAAI,KAAK,cAAc,CAAC,UAAU;QAChC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM;QACxB,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,aAAa;YACvC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,UAAU;gBACpC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM;gBACzB,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,YAAY;oBACpC,IAAI,KAAK,cAAc,CAAC,kBAAkB;oBAC5C,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM;oBAC7B,CAAC,CAAC,IAAI,CAAC;IAEX,4BAA4B;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,IAAI,MAAM;YAAE,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjC,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,cAAc,CAAC,aAAa,IAAI,MAAM;YAAE,OAAO;QACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAE/B,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,CAAC;QAElC,IAAI,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACpC,IACE,CAAC,WAAW;YACZ,IAAI,KAAK,cAAc,CAAC,UAAU;YAClC,OAAO,GAAG,CAAC;YACX,gBAAgB,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,EACjC,CAAC;YACD,KAAK,GAAG,gBAAgB,CAAC;QAC3B,CAAC;aAAM,IACL,CAAC,WAAW;YACZ,IAAI,KAAK,cAAc,CAAC,UAAU;YAClC,OAAO,GAAG,CAAC;YACX,gBAAgB,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,EACjC,CAAC;YACD,KAAK,GAAG,gBAAgB,CAAC;QAC3B,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,KAAK,KAAK,QAAQ,CAAC,OAAO;gBAAE,OAAO;YACvC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE;QACD,MAAM;QACN,IAAI;QACJ,OAAO;QACP,MAAM;QACN,KAAK;QACL,gBAAgB;QAChB,gBAAgB;QAChB,gBAAgB;KACjB,CAAC,CAAC;IAEH,4EAA4E;IAC5E,+EAA+E;IAC/E,MAAM,IAAI,GAAG,CAAC,WAAmB,EAAU,EAAE;QAC3C,IAAI,cAAc,IAAI,IAAI;YAAE,OAAO,WAAW,CAAC;QAC/C,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,eAAe,CAAC,WAAW,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,eAAe,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC,CAAC;IAEF,yBAAyB;IACzB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,MAAC,IAAI,IAAC,QAAQ,mBACX,MAAM,EACN,IAAI,CAAC,IAAI,CAAC,IACN,CACR,CAAC;IACJ,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9D,OAAO,CACL,MAAC,IAAI,eACF,MAAM,EACN,IAAI,CAAC,OAAO,CAAC,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,YAAG,QAAQ,GAAQ,IACvC,CACR,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,OAAO,CACL,MAAC,IAAI,eACF,MAAM,EACN,IAAI,CAAC,OAAO,CAAC,IACT,CACR,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,CAAC,aAAa,EAAE,CAAC;QAC1C,OAAO,CACL,MAAC,IAAI,eACF,MAAM,EACN,IAAI,CAAC,IAAI,CAAC,IACN,CACR,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,CAAC,kBAAkB,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO,CACL,MAAC,IAAI,eACF,MAAM,EACN,IAAI,CAAC,OAAO,CAAC,IACT,CACR,CAAC;IACJ,CAAC;IAED,eAAe;IACf,OAAO,CACL,MAAC,IAAI,eACF,MAAM,EACN,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CACxB,KAAC,IAAI,IAAU,QAAQ,EAAE,EAAE,IAAI,OAAO,YACnC,CAAC,IADO,EAAE,CAEN,CACR,CAAC,IACG,CACR,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/**\n * TextBlock — Animates a single string paragraph.\n *\n * Self-contained: owns its own animIdx and timer.\n * Calls onComplete() when the animation finishes.\n *\n * Five animation modes:\n * 1. Typewriter — character-by-character reveal\n * 2. Word by word — each word appears in order\n * 3. Sentence by sentence — sentences appear one at a time\n * 4. Paragraph fade — paragraph appears at full opacity immediately\n * 5. Sentence fade — paragraph dim, sentences light up in order\n */\n\nimport { Text } from 'ink';\nimport { useState, useEffect, useRef, useMemo, type ReactNode } from 'react';\nimport { Colors } from '../styles.js';\nimport {\n splitSentences,\n sentenceEndChars,\n sentenceEndWords,\n} from './text-helpers.js';\nimport { wrapAndTruncate } from './layout-helpers.js';\n\nexport enum TextRevealMode {\n Typewriter = 0,\n WordByWord = 1,\n SentenceBySentence = 2,\n ParagraphFade = 3,\n SentenceFade = 4,\n}\n\nexport const TEXT_REVEAL_MODE_LABELS = [\n 'Typewriter',\n 'Word by word',\n 'Sentence by sentence',\n 'Paragraph fade',\n 'Sentence fade',\n];\n\nexport const TEXT_REVEAL_MODE_COUNT = 5;\n\n/** Default interval per mode (ms) */\nexport const TEXT_REVEAL_MODE_DEFAULTS: Record<TextRevealMode, number> = {\n [TextRevealMode.WordByWord]: 240,\n [TextRevealMode.Typewriter]: 32,\n [TextRevealMode.SentenceBySentence]: 1800,\n [TextRevealMode.ParagraphFade]: 4800,\n [TextRevealMode.SentenceFade]: 2400,\n};\n\ninterface TextBlockProps {\n text: string;\n active: boolean;\n completed: boolean;\n onComplete: () => void;\n mode: TextRevealMode;\n bullet?: ReactNode;\n animationInterval?: number;\n sentenceInterval?: number;\n /** Max rows this block may occupy. When exceeded, top lines are truncated. */\n maxHeight?: number;\n /** Available text width in columns (for truncation wrapping). */\n availableWidth?: number;\n}\n\nexport const TextBlock = ({\n text,\n active,\n completed,\n onComplete,\n mode,\n bullet,\n animationInterval,\n sentenceInterval = 1600,\n maxHeight,\n availableWidth,\n}: TextBlockProps) => {\n const speed = animationInterval ?? TEXT_REVEAL_MODE_DEFAULTS[mode];\n\n const [animIdx, setAnimIdx] = useState(\n mode === TextRevealMode.SentenceFade ? 1 : 0,\n );\n\n // Reset synchronously during render to avoid a one-frame flash\n const resetRef = useRef(0);\n const prevMode = useRef(mode);\n if (prevMode.current !== mode) {\n prevMode.current = mode;\n resetRef.current += 1;\n setAnimIdx(mode === TextRevealMode.SentenceFade ? 1 : 0);\n }\n\n const words = text.split(/\\s+/);\n const sentences = splitSentences(text);\n\n const sentenceCharEnds = useMemo(() => sentenceEndChars(text), [text]);\n const sentenceWordEnds = useMemo(() => sentenceEndWords(text), [text]);\n\n const isDone =\n mode === TextRevealMode.Typewriter\n ? animIdx >= text.length\n : mode === TextRevealMode.ParagraphFade\n ? true\n : mode === TextRevealMode.WordByWord\n ? animIdx >= words.length\n : mode === TextRevealMode.SentenceFade ||\n mode === TextRevealMode.SentenceBySentence\n ? animIdx >= sentences.length\n : true;\n\n // Fire onComplete when done\n useEffect(() => {\n if (isDone && active) onComplete();\n }, [isDone, active, onComplete]);\n\n // Animate: single effect for all tick-based modes\n useEffect(() => {\n if (!active || mode === TextRevealMode.ParagraphFade || isDone) return;\n const token = resetRef.current;\n\n const isFirstTick = animIdx === 0;\n\n let delay = isFirstTick ? 0 : speed;\n if (\n !isFirstTick &&\n mode === TextRevealMode.Typewriter &&\n animIdx > 0 &&\n sentenceCharEnds.has(animIdx - 1)\n ) {\n delay = sentenceInterval;\n } else if (\n !isFirstTick &&\n mode === TextRevealMode.WordByWord &&\n animIdx > 0 &&\n sentenceWordEnds.has(animIdx - 1)\n ) {\n delay = sentenceInterval;\n }\n\n const timer = setTimeout(() => {\n if (token !== resetRef.current) return;\n setAnimIdx((c) => c + 1);\n }, delay);\n return () => clearTimeout(timer);\n }, [\n active,\n mode,\n animIdx,\n isDone,\n speed,\n sentenceInterval,\n sentenceCharEnds,\n sentenceWordEnds,\n ]);\n\n // Pre-wrap text ourselves to avoid Ink's native wrap leaving leading spaces\n // on continuation lines. When maxHeight is set, also truncates to last N rows.\n const wrap = (visibleText: string): string => {\n if (availableWidth == null) return visibleText;\n if (maxHeight == null) {\n return wrapAndTruncate(visibleText, availableWidth, Infinity);\n }\n return wrapAndTruncate(visibleText, availableWidth, maxHeight);\n };\n\n // Completed: dimmed text\n if (completed) {\n return (\n <Text dimColor>\n {bullet}\n {wrap(text)}\n </Text>\n );\n }\n\n // Active: mode-specific rendering\n if (mode === TextRevealMode.Typewriter) {\n const revealed = text.slice(0, animIdx);\n const atSentenceEnd = /[.!?]\\s*$/.test(revealed);\n const display = atSentenceEnd ? revealed.trimEnd() : revealed;\n return (\n <Text>\n {bullet}\n {wrap(display)}\n <Text color={Colors.muted}>{'\\u258C'}</Text>\n </Text>\n );\n }\n\n if (mode === TextRevealMode.WordByWord) {\n const visible = words.slice(0, animIdx).join(' ');\n return (\n <Text>\n {bullet}\n {wrap(visible)}\n </Text>\n );\n }\n\n if (mode === TextRevealMode.ParagraphFade) {\n return (\n <Text>\n {bullet}\n {wrap(text)}\n </Text>\n );\n }\n\n if (mode === TextRevealMode.SentenceBySentence) {\n const visible = sentences.slice(0, animIdx).join('');\n return (\n <Text>\n {bullet}\n {wrap(visible)}\n </Text>\n );\n }\n\n // SentenceFade\n return (\n <Text>\n {bullet}\n {sentences.map((s, si) => (\n <Text key={si} dimColor={si >= animIdx}>\n {s}\n </Text>\n ))}\n </Text>\n );\n};\n"]}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Content block types and type guards.
3
+ *
4
+ * Extracted from ContentSequencer so that pure-logic modules (like
5
+ * layout-helpers) can import them without pulling in Ink/React.
6
+ */
7
+ import type { ReactNode } from 'react';
8
+ import type { TextRevealMode } from './TextBlock.js';
9
+ /** Object form — string or ReactNode content with per-block overrides. */
10
+ export interface ContentObjectBlock {
11
+ content: string | ReactNode;
12
+ mode?: TextRevealMode;
13
+ animationInterval?: number;
14
+ sentenceInterval?: number;
15
+ pause?: number;
16
+ persist?: boolean;
17
+ }
18
+ /** Lines block — reveals ReactNode lines one at a time. */
19
+ export interface ContentLinesBlock {
20
+ type: 'lines';
21
+ lines: ReactNode[];
22
+ interval?: number;
23
+ pause?: number;
24
+ }
25
+ /** Clear block — page break that hides all prior blocks. */
26
+ export interface ContentClearBlock {
27
+ type: 'clear';
28
+ pause?: number;
29
+ }
30
+ /** A content block in the sequence. Bare strings are sugar for { content: '...' }. */
31
+ export type ContentBlock = string | ContentObjectBlock | ContentLinesBlock | ContentClearBlock;
32
+ /** Type guard for lines blocks. */
33
+ export declare function isLinesBlock(block: ContentBlock): block is ContentLinesBlock;
34
+ /** Type guard for clear blocks. */
35
+ export declare function isClearBlock(block: ContentBlock): block is ContentClearBlock;
36
+ /** Type guard for object blocks (text or node content). */
37
+ export declare function isObjectBlock(block: ContentBlock): block is ContentObjectBlock;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Content block types and type guards.
3
+ *
4
+ * Extracted from ContentSequencer so that pure-logic modules (like
5
+ * layout-helpers) can import them without pulling in Ink/React.
6
+ */
7
+ /** Type guard for lines blocks. */
8
+ export function isLinesBlock(block) {
9
+ return typeof block !== 'string' && 'type' in block && block.type === 'lines';
10
+ }
11
+ /** Type guard for clear blocks. */
12
+ export function isClearBlock(block) {
13
+ return typeof block !== 'string' && 'type' in block && block.type === 'clear';
14
+ }
15
+ /** Type guard for object blocks (text or node content). */
16
+ export function isObjectBlock(block) {
17
+ return typeof block !== 'string' && !('type' in block);
18
+ }
19
+ //# sourceMappingURL=content-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-types.js","sourceRoot":"","sources":["../../../../../src/ui/tui/primitives/content-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoCH,mCAAmC;AACnC,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;AAChF,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;AAChF,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAC3B,KAAmB;IAEnB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AACzD,CAAC","sourcesContent":["/**\n * Content block types and type guards.\n *\n * Extracted from ContentSequencer so that pure-logic modules (like\n * layout-helpers) can import them without pulling in Ink/React.\n */\n\nimport type { ReactNode } from 'react';\nimport type { TextRevealMode } from './TextBlock.js';\n\n/** Object form — string or ReactNode content with per-block overrides. */\nexport interface ContentObjectBlock {\n content: string | ReactNode;\n mode?: TextRevealMode;\n animationInterval?: number;\n sentenceInterval?: number;\n pause?: number;\n persist?: boolean;\n}\n\n/** Lines block — reveals ReactNode lines one at a time. */\nexport interface ContentLinesBlock {\n type: 'lines';\n lines: ReactNode[];\n interval?: number;\n pause?: number;\n}\n\n/** Clear block — page break that hides all prior blocks. */\nexport interface ContentClearBlock {\n type: 'clear';\n pause?: number;\n}\n\n/** A content block in the sequence. Bare strings are sugar for { content: '...' }. */\nexport type ContentBlock =\n | string\n | ContentObjectBlock\n | ContentLinesBlock\n | ContentClearBlock;\n\n/** Type guard for lines blocks. */\nexport function isLinesBlock(block: ContentBlock): block is ContentLinesBlock {\n return typeof block !== 'string' && 'type' in block && block.type === 'lines';\n}\n\n/** Type guard for clear blocks. */\nexport function isClearBlock(block: ContentBlock): block is ContentClearBlock {\n return typeof block !== 'string' && 'type' in block && block.type === 'clear';\n}\n\n/** Type guard for object blocks (text or node content). */\nexport function isObjectBlock(\n block: ContentBlock,\n): block is ContentObjectBlock {\n return typeof block !== 'string' && !('type' in block);\n}\n"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Barrel export for all TUI layout primitives.
3
+ */
4
+ export { CardLayout } from './CardLayout.js';
5
+ export { SplitView } from './SplitView.js';
6
+ export { LoadingBox } from './LoadingBox.js';
7
+ export { ProgressList } from './ProgressList.js';
8
+ export type { ProgressItem } from './ProgressList.js';
9
+ export { PromptLabel } from './PromptLabel.js';
10
+ export { PickerMenu } from './PickerMenu.js';
11
+ export { ConfirmationInput } from './ConfirmationInput.js';
12
+ export { LogViewer } from './LogViewer.js';
13
+ export { EventPlanViewer } from './EventPlanViewer.js';
14
+ export { ScreenContainer } from './ScreenContainer.js';
15
+ export { ScreenErrorBoundary } from './ScreenErrorBoundary.js';
16
+ export { TabContainer } from './TabContainer.js';
17
+ export type { TabDefinition } from './TabContainer.js';
18
+ export { HNViewer } from './HNViewer.js';
19
+ export { DissolveTransition } from './DissolveTransition.js';
20
+ export type { WipeDirection } from './DissolveTransition.js';
21
+ export { ContentSequencer } from './ContentSequencer.js';
22
+ export type { ContentBlock, ContentObjectBlock, ContentLinesBlock, ContentClearBlock, } from './ContentSequencer.js';
23
+ export { estimateBlockHeight, computeVisibleRange, wordWrap, wrapAndTruncate, } from './layout-helpers.js';
24
+ export { TextRevealMode, TEXT_REVEAL_MODE_LABELS, TEXT_REVEAL_MODE_COUNT, TEXT_REVEAL_MODE_DEFAULTS, } from './TextBlock.js';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Barrel export for all TUI layout primitives.
3
+ */
4
+ export { CardLayout } from './CardLayout.js';
5
+ export { SplitView } from './SplitView.js';
6
+ export { LoadingBox } from './LoadingBox.js';
7
+ export { ProgressList } from './ProgressList.js';
8
+ export { PromptLabel } from './PromptLabel.js';
9
+ export { PickerMenu } from './PickerMenu.js';
10
+ export { ConfirmationInput } from './ConfirmationInput.js';
11
+ export { LogViewer } from './LogViewer.js';
12
+ export { EventPlanViewer } from './EventPlanViewer.js';
13
+ export { ScreenContainer } from './ScreenContainer.js';
14
+ export { ScreenErrorBoundary } from './ScreenErrorBoundary.js';
15
+ export { TabContainer } from './TabContainer.js';
16
+ export { HNViewer } from './HNViewer.js';
17
+ export { DissolveTransition } from './DissolveTransition.js';
18
+ export { ContentSequencer } from './ContentSequencer.js';
19
+ export { estimateBlockHeight, computeVisibleRange, wordWrap, wrapAndTruncate, } from './layout-helpers.js';
20
+ export { TextRevealMode, TEXT_REVEAL_MODE_LABELS, TEXT_REVEAL_MODE_COUNT, TEXT_REVEAL_MODE_DEFAULTS, } from './TextBlock.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/ui/tui/primitives/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAOzD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,QAAQ,EACR,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC","sourcesContent":["/**\n * Barrel export for all TUI layout primitives.\n */\n\nexport { CardLayout } from './CardLayout.js';\nexport { SplitView } from './SplitView.js';\nexport { LoadingBox } from './LoadingBox.js';\nexport { ProgressList } from './ProgressList.js';\nexport type { ProgressItem } from './ProgressList.js';\nexport { PromptLabel } from './PromptLabel.js';\nexport { PickerMenu } from './PickerMenu.js';\nexport { ConfirmationInput } from './ConfirmationInput.js';\nexport { LogViewer } from './LogViewer.js';\nexport { EventPlanViewer } from './EventPlanViewer.js';\nexport { ScreenContainer } from './ScreenContainer.js';\nexport { ScreenErrorBoundary } from './ScreenErrorBoundary.js';\nexport { TabContainer } from './TabContainer.js';\nexport type { TabDefinition } from './TabContainer.js';\nexport { HNViewer } from './HNViewer.js';\nexport { DissolveTransition } from './DissolveTransition.js';\nexport type { WipeDirection } from './DissolveTransition.js';\nexport { ContentSequencer } from './ContentSequencer.js';\nexport type {\n ContentBlock,\n ContentObjectBlock,\n ContentLinesBlock,\n ContentClearBlock,\n} from './ContentSequencer.js';\nexport {\n estimateBlockHeight,\n computeVisibleRange,\n wordWrap,\n wrapAndTruncate,\n} from './layout-helpers.js';\nexport {\n TextRevealMode,\n TEXT_REVEAL_MODE_LABELS,\n TEXT_REVEAL_MODE_COUNT,\n TEXT_REVEAL_MODE_DEFAULTS,\n} from './TextBlock.js';\n"]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Layout helpers — pure functions for height estimation and viewport eviction.
3
+ *
4
+ * These are the core of the responsive content system. They estimate how many
5
+ * terminal rows a content block will occupy and determine which blocks fit
6
+ * within a given height budget.
7
+ */
8
+ import type { ContentBlock } from './content-types.js';
9
+ /**
10
+ * Estimate the number of terminal rows a content block will occupy,
11
+ * including 1 row of marginBottom.
12
+ */
13
+ export declare function estimateBlockHeight(block: ContentBlock, availableWidth: number): number;
14
+ /**
15
+ * Given all blocks, the active index, available width, and a row budget,
16
+ * return [startIdx, endIdx] — the range of blocks to render.
17
+ *
18
+ * Always includes activeIdx. Walks backward to include as many completed
19
+ * blocks as fit within maxHeight.
20
+ */
21
+ export declare function computeVisibleRange(blocks: ContentBlock[], activeIdx: number, availableWidth: number, maxHeight: number): [number, number];
22
+ /**
23
+ * Word-wrap text at clean word boundaries. Always returns pre-wrapped text
24
+ * joined with \n — this avoids Ink's native wrap which can leave leading
25
+ * spaces on continuation lines.
26
+ *
27
+ * Uses a 1-char safety margin so slight width estimate mismatches don't
28
+ * cause Ink to re-wrap our already-wrapped lines.
29
+ */
30
+ export declare function wordWrap(text: string, availableWidth: number): string[];
31
+ /**
32
+ * Word-wrap text and return only the last `maxRows` lines.
33
+ * Used for intra-block truncation when a single text block exceeds the viewport.
34
+ * Also used for normal rendering to avoid Ink's leading-space wrap artifacts.
35
+ */
36
+ export declare function wrapAndTruncate(text: string, availableWidth: number, maxRows: number): string;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Layout helpers — pure functions for height estimation and viewport eviction.
3
+ *
4
+ * These are the core of the responsive content system. They estimate how many
5
+ * terminal rows a content block will occupy and determine which blocks fit
6
+ * within a given height budget.
7
+ */
8
+ import { isLinesBlock, isClearBlock, isObjectBlock } from './content-types.js';
9
+ /**
10
+ * Estimate the number of terminal rows a content block will occupy,
11
+ * including 1 row of marginBottom.
12
+ */
13
+ export function estimateBlockHeight(block, availableWidth) {
14
+ if (typeof block === 'string') {
15
+ return wordWrap(block, availableWidth).length + 1; // +1 for marginBottom
16
+ }
17
+ if (isClearBlock(block))
18
+ return 0;
19
+ if (isLinesBlock(block)) {
20
+ return block.lines.length + 1;
21
+ }
22
+ if (isObjectBlock(block)) {
23
+ if (typeof block.content === 'string') {
24
+ return wordWrap(block.content, availableWidth).length + 1;
25
+ }
26
+ return 4; // conservative fixed estimate for ReactNode
27
+ }
28
+ return 1;
29
+ }
30
+ /**
31
+ * Given all blocks, the active index, available width, and a row budget,
32
+ * return [startIdx, endIdx] — the range of blocks to render.
33
+ *
34
+ * Always includes activeIdx. Walks backward to include as many completed
35
+ * blocks as fit within maxHeight.
36
+ */
37
+ export function computeVisibleRange(blocks, activeIdx, availableWidth, maxHeight) {
38
+ // Reserve a 2-row buffer so resize-induced estimate drift doesn't
39
+ // cause overflow="hidden" to clip the margin between blocks.
40
+ const budget = Math.max(4, maxHeight - 2);
41
+ let totalHeight = estimateBlockHeight(blocks[activeIdx], availableWidth);
42
+ let start = activeIdx;
43
+ for (let i = activeIdx - 1; i >= 0; i--) {
44
+ // Clear blocks act as a hard boundary — don't show anything before them
45
+ if (isClearBlock(blocks[i]))
46
+ break;
47
+ const h = estimateBlockHeight(blocks[i], availableWidth);
48
+ if (totalHeight + h > budget)
49
+ break;
50
+ totalHeight += h;
51
+ start = i;
52
+ }
53
+ return [start, activeIdx];
54
+ }
55
+ /**
56
+ * Word-wrap text at clean word boundaries. Always returns pre-wrapped text
57
+ * joined with \n — this avoids Ink's native wrap which can leave leading
58
+ * spaces on continuation lines.
59
+ *
60
+ * Uses a 1-char safety margin so slight width estimate mismatches don't
61
+ * cause Ink to re-wrap our already-wrapped lines.
62
+ */
63
+ export function wordWrap(text, availableWidth) {
64
+ const safeWidth = Math.max(10, availableWidth - 1);
65
+ const words = text.split(/\s+/);
66
+ const lines = [];
67
+ let currentLine = '';
68
+ for (const word of words) {
69
+ if (currentLine.length + word.length + 1 > safeWidth &&
70
+ currentLine.length > 0) {
71
+ lines.push(currentLine);
72
+ currentLine = word;
73
+ }
74
+ else {
75
+ currentLine += (currentLine.length > 0 ? ' ' : '') + word;
76
+ }
77
+ }
78
+ if (currentLine.length > 0) {
79
+ lines.push(currentLine);
80
+ }
81
+ return lines;
82
+ }
83
+ /**
84
+ * Word-wrap text and return only the last `maxRows` lines.
85
+ * Used for intra-block truncation when a single text block exceeds the viewport.
86
+ * Also used for normal rendering to avoid Ink's leading-space wrap artifacts.
87
+ */
88
+ export function wrapAndTruncate(text, availableWidth, maxRows) {
89
+ const lines = wordWrap(text, availableWidth);
90
+ if (lines.length <= maxRows) {
91
+ return lines.join('\n');
92
+ }
93
+ return lines.slice(-maxRows).join('\n');
94
+ }
95
+ //# sourceMappingURL=layout-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-helpers.js","sourceRoot":"","sources":["../../../../../src/ui/tui/primitives/layout-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAAmB,EACnB,cAAsB;IAEtB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,sBAAsB;IAC3E,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAElC,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,CAAC,CAAC,4CAA4C;IACxD,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,SAAiB,EACjB,cAAsB,EACtB,SAAiB;IAEjB,kEAAkE;IAClE,6DAA6D;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IAE1C,IAAI,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;IACzE,IAAI,KAAK,GAAG,SAAS,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,wEAAwE;QACxE,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAAE,MAAM;QACnC,MAAM,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,WAAW,GAAG,CAAC,GAAG,MAAM;YAAE,MAAM;QACpC,WAAW,IAAI,CAAC,CAAC;QACjB,KAAK,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,cAAsB;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IACE,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS;YAChD,WAAW,CAAC,MAAM,GAAG,CAAC,EACtB,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,WAAW,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,cAAsB,EACtB,OAAe;IAEf,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAE7C,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["/**\n * Layout helpers — pure functions for height estimation and viewport eviction.\n *\n * These are the core of the responsive content system. They estimate how many\n * terminal rows a content block will occupy and determine which blocks fit\n * within a given height budget.\n */\n\nimport type { ContentBlock } from './content-types.js';\nimport { isLinesBlock, isClearBlock, isObjectBlock } from './content-types.js';\n\n/**\n * Estimate the number of terminal rows a content block will occupy,\n * including 1 row of marginBottom.\n */\nexport function estimateBlockHeight(\n block: ContentBlock,\n availableWidth: number,\n): number {\n if (typeof block === 'string') {\n return wordWrap(block, availableWidth).length + 1; // +1 for marginBottom\n }\n\n if (isClearBlock(block)) return 0;\n\n if (isLinesBlock(block)) {\n return block.lines.length + 1;\n }\n\n if (isObjectBlock(block)) {\n if (typeof block.content === 'string') {\n return wordWrap(block.content, availableWidth).length + 1;\n }\n return 4; // conservative fixed estimate for ReactNode\n }\n\n return 1;\n}\n\n/**\n * Given all blocks, the active index, available width, and a row budget,\n * return [startIdx, endIdx] — the range of blocks to render.\n *\n * Always includes activeIdx. Walks backward to include as many completed\n * blocks as fit within maxHeight.\n */\nexport function computeVisibleRange(\n blocks: ContentBlock[],\n activeIdx: number,\n availableWidth: number,\n maxHeight: number,\n): [number, number] {\n // Reserve a 2-row buffer so resize-induced estimate drift doesn't\n // cause overflow=\"hidden\" to clip the margin between blocks.\n const budget = Math.max(4, maxHeight - 2);\n\n let totalHeight = estimateBlockHeight(blocks[activeIdx], availableWidth);\n let start = activeIdx;\n\n for (let i = activeIdx - 1; i >= 0; i--) {\n // Clear blocks act as a hard boundary — don't show anything before them\n if (isClearBlock(blocks[i])) break;\n const h = estimateBlockHeight(blocks[i], availableWidth);\n if (totalHeight + h > budget) break;\n totalHeight += h;\n start = i;\n }\n\n return [start, activeIdx];\n}\n\n/**\n * Word-wrap text at clean word boundaries. Always returns pre-wrapped text\n * joined with \\n — this avoids Ink's native wrap which can leave leading\n * spaces on continuation lines.\n *\n * Uses a 1-char safety margin so slight width estimate mismatches don't\n * cause Ink to re-wrap our already-wrapped lines.\n */\nexport function wordWrap(text: string, availableWidth: number): string[] {\n const safeWidth = Math.max(10, availableWidth - 1);\n const words = text.split(/\\s+/);\n const lines: string[] = [];\n let currentLine = '';\n\n for (const word of words) {\n if (\n currentLine.length + word.length + 1 > safeWidth &&\n currentLine.length > 0\n ) {\n lines.push(currentLine);\n currentLine = word;\n } else {\n currentLine += (currentLine.length > 0 ? ' ' : '') + word;\n }\n }\n if (currentLine.length > 0) {\n lines.push(currentLine);\n }\n\n return lines;\n}\n\n/**\n * Word-wrap text and return only the last `maxRows` lines.\n * Used for intra-block truncation when a single text block exceeds the viewport.\n * Also used for normal rendering to avoid Ink's leading-space wrap artifacts.\n */\nexport function wrapAndTruncate(\n text: string,\n availableWidth: number,\n maxRows: number,\n): string {\n const lines = wordWrap(text, availableWidth);\n\n if (lines.length <= maxRows) {\n return lines.join('\\n');\n }\n\n return lines.slice(-maxRows).join('\\n');\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Text-splitting helpers for sentence boundary detection.
3
+ * Used by TextBlock for animation pauses at punctuation.
4
+ */
5
+ /** Split text into sentences (keeps the delimiter attached) */
6
+ export declare function splitSentences(text: string): string[];
7
+ /** Build a set of character indices where sentences end (for typewriter pause) */
8
+ export declare function sentenceEndChars(text: string): Set<number>;
9
+ /** Build a set of word indices where sentences end (for word-by-word pause) */
10
+ export declare function sentenceEndWords(text: string): Set<number>;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Text-splitting helpers for sentence boundary detection.
3
+ * Used by TextBlock for animation pauses at punctuation.
4
+ */
5
+ /** Split text into sentences (keeps the delimiter attached) */
6
+ export function splitSentences(text) {
7
+ const parts = [];
8
+ const re = /[^.!?]*[.!?]+\s*/g;
9
+ let match;
10
+ let lastIndex = 0;
11
+ while ((match = re.exec(text)) !== null) {
12
+ parts.push(match[0]);
13
+ lastIndex = re.lastIndex;
14
+ }
15
+ if (lastIndex < text.length) {
16
+ parts.push(text.slice(lastIndex));
17
+ }
18
+ return parts;
19
+ }
20
+ /** Build a set of character indices where sentences end (for typewriter pause) */
21
+ export function sentenceEndChars(text) {
22
+ const ends = new Set();
23
+ const sentences = splitSentences(text);
24
+ let pos = 0;
25
+ for (const s of sentences) {
26
+ pos += s.length;
27
+ ends.add(pos - 1);
28
+ }
29
+ return ends;
30
+ }
31
+ /** Build a set of word indices where sentences end (for word-by-word pause) */
32
+ export function sentenceEndWords(text) {
33
+ const ends = new Set();
34
+ const sentences = splitSentences(text);
35
+ let wordCount = 0;
36
+ for (const s of sentences) {
37
+ const words = s.trim().split(/\s+/).filter(Boolean);
38
+ wordCount += words.length;
39
+ ends.add(wordCount - 1);
40
+ }
41
+ return ends;
42
+ }
43
+ //# sourceMappingURL=text-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-helpers.js","sourceRoot":"","sources":["../../../../../src/ui/tui/primitives/text-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+DAA+D;AAC/D,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,mBAAmB,CAAC;IAC/B,IAAI,KAA6B,CAAC;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;IAC3B,CAAC;IACD,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpD,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * Text-splitting helpers for sentence boundary detection.\n * Used by TextBlock for animation pauses at punctuation.\n */\n\n/** Split text into sentences (keeps the delimiter attached) */\nexport function splitSentences(text: string): string[] {\n const parts: string[] = [];\n const re = /[^.!?]*[.!?]+\\s*/g;\n let match: RegExpExecArray | null;\n let lastIndex = 0;\n while ((match = re.exec(text)) !== null) {\n parts.push(match[0]);\n lastIndex = re.lastIndex;\n }\n if (lastIndex < text.length) {\n parts.push(text.slice(lastIndex));\n }\n return parts;\n}\n\n/** Build a set of character indices where sentences end (for typewriter pause) */\nexport function sentenceEndChars(text: string): Set<number> {\n const ends = new Set<number>();\n const sentences = splitSentences(text);\n let pos = 0;\n for (const s of sentences) {\n pos += s.length;\n ends.add(pos - 1);\n }\n return ends;\n}\n\n/** Build a set of word indices where sentences end (for word-by-word pause) */\nexport function sentenceEndWords(text: string): Set<number> {\n const ends = new Set<number>();\n const sentences = splitSentences(text);\n let wordCount = 0;\n for (const s of sentences) {\n const words = s.trim().split(/\\s+/).filter(Boolean);\n wordCount += words.length;\n ends.add(wordCount - 1);\n }\n return ends;\n}\n"]}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * WizardRouter — declarative flow pipelines + overlay stack.
3
+ *
4
+ * Two layers:
5
+ * Flow cursor — linear pipeline of screens, advanced with next()
6
+ * Overlay stack — interrupts (outage, auth-expired, etc.) that push/pop
7
+ *
8
+ * The visible screen is: top of overlay stack if non-empty, otherwise the flow cursor.
9
+ *
10
+ * Adding a flow screen = append to a pipeline array.
11
+ * Adding an overlay = call pushOverlay() from anywhere.
12
+ * No switch statements, no hardcoded transitions in business logic.
13
+ */
14
+ import type { WizardSession } from '../../lib/wizard-session.js';
15
+ import { Screen, Flow, type FlowEntry } from './flows.js';
16
+ export { Screen, Flow };
17
+ export type { FlowEntry };
18
+ /** Screens that interrupt flows as overlays */
19
+ export declare enum Overlay {
20
+ Outage = "outage",
21
+ SettingsOverride = "settings-override"
22
+ }
23
+ /** Union of all screen names */
24
+ export type ScreenName = Screen | Overlay;
25
+ export declare class WizardRouter {
26
+ private flow;
27
+ private flowName;
28
+ private overlays;
29
+ constructor(flowName?: Flow);
30
+ /**
31
+ * Resolve which screen should be active based on session state.
32
+ * Walks the flow pipeline, skipping hidden entries and completed entries,
33
+ * returns the first incomplete screen.
34
+ */
35
+ resolve(session: WizardSession): ScreenName;
36
+ /** The screen that should be rendered right now. */
37
+ get activeScreen(): ScreenName;
38
+ /** The name of the active flow. */
39
+ get activeFlow(): Flow;
40
+ /** Whether an overlay is currently active. */
41
+ get hasOverlay(): boolean;
42
+ /**
43
+ * Push an overlay that interrupts the current flow.
44
+ * The flow resumes when the overlay is dismissed via popOverlay().
45
+ */
46
+ pushOverlay(overlay: Overlay): void;
47
+ /**
48
+ * Dismiss the topmost overlay. The flow screen underneath resumes.
49
+ */
50
+ popOverlay(): void;
51
+ /**
52
+ * Direction hint for screen transitions.
53
+ */
54
+ private _lastDirection;
55
+ get lastNavDirection(): 'push' | 'pop' | null;
56
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * WizardRouter — declarative flow pipelines + overlay stack.
3
+ *
4
+ * Two layers:
5
+ * Flow cursor — linear pipeline of screens, advanced with next()
6
+ * Overlay stack — interrupts (outage, auth-expired, etc.) that push/pop
7
+ *
8
+ * The visible screen is: top of overlay stack if non-empty, otherwise the flow cursor.
9
+ *
10
+ * Adding a flow screen = append to a pipeline array.
11
+ * Adding an overlay = call pushOverlay() from anywhere.
12
+ * No switch statements, no hardcoded transitions in business logic.
13
+ */
14
+ import { FLOWS, Screen, Flow } from './flows.js';
15
+ // Re-export so existing imports from './router.js' keep working
16
+ export { Screen, Flow };
17
+ // ── Screen name taxonomy ──────────────────────────────────────────────
18
+ /** Screens that interrupt flows as overlays */
19
+ export var Overlay;
20
+ (function (Overlay) {
21
+ Overlay["Outage"] = "outage";
22
+ Overlay["SettingsOverride"] = "settings-override";
23
+ })(Overlay || (Overlay = {}));
24
+ // ── Router ────────────────────────────────────────────────────────────
25
+ export class WizardRouter {
26
+ flow;
27
+ flowName;
28
+ overlays = [];
29
+ constructor(flowName = Flow.Wizard) {
30
+ this.flowName = flowName;
31
+ this.flow = FLOWS[flowName];
32
+ }
33
+ /**
34
+ * Resolve which screen should be active based on session state.
35
+ * Walks the flow pipeline, skipping hidden entries and completed entries,
36
+ * returns the first incomplete screen.
37
+ */
38
+ resolve(session) {
39
+ if (this.overlays.length > 0) {
40
+ return this.overlays[this.overlays.length - 1];
41
+ }
42
+ for (const entry of this.flow) {
43
+ if (entry.show && !entry.show(session))
44
+ continue;
45
+ if (entry.isComplete && entry.isComplete(session))
46
+ continue;
47
+ return entry.screen;
48
+ }
49
+ // All entries complete — show the last screen (outro)
50
+ return this.flow[this.flow.length - 1].screen;
51
+ }
52
+ /** The screen that should be rendered right now. */
53
+ get activeScreen() {
54
+ // Overlays take priority — resolve() handles this too,
55
+ // but activeScreen is called before session is available in some paths
56
+ if (this.overlays.length > 0) {
57
+ return this.overlays[this.overlays.length - 1];
58
+ }
59
+ return this.flow[0].screen;
60
+ }
61
+ /** The name of the active flow. */
62
+ get activeFlow() {
63
+ return this.flowName;
64
+ }
65
+ /** Whether an overlay is currently active. */
66
+ get hasOverlay() {
67
+ return this.overlays.length > 0;
68
+ }
69
+ /**
70
+ * Push an overlay that interrupts the current flow.
71
+ * The flow resumes when the overlay is dismissed via popOverlay().
72
+ */
73
+ pushOverlay(overlay) {
74
+ this.overlays.push(overlay);
75
+ }
76
+ /**
77
+ * Dismiss the topmost overlay. The flow screen underneath resumes.
78
+ */
79
+ popOverlay() {
80
+ this.overlays.pop();
81
+ }
82
+ /**
83
+ * Direction hint for screen transitions.
84
+ */
85
+ _lastDirection = null;
86
+ get lastNavDirection() {
87
+ return this._lastDirection;
88
+ }
89
+ /** @internal — called by store wrapper to track direction */
90
+ _setDirection(dir) {
91
+ this._lastDirection = dir;
92
+ }
93
+ }
94
+ //# sourceMappingURL=router.js.map