@mks2508/mks-ui 0.3.1 → 0.4.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 (325) hide show
  1. package/dist/react-ui/blocks/Terminal/ResttyAdapter.d.ts +146 -0
  2. package/dist/react-ui/blocks/Terminal/ResttyAdapter.d.ts.map +1 -0
  3. package/dist/react-ui/blocks/Terminal/ResttyAdapter.js +213 -0
  4. package/dist/react-ui/blocks/Terminal/Terminal.adapter.d.ts +55 -0
  5. package/dist/react-ui/blocks/Terminal/Terminal.adapter.d.ts.map +1 -0
  6. package/dist/react-ui/blocks/Terminal/Terminal.adapter.js +68 -0
  7. package/dist/react-ui/blocks/Terminal/Terminal.theme.d.ts +43 -0
  8. package/dist/react-ui/blocks/Terminal/Terminal.theme.d.ts.map +1 -0
  9. package/dist/react-ui/blocks/Terminal/Terminal.theme.js +59 -0
  10. package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.d.ts +63 -0
  11. package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.d.ts.map +1 -0
  12. package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.js +109 -0
  13. package/dist/react-ui/blocks/Terminal/Terminal.types.d.ts +351 -0
  14. package/dist/react-ui/blocks/Terminal/Terminal.types.d.ts.map +1 -0
  15. package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts +60 -0
  16. package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts.map +1 -0
  17. package/dist/react-ui/blocks/Terminal/TerminalPanel.js +183 -0
  18. package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts +111 -0
  19. package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts.map +1 -0
  20. package/dist/react-ui/blocks/Terminal/TerminalRestty.js +185 -0
  21. package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts +58 -0
  22. package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts.map +1 -0
  23. package/dist/react-ui/blocks/Terminal/TerminalXterm.js +143 -0
  24. package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts +87 -0
  25. package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts.map +1 -0
  26. package/dist/react-ui/blocks/Terminal/XTermAdapter.js +135 -0
  27. package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts +160 -0
  28. package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts.map +1 -0
  29. package/dist/react-ui/blocks/Terminal/components/LogLineBadges.js +185 -0
  30. package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts +48 -0
  31. package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts.map +1 -0
  32. package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.js +139 -0
  33. package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts +60 -0
  34. package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts.map +1 -0
  35. package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.js +352 -0
  36. package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts +36 -0
  37. package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts.map +1 -0
  38. package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.js +52 -0
  39. package/dist/react-ui/blocks/Terminal/components/index.d.ts +10 -0
  40. package/dist/react-ui/blocks/Terminal/components/index.d.ts.map +1 -0
  41. package/dist/react-ui/blocks/Terminal/components/index.js +4 -0
  42. package/dist/react-ui/blocks/Terminal/hooks/index.d.ts +11 -0
  43. package/dist/react-ui/blocks/Terminal/hooks/index.d.ts.map +1 -0
  44. package/dist/react-ui/blocks/Terminal/hooks/index.js +2 -0
  45. package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts +69 -0
  46. package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts.map +1 -0
  47. package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.js +162 -0
  48. package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts +104 -0
  49. package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts.map +1 -0
  50. package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.js +180 -0
  51. package/dist/react-ui/blocks/Terminal/index.d.ts +39 -0
  52. package/dist/react-ui/blocks/Terminal/index.d.ts.map +1 -0
  53. package/dist/react-ui/blocks/Terminal/index.js +38 -0
  54. package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts +58 -0
  55. package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts.map +1 -0
  56. package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.js +222 -0
  57. package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts +74 -0
  58. package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts.map +1 -0
  59. package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.js +168 -0
  60. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts +42 -0
  61. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts.map +1 -0
  62. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.js +175 -0
  63. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts +43 -0
  64. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts.map +1 -0
  65. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts +38 -0
  66. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts.map +1 -0
  67. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.js +62 -0
  68. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts +67 -0
  69. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts.map +1 -0
  70. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts +32 -0
  71. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts.map +1 -0
  72. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.js +326 -0
  73. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts +36 -0
  74. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts.map +1 -0
  75. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.js +371 -0
  76. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts +67 -0
  77. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts.map +1 -0
  78. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.js +417 -0
  79. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts +197 -0
  80. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts.map +1 -0
  81. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts +54 -0
  82. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts.map +1 -0
  83. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.js +193 -0
  84. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts +57 -0
  85. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts.map +1 -0
  86. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts +30 -0
  87. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts.map +1 -0
  88. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.js +126 -0
  89. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts +31 -0
  90. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts.map +1 -0
  91. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.js +149 -0
  92. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts +35 -0
  93. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts.map +1 -0
  94. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts +58 -0
  95. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts.map +1 -0
  96. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts +63 -0
  97. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts.map +1 -0
  98. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.js +245 -0
  99. package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts +24 -0
  100. package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts.map +1 -0
  101. package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.js +225 -0
  102. package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts +35 -0
  103. package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts.map +1 -0
  104. package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.js +187 -0
  105. package/dist/react-ui/blocks/Terminal/panel/index.d.ts +30 -0
  106. package/dist/react-ui/blocks/Terminal/panel/index.d.ts.map +1 -0
  107. package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module-Bovc57nm.css +60 -0
  108. package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.js +5 -0
  109. package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module-QyxHO7cN.css +60 -0
  110. package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.js +5 -0
  111. package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts +73 -0
  112. package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts.map +1 -0
  113. package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.js +136 -0
  114. package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts +117 -0
  115. package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts.map +1 -0
  116. package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.js +174 -0
  117. package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts +221 -0
  118. package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts.map +1 -0
  119. package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts +184 -0
  120. package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts.map +1 -0
  121. package/dist/react-ui/blocks/Terminal/parsing/LogParserService.js +478 -0
  122. package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts +173 -0
  123. package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts.map +1 -0
  124. package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.js +313 -0
  125. package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts +181 -0
  126. package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts.map +1 -0
  127. package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.js +221 -0
  128. package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts +69 -0
  129. package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts.map +1 -0
  130. package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.js +142 -0
  131. package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts +125 -0
  132. package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts.map +1 -0
  133. package/dist/react-ui/blocks/Terminal/parsing/TableParser.js +245 -0
  134. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts +165 -0
  135. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts.map +1 -0
  136. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.js +225 -0
  137. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts +164 -0
  138. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts.map +1 -0
  139. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.js +285 -0
  140. package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts +188 -0
  141. package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts.map +1 -0
  142. package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.js +178 -0
  143. package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts +12 -0
  144. package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts.map +1 -0
  145. package/dist/react-ui/blocks/Terminal/parsing/index.d.ts +24 -0
  146. package/dist/react-ui/blocks/Terminal/parsing/index.d.ts.map +1 -0
  147. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts +56 -0
  148. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts.map +1 -0
  149. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts +140 -0
  150. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts.map +1 -0
  151. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.js +325 -0
  152. package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts +10 -0
  153. package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts.map +1 -0
  154. package/dist/react-ui/blocks/index.d.ts +11 -0
  155. package/dist/react-ui/blocks/index.d.ts.map +1 -0
  156. package/dist/react-ui/icons/lucide-animated/activity.js +1 -1
  157. package/dist/react-ui/icons/lucide-animated/bell-electric.js +1 -1
  158. package/dist/react-ui/icons/lucide-animated/bell.js +1 -1
  159. package/dist/react-ui/icons/lucide-animated/bot.js +1 -1
  160. package/dist/react-ui/icons/lucide-animated/box.js +1 -1
  161. package/dist/react-ui/icons/lucide-animated/circle-check.js +1 -1
  162. package/dist/react-ui/icons/lucide-animated/delete.js +1 -1
  163. package/dist/react-ui/icons/lucide-animated/download.js +1 -1
  164. package/dist/react-ui/icons/lucide-animated/home.js +1 -1
  165. package/dist/react-ui/icons/lucide-animated/layout-panel-top.js +1 -1
  166. package/dist/react-ui/icons/lucide-animated/plus.js +1 -1
  167. package/dist/react-ui/icons/lucide-animated/search.js +1 -1
  168. package/dist/react-ui/icons/lucide-animated/settings.js +1 -1
  169. package/dist/react-ui/icons/lucide-animated/trending-down.js +1 -1
  170. package/dist/react-ui/icons/lucide-animated/trending-up.js +1 -1
  171. package/dist/react-ui/icons/lucide-animated/x.js +1 -1
  172. package/dist/react-ui/index.js +4 -1
  173. package/dist/react-ui/lib/icon-wrapper.d.ts +37 -0
  174. package/dist/react-ui/lib/icon-wrapper.d.ts.map +1 -0
  175. package/dist/react-ui/lib/icon-wrapper.js +55 -0
  176. package/dist/react-ui/lib/index.d.ts +1 -0
  177. package/dist/react-ui/lib/index.d.ts.map +1 -1
  178. package/dist/react-ui/lib/index.js +1 -0
  179. package/dist/react-ui/primitives/AutoHeight/index.d.ts +1 -1
  180. package/dist/react-ui/primitives/CountingNumber/index.d.ts +1 -1
  181. package/dist/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.d.ts +1 -1
  182. package/dist/react-ui/primitives/waapi/SlidingText/SlidingText.styles.d.ts +1 -1
  183. package/dist/react-ui/ui/Accordion/Accordion.styles.d.ts +1 -1
  184. package/dist/react-ui/ui/Accordion/Accordion.types.d.ts +1 -1
  185. package/dist/react-ui/ui/AlertDialog/AlertDialog.styles.d.ts +1 -1
  186. package/dist/react-ui/ui/AlertDialog/AlertDialog.types.d.ts +1 -1
  187. package/dist/react-ui/ui/Badge/Badge.styles.d.ts +1 -1
  188. package/dist/react-ui/ui/Badge/Badge.types.d.ts +1 -1
  189. package/dist/react-ui/ui/Button/Button.styles.d.ts +2 -2
  190. package/dist/react-ui/ui/Button/Button.types.d.ts +1 -1
  191. package/dist/react-ui/ui/Card/Card.styles.d.ts +1 -1
  192. package/dist/react-ui/ui/Card/Card.types.d.ts +1 -1
  193. package/dist/react-ui/ui/Checkbox/Checkbox.styles.d.ts +1 -1
  194. package/dist/react-ui/ui/Checkbox/Checkbox.types.d.ts +1 -1
  195. package/dist/react-ui/ui/Combobox/Combobox.styles.d.ts +1 -1
  196. package/dist/react-ui/ui/Combobox/Combobox.types.d.ts +1 -1
  197. package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.d.ts +2 -2
  198. package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.js +1 -1
  199. package/dist/react-ui/ui/CornerBracket/CornerBracket.types.d.ts +1 -1
  200. package/dist/react-ui/ui/DataCard/DataCard.styles.d.ts +1 -1
  201. package/dist/react-ui/ui/DataCard/DataCard.types.d.ts +1 -1
  202. package/dist/react-ui/ui/DataCard/index.d.ts +1 -1
  203. package/dist/react-ui/ui/Dialog/Dialog.styles.d.ts +1 -1
  204. package/dist/react-ui/ui/Dialog/Dialog.types.d.ts +1 -1
  205. package/dist/react-ui/ui/DropdownMenu/DropdownMenu.styles.d.ts +1 -1
  206. package/dist/react-ui/ui/DropdownMenu/DropdownMenu.types.d.ts +1 -1
  207. package/dist/react-ui/ui/Field/Field.styles.d.ts +1 -1
  208. package/dist/react-ui/ui/Field/Field.types.d.ts +1 -1
  209. package/dist/react-ui/ui/Input/Input.styles.d.ts +1 -1
  210. package/dist/react-ui/ui/Input/Input.types.d.ts +1 -1
  211. package/dist/react-ui/ui/InputGroup/InputGroup.styles.d.ts +1 -1
  212. package/dist/react-ui/ui/InputGroup/InputGroup.types.d.ts +1 -1
  213. package/dist/react-ui/ui/Label/Label.styles.d.ts +1 -1
  214. package/dist/react-ui/ui/Label/Label.types.d.ts +1 -1
  215. package/dist/react-ui/ui/Menu/Menu.styles.d.ts +1 -1
  216. package/dist/react-ui/ui/Menu/Menu.types.d.ts +2 -2
  217. package/dist/react-ui/ui/Popover/Popover.styles.d.ts +1 -1
  218. package/dist/react-ui/ui/Popover/Popover.types.d.ts +1 -1
  219. package/dist/react-ui/ui/Progress/Progress.styles.d.ts +1 -1
  220. package/dist/react-ui/ui/Progress/Progress.types.d.ts +2 -2
  221. package/dist/react-ui/ui/Select/Select.styles.d.ts +1 -1
  222. package/dist/react-ui/ui/Select/Select.types.d.ts +1 -1
  223. package/dist/react-ui/ui/Separator/Separator.styles.d.ts +1 -1
  224. package/dist/react-ui/ui/Separator/Separator.types.d.ts +1 -1
  225. package/dist/react-ui/ui/Switch/Switch.styles.d.ts +1 -1
  226. package/dist/react-ui/ui/Switch/Switch.types.d.ts +1 -1
  227. package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts +43 -25
  228. package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts.map +1 -1
  229. package/dist/react-ui/ui/Tabs/Tabs.styles.js +105 -13
  230. package/dist/react-ui/ui/Tabs/Tabs.types.d.ts +9 -6
  231. package/dist/react-ui/ui/Tabs/Tabs.types.d.ts.map +1 -1
  232. package/dist/react-ui/ui/Tabs/index.d.ts +18 -9
  233. package/dist/react-ui/ui/Tabs/index.d.ts.map +1 -1
  234. package/dist/react-ui/ui/Tabs/index.js +99 -27
  235. package/dist/react-ui/ui/TextFlow/TextFlow.styles.d.ts +1 -1
  236. package/dist/react-ui/ui/Textarea/Textarea.styles.d.ts +1 -1
  237. package/dist/react-ui/ui/Textarea/Textarea.types.d.ts +1 -1
  238. package/dist/react-ui/ui/Tooltip/Tooltip.styles.d.ts +1 -1
  239. package/dist/react-ui/ui/Tooltip/Tooltip.types.d.ts +1 -1
  240. package/dist/react-ui/ui/index.d.ts +1 -0
  241. package/dist/react-ui/ui/index.d.ts.map +1 -1
  242. package/dist/react-ui/ui/index.js +2 -0
  243. package/package.json +54 -6
  244. package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +278 -0
  245. package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +97 -0
  246. package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +155 -0
  247. package/src/react-ui/blocks/Terminal/Terminal.theme.ts +80 -0
  248. package/src/react-ui/blocks/Terminal/Terminal.types.ts +438 -0
  249. package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +269 -0
  250. package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +326 -0
  251. package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +230 -0
  252. package/src/react-ui/blocks/Terminal/XTermAdapter.ts +163 -0
  253. package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +316 -0
  254. package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +218 -0
  255. package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +386 -0
  256. package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +67 -0
  257. package/src/react-ui/blocks/Terminal/components/index.ts +10 -0
  258. package/src/react-ui/blocks/Terminal/hooks/index.ts +22 -0
  259. package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +229 -0
  260. package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +292 -0
  261. package/src/react-ui/blocks/Terminal/index.ts +103 -0
  262. package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +330 -0
  263. package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +242 -0
  264. package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +202 -0
  265. package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +140 -0
  266. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +68 -0
  267. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +85 -0
  268. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +383 -0
  269. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +439 -0
  270. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +550 -0
  271. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +259 -0
  272. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +237 -0
  273. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +76 -0
  274. package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +112 -0
  275. package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +178 -0
  276. package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +203 -0
  277. package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +252 -0
  278. package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +334 -0
  279. package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +261 -0
  280. package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +248 -0
  281. package/src/react-ui/blocks/Terminal/panel/index.ts +72 -0
  282. package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +59 -0
  283. package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +59 -0
  284. package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +180 -0
  285. package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +248 -0
  286. package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +283 -0
  287. package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +686 -0
  288. package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +466 -0
  289. package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +343 -0
  290. package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +167 -0
  291. package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +348 -0
  292. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +251 -0
  293. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +390 -0
  294. package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +320 -0
  295. package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +20 -0
  296. package/src/react-ui/blocks/Terminal/parsing/index.ts +69 -0
  297. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +68 -0
  298. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +436 -0
  299. package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +14 -0
  300. package/src/react-ui/blocks/index.ts +11 -0
  301. package/src/react-ui/icons/lucide-animated/activity.tsx +2 -2
  302. package/src/react-ui/icons/lucide-animated/bell-electric.tsx +1 -1
  303. package/src/react-ui/icons/lucide-animated/bell.tsx +2 -2
  304. package/src/react-ui/icons/lucide-animated/bot.tsx +1 -1
  305. package/src/react-ui/icons/lucide-animated/box.tsx +2 -2
  306. package/src/react-ui/icons/lucide-animated/circle-check.tsx +2 -2
  307. package/src/react-ui/icons/lucide-animated/delete.tsx +2 -2
  308. package/src/react-ui/icons/lucide-animated/download.tsx +2 -2
  309. package/src/react-ui/icons/lucide-animated/home.tsx +2 -2
  310. package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +1 -1
  311. package/src/react-ui/icons/lucide-animated/plus.tsx +1 -1
  312. package/src/react-ui/icons/lucide-animated/search.tsx +1 -1
  313. package/src/react-ui/icons/lucide-animated/settings.tsx +1 -1
  314. package/src/react-ui/icons/lucide-animated/trending-down.tsx +2 -2
  315. package/src/react-ui/icons/lucide-animated/trending-up.tsx +2 -2
  316. package/src/react-ui/icons/lucide-animated/x.tsx +2 -2
  317. package/src/react-ui/lib/icon-wrapper.tsx +70 -0
  318. package/src/react-ui/lib/index.ts +1 -0
  319. package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +1 -1
  320. package/src/react-ui/ui/Tabs/Tabs.css +39 -0
  321. package/src/react-ui/ui/Tabs/Tabs.styles.ts +119 -31
  322. package/src/react-ui/ui/Tabs/Tabs.types.ts +8 -3
  323. package/src/react-ui/ui/Tabs/index.tsx +135 -27
  324. package/src/react-ui/ui/index.ts +1 -0
  325. package/dist/index.css +0 -129
@@ -0,0 +1,248 @@
1
+ /**
2
+ * TerminalThemeSelector Component.
3
+ *
4
+ * Searchable dropdown for restty's 458 built-in terminal themes.
5
+ * Uses Popover for the dropdown UI with glassmorphism styling
6
+ * matching the existing TerminalFilterDropdown pattern.
7
+ *
8
+ * @module components/devenv/terminal/panel/TerminalThemeSelector
9
+ */
10
+
11
+ 'use client';
12
+
13
+ import { useState, useMemo, useCallback, useRef, useEffect } from 'react';
14
+ import { Popover, PopoverTrigger, PopoverPortal, PopoverPositioner, PopoverPopup } from '@/react-ui/ui/Popover';
15
+ import { cn } from '@/react-ui/lib/utils';
16
+
17
+ /**
18
+ * Props for the TerminalThemeSelector component.
19
+ */
20
+ export interface ITerminalThemeSelectorProps {
21
+ /** Currently active theme name */
22
+ currentTheme: string;
23
+
24
+ /** Callback when user selects a new theme */
25
+ onThemeChange: (themeName: string) => void;
26
+ }
27
+
28
+ /**
29
+ * Favorite themes displayed at the top of the list.
30
+ */
31
+ const FAVORITE_THEMES = [
32
+ 'Synthwave Alpha',
33
+ 'Synthwave',
34
+ 'Dracula',
35
+ 'Nord',
36
+ 'One Dark',
37
+ 'Tokyo Night',
38
+ 'Catppuccin Mocha',
39
+ 'Gruvbox Dark',
40
+ ];
41
+
42
+ /**
43
+ * Action button base styles (matches TerminalInteractivePanel pattern).
44
+ */
45
+ const triggerStyles =
46
+ 'h-8 px-2.5 rounded-md transition-all hover:bg-muted/20 active:bg-muted/30 flex items-center justify-center gap-1.5 text-xs font-mono text-muted-foreground hover:text-foreground flex-shrink-0 border border-border/30';
47
+
48
+ /**
49
+ * TerminalThemeSelector Component.
50
+ *
51
+ * Searchable dropdown for restty's built-in theme catalog.
52
+ * Favorites are pinned to the top, followed by alphabetically
53
+ * sorted themes. Search filters by case-insensitive substring.
54
+ *
55
+ * @example
56
+ * ```tsx
57
+ * <TerminalThemeSelector
58
+ * currentTheme="Synthwave Alpha"
59
+ * onThemeChange={(name) => setResttyThemeName(name)}
60
+ * />
61
+ * ```
62
+ */
63
+ export function TerminalThemeSelector({ currentTheme, onThemeChange }: ITerminalThemeSelectorProps) {
64
+ const [open, setOpen] = useState(false);
65
+ const [search, setSearch] = useState('');
66
+ const [themeNames, setThemeNames] = useState<string[]>([]);
67
+ const searchInputRef = useRef<HTMLInputElement>(null);
68
+
69
+ /**
70
+ * Load the theme catalog from restty on first open.
71
+ */
72
+ useEffect(() => {
73
+ if (!open || themeNames.length > 0) return;
74
+
75
+ import('restty').then(({ listBuiltinThemeNames }) => {
76
+ const names = listBuiltinThemeNames();
77
+ if (Array.isArray(names)) {
78
+ setThemeNames(names.sort((a: string, b: string) => a.localeCompare(b)));
79
+ }
80
+ }).catch(() => {
81
+ // restty not available — show favorites only
82
+ });
83
+ }, [open, themeNames.length]);
84
+
85
+ /**
86
+ * Focus search input on open.
87
+ */
88
+ useEffect(() => {
89
+ if (open) {
90
+ requestAnimationFrame(() => searchInputRef.current?.focus());
91
+ } else {
92
+ setSearch('');
93
+ }
94
+ }, [open]);
95
+
96
+ /**
97
+ * Filter and group themes based on search query.
98
+ */
99
+ const { favorites, others } = useMemo(() => {
100
+ const query = search.toLowerCase().trim();
101
+ const allNames = themeNames.length > 0 ? themeNames : FAVORITE_THEMES;
102
+
103
+ const favSet = new Set(FAVORITE_THEMES);
104
+
105
+ const filteredFavorites = FAVORITE_THEMES.filter(
106
+ (name) => !query || name.toLowerCase().includes(query)
107
+ );
108
+
109
+ const filteredOthers = allNames.filter(
110
+ (name) => !favSet.has(name) && (!query || name.toLowerCase().includes(query))
111
+ );
112
+
113
+ return { favorites: filteredFavorites, others: filteredOthers };
114
+ }, [search, themeNames]);
115
+
116
+ /**
117
+ * Handle theme selection.
118
+ */
119
+ const handleSelect = useCallback(
120
+ (themeName: string) => {
121
+ onThemeChange(themeName);
122
+ setOpen(false);
123
+ },
124
+ [onThemeChange]
125
+ );
126
+
127
+ return (
128
+ <Popover open={open} onOpenChange={setOpen}>
129
+ <PopoverTrigger>
130
+ <button type="button" className={triggerStyles} title="Select terminal theme">
131
+ <span className="truncate max-w-[140px]">{currentTheme}</span>
132
+ <svg
133
+ className={cn('w-3 h-3 transition-transform flex-shrink-0', open && 'rotate-180')}
134
+ viewBox="0 0 12 12"
135
+ fill="none"
136
+ stroke="currentColor"
137
+ strokeWidth="2"
138
+ >
139
+ <path d="M3 5l3 3 3-3" />
140
+ </svg>
141
+ </button>
142
+ </PopoverTrigger>
143
+
144
+ <PopoverPortal>
145
+ <PopoverPositioner align="start" sideOffset={6}>
146
+ <PopoverPopup className="w-64 p-0 glass-subtle rounded-lg">
147
+ {/* Search */}
148
+ <div className="p-2 border-b border-border/30">
149
+ <input
150
+ ref={searchInputRef}
151
+ type="text"
152
+ value={search}
153
+ onChange={(e) => setSearch(e.target.value)}
154
+ placeholder="Search themes..."
155
+ className="w-full h-8 px-2.5 rounded-md bg-muted/20 border border-border/30 text-xs font-mono text-foreground placeholder:text-muted-foreground/50 outline-none focus:border-primary/40 focus:ring-1 focus:ring-primary/20 transition-colors"
156
+ />
157
+ </div>
158
+
159
+ {/* Theme list */}
160
+ <div className="max-h-[300px] overflow-y-auto py-1">
161
+ {/* Favorites section */}
162
+ {favorites.length > 0 && (
163
+ <>
164
+ <div className="px-3 py-1.5">
165
+ <span className="text-[10px] font-mono text-muted-foreground/60 uppercase tracking-wider">
166
+ Favorites
167
+ </span>
168
+ </div>
169
+ {favorites.map((name) => (
170
+ <ThemeOption
171
+ key={`fav-${name}`}
172
+ name={name}
173
+ isActive={name === currentTheme}
174
+ onSelect={handleSelect}
175
+ />
176
+ ))}
177
+ </>
178
+ )}
179
+
180
+ {/* All themes section */}
181
+ {others.length > 0 && (
182
+ <>
183
+ {favorites.length > 0 && (
184
+ <div className="mx-2 my-1 h-px bg-border/20" />
185
+ )}
186
+ <div className="px-3 py-1.5">
187
+ <span className="text-[10px] font-mono text-muted-foreground/60 uppercase tracking-wider">
188
+ All Themes ({others.length})
189
+ </span>
190
+ </div>
191
+ {others.map((name) => (
192
+ <ThemeOption
193
+ key={name}
194
+ name={name}
195
+ isActive={name === currentTheme}
196
+ onSelect={handleSelect}
197
+ />
198
+ ))}
199
+ </>
200
+ )}
201
+
202
+ {/* No results */}
203
+ {favorites.length === 0 && others.length === 0 && (
204
+ <div className="px-3 py-4 text-center">
205
+ <span className="text-xs font-mono text-muted-foreground/50">
206
+ No themes match &quot;{search}&quot;
207
+ </span>
208
+ </div>
209
+ )}
210
+ </div>
211
+ </PopoverPopup>
212
+ </PopoverPositioner>
213
+ </PopoverPortal>
214
+ </Popover>
215
+ );
216
+ }
217
+
218
+ /**
219
+ * Individual theme option in the dropdown list.
220
+ */
221
+ function ThemeOption({
222
+ name,
223
+ isActive,
224
+ onSelect,
225
+ }: {
226
+ name: string;
227
+ isActive: boolean;
228
+ onSelect: (name: string) => void;
229
+ }) {
230
+ return (
231
+ <button
232
+ type="button"
233
+ onClick={() => onSelect(name)}
234
+ className={cn(
235
+ 'w-full text-left px-3 py-1.5 text-xs font-mono transition-colors',
236
+ 'hover:bg-muted/20',
237
+ isActive
238
+ ? 'text-primary bg-primary/10'
239
+ : 'text-foreground/80'
240
+ )}
241
+ >
242
+ {isActive && (
243
+ <span className="inline-block w-1.5 h-1.5 rounded-full bg-primary mr-2 align-middle" />
244
+ )}
245
+ {name}
246
+ </button>
247
+ );
248
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Terminal Panel Module.
3
+ *
4
+ * Complete terminal panel with session tabs, header, filter tabs,
5
+ * action bar, display, and footer. Ghostty-inspired design with
6
+ * glassmorphism effects and premium visual details.
7
+ *
8
+ * @module components/devenv/terminal/panel
9
+ */
10
+
11
+ // Main components
12
+ export { TerminalLogsPanel } from './TerminalLogsPanel';
13
+ export { TerminalInteractivePanel } from './TerminalInteractivePanel';
14
+ export { TerminalInteractivePanelRestty } from './TerminalInteractivePanelRestty';
15
+ export { TerminalPanelChrome } from './TerminalPanelChrome';
16
+
17
+ // Settings UI
18
+ export { TerminalSettingsPopover } from './TerminalSettingsPopover';
19
+ export { TerminalThemeSelector } from './TerminalThemeSelector';
20
+
21
+ // Debug panel
22
+ export { TerminalDebugPanel, type ITerminalDebugPanelProps } from './TerminalDebugPanel';
23
+
24
+ // Shared constants (noise texture, scroll styles)
25
+ export { NOISE_TEXTURE_SVG, terminalScrollStyles } from './TerminalPanelChrome';
26
+
27
+ // Sub-components
28
+ export { TerminalPanelHeader } from './TerminalPanelHeader';
29
+ export { TerminalPanelFooter } from './TerminalPanelFooter';
30
+
31
+ // Ghostty-inspired components
32
+ export { TerminalSessionTabs } from './TerminalSessionTabs';
33
+ export { TerminalFilterTabs } from './TerminalFilterTabs';
34
+ export { TerminalFilterDropdown } from './TerminalFilterDropdown';
35
+ export { TerminalSessionControl } from './TerminalSessionControl';
36
+
37
+ // React viewer components
38
+ export { LogLinesViewer } from './LogLinesViewer';
39
+
40
+ // Types - Chrome
41
+ export type { ITerminalPanelChromeProps } from './TerminalPanelChrome.types';
42
+
43
+ // Types - Interactive panel
44
+ export type {
45
+ ITerminalInteractivePanelProps,
46
+ ITerminalInteractivePanelRef,
47
+ } from './TerminalInteractivePanel.types';
48
+
49
+ // Types - Theme selector
50
+ export type { ITerminalThemeSelectorProps } from './TerminalThemeSelector';
51
+
52
+ // Types - Logs panel and sub-components
53
+ export type {
54
+ ITerminalLogsPanelProps,
55
+ ITerminalLogsPanelRef,
56
+ ITerminalPanelHeaderProps,
57
+ ITerminalPanelToolbarProps,
58
+ ITerminalPanelFooterProps,
59
+ ITerminalSession,
60
+ ITerminalSessionTabsProps,
61
+ ITerminalFilterTabsProps,
62
+ ITerminalFilterDropdownProps,
63
+ ITerminalSessionControlProps,
64
+ TLogLevelFilter,
65
+ ILevelFilterButton,
66
+ TTerminalAction,
67
+ TLogLevel,
68
+ } from './TerminalLogsPanel.types';
69
+
70
+ export type {
71
+ ILogLinesViewerProps,
72
+ } from './LogLinesViewer';
@@ -0,0 +1,59 @@
1
+ /**
2
+ * TerminalFilterDropdown Styles.
3
+ *
4
+ * Uses CSS Anchor Positioning API for dropdown placement.
5
+ * Button acts as anchor, dropdown is positioned relative to it
6
+ * with automatic flip behavior at viewport edges.
7
+ *
8
+ * @module components/devenv/terminal/panel/terminal-filter-dropdown/styles
9
+ */
10
+
11
+ /* Trigger button - acts as CSS anchor */
12
+ .triggerButton {
13
+ anchor-name: --filter-dropdown-anchor;
14
+ }
15
+
16
+ /* Dropdown menu - anchored to trigger button */
17
+ .dropdownMenu {
18
+ position-anchor: --filter-dropdown-anchor;
19
+ position: fixed;
20
+
21
+ /* Position below and left-aligned */
22
+ left: anchor(left);
23
+ top: anchor(bottom);
24
+ margin-top: 4px;
25
+
26
+ /* Flip to above if no room below */
27
+ position-try-fallbacks: flip-block, flip-inline;
28
+
29
+ min-width: 180px;
30
+ z-index: 50;
31
+
32
+ /* Hidden by default */
33
+ display: none;
34
+ opacity: 0;
35
+ transform: translateY(-4px);
36
+ transition: opacity 0.15s ease-out, transform 0.15s ease-out;
37
+ pointer-events: none;
38
+ }
39
+
40
+ .dropdownMenu[data-open="true"] {
41
+ display: block;
42
+ opacity: 1;
43
+ transform: translateY(0);
44
+ pointer-events: auto;
45
+ }
46
+
47
+ /* Fallback for browsers without CSS Anchor Positioning */
48
+ @supports not (anchor-name: none) {
49
+ .dropdownMenu {
50
+ position: absolute;
51
+ left: 0;
52
+ top: calc(100% + 4px);
53
+ z-index: 50;
54
+ }
55
+
56
+ .dropdownMenu[data-open="true"] {
57
+ display: block;
58
+ }
59
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * TerminalSessionTabs Dropdown Styles.
3
+ *
4
+ * Uses CSS Anchor Positioning API for the "add container" dropdown.
5
+ * The + button acts as anchor, dropdown is positioned below it
6
+ * with automatic flip behavior at viewport edges.
7
+ *
8
+ * @module components/devenv/terminal/panel/terminal-session-tabs/styles
9
+ */
10
+
11
+ /* + button - acts as CSS anchor */
12
+ .addButton {
13
+ anchor-name: --session-tabs-add-anchor;
14
+ }
15
+
16
+ /* Container dropdown - anchored to + button */
17
+ .containerDropdown {
18
+ position-anchor: --session-tabs-add-anchor;
19
+ position: fixed;
20
+
21
+ /* Position below and left-aligned */
22
+ left: anchor(left);
23
+ top: anchor(bottom);
24
+ margin-top: 4px;
25
+
26
+ /* Flip to above if no room below */
27
+ position-try-fallbacks: flip-block, flip-inline;
28
+
29
+ min-width: 200px;
30
+ z-index: 50;
31
+
32
+ /* Hidden by default */
33
+ display: none;
34
+ opacity: 0;
35
+ transform: translateY(-4px);
36
+ transition: opacity 0.15s ease-out, transform 0.15s ease-out;
37
+ pointer-events: none;
38
+ }
39
+
40
+ .containerDropdown[data-open="true"] {
41
+ display: block;
42
+ opacity: 1;
43
+ transform: translateY(0);
44
+ pointer-events: auto;
45
+ }
46
+
47
+ /* Fallback for browsers without CSS Anchor Positioning */
48
+ @supports not (anchor-name: none) {
49
+ .containerDropdown {
50
+ position: absolute;
51
+ left: 0;
52
+ top: calc(100% + 4px);
53
+ z-index: 50;
54
+ }
55
+
56
+ .containerDropdown[data-open="true"] {
57
+ display: block;
58
+ }
59
+ }
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Badge formatter for terminal logs.
3
+ *
4
+ * Creates stylized badges using standard ANSI escape codes
5
+ * compatible with xterm.js.
6
+ *
7
+ * @module components/devenv/terminal/parsing/badge
8
+ */
9
+
10
+ import type { TLogLevel } from './LogParser.types';
11
+
12
+ /**
13
+ * ANSI color combinations for badges.
14
+ *
15
+ * Uses standard 16-color palette for maximum compatibility.
16
+ */
17
+ const BADGE_COLORS = {
18
+ info: '\x1b[44m\x1b[97m', // Blue bg, bright white fg
19
+ warn: '\x1b[43m\x1b[30m', // Yellow bg, black fg
20
+ error: '\x1b[41m\x1b[97m', // Red bg, bright white fg
21
+ debug: '\x1b[46m\x1b[30m', // Cyan bg, black fg
22
+ fatal: '\x1b[45m\x1b[97m', // Magenta bg, bright white fg
23
+ trace: '\x1b[47m\x1b[30m', // White bg, black fg
24
+ unknown: '\x1b[47m\x1b[30m', // White bg, black fg
25
+ } as const;
26
+
27
+ /**
28
+ * Tag badge colors (cyan on gray).
29
+ */
30
+ const TAG_COLORS = '\x1b[90m\x1b[36m'; // Dim bg, cyan fg
31
+
32
+ /**
33
+ * Timestamp colors (gray).
34
+ */
35
+ const TIMESTAMP_COLORS = '\x1b[90m\x1b[37m'; // Dim bg, white fg
36
+
37
+ /**
38
+ * Reset code.
39
+ */
40
+ const RESET = '\x1b[0m';
41
+
42
+ /**
43
+ * Bold modifier.
44
+ */
45
+ const BOLD = '\x1b[1m';
46
+
47
+ /**
48
+ * Level badge icons.
49
+ */
50
+ const LEVEL_ICONS: Record<TLogLevel, string> = {
51
+ info: 'I',
52
+ warn: 'W',
53
+ error: 'E',
54
+ fatal: 'F',
55
+ debug: 'D',
56
+ trace: 'T',
57
+ unknown: '?',
58
+ };
59
+
60
+ /**
61
+ * Badge formatter class.
62
+ *
63
+ * Creates simple ANSI badges for log levels, tags, and timestamps.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * const formatter = new BadgeFormatter();
68
+ * const infoBadge = formatter.createLevelBadge('info');
69
+ * // Returns: '\x1b[1m\x1b[44m\x1b[97m[ INFO ]\x1b[0m'
70
+ * ```
71
+ */
72
+ export class BadgeFormatter {
73
+ /**
74
+ * Create a level badge.
75
+ *
76
+ * Badge format: [ INFO ] with background color
77
+ *
78
+ * @param level - Log level
79
+ * @returns ANSI-formatted level badge string
80
+ */
81
+ createLevelBadge(level: TLogLevel): string {
82
+ const colors = BADGE_COLORS[level] ?? BADGE_COLORS.unknown;
83
+ const icon = LEVEL_ICONS[level] ?? LEVEL_ICONS.unknown;
84
+ const label = level.toUpperCase().padEnd(4); // "INFO", "WARN", etc.
85
+
86
+ // Badge: [INFO] with background color
87
+ return `${BOLD}${colors}[${icon}${label}]${RESET}`;
88
+ }
89
+
90
+ /**
91
+ * Create a timestamp badge for end of line.
92
+ *
93
+ * Badge format: " 22:55:20" aligned to right
94
+ *
95
+ * @param timestamp - Display timestamp string
96
+ * @returns ANSI-formatted timestamp string
97
+ */
98
+ createTimestampBadge(timestamp: string): string {
99
+ if (!timestamp) return '';
100
+
101
+ // Truncate to HH:MM:SS format for consistent width
102
+ const timeOnly = timestamp.includes('.')
103
+ ? timestamp.split('.')[0] // 22:55:20.916 -> 22:55:20
104
+ : timestamp;
105
+
106
+ // Pad to 12 chars for right alignment visual
107
+ const padded = timeOnly.padStart(12);
108
+
109
+ return `${TIMESTAMP_COLORS}${padded}${RESET}`;
110
+ }
111
+
112
+ /**
113
+ * Create a tag badge.
114
+ *
115
+ * Badge format: [TAG] with subtle styling
116
+ *
117
+ * @param tag - Tag string
118
+ * @returns ANSI-formatted tag badge string
119
+ */
120
+ createTagBadge(tag: string): string {
121
+ // Truncate long tags
122
+ const displayTag = tag.length > 12 ? tag.slice(0, 9) + '...' : tag;
123
+
124
+ return `${TAG_COLORS}[${displayTag}]${RESET}`;
125
+ }
126
+
127
+ /**
128
+ * Create multiple tag badges joined with space.
129
+ *
130
+ * @param tags - Array of tag strings
131
+ * @returns ANSI-formatted tag badges string
132
+ */
133
+ createTagBadges(tags: string[]): string {
134
+ if (!tags || tags.length === 0) return '';
135
+ return tags.map(tag => this.createTagBadge(tag)).join('');
136
+ }
137
+
138
+ /**
139
+ * Create a status indicator.
140
+ *
141
+ * @param status - Status type
142
+ * @returns ANSI-formatted status indicator
143
+ */
144
+ createStatusIndicator(status: 'success' | 'warning' | 'error' | 'info'): string {
145
+ const colors = {
146
+ success: '\x1b[42m\x1b[97m', // Green
147
+ warning: '\x1b[43m\x1b[30m', // Yellow
148
+ error: '\x1b[41m\x1b[97m', // Red
149
+ info: '\x1b[44m\x1b[97m', // Blue
150
+ } as const;
151
+
152
+ const symbols = {
153
+ success: '✓',
154
+ warning: '⚠',
155
+ error: '✖',
156
+ info: 'i',
157
+ } as const;
158
+
159
+ return `${colors[status]} ${symbols[status]} ${RESET}`;
160
+ }
161
+
162
+ /**
163
+ * Create a box badge (multi-line).
164
+ *
165
+ * @param text - Text to display
166
+ * @param level - Log level for color
167
+ * @returns Multi-line ANSI box
168
+ */
169
+ createBoxBadge(text: string, level: TLogLevel = 'info'): string {
170
+ const colors = BADGE_COLORS[level] ?? BADGE_COLORS.unknown;
171
+ const padding = 2;
172
+ const width = text.length + padding * 2 + 2;
173
+
174
+ const topBorder = `\x1b[90m┌${'─'.repeat(width)}┐${RESET}`;
175
+ const middle = `${colors}│${' '.repeat(padding)}${text}${' '.repeat(padding)}│${RESET}`;
176
+ const bottomBorder = `\x1b[90m└${'─'.repeat(width)}┘${RESET}`;
177
+
178
+ return `${topBorder}\r\n${middle}\r\n${bottomBorder}`;
179
+ }
180
+ }