@navios/commander-tui 1.1.0 → 1.3.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 (364) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +69 -1
  3. package/dist/base/src/adapters/index.d.ts +2 -0
  4. package/dist/base/src/adapters/index.d.ts.map +1 -0
  5. package/dist/base/src/adapters/interface.d.ts +45 -0
  6. package/dist/base/src/adapters/interface.d.ts.map +1 -0
  7. package/dist/base/src/components/index.d.ts +2 -0
  8. package/dist/base/src/components/index.d.ts.map +1 -0
  9. package/dist/base/src/context/index.d.ts +2 -0
  10. package/dist/base/src/context/index.d.ts.map +1 -0
  11. package/dist/base/src/factories/index.d.ts +3 -0
  12. package/dist/base/src/factories/index.d.ts.map +1 -0
  13. package/dist/base/src/factories/isomorphic-logger.factory.d.ts +8 -0
  14. package/dist/base/src/factories/isomorphic-logger.factory.d.ts.map +1 -0
  15. package/dist/base/src/factories/screen.factory.d.ts +8 -0
  16. package/dist/base/src/factories/screen.factory.d.ts.map +1 -0
  17. package/dist/base/src/filter/filter_engine.d.ts +19 -0
  18. package/dist/base/src/filter/filter_engine.d.ts.map +1 -0
  19. package/dist/base/src/filter/index.d.ts +2 -0
  20. package/dist/base/src/filter/index.d.ts.map +1 -0
  21. package/dist/base/src/hooks/index.d.ts +2 -0
  22. package/dist/base/src/hooks/index.d.ts.map +1 -0
  23. package/dist/base/src/index.d.ts +16 -0
  24. package/dist/base/src/index.d.ts.map +1 -0
  25. package/dist/base/src/interfaces/index.d.ts +2 -0
  26. package/dist/base/src/interfaces/index.d.ts.map +1 -0
  27. package/dist/base/src/interfaces/isomorphic-logger.d.ts +9 -0
  28. package/dist/base/src/interfaces/isomorphic-logger.d.ts.map +1 -0
  29. package/dist/base/src/keyboard/create_bindings.d.ts +26 -0
  30. package/dist/base/src/keyboard/create_bindings.d.ts.map +1 -0
  31. package/dist/base/src/keyboard/index.d.ts +3 -0
  32. package/dist/base/src/keyboard/index.d.ts.map +1 -0
  33. package/dist/base/src/keyboard/keyboard_manager.d.ts +63 -0
  34. package/dist/base/src/keyboard/keyboard_manager.d.ts.map +1 -0
  35. package/dist/base/src/overrides/console.logger.override.d.ts +3 -0
  36. package/dist/base/src/overrides/console.logger.override.d.ts.map +1 -0
  37. package/dist/base/src/overrides/index.d.ts +3 -0
  38. package/dist/base/src/overrides/index.d.ts.map +1 -0
  39. package/dist/base/src/overrides/missing-adapter.override.d.ts +6 -0
  40. package/dist/base/src/overrides/missing-adapter.override.d.ts.map +1 -0
  41. package/dist/base/src/schemas/index.d.ts +4 -0
  42. package/dist/base/src/schemas/index.d.ts.map +1 -0
  43. package/dist/base/src/schemas/logger-options.d.ts +21 -0
  44. package/dist/base/src/schemas/logger-options.d.ts.map +1 -0
  45. package/dist/base/src/schemas/prompt-options.d.ts +12 -0
  46. package/dist/base/src/schemas/prompt-options.d.ts.map +1 -0
  47. package/dist/base/src/schemas/screen-options.d.ts +10 -0
  48. package/dist/base/src/schemas/screen-options.d.ts.map +1 -0
  49. package/dist/base/src/services/index.d.ts +5 -0
  50. package/dist/base/src/services/index.d.ts.map +1 -0
  51. package/dist/base/src/services/logger.d.ts +52 -0
  52. package/dist/base/src/services/logger.d.ts.map +1 -0
  53. package/dist/base/src/services/prompt.d.ts +31 -0
  54. package/dist/base/src/services/prompt.d.ts.map +1 -0
  55. package/dist/base/src/services/screen.d.ts +161 -0
  56. package/dist/base/src/services/screen.d.ts.map +1 -0
  57. package/dist/base/src/services/screen_manager.d.ts +130 -0
  58. package/dist/base/src/services/screen_manager.d.ts.map +1 -0
  59. package/dist/base/src/themes/dark.d.ts +7 -0
  60. package/dist/base/src/themes/dark.d.ts.map +1 -0
  61. package/dist/base/src/themes/high-contrast.d.ts +7 -0
  62. package/dist/base/src/themes/high-contrast.d.ts.map +1 -0
  63. package/dist/base/src/themes/index.d.ts +5 -0
  64. package/dist/base/src/themes/index.d.ts.map +1 -0
  65. package/dist/base/src/themes/light.d.ts +6 -0
  66. package/dist/base/src/themes/light.d.ts.map +1 -0
  67. package/dist/base/src/themes/utils.d.ts +22 -0
  68. package/dist/base/src/themes/utils.d.ts.map +1 -0
  69. package/dist/base/src/tokens/adapter.d.ts +9 -0
  70. package/dist/base/src/tokens/adapter.d.ts.map +1 -0
  71. package/dist/base/src/tokens/index.d.ts +6 -0
  72. package/dist/base/src/tokens/index.d.ts.map +1 -0
  73. package/dist/base/src/tokens/logger.d.ts +44 -0
  74. package/dist/base/src/tokens/logger.d.ts.map +1 -0
  75. package/dist/base/src/tokens/prompt.d.ts +12 -0
  76. package/dist/base/src/tokens/prompt.d.ts.map +1 -0
  77. package/dist/base/src/tokens/screen-manager.d.ts +8 -0
  78. package/dist/base/src/tokens/screen-manager.d.ts.map +1 -0
  79. package/dist/base/src/tokens/screen.d.ts +10 -0
  80. package/dist/base/src/tokens/screen.d.ts.map +1 -0
  81. package/dist/base/src/types/file.types.d.ts +40 -0
  82. package/dist/base/src/types/file.types.d.ts.map +1 -0
  83. package/dist/base/src/types/filter.types.d.ts +31 -0
  84. package/dist/base/src/types/filter.types.d.ts.map +1 -0
  85. package/dist/base/src/types/index.d.ts +9 -0
  86. package/dist/base/src/types/index.d.ts.map +1 -0
  87. package/dist/base/src/types/keyboard.types.d.ts +83 -0
  88. package/dist/base/src/types/keyboard.types.d.ts.map +1 -0
  89. package/dist/base/src/types/log.types.d.ts +39 -0
  90. package/dist/base/src/types/log.types.d.ts.map +1 -0
  91. package/dist/base/src/types/message.types.d.ts +82 -0
  92. package/dist/base/src/types/message.types.d.ts.map +1 -0
  93. package/dist/base/src/types/prompt.types.d.ts +85 -0
  94. package/dist/base/src/types/prompt.types.d.ts.map +1 -0
  95. package/dist/base/src/types/screen.types.d.ts +79 -0
  96. package/dist/base/src/types/screen.types.d.ts.map +1 -0
  97. package/dist/base/src/types/theme.types.d.ts +217 -0
  98. package/dist/base/src/types/theme.types.d.ts.map +1 -0
  99. package/dist/base/src/utils/colors/file-colors.d.ts +10 -0
  100. package/dist/base/src/utils/colors/file-colors.d.ts.map +1 -0
  101. package/dist/base/src/utils/colors/helpers.d.ts +26 -0
  102. package/dist/base/src/utils/colors/helpers.d.ts.map +1 -0
  103. package/dist/base/src/utils/colors/index.d.ts +8 -0
  104. package/dist/base/src/utils/colors/index.d.ts.map +1 -0
  105. package/dist/base/src/utils/colors/log-colors.d.ts +19 -0
  106. package/dist/base/src/utils/colors/log-colors.d.ts.map +1 -0
  107. package/dist/base/src/utils/colors/progress-colors.d.ts +25 -0
  108. package/dist/base/src/utils/colors/progress-colors.d.ts.map +1 -0
  109. package/dist/base/src/utils/colors/prompt-colors.d.ts +22 -0
  110. package/dist/base/src/utils/colors/prompt-colors.d.ts.map +1 -0
  111. package/dist/base/src/utils/colors/sidebar-colors.d.ts +50 -0
  112. package/dist/base/src/utils/colors/sidebar-colors.d.ts.map +1 -0
  113. package/dist/base/src/utils/colors/table-colors.d.ts +12 -0
  114. package/dist/base/src/utils/colors/table-colors.d.ts.map +1 -0
  115. package/dist/base/src/utils/filetype.d.ts +19 -0
  116. package/dist/base/src/utils/filetype.d.ts.map +1 -0
  117. package/dist/base/src/utils/format.d.ts +9 -0
  118. package/dist/base/src/utils/format.d.ts.map +1 -0
  119. package/dist/base/src/utils/index.d.ts +5 -0
  120. package/dist/base/src/utils/index.d.ts.map +1 -0
  121. package/dist/base/src/utils/stdout-printer.d.ts +6 -0
  122. package/dist/base/src/utils/stdout-printer.d.ts.map +1 -0
  123. package/dist/base/tsconfig.base.tsbuildinfo +1 -0
  124. package/dist/react/src/adapters/react/components/file/file_log.d.ts +35 -0
  125. package/dist/react/src/adapters/react/components/file/file_log.d.ts.map +1 -0
  126. package/dist/react/src/adapters/react/components/file/index.d.ts +2 -0
  127. package/dist/react/src/adapters/react/components/file/index.d.ts.map +1 -0
  128. package/dist/react/src/adapters/react/components/filter/filter_bar.d.ts +7 -0
  129. package/dist/react/src/adapters/react/components/filter/filter_bar.d.ts.map +1 -0
  130. package/dist/react/src/adapters/react/components/filter/index.d.ts +2 -0
  131. package/dist/react/src/adapters/react/components/filter/index.d.ts.map +1 -0
  132. package/dist/react/src/adapters/react/components/help/help_overlay.d.ts +6 -0
  133. package/dist/react/src/adapters/react/components/help/help_overlay.d.ts.map +1 -0
  134. package/dist/react/src/adapters/react/components/help/index.d.ts +2 -0
  135. package/dist/react/src/adapters/react/components/help/index.d.ts.map +1 -0
  136. package/dist/react/src/adapters/react/components/log/index.d.ts +2 -0
  137. package/dist/react/src/adapters/react/components/log/index.d.ts.map +1 -0
  138. package/dist/react/src/adapters/react/components/log/log_message.d.ts +28 -0
  139. package/dist/react/src/adapters/react/components/log/log_message.d.ts.map +1 -0
  140. package/dist/react/src/adapters/react/components/prompt/index.d.ts +3 -0
  141. package/dist/react/src/adapters/react/components/prompt/index.d.ts.map +1 -0
  142. package/dist/react/src/adapters/react/components/prompt/prompt_renderer.d.ts +6 -0
  143. package/dist/react/src/adapters/react/components/prompt/prompt_renderer.d.ts.map +1 -0
  144. package/dist/react/src/adapters/react/components/screen/group_renderer.d.ts +14 -0
  145. package/dist/react/src/adapters/react/components/screen/group_renderer.d.ts.map +1 -0
  146. package/dist/react/src/adapters/react/components/screen/index.d.ts +7 -0
  147. package/dist/react/src/adapters/react/components/screen/index.d.ts.map +1 -0
  148. package/dist/react/src/adapters/react/components/screen/loading_message.d.ts +6 -0
  149. package/dist/react/src/adapters/react/components/screen/loading_message.d.ts.map +1 -0
  150. package/dist/react/src/adapters/react/components/screen/message_renderer.d.ts +6 -0
  151. package/dist/react/src/adapters/react/components/screen/message_renderer.d.ts.map +1 -0
  152. package/dist/react/src/adapters/react/components/screen/progress_message.d.ts +6 -0
  153. package/dist/react/src/adapters/react/components/screen/progress_message.d.ts.map +1 -0
  154. package/dist/react/src/adapters/react/components/screen/screen_bridge.d.ts +14 -0
  155. package/dist/react/src/adapters/react/components/screen/screen_bridge.d.ts.map +1 -0
  156. package/dist/react/src/adapters/react/components/screen/table_message.d.ts +6 -0
  157. package/dist/react/src/adapters/react/components/screen/table_message.d.ts.map +1 -0
  158. package/dist/react/src/adapters/react/components/screen_manager_bridge.d.ts +8 -0
  159. package/dist/react/src/adapters/react/components/screen_manager_bridge.d.ts.map +1 -0
  160. package/dist/react/src/adapters/react/components/sidebar/index.d.ts +4 -0
  161. package/dist/react/src/adapters/react/components/sidebar/index.d.ts.map +1 -0
  162. package/dist/react/src/adapters/react/components/sidebar/sidebar.d.ts +11 -0
  163. package/dist/react/src/adapters/react/components/sidebar/sidebar.d.ts.map +1 -0
  164. package/dist/react/src/adapters/react/components/sidebar/sidebar_item.d.ts +9 -0
  165. package/dist/react/src/adapters/react/components/sidebar/sidebar_item.d.ts.map +1 -0
  166. package/dist/react/src/adapters/react/components/sidebar/sidebar_separator.d.ts +2 -0
  167. package/dist/react/src/adapters/react/components/sidebar/sidebar_separator.d.ts.map +1 -0
  168. package/dist/react/src/adapters/react/context/index.d.ts +2 -0
  169. package/dist/react/src/adapters/react/context/index.d.ts.map +1 -0
  170. package/dist/react/src/adapters/react/context/logger_context.d.ts +53 -0
  171. package/dist/react/src/adapters/react/context/logger_context.d.ts.map +1 -0
  172. package/dist/react/src/adapters/react/hooks/index.d.ts +2 -0
  173. package/dist/react/src/adapters/react/hooks/index.d.ts.map +1 -0
  174. package/dist/react/src/adapters/react/hooks/use_theme.d.ts +7 -0
  175. package/dist/react/src/adapters/react/hooks/use_theme.d.ts.map +1 -0
  176. package/dist/react/src/adapters/react/index.d.ts +13 -0
  177. package/dist/react/src/adapters/react/index.d.ts.map +1 -0
  178. package/dist/react/tsconfig.react.tsbuildinfo +1 -0
  179. package/dist/solid/src/adapters/solid/components/file/file_log.d.ts +35 -0
  180. package/dist/solid/src/adapters/solid/components/file/file_log.d.ts.map +1 -0
  181. package/dist/solid/src/adapters/solid/components/file/index.d.ts +2 -0
  182. package/dist/solid/src/adapters/solid/components/file/index.d.ts.map +1 -0
  183. package/dist/solid/src/adapters/solid/components/filter/filter_bar.d.ts +7 -0
  184. package/dist/solid/src/adapters/solid/components/filter/filter_bar.d.ts.map +1 -0
  185. package/dist/solid/src/adapters/solid/components/filter/index.d.ts +2 -0
  186. package/dist/solid/src/adapters/solid/components/filter/index.d.ts.map +1 -0
  187. package/dist/solid/src/adapters/solid/components/help/help_overlay.d.ts +6 -0
  188. package/dist/solid/src/adapters/solid/components/help/help_overlay.d.ts.map +1 -0
  189. package/dist/solid/src/adapters/solid/components/help/index.d.ts +2 -0
  190. package/dist/solid/src/adapters/solid/components/help/index.d.ts.map +1 -0
  191. package/dist/solid/src/adapters/solid/components/log/index.d.ts +2 -0
  192. package/dist/solid/src/adapters/solid/components/log/index.d.ts.map +1 -0
  193. package/dist/solid/src/adapters/solid/components/log/log_message.d.ts +31 -0
  194. package/dist/solid/src/adapters/solid/components/log/log_message.d.ts.map +1 -0
  195. package/dist/solid/src/adapters/solid/components/prompt/index.d.ts +3 -0
  196. package/dist/solid/src/adapters/solid/components/prompt/index.d.ts.map +1 -0
  197. package/dist/solid/src/adapters/solid/components/prompt/prompt_renderer.d.ts +6 -0
  198. package/dist/solid/src/adapters/solid/components/prompt/prompt_renderer.d.ts.map +1 -0
  199. package/dist/solid/src/adapters/solid/components/screen/group_renderer.d.ts +14 -0
  200. package/dist/solid/src/adapters/solid/components/screen/group_renderer.d.ts.map +1 -0
  201. package/dist/solid/src/adapters/solid/components/screen/index.d.ts +7 -0
  202. package/dist/solid/src/adapters/solid/components/screen/index.d.ts.map +1 -0
  203. package/dist/solid/src/adapters/solid/components/screen/loading_message.d.ts +6 -0
  204. package/dist/solid/src/adapters/solid/components/screen/loading_message.d.ts.map +1 -0
  205. package/dist/solid/src/adapters/solid/components/screen/message_renderer.d.ts +6 -0
  206. package/dist/solid/src/adapters/solid/components/screen/message_renderer.d.ts.map +1 -0
  207. package/dist/solid/src/adapters/solid/components/screen/progress_message.d.ts +6 -0
  208. package/dist/solid/src/adapters/solid/components/screen/progress_message.d.ts.map +1 -0
  209. package/dist/solid/src/adapters/solid/components/screen/screen_bridge.d.ts +14 -0
  210. package/dist/solid/src/adapters/solid/components/screen/screen_bridge.d.ts.map +1 -0
  211. package/dist/solid/src/adapters/solid/components/screen/table_message.d.ts +6 -0
  212. package/dist/solid/src/adapters/solid/components/screen/table_message.d.ts.map +1 -0
  213. package/dist/solid/src/adapters/solid/components/screen_manager_bridge.d.ts +8 -0
  214. package/dist/solid/src/adapters/solid/components/screen_manager_bridge.d.ts.map +1 -0
  215. package/dist/solid/src/adapters/solid/components/sidebar/index.d.ts +4 -0
  216. package/dist/solid/src/adapters/solid/components/sidebar/index.d.ts.map +1 -0
  217. package/dist/solid/src/adapters/solid/components/sidebar/sidebar.d.ts +11 -0
  218. package/dist/solid/src/adapters/solid/components/sidebar/sidebar.d.ts.map +1 -0
  219. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_item.d.ts +9 -0
  220. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_item.d.ts.map +1 -0
  221. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_separator.d.ts +2 -0
  222. package/dist/solid/src/adapters/solid/components/sidebar/sidebar_separator.d.ts.map +1 -0
  223. package/dist/solid/src/adapters/solid/context/index.d.ts +3 -0
  224. package/dist/solid/src/adapters/solid/context/index.d.ts.map +1 -0
  225. package/dist/solid/src/adapters/solid/context/logger_context.d.ts +52 -0
  226. package/dist/solid/src/adapters/solid/context/logger_context.d.ts.map +1 -0
  227. package/dist/solid/src/adapters/solid/hooks/index.d.ts +2 -0
  228. package/dist/solid/src/adapters/solid/hooks/index.d.ts.map +1 -0
  229. package/dist/solid/src/adapters/solid/hooks/use_theme.d.ts +7 -0
  230. package/dist/solid/src/adapters/solid/hooks/use_theme.d.ts.map +1 -0
  231. package/dist/solid/src/adapters/solid/index.d.ts +13 -0
  232. package/dist/solid/src/adapters/solid/index.d.ts.map +1 -0
  233. package/dist/solid/tsconfig.solid.tsbuildinfo +1 -0
  234. package/dist/tsconfig.base.tsbuildinfo +1 -0
  235. package/dist/tsconfig.react.tsbuildinfo +1 -0
  236. package/dist/tsconfig.solid.tsbuildinfo +1 -0
  237. package/dist/tsconfig.tsbuildinfo +1 -1
  238. package/lib/adapters/react/index.cjs +1768 -0
  239. package/lib/adapters/react/index.cjs.map +1 -0
  240. package/lib/adapters/react/index.d.cts +80 -0
  241. package/lib/adapters/react/index.d.mts +80 -0
  242. package/lib/adapters/react/index.mjs +1760 -0
  243. package/lib/adapters/react/index.mjs.map +1 -0
  244. package/lib/adapters/solid/index.cjs +3855 -0
  245. package/lib/adapters/solid/index.cjs.map +1 -0
  246. package/lib/adapters/solid/index.d.cts +74 -0
  247. package/lib/adapters/solid/index.d.mts +74 -0
  248. package/lib/adapters/solid/index.mjs +3847 -0
  249. package/lib/adapters/solid/index.mjs.map +1 -0
  250. package/lib/filter_engine-DXqu9Vaq.cjs +1836 -0
  251. package/lib/filter_engine-DXqu9Vaq.cjs.map +1 -0
  252. package/lib/filter_engine-DmqhEhpA.mjs +1609 -0
  253. package/lib/filter_engine-DmqhEhpA.mjs.map +1 -0
  254. package/lib/index.cjs +1693 -1087
  255. package/lib/index.cjs.map +1 -1
  256. package/lib/index.d.cts +274 -1129
  257. package/lib/index.d.mts +294 -1149
  258. package/lib/index.mjs +1640 -1032
  259. package/lib/index.mjs.map +1 -1
  260. package/lib/interface-CTHQ08aY.d.mts +699 -0
  261. package/lib/interface-DQEIz9Mb.d.cts +699 -0
  262. package/package.json +25 -1
  263. package/project.json +2 -2
  264. package/src/__tests__/components/filter_bar.spec.tsx +1 -1
  265. package/src/__tests__/components/loading_message.spec.tsx +1 -1
  266. package/src/__tests__/components/log_message.spec.tsx +1 -1
  267. package/src/__tests__/components/progress_message.spec.tsx +1 -1
  268. package/src/__tests__/components/prompt_renderer.spec.tsx +1 -1
  269. package/src/__tests__/components/sidebar.spec.tsx +1 -1
  270. package/src/__tests__/services/logger.spec.ts +5 -3
  271. package/src/__tests__/utils/render-utils.tsx +1 -1
  272. package/src/adapters/index.ts +2 -0
  273. package/src/adapters/interface.ts +50 -0
  274. package/src/{components → adapters/react/components}/file/file_log.tsx +2 -2
  275. package/src/{components → adapters/react/components}/filter/filter_bar.tsx +2 -2
  276. package/src/{components → adapters/react/components}/help/help_overlay.tsx +2 -2
  277. package/src/{components → adapters/react/components}/log/log_message.tsx +2 -2
  278. package/src/{components → adapters/react/components}/prompt/prompt_renderer.tsx +1 -1
  279. package/src/{components → adapters/react/components}/screen/group_renderer.tsx +1 -1
  280. package/src/{components → adapters/react/components}/screen/loading_message.tsx +2 -3
  281. package/src/{components → adapters/react/components}/screen/message_renderer.tsx +1 -1
  282. package/src/{components → adapters/react/components}/screen/progress_message.tsx +1 -1
  283. package/src/{components → adapters/react/components}/screen/screen_bridge.tsx +2 -2
  284. package/src/{components → adapters/react/components}/screen/table_message.tsx +2 -2
  285. package/src/{components → adapters/react/components}/screen_manager_bridge.tsx +5 -5
  286. package/src/{components → adapters/react/components}/sidebar/sidebar.tsx +1 -1
  287. package/src/{components → adapters/react/components}/sidebar/sidebar_item.tsx +1 -1
  288. package/src/adapters/react/context/index.ts +1 -0
  289. package/src/{context → adapters/react/context}/logger_context.tsx +2 -2
  290. package/src/adapters/react/hooks/index.ts +1 -0
  291. package/src/{hooks → adapters/react/hooks}/use_theme.ts +1 -1
  292. package/src/adapters/react/index.ts +39 -0
  293. package/src/adapters/solid/components/file/file_log.tsx +221 -0
  294. package/src/adapters/solid/components/file/index.ts +1 -0
  295. package/src/adapters/solid/components/filter/filter_bar.tsx +84 -0
  296. package/src/adapters/solid/components/filter/index.ts +1 -0
  297. package/src/adapters/solid/components/help/help_overlay.tsx +106 -0
  298. package/src/adapters/solid/components/help/index.ts +1 -0
  299. package/src/adapters/solid/components/log/index.ts +1 -0
  300. package/src/adapters/solid/components/log/log_message.tsx +92 -0
  301. package/src/adapters/solid/components/prompt/index.ts +2 -0
  302. package/src/adapters/solid/components/prompt/prompt_renderer.tsx +350 -0
  303. package/src/adapters/solid/components/screen/group_renderer.tsx +61 -0
  304. package/src/adapters/solid/components/screen/index.ts +6 -0
  305. package/src/adapters/solid/components/screen/loading_message.tsx +39 -0
  306. package/src/adapters/solid/components/screen/message_renderer.tsx +122 -0
  307. package/src/adapters/solid/components/screen/progress_message.tsx +61 -0
  308. package/src/adapters/solid/components/screen/screen_bridge.tsx +155 -0
  309. package/src/adapters/solid/components/screen/table_message.tsx +58 -0
  310. package/src/adapters/solid/components/screen_manager_bridge.tsx +243 -0
  311. package/src/adapters/solid/components/sidebar/index.ts +3 -0
  312. package/src/adapters/solid/components/sidebar/sidebar.tsx +108 -0
  313. package/src/adapters/solid/components/sidebar/sidebar_item.tsx +55 -0
  314. package/src/adapters/solid/components/sidebar/sidebar_separator.tsx +13 -0
  315. package/src/adapters/solid/context/index.ts +2 -0
  316. package/src/adapters/solid/context/logger_context.tsx +95 -0
  317. package/src/adapters/solid/hooks/index.ts +1 -0
  318. package/src/adapters/solid/hooks/use_theme.ts +12 -0
  319. package/src/adapters/solid/index.tsx +43 -0
  320. package/src/adapters/solid/jsx.d.ts +98 -0
  321. package/src/components/index.ts +3 -15
  322. package/src/context/index.ts +3 -1
  323. package/src/factories/index.ts +1 -0
  324. package/src/factories/isomorphic-logger.factory.ts +22 -0
  325. package/src/factories/screen.factory.ts +2 -2
  326. package/src/hooks/index.ts +3 -1
  327. package/src/index.ts +10 -0
  328. package/src/interfaces/index.ts +1 -0
  329. package/src/interfaces/isomorphic-logger.ts +9 -0
  330. package/src/keyboard/create_bindings.ts +2 -2
  331. package/src/overrides/index.ts +1 -0
  332. package/src/overrides/missing-adapter.override.ts +20 -0
  333. package/src/services/index.ts +1 -1
  334. package/src/services/logger.ts +1 -1
  335. package/src/services/screen.ts +3 -3
  336. package/src/services/{screen_manager.tsx → screen_manager.ts} +22 -11
  337. package/src/tokens/adapter.ts +10 -0
  338. package/src/tokens/index.ts +2 -0
  339. package/src/tokens/logger.ts +9 -0
  340. package/src/tokens/screen-manager.ts +9 -0
  341. package/src/types/screen.types.ts +1 -1
  342. package/src/utils/format.ts +3 -2
  343. package/tsconfig.base.json +31 -0
  344. package/tsconfig.json +6 -12
  345. package/tsconfig.react.json +16 -0
  346. package/tsconfig.solid.json +16 -0
  347. package/tsdown.config.mts +69 -16
  348. package/vitest.config.mts +20 -0
  349. package/lib/index.d.cts.map +0 -1
  350. package/lib/index.d.mts.map +0 -1
  351. package/lib/screen_manager_bridge-Cp2p1Ix3.cjs +0 -3
  352. package/lib/screen_manager_bridge-D2BBwKcF.mjs +0 -3046
  353. package/lib/screen_manager_bridge-D2BBwKcF.mjs.map +0 -1
  354. package/lib/screen_manager_bridge-DT-l0rxa.mjs +0 -3
  355. package/lib/screen_manager_bridge-hMUrLiBP.cjs +0 -3369
  356. package/lib/screen_manager_bridge-hMUrLiBP.cjs.map +0 -1
  357. /package/src/{components → adapters/react/components}/file/index.ts +0 -0
  358. /package/src/{components → adapters/react/components}/filter/index.ts +0 -0
  359. /package/src/{components → adapters/react/components}/help/index.ts +0 -0
  360. /package/src/{components → adapters/react/components}/log/index.ts +0 -0
  361. /package/src/{components → adapters/react/components}/prompt/index.ts +0 -0
  362. /package/src/{components → adapters/react/components}/screen/index.ts +0 -0
  363. /package/src/{components → adapters/react/components}/sidebar/index.ts +0 -0
  364. /package/src/{components → adapters/react/components}/sidebar/sidebar_separator.tsx +0 -0
@@ -0,0 +1,350 @@
1
+ import { TextAttributes } from '@opentui/core'
2
+ import { Show, For, Switch, Match } from 'solid-js'
3
+
4
+ import { useTheme } from '../../hooks/index.ts'
5
+
6
+ import type {
7
+ PromptData,
8
+ ChoicePromptData,
9
+ ConfirmPromptData,
10
+ InputPromptData,
11
+ MultiChoicePromptData,
12
+ PromptTheme,
13
+ } from '../../../../types/index.ts'
14
+
15
+ export interface PromptRendererProps {
16
+ prompt: PromptData
17
+ }
18
+
19
+ export function PromptRenderer(props: PromptRendererProps) {
20
+ const theme = useTheme()
21
+ // Calculate timeout remaining if applicable
22
+ const timeoutRemaining = () => getTimeoutRemaining(props.prompt)
23
+
24
+ return (
25
+ <Switch fallback={null}>
26
+ <Match when={props.prompt.type === 'choice'}>
27
+ <ChoicePromptRenderer
28
+ prompt={props.prompt as ChoicePromptData}
29
+ timeoutRemaining={timeoutRemaining()}
30
+ colors={theme.prompt}
31
+ />
32
+ </Match>
33
+ <Match when={props.prompt.type === 'confirm'}>
34
+ <ConfirmPromptRenderer
35
+ prompt={props.prompt as ConfirmPromptData}
36
+ timeoutRemaining={timeoutRemaining()}
37
+ colors={theme.prompt}
38
+ />
39
+ </Match>
40
+ <Match when={props.prompt.type === 'input'}>
41
+ <InputPromptRenderer
42
+ prompt={props.prompt as InputPromptData}
43
+ timeoutRemaining={timeoutRemaining()}
44
+ colors={theme.prompt}
45
+ />
46
+ </Match>
47
+ <Match when={props.prompt.type === 'multiChoice'}>
48
+ <MultiChoicePromptRenderer
49
+ prompt={props.prompt as MultiChoicePromptData}
50
+ timeoutRemaining={timeoutRemaining()}
51
+ colors={theme.prompt}
52
+ />
53
+ </Match>
54
+ </Switch>
55
+ )
56
+ }
57
+
58
+ function getTimeoutRemaining(prompt: PromptData): number | null {
59
+ if (!prompt.timeout || !prompt.timeoutStarted) return null
60
+ const elapsed = Date.now() - prompt.timeoutStarted
61
+ const remaining = Math.max(0, prompt.timeout - elapsed)
62
+ return Math.ceil(remaining / 1000)
63
+ }
64
+
65
+ function TimeoutIndicator(props: { seconds: number | null; colors: PromptTheme }) {
66
+ return (
67
+ <Show when={props.seconds !== null}>
68
+ <text fg={props.colors.optionTextDim} attributes={TextAttributes.DIM}>
69
+ {' '}
70
+ (auto-select in {props.seconds}s)
71
+ </text>
72
+ </Show>
73
+ )
74
+ }
75
+
76
+ interface ChoicePromptRendererProps {
77
+ prompt: ChoicePromptData
78
+ timeoutRemaining: number | null
79
+ colors: PromptTheme
80
+ }
81
+
82
+ function ChoicePromptRenderer(props: ChoicePromptRendererProps) {
83
+ return (
84
+ <box
85
+ flexDirection="column"
86
+ borderColor={props.colors.focusBorder}
87
+ border={['left']}
88
+ paddingLeft={1}
89
+ paddingRight={1}
90
+ gap={1}
91
+ >
92
+ {/* Question */}
93
+ <box flexDirection="row">
94
+ <text fg={props.colors.question} attributes={TextAttributes.BOLD}>
95
+ ? {props.prompt.question}
96
+ </text>
97
+ <TimeoutIndicator seconds={props.timeoutRemaining} colors={props.colors} />
98
+ </box>
99
+
100
+ {/* Choices */}
101
+ <box flexDirection="column">
102
+ <For each={props.prompt.choices}>
103
+ {(choice, index) => {
104
+ const isSelected = () => index() === props.prompt.selectedIndex
105
+ const showInput = () => isSelected() && choice.input && props.prompt.inputMode
106
+
107
+ return (
108
+ <box flexDirection="row">
109
+ {/* Selection indicator */}
110
+ <text fg={isSelected() ? props.colors.optionSelected : 'transparent'}>{'>'} </text>
111
+
112
+ {/* Choice label */}
113
+ <text
114
+ fg={isSelected() ? props.colors.optionText : props.colors.optionTextDim}
115
+ attributes={isSelected() ? TextAttributes.BOLD : undefined}
116
+ >
117
+ {choice.label}
118
+ </text>
119
+
120
+ {/* Input field (if applicable) */}
121
+ <Show when={showInput()}>
122
+ <box flexDirection="row" marginLeft={1}>
123
+ <text fg={props.colors.inputText}>: </text>
124
+ <text fg={props.colors.inputText}>{props.prompt.inputValue}</text>
125
+ <text fg={props.colors.inputCursor} attributes={TextAttributes.BLINK}>
126
+ _
127
+ </text>
128
+ </box>
129
+ </Show>
130
+
131
+ {/* Show hint for input option when selected but not in input mode */}
132
+ <Show when={isSelected() && choice.input && !props.prompt.inputMode}>
133
+ <text fg={props.colors.optionTextDim}> (press Enter to type)</text>
134
+ </Show>
135
+ </box>
136
+ )
137
+ }}
138
+ </For>
139
+ </box>
140
+
141
+ {/* Instructions */}
142
+ <Show
143
+ when={props.prompt.inputMode}
144
+ fallback={
145
+ <text fg={props.colors.optionTextDim} attributes={TextAttributes.DIM}>
146
+ ↑/↓ to navigate, Enter to select
147
+ </text>
148
+ }
149
+ >
150
+ <text fg={props.colors.optionTextDim} attributes={TextAttributes.DIM}>
151
+ Type your answer, Enter to submit, Esc to cancel
152
+ </text>
153
+ </Show>
154
+ </box>
155
+ )
156
+ }
157
+
158
+ interface ConfirmPromptRendererProps {
159
+ prompt: ConfirmPromptData
160
+ timeoutRemaining: number | null
161
+ colors: PromptTheme
162
+ }
163
+
164
+ function ConfirmPromptRenderer(props: ConfirmPromptRendererProps) {
165
+ const confirmSelected = () => props.prompt.selectedValue === true
166
+ const cancelSelected = () => props.prompt.selectedValue === false
167
+
168
+ return (
169
+ <box
170
+ flexDirection="column"
171
+ borderColor={props.colors.focusBorder}
172
+ border={['left']}
173
+ paddingLeft={1}
174
+ paddingRight={1}
175
+ gap={1}
176
+ >
177
+ {/* Question */}
178
+ <box flexDirection="row">
179
+ <text fg={props.colors.question} attributes={TextAttributes.BOLD}>
180
+ ? {props.prompt.question}
181
+ </text>
182
+ <TimeoutIndicator seconds={props.timeoutRemaining} colors={props.colors} />
183
+ </box>
184
+
185
+ {/* Buttons */}
186
+ <box flexDirection="row" gap={2}>
187
+ {/* Confirm button */}
188
+ <box
189
+ backgroundColor={confirmSelected() ? props.colors.buttonSelectedBackground : undefined}
190
+ paddingLeft={1}
191
+ paddingRight={1}
192
+ >
193
+ <text
194
+ fg={confirmSelected() ? props.colors.confirmButton : props.colors.optionTextDim}
195
+ attributes={confirmSelected() ? TextAttributes.BOLD : undefined}
196
+ >
197
+ {confirmSelected() ? '>' : ' '} {props.prompt.confirmText}
198
+ </text>
199
+ </box>
200
+
201
+ {/* Cancel button */}
202
+ <box
203
+ backgroundColor={cancelSelected() ? props.colors.buttonSelectedBackground : undefined}
204
+ paddingLeft={1}
205
+ paddingRight={1}
206
+ >
207
+ <text
208
+ fg={cancelSelected() ? props.colors.cancelButton : props.colors.optionTextDim}
209
+ attributes={cancelSelected() ? TextAttributes.BOLD : undefined}
210
+ >
211
+ {cancelSelected() ? '>' : ' '} {props.prompt.cancelText}
212
+ </text>
213
+ </box>
214
+ </box>
215
+
216
+ {/* Instructions */}
217
+ <text fg={props.colors.optionTextDim} attributes={TextAttributes.DIM}>
218
+ ←/→ to select, Enter to confirm
219
+ </text>
220
+ </box>
221
+ )
222
+ }
223
+
224
+ interface InputPromptRendererProps {
225
+ prompt: InputPromptData
226
+ timeoutRemaining: number | null
227
+ colors: PromptTheme
228
+ }
229
+
230
+ function InputPromptRenderer(props: InputPromptRendererProps) {
231
+ const hasValue = () => props.prompt.value.length > 0
232
+
233
+ return (
234
+ <box
235
+ flexDirection="column"
236
+ borderColor={props.colors.focusBorder}
237
+ border={['left']}
238
+ paddingLeft={1}
239
+ paddingRight={1}
240
+ gap={1}
241
+ >
242
+ {/* Question */}
243
+ <box flexDirection="row">
244
+ <text fg={props.colors.question} attributes={TextAttributes.BOLD}>
245
+ ? {props.prompt.question}
246
+ </text>
247
+ <TimeoutIndicator seconds={props.timeoutRemaining} colors={props.colors} />
248
+ </box>
249
+
250
+ {/* Input field */}
251
+ <box flexDirection="row" borderColor={props.colors.inputBorder} border={['left']} paddingLeft={1}>
252
+ <text fg={hasValue() ? props.colors.inputText : props.colors.inputPlaceholder}>
253
+ {hasValue() ? props.prompt.value : props.prompt.placeholder}
254
+ </text>
255
+ <text fg={props.colors.inputCursor} attributes={TextAttributes.BLINK}>
256
+ _
257
+ </text>
258
+ </box>
259
+
260
+ {/* Instructions */}
261
+ <text fg={props.colors.optionTextDim} attributes={TextAttributes.DIM}>
262
+ Type your answer, Enter to submit
263
+ </text>
264
+ </box>
265
+ )
266
+ }
267
+
268
+ interface MultiChoicePromptRendererProps {
269
+ prompt: MultiChoicePromptData
270
+ timeoutRemaining: number | null
271
+ colors: PromptTheme
272
+ }
273
+
274
+ function MultiChoicePromptRenderer(props: MultiChoicePromptRendererProps) {
275
+ const selectedCount = () => props.prompt.selectedIndices.size
276
+ const canSubmit = () => selectedCount() >= props.prompt.minSelect
277
+
278
+ return (
279
+ <box
280
+ flexDirection="column"
281
+ borderColor={props.colors.focusBorder}
282
+ border={['left']}
283
+ paddingLeft={1}
284
+ paddingRight={1}
285
+ gap={1}
286
+ >
287
+ {/* Question */}
288
+ <box flexDirection="row">
289
+ <text fg={props.colors.question} attributes={TextAttributes.BOLD}>
290
+ ? {props.prompt.question}
291
+ </text>
292
+ <text fg={props.colors.optionTextDim}>
293
+ {' '}
294
+ ({selectedCount()}/{props.prompt.maxSelect} selected)
295
+ </text>
296
+ <TimeoutIndicator seconds={props.timeoutRemaining} colors={props.colors} />
297
+ </box>
298
+
299
+ {/* Choices */}
300
+ <box flexDirection="column">
301
+ <For each={props.prompt.choices}>
302
+ {(choice, index) => {
303
+ const isFocused = () => index() === props.prompt.focusedIndex
304
+ const isChecked = () => props.prompt.selectedIndices.has(index())
305
+
306
+ return (
307
+ <box flexDirection="row">
308
+ {/* Focus indicator */}
309
+ <text fg={isFocused() ? props.colors.optionSelected : 'transparent'}>{'>'} </text>
310
+
311
+ {/* Checkbox */}
312
+ <text fg={isChecked() ? props.colors.optionSelected : props.colors.optionTextDim}>
313
+ {isChecked() ? '[✓]' : '[ ]'}{' '}
314
+ </text>
315
+
316
+ {/* Choice label */}
317
+ <text
318
+ fg={isFocused() ? props.colors.optionText : props.colors.optionTextDim}
319
+ attributes={isFocused() ? TextAttributes.BOLD : undefined}
320
+ >
321
+ {choice.label}
322
+ </text>
323
+ </box>
324
+ )
325
+ }}
326
+ </For>
327
+ </box>
328
+
329
+ {/* Instructions */}
330
+ <box flexDirection="column">
331
+ <text fg={props.colors.optionTextDim} attributes={TextAttributes.DIM}>
332
+ ↑/↓ to navigate, Space to toggle
333
+ </text>
334
+ <Show
335
+ when={canSubmit()}
336
+ fallback={
337
+ <text fg={props.colors.cancelButton} attributes={TextAttributes.DIM}>
338
+ Select at least {props.prompt.minSelect} option
339
+ {props.prompt.minSelect > 1 ? 's' : ''}
340
+ </text>
341
+ }
342
+ >
343
+ <text fg={props.colors.optionTextDim} attributes={TextAttributes.DIM}>
344
+ Enter to confirm
345
+ </text>
346
+ </Show>
347
+ </box>
348
+ </box>
349
+ )
350
+ }
@@ -0,0 +1,61 @@
1
+ import { TextAttributes } from '@opentui/core'
2
+ import { For, Show } from 'solid-js'
3
+
4
+ import { useTheme } from '../../hooks/index.ts'
5
+
6
+ import type { MessageData, GroupMessageData } from '../../../../types/index.ts'
7
+
8
+ import { MessageRenderer } from './message_renderer.tsx'
9
+
10
+ export interface GroupRendererProps {
11
+ label: string
12
+ messages: MessageData[]
13
+ }
14
+
15
+ export function GroupRenderer(props: GroupRendererProps) {
16
+ const theme = useTheme()
17
+
18
+ return (
19
+ <box
20
+ flexDirection="column"
21
+ border={['left']}
22
+ borderColor={theme.group.border}
23
+ backgroundColor={theme.group.background}
24
+ paddingLeft={1}
25
+ >
26
+ {/* Group header */}
27
+ <box flexDirection="row" marginBottom={1}>
28
+ <text fg={theme.group.icon}>▼ </text>
29
+ <text fg={theme.group.headerText} attributes={TextAttributes.BOLD}>
30
+ {props.label}
31
+ </text>
32
+ </box>
33
+
34
+ {/* Group content */}
35
+ <box flexDirection="column" gap={1}>
36
+ <For each={props.messages}>{(msg) => <MessageRenderer message={msg} />}</For>
37
+ </box>
38
+ </box>
39
+ )
40
+ }
41
+
42
+ export interface GroupMessageRendererProps {
43
+ message: GroupMessageData
44
+ }
45
+
46
+ /**
47
+ * Fallback renderer for group markers (when not processed at higher level)
48
+ */
49
+ export function GroupMessageRenderer(props: GroupMessageRendererProps) {
50
+ const theme = useTheme()
51
+
52
+ return (
53
+ <Show when={!props.message.isEnd}>
54
+ <box flexDirection="row" borderColor={theme.group.border} border={['left']} paddingLeft={1}>
55
+ <text fg={theme.group.headerText} attributes={TextAttributes.BOLD}>
56
+ ▼ {props.message.label}
57
+ </text>
58
+ </box>
59
+ </Show>
60
+ )
61
+ }
@@ -0,0 +1,6 @@
1
+ export * from './screen_bridge.tsx'
2
+ export * from './message_renderer.tsx'
3
+ export * from './group_renderer.tsx'
4
+ export * from './loading_message.tsx'
5
+ export * from './progress_message.tsx'
6
+ export * from './table_message.tsx'
@@ -0,0 +1,39 @@
1
+ import { createSignal, createEffect, onCleanup } from 'solid-js'
2
+
3
+ import { LogMessage } from '../log/index.ts'
4
+
5
+ import type { LoadingMessageData, LogMessageVariant } from '../../../../types/index.ts'
6
+
7
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']
8
+
9
+ export interface LoadingMessageProps {
10
+ message: LoadingMessageData
11
+ }
12
+
13
+ export function LoadingMessage(props: LoadingMessageProps) {
14
+ const [frameIndex, setFrameIndex] = createSignal(0)
15
+
16
+ createEffect(() => {
17
+ if (props.message.status === 'loading') {
18
+ const interval = setInterval(() => {
19
+ setFrameIndex((prev) => (prev + 1) % SPINNER_FRAMES.length)
20
+ }, 80)
21
+
22
+ onCleanup(() => clearInterval(interval))
23
+ }
24
+ })
25
+
26
+ // Map loading status to log level and variant for display
27
+ const level = () => (props.message.status === 'fail' ? 'error' : 'log')
28
+ const variant = (): LogMessageVariant | undefined =>
29
+ props.message.status === 'success' ? 'success' : undefined
30
+
31
+ const displayContent = () => props.message.resolvedContent ?? props.message.content
32
+ const spinner = () => (props.message.status === 'loading' ? SPINNER_FRAMES[frameIndex()] + ' ' : '')
33
+
34
+ return (
35
+ <LogMessage level={level()} variant={variant()} timestamp={props.message.timestamp}>
36
+ {spinner() + displayContent()}
37
+ </LogMessage>
38
+ )
39
+ }
@@ -0,0 +1,122 @@
1
+ import { Switch, Match } from 'solid-js'
2
+
3
+ import { useTheme } from '../../hooks/index.ts'
4
+ import { FileLog } from '../file/index.ts'
5
+ import { LogMessage } from '../log/index.ts'
6
+
7
+ import type {
8
+ MessageData,
9
+ LogMessageData,
10
+ FileMessageData,
11
+ DiffMessageData,
12
+ FileErrorMessageData,
13
+ LoadingMessageData,
14
+ ProgressMessageData,
15
+ GroupMessageData,
16
+ TableMessageData,
17
+ } from '../../../../types/index.ts'
18
+
19
+ import { GroupMessageRenderer } from './group_renderer.tsx'
20
+ import { LoadingMessage } from './loading_message.tsx'
21
+ import { ProgressMessage } from './progress_message.tsx'
22
+ import { TableMessage } from './table_message.tsx'
23
+
24
+ export interface MessageRendererProps {
25
+ message: MessageData
26
+ }
27
+
28
+ export function MessageRenderer(props: MessageRendererProps) {
29
+ const theme = useTheme()
30
+ const msg = () => props.message
31
+
32
+ return (
33
+ <Switch fallback={null}>
34
+ <Match when={msg().type === 'log' && (msg() as LogMessageData)}>
35
+ {(logMsg) => (
36
+ <LogMessage
37
+ level={logMsg().level}
38
+ timestamp={logMsg().timestamp}
39
+ variant={logMsg().variant}
40
+ label={logMsg().label}
41
+ trace={logMsg().trace}
42
+ >
43
+ {logMsg().content}
44
+ </LogMessage>
45
+ )}
46
+ </Match>
47
+
48
+ <Match when={msg().type === 'file' && (msg() as FileMessageData)}>
49
+ {(fileMsg) => (
50
+ <box
51
+ flexDirection="column"
52
+ border={['left']}
53
+ borderColor={theme.file.border}
54
+ backgroundColor={theme.file.background}
55
+ >
56
+ <FileLog
57
+ mode="full"
58
+ filePath={fileMsg().filePath}
59
+ content={fileMsg().content}
60
+ headerBackgroundColor={theme.file.headerBackground}
61
+ />
62
+ </box>
63
+ )}
64
+ </Match>
65
+
66
+ <Match when={msg().type === 'diff' && (msg() as DiffMessageData)}>
67
+ {(diffMsg) => (
68
+ <box
69
+ flexDirection="column"
70
+ border={['left']}
71
+ borderColor={theme.file.border}
72
+ backgroundColor={theme.file.background}
73
+ >
74
+ <FileLog
75
+ mode="diff"
76
+ filePath={diffMsg().filePath}
77
+ diff={diffMsg().diff}
78
+ view={diffMsg().view}
79
+ headerBackgroundColor={theme.file.headerBackground}
80
+ />
81
+ </box>
82
+ )}
83
+ </Match>
84
+
85
+ <Match when={msg().type === 'fileError' && (msg() as FileErrorMessageData)}>
86
+ {(errorMsg) => (
87
+ <box
88
+ flexDirection="column"
89
+ border={['left']}
90
+ borderColor={theme.file.border}
91
+ backgroundColor={theme.file.background}
92
+ >
93
+ <FileLog
94
+ mode="partial"
95
+ filePath={errorMsg().filePath}
96
+ content={errorMsg().content}
97
+ startLine={errorMsg().startLine}
98
+ errorLines={errorMsg().errorLines}
99
+ headerBackgroundColor={theme.file.headerBackground}
100
+ />
101
+ </box>
102
+ )}
103
+ </Match>
104
+
105
+ <Match when={msg().type === 'loading' && (msg() as LoadingMessageData)}>
106
+ {(loadingMsg) => <LoadingMessage message={loadingMsg()} />}
107
+ </Match>
108
+
109
+ <Match when={msg().type === 'progress' && (msg() as ProgressMessageData)}>
110
+ {(progressMsg) => <ProgressMessage message={progressMsg()} />}
111
+ </Match>
112
+
113
+ <Match when={msg().type === 'group' && (msg() as GroupMessageData)}>
114
+ {(groupMsg) => <GroupMessageRenderer message={groupMsg()} />}
115
+ </Match>
116
+
117
+ <Match when={msg().type === 'table' && (msg() as TableMessageData)}>
118
+ {(tableMsg) => <TableMessage message={tableMsg()} />}
119
+ </Match>
120
+ </Switch>
121
+ )
122
+ }
@@ -0,0 +1,61 @@
1
+ import { useTheme } from '../../hooks/index.ts'
2
+
3
+ import type { ProgressMessageData } from '../../../../types/index.ts'
4
+
5
+ export interface ProgressMessageProps {
6
+ message: ProgressMessageData
7
+ }
8
+
9
+ export function ProgressMessage(props: ProgressMessageProps) {
10
+ const theme = useTheme()
11
+
12
+ const percent = () => Math.round((props.message.current / props.message.total) * 100)
13
+ const barWidth = 20
14
+ const filled = () => Math.round((percent() / 100) * barWidth)
15
+ const empty = () => barWidth - filled()
16
+
17
+ const barFilled = () => '█'.repeat(filled())
18
+ const barEmpty = () => '░'.repeat(empty())
19
+
20
+ // Determine colors based on status
21
+ const borderColor = () =>
22
+ props.message.status === 'complete'
23
+ ? theme.progress.complete
24
+ : props.message.status === 'failed'
25
+ ? theme.progress.failed
26
+ : theme.progress.border
27
+
28
+ const backgroundColor = () =>
29
+ props.message.status === 'complete'
30
+ ? theme.progress.completeBackground
31
+ : props.message.status === 'failed'
32
+ ? theme.progress.failedBackground
33
+ : theme.progress.background
34
+
35
+ const barColor = () =>
36
+ props.message.status === 'complete'
37
+ ? theme.progress.complete
38
+ : props.message.status === 'failed'
39
+ ? theme.progress.failed
40
+ : theme.progress.barFilled
41
+
42
+ const displayLabel = () => props.message.resolvedContent ?? props.message.label
43
+
44
+ return (
45
+ <box
46
+ flexDirection="column"
47
+ border={['left']}
48
+ borderColor={borderColor()}
49
+ backgroundColor={backgroundColor()}
50
+ paddingLeft={1}
51
+ paddingRight={1}
52
+ >
53
+ <box flexDirection="row" gap={1}>
54
+ <text fg={barColor()}>[{barFilled()}</text>
55
+ <text fg={theme.progress.barEmpty}>{barEmpty()}]</text>
56
+ <text fg={theme.progress.textDim}>{percent()}%</text>
57
+ <text fg={theme.progress.text}>{displayLabel()}</text>
58
+ </box>
59
+ </box>
60
+ )
61
+ }