@mks2508/mks-ui 0.3.2 → 0.5.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 (329) 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/TerminalDisplay.d.ts +46 -0
  16. package/dist/react-ui/blocks/Terminal/TerminalDisplay.d.ts.map +1 -0
  17. package/dist/react-ui/blocks/Terminal/TerminalDisplay.js +168 -0
  18. package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.d.ts +21 -0
  19. package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.d.ts.map +1 -0
  20. package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.js +31 -0
  21. package/dist/react-ui/blocks/Terminal/TerminalDisplay.types.d.ts +56 -0
  22. package/dist/react-ui/blocks/Terminal/TerminalDisplay.types.d.ts.map +1 -0
  23. package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts +60 -0
  24. package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts.map +1 -0
  25. package/dist/react-ui/blocks/Terminal/TerminalPanel.js +183 -0
  26. package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts +111 -0
  27. package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts.map +1 -0
  28. package/dist/react-ui/blocks/Terminal/TerminalRestty.js +185 -0
  29. package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts +58 -0
  30. package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts.map +1 -0
  31. package/dist/react-ui/blocks/Terminal/TerminalXterm.js +143 -0
  32. package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts +87 -0
  33. package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts.map +1 -0
  34. package/dist/react-ui/blocks/Terminal/XTermAdapter.js +135 -0
  35. package/dist/react-ui/blocks/Terminal/chrome.d.ts +14 -0
  36. package/dist/react-ui/blocks/Terminal/chrome.d.ts.map +1 -0
  37. package/dist/react-ui/blocks/Terminal/chrome.js +6 -0
  38. package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts +160 -0
  39. package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts.map +1 -0
  40. package/dist/react-ui/blocks/Terminal/components/LogLineBadges.js +185 -0
  41. package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts +48 -0
  42. package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts.map +1 -0
  43. package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.js +139 -0
  44. package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts +60 -0
  45. package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts.map +1 -0
  46. package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.js +352 -0
  47. package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts +36 -0
  48. package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts.map +1 -0
  49. package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.js +52 -0
  50. package/dist/react-ui/blocks/Terminal/components/index.d.ts +10 -0
  51. package/dist/react-ui/blocks/Terminal/components/index.d.ts.map +1 -0
  52. package/dist/react-ui/blocks/Terminal/components/index.js +4 -0
  53. package/dist/react-ui/blocks/Terminal/display.d.ts +20 -0
  54. package/dist/react-ui/blocks/Terminal/display.d.ts.map +1 -0
  55. package/dist/react-ui/blocks/Terminal/display.js +9 -0
  56. package/dist/react-ui/blocks/Terminal/hooks/index.d.ts +11 -0
  57. package/dist/react-ui/blocks/Terminal/hooks/index.d.ts.map +1 -0
  58. package/dist/react-ui/blocks/Terminal/hooks/index.js +2 -0
  59. package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts +69 -0
  60. package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts.map +1 -0
  61. package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.js +162 -0
  62. package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts +104 -0
  63. package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts.map +1 -0
  64. package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.js +180 -0
  65. package/dist/react-ui/blocks/Terminal/index.d.ts +43 -0
  66. package/dist/react-ui/blocks/Terminal/index.d.ts.map +1 -0
  67. package/dist/react-ui/blocks/Terminal/index.js +41 -0
  68. package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts +58 -0
  69. package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts.map +1 -0
  70. package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.js +222 -0
  71. package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts +74 -0
  72. package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts.map +1 -0
  73. package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.js +168 -0
  74. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts +42 -0
  75. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts.map +1 -0
  76. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.js +175 -0
  77. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts +43 -0
  78. package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts.map +1 -0
  79. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts +38 -0
  80. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts.map +1 -0
  81. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.js +62 -0
  82. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts +67 -0
  83. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts.map +1 -0
  84. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts +32 -0
  85. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts.map +1 -0
  86. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.js +326 -0
  87. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts +36 -0
  88. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts.map +1 -0
  89. package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.js +371 -0
  90. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts +67 -0
  91. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts.map +1 -0
  92. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.js +417 -0
  93. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts +197 -0
  94. package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts.map +1 -0
  95. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts +55 -0
  96. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts.map +1 -0
  97. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.js +214 -0
  98. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.d.ts +35 -0
  99. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.d.ts.map +1 -0
  100. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.js +57 -0
  101. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts +62 -0
  102. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts.map +1 -0
  103. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts +30 -0
  104. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts.map +1 -0
  105. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.js +126 -0
  106. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts +31 -0
  107. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts.map +1 -0
  108. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.js +149 -0
  109. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts +35 -0
  110. package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts.map +1 -0
  111. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts +58 -0
  112. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts.map +1 -0
  113. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts +63 -0
  114. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts.map +1 -0
  115. package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.js +245 -0
  116. package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts +24 -0
  117. package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts.map +1 -0
  118. package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.js +225 -0
  119. package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts +35 -0
  120. package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts.map +1 -0
  121. package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.js +187 -0
  122. package/dist/react-ui/blocks/Terminal/panel/index.d.ts +30 -0
  123. package/dist/react-ui/blocks/Terminal/panel/index.d.ts.map +1 -0
  124. package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module-CNVWCefU.css +60 -0
  125. package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.js +5 -0
  126. package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module-cmyJ11jP.css +60 -0
  127. package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.js +5 -0
  128. package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts +73 -0
  129. package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts.map +1 -0
  130. package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.js +136 -0
  131. package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts +117 -0
  132. package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts.map +1 -0
  133. package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.js +174 -0
  134. package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts +221 -0
  135. package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts.map +1 -0
  136. package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts +184 -0
  137. package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts.map +1 -0
  138. package/dist/react-ui/blocks/Terminal/parsing/LogParserService.js +478 -0
  139. package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts +173 -0
  140. package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts.map +1 -0
  141. package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.js +313 -0
  142. package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts +181 -0
  143. package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts.map +1 -0
  144. package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.js +221 -0
  145. package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts +69 -0
  146. package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts.map +1 -0
  147. package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.js +142 -0
  148. package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts +125 -0
  149. package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts.map +1 -0
  150. package/dist/react-ui/blocks/Terminal/parsing/TableParser.js +245 -0
  151. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts +165 -0
  152. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts.map +1 -0
  153. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.js +225 -0
  154. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts +164 -0
  155. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts.map +1 -0
  156. package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.js +285 -0
  157. package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts +188 -0
  158. package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts.map +1 -0
  159. package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.js +178 -0
  160. package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts +12 -0
  161. package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts.map +1 -0
  162. package/dist/react-ui/blocks/Terminal/parsing/index.d.ts +24 -0
  163. package/dist/react-ui/blocks/Terminal/parsing/index.d.ts.map +1 -0
  164. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts +56 -0
  165. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts.map +1 -0
  166. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts +140 -0
  167. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts.map +1 -0
  168. package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.js +325 -0
  169. package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts +10 -0
  170. package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts.map +1 -0
  171. package/dist/react-ui/blocks/index.d.ts +11 -0
  172. package/dist/react-ui/blocks/index.d.ts.map +1 -0
  173. package/dist/react-ui/icons/lucide-animated/activity.js +1 -1
  174. package/dist/react-ui/icons/lucide-animated/bell-electric.js +1 -1
  175. package/dist/react-ui/icons/lucide-animated/bell.js +1 -1
  176. package/dist/react-ui/icons/lucide-animated/bot.js +1 -1
  177. package/dist/react-ui/icons/lucide-animated/box.js +1 -1
  178. package/dist/react-ui/icons/lucide-animated/circle-check.js +1 -1
  179. package/dist/react-ui/icons/lucide-animated/delete.js +1 -1
  180. package/dist/react-ui/icons/lucide-animated/download.js +1 -1
  181. package/dist/react-ui/icons/lucide-animated/home.js +1 -1
  182. package/dist/react-ui/icons/lucide-animated/layout-panel-top.js +1 -1
  183. package/dist/react-ui/icons/lucide-animated/plus.js +1 -1
  184. package/dist/react-ui/icons/lucide-animated/search.js +1 -1
  185. package/dist/react-ui/icons/lucide-animated/settings.js +1 -1
  186. package/dist/react-ui/icons/lucide-animated/trending-down.js +1 -1
  187. package/dist/react-ui/icons/lucide-animated/trending-up.js +1 -1
  188. package/dist/react-ui/icons/lucide-animated/x.js +1 -1
  189. package/dist/react-ui/index.js +3 -1
  190. package/dist/react-ui/lib/icon-wrapper.d.ts +37 -0
  191. package/dist/react-ui/lib/icon-wrapper.d.ts.map +1 -0
  192. package/dist/react-ui/lib/icon-wrapper.js +55 -0
  193. package/dist/react-ui/lib/index.d.ts +1 -0
  194. package/dist/react-ui/lib/index.d.ts.map +1 -1
  195. package/dist/react-ui/lib/index.js +1 -0
  196. package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.d.ts.map +1 -1
  197. package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.js +2 -0
  198. package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.d.ts.map +1 -1
  199. package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.js +2 -0
  200. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.d.ts.map +1 -1
  201. package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.js +2 -0
  202. package/dist/react-ui/primitives/waapi/Morph/useMorph.d.ts.map +1 -1
  203. package/dist/react-ui/primitives/waapi/Morph/useMorph.js +2 -0
  204. package/dist/react-ui/primitives/waapi/Reorder/useReorder.d.ts.map +1 -1
  205. package/dist/react-ui/primitives/waapi/Reorder/useReorder.js +2 -0
  206. package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.d.ts.map +1 -1
  207. package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.js +2 -0
  208. package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.d.ts.map +1 -1
  209. package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.js +2 -0
  210. package/dist/react-ui/primitives/waapi/core/useElementRegistry.d.ts.map +1 -1
  211. package/dist/react-ui/primitives/waapi/core/useElementRegistry.js +2 -0
  212. package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.d.ts.map +1 -1
  213. package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.js +2 -0
  214. package/dist/react-ui/primitives/waapi/core/usePositionCapture.d.ts.map +1 -1
  215. package/dist/react-ui/primitives/waapi/core/usePositionCapture.js +2 -0
  216. package/dist/react-ui/ui/Button/Button.styles.d.ts +1 -1
  217. package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.d.ts +1 -1
  218. package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.js +1 -1
  219. package/dist/react-ui/ui/InputGroup/index.d.ts.map +1 -1
  220. package/dist/react-ui/ui/InputGroup/index.js +2 -0
  221. package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts +43 -25
  222. package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts.map +1 -1
  223. package/dist/react-ui/ui/Tabs/Tabs.styles.js +105 -13
  224. package/dist/react-ui/ui/Tabs/Tabs.types.d.ts +6 -3
  225. package/dist/react-ui/ui/Tabs/Tabs.types.d.ts.map +1 -1
  226. package/dist/react-ui/ui/Tabs/index.d.ts +18 -9
  227. package/dist/react-ui/ui/Tabs/index.d.ts.map +1 -1
  228. package/dist/react-ui/ui/Tabs/index.js +99 -27
  229. package/dist/react-ui/ui/index.js +1 -0
  230. package/package.json +84 -29
  231. package/src/css.d.ts +6 -0
  232. package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +278 -0
  233. package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +97 -0
  234. package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +155 -0
  235. package/src/react-ui/blocks/Terminal/Terminal.theme.ts +80 -0
  236. package/src/react-ui/blocks/Terminal/Terminal.types.ts +438 -0
  237. package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +38 -0
  238. package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +243 -0
  239. package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +73 -0
  240. package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +269 -0
  241. package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +326 -0
  242. package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +230 -0
  243. package/src/react-ui/blocks/Terminal/XTermAdapter.ts +163 -0
  244. package/src/react-ui/blocks/Terminal/chrome.ts +25 -0
  245. package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +316 -0
  246. package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +218 -0
  247. package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +386 -0
  248. package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +67 -0
  249. package/src/react-ui/blocks/Terminal/components/index.ts +10 -0
  250. package/src/react-ui/blocks/Terminal/display.ts +46 -0
  251. package/src/react-ui/blocks/Terminal/hooks/index.ts +22 -0
  252. package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +229 -0
  253. package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +292 -0
  254. package/src/react-ui/blocks/Terminal/index.ts +111 -0
  255. package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +330 -0
  256. package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +242 -0
  257. package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +202 -0
  258. package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +140 -0
  259. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +68 -0
  260. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +85 -0
  261. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +383 -0
  262. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +439 -0
  263. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +550 -0
  264. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +259 -0
  265. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +75 -0
  266. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +266 -0
  267. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +82 -0
  268. package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +112 -0
  269. package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +178 -0
  270. package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +203 -0
  271. package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +252 -0
  272. package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +334 -0
  273. package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +261 -0
  274. package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +248 -0
  275. package/src/react-ui/blocks/Terminal/panel/index.ts +72 -0
  276. package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +59 -0
  277. package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +59 -0
  278. package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +180 -0
  279. package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +248 -0
  280. package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +283 -0
  281. package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +686 -0
  282. package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +466 -0
  283. package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +343 -0
  284. package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +167 -0
  285. package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +348 -0
  286. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +251 -0
  287. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +390 -0
  288. package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +320 -0
  289. package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +20 -0
  290. package/src/react-ui/blocks/Terminal/parsing/index.ts +69 -0
  291. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +68 -0
  292. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +436 -0
  293. package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +14 -0
  294. package/src/react-ui/blocks/index.ts +11 -0
  295. package/src/react-ui/icons/lucide-animated/activity.tsx +2 -2
  296. package/src/react-ui/icons/lucide-animated/bell-electric.tsx +1 -1
  297. package/src/react-ui/icons/lucide-animated/bell.tsx +2 -2
  298. package/src/react-ui/icons/lucide-animated/bot.tsx +1 -1
  299. package/src/react-ui/icons/lucide-animated/box.tsx +2 -2
  300. package/src/react-ui/icons/lucide-animated/circle-check.tsx +2 -2
  301. package/src/react-ui/icons/lucide-animated/delete.tsx +2 -2
  302. package/src/react-ui/icons/lucide-animated/download.tsx +2 -2
  303. package/src/react-ui/icons/lucide-animated/home.tsx +2 -2
  304. package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +1 -1
  305. package/src/react-ui/icons/lucide-animated/plus.tsx +1 -1
  306. package/src/react-ui/icons/lucide-animated/search.tsx +1 -1
  307. package/src/react-ui/icons/lucide-animated/settings.tsx +1 -1
  308. package/src/react-ui/icons/lucide-animated/trending-down.tsx +2 -2
  309. package/src/react-ui/icons/lucide-animated/trending-up.tsx +2 -2
  310. package/src/react-ui/icons/lucide-animated/x.tsx +2 -2
  311. package/src/react-ui/lib/icon-wrapper.tsx +70 -0
  312. package/src/react-ui/lib/index.ts +1 -0
  313. package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +1 -0
  314. package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +1 -0
  315. package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +1 -0
  316. package/src/react-ui/primitives/waapi/Morph/useMorph.ts +1 -0
  317. package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +1 -0
  318. package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +1 -0
  319. package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +1 -0
  320. package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +1 -0
  321. package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +1 -0
  322. package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +1 -0
  323. package/src/react-ui/ui/Accordion/index.tsx +3 -3
  324. package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +1 -1
  325. package/src/react-ui/ui/InputGroup/index.tsx +2 -0
  326. package/src/react-ui/ui/Tabs/Tabs.css +39 -0
  327. package/src/react-ui/ui/Tabs/Tabs.styles.ts +119 -31
  328. package/src/react-ui/ui/Tabs/Tabs.types.ts +8 -3
  329. package/src/react-ui/ui/Tabs/index.tsx +135 -27
@@ -0,0 +1,466 @@
1
+ /**
2
+ * Multiline log aggregator for JSON and structured data.
3
+ *
4
+ * Detects and aggregates multiline log entries such as JSON objects,
5
+ * tables, and structured data that span multiple lines. Prevents
6
+ * timestamp/level repetition on continuation lines.
7
+ *
8
+ * @module components/devenv/terminal/parsing/multiline
9
+ */
10
+
11
+ import type { IParsedLogEntry, TLogLevel } from './LogParser.types';
12
+
13
+ /**
14
+ * Box-drawing characters used for table borders.
15
+ * Unicode range: U+2500-U+257F
16
+ */
17
+ const TABLE_CHARS = [
18
+ '─', '│', '┌', '┐', '└', '┘',
19
+ '├', '┤', '┬', '┴', '┼',
20
+ '═', '║', '╔', '╗', '╚', '╝',
21
+ '╠', '╣', '╦', '╩', '╬',
22
+ ];
23
+
24
+ /**
25
+ * Multiline aggregation state.
26
+ *
27
+ * Tracks buffer and context while aggregating multiline logs.
28
+ */
29
+ export interface IMultilineState {
30
+ /** Buffered lines for current multiline entry */
31
+ buffer: string[];
32
+
33
+ /** Parent entry for continuation lines (only line_number is used) */
34
+ parentEntry?: {
35
+ line_number: number;
36
+ level: TLogLevel;
37
+ };
38
+
39
+ /** Whether currently in multiline mode */
40
+ isMultiline: boolean;
41
+
42
+ /** Expected closing bracket/brace for current multiline */
43
+ expectedClose?: '}' | ']';
44
+
45
+ /** Current depth of nested braces/brackets */
46
+ depth: number;
47
+ }
48
+
49
+ /**
50
+ * Multiline log aggregator class.
51
+ *
52
+ * Detects and aggregates lines that are part of a multiline JSON
53
+ * or structured data entry. Marks continuation lines so they don't
54
+ * get timestamp/level prefixes.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * const aggregator = new MultilineAggregator();
59
+ * const aggregated = aggregator.aggregate(entries);
60
+ * // Lines like '{', ' filter: {},', '}' get marked as continuation
61
+ * ```
62
+ */
63
+ export class MultilineAggregator {
64
+ /**
65
+ * Detect if a line is a continuation of multiline JSON/structured data.
66
+ *
67
+ * Continuation indicators:
68
+ * - Line starts with `{` or `[` alone → opens multiline
69
+ * - Line has indentation + `key: value,` → continuation
70
+ * - Line is just `}` or `]` → closes multiline
71
+ * - Line ends with `{` or `[` without match → opens multiline
72
+ * - When in multiline mode: lines ending with comma or containing key-value patterns
73
+ *
74
+ * @param line - Line to check
75
+ * @param state - Current multiline state
76
+ * @returns true if line is a continuation
77
+ */
78
+ detectContinuation(line: string, state: IMultilineState): boolean {
79
+ const trimmed = line.trim();
80
+
81
+ // Already in multiline mode - more permissive detection
82
+ if (state.isMultiline) {
83
+ // Check if this closes the multiline
84
+ if (this.isClosingBrace(trimmed, state.expectedClose)) {
85
+ return true;
86
+ }
87
+ // Check if this opens another level
88
+ if (this.isOpeningBrace(trimmed)) {
89
+ return true;
90
+ }
91
+ // Check if this looks like a continuation (indented content)
92
+ if (this.isContinuationLine(line)) {
93
+ return true;
94
+ }
95
+ // NEW: When in multiline mode, lines ending with comma or containing JSON patterns
96
+ // are continuations even if they have their own timestamp/level metadata
97
+ if (this.isJsonContinuation(trimmed)) {
98
+ return true;
99
+ }
100
+ return false;
101
+ }
102
+
103
+ // Not in multiline mode - check if this opens one
104
+ return this.opensMultiline(trimmed);
105
+ }
106
+
107
+ /**
108
+ * Aggregate entries, marking continuation lines.
109
+ *
110
+ * Processes entries and marks lines that are continuations
111
+ * of a previous multiline entry. Handles:
112
+ * - JSON/structured data blocks
113
+ * - Table borders (box-drawing characters)
114
+ * - Indented continuation lines
115
+ *
116
+ * @param entries - Parsed log entries to aggregate
117
+ * @param initialState - Optional initial multiline state (for persistence across chunks)
118
+ * @returns Entries with continuation marking and new multiline state
119
+ */
120
+ aggregate(entries: IParsedLogEntry[], initialState?: IMultilineState): { entries: IParsedLogEntry[]; state: IMultilineState } {
121
+ const result: IParsedLogEntry[] = [];
122
+ const state: IMultilineState = initialState ?? {
123
+ buffer: [],
124
+ isMultiline: false,
125
+ depth: 0,
126
+ };
127
+
128
+ for (const entry of entries) {
129
+ const raw = entry.raw;
130
+ const trimmed = raw.trim();
131
+
132
+ // Skip empty lines (end previous blocks)
133
+ if (trimmed.length === 0) {
134
+ if (state.isMultiline) {
135
+ // End the current block
136
+ state.isMultiline = false;
137
+ state.buffer = [];
138
+ state.parentEntry = undefined;
139
+ state.depth = 0;
140
+ state.expectedClose = undefined;
141
+ }
142
+ // Don't add empty lines to result
143
+ continue;
144
+ }
145
+
146
+ // Check if this line starts a multiline block
147
+ if (!state.isMultiline && this.opensMultiline(trimmed)) {
148
+ // This is the start of multiline
149
+ state.isMultiline = true;
150
+ state.parentEntry = entry;
151
+ state.depth = this.countOpeningBraces(trimmed);
152
+ state.expectedClose = this.getExpectedClose(trimmed);
153
+
154
+ // Mark entry as multiline start (not a continuation)
155
+ entry.is_continuation = false;
156
+ result.push(entry);
157
+ continue;
158
+ }
159
+
160
+ // Check if this is a continuation line
161
+ if (state.isMultiline) {
162
+ // Check if this line closes the multiline
163
+ if (this.isClosingBrace(trimmed, state.expectedClose)) {
164
+ state.depth--;
165
+ if (state.depth <= 0) {
166
+ // This closes the multiline block
167
+ entry.is_continuation = true;
168
+ entry.parent_line_number = state.parentEntry?.line_number;
169
+ result.push(entry);
170
+
171
+ // Reset state
172
+ state.isMultiline = false;
173
+ state.buffer = [];
174
+ state.parentEntry = undefined;
175
+ state.depth = 0;
176
+ state.expectedClose = undefined;
177
+ continue;
178
+ }
179
+ }
180
+
181
+ // Check if this opens another level
182
+ if (this.isOpeningBrace(trimmed)) {
183
+ state.depth += this.countOpeningBraces(trimmed);
184
+ }
185
+
186
+ // Check if this looks like a continuation (even with timestamp)
187
+ if (this.isJsonContinuation(trimmed)) {
188
+ entry.is_continuation = true;
189
+ entry.parent_line_number = state.parentEntry?.line_number;
190
+ result.push(entry);
191
+ continue;
192
+ }
193
+
194
+ // If we're in multiline mode but this line doesn't look like a continuation,
195
+ // it might be a new log entry ending the multiline block
196
+ if (this.looksLikeNewEntry(trimmed)) {
197
+ // End the multiline block
198
+ state.isMultiline = false;
199
+ state.parentEntry = undefined;
200
+ state.depth = 0;
201
+ state.expectedClose = undefined;
202
+
203
+ // Check if this new line also starts a multiline
204
+ if (this.opensMultiline(trimmed)) {
205
+ state.isMultiline = true;
206
+ state.parentEntry = entry;
207
+ state.depth = this.countOpeningBraces(trimmed);
208
+ state.expectedClose = this.getExpectedClose(trimmed);
209
+ }
210
+
211
+ entry.is_continuation = false;
212
+ result.push(entry);
213
+ continue;
214
+ }
215
+
216
+ // Default: treat as continuation if in multiline mode
217
+ entry.is_continuation = true;
218
+ entry.parent_line_number = state.parentEntry?.line_number;
219
+ result.push(entry);
220
+ continue;
221
+ }
222
+
223
+ // Normal line, not part of multiline
224
+ entry.is_continuation = false;
225
+ result.push(entry);
226
+ }
227
+
228
+ return { entries: result, state };
229
+ }
230
+
231
+ /**
232
+ * Check if a line opens a multiline block.
233
+ *
234
+ * @param trimmed - Trimmed line to check
235
+ * @returns true if line opens multiline
236
+ * @private
237
+ */
238
+ private opensMultiline(trimmed: string): boolean {
239
+ // Line is just an opening brace
240
+ if (trimmed === '{' || trimmed === '[') {
241
+ return true;
242
+ }
243
+
244
+ // Line ends with opening brace without match
245
+ const openCount = (trimmed.match(/\{/g) ?? []).length;
246
+ const closeCount = (trimmed.match(/\}/g) ?? []).length;
247
+ const bracketOpen = (trimmed.match(/\[/g) ?? []).length;
248
+ const bracketClose = (trimmed.match(/\]/g) ?? []).length;
249
+
250
+ // More opening than closing = multiline start
251
+ if ((openCount > closeCount) || (bracketOpen > bracketClose)) {
252
+ return true;
253
+ }
254
+
255
+ // Line ends with opening brace (e.g., "GET /api/endpoint {")
256
+ if (trimmed.endsWith('{') || trimmed.endsWith('[')) {
257
+ return true;
258
+ }
259
+
260
+ return false;
261
+ }
262
+
263
+ /**
264
+ * Check if a line is an opening brace/bracket.
265
+ *
266
+ * @param trimmed - Trimmed line to check
267
+ * @returns true if line contains opening brace/bracket
268
+ * @private
269
+ */
270
+ private isOpeningBrace(trimmed: string): boolean {
271
+ return trimmed.includes('{') || trimmed.includes('[');
272
+ }
273
+
274
+ /**
275
+ * Check if a line is a closing brace/bracket for expected type.
276
+ *
277
+ * @param trimmed - Trimmed line to check
278
+ * @param expected - Expected close type
279
+ * @returns true if line closes the multiline block
280
+ * @private
281
+ */
282
+ private isClosingBrace(trimmed: string, expected?: '}' | ']'): boolean {
283
+ if (!expected) return false;
284
+
285
+ if (expected === '}' && trimmed === '}') {
286
+ return true;
287
+ }
288
+ if (expected === ']' && trimmed === ']') {
289
+ return true;
290
+ }
291
+
292
+ return false;
293
+ }
294
+
295
+ /**
296
+ * Get the expected closing character for a line.
297
+ *
298
+ * @param trimmed - Trimmed line to check
299
+ * @returns Expected closing character or undefined
300
+ * @private
301
+ */
302
+ private getExpectedClose(trimmed: string): '}' | ']' | undefined {
303
+ if (trimmed.includes('{')) return '}';
304
+ if (trimmed.includes('[')) return ']';
305
+ return undefined;
306
+ }
307
+
308
+ /**
309
+ * Count opening braces/brackets in a line.
310
+ *
311
+ * @param trimmed - Trimmed line to check
312
+ * @returns Count of opening braces/brackets
313
+ * @private
314
+ */
315
+ private countOpeningBraces(trimmed: string): number {
316
+ const openCount = (trimmed.match(/\{/g) ?? []).length;
317
+ const bracketOpen = (trimmed.match(/\[/g) ?? []).length;
318
+ return openCount + bracketOpen;
319
+ }
320
+
321
+ /**
322
+ * Check if a line is a table line (contains box-drawing characters).
323
+ *
324
+ * @param trimmed - Trimmed line to check
325
+ * @returns true if line contains table borders
326
+ * @private
327
+ */
328
+ private isTableLine(trimmed: string): boolean {
329
+ // Check if line contains multiple box-drawing characters
330
+ // (to avoid false positives on single characters)
331
+ let count = 0;
332
+ for (const char of TABLE_CHARS) {
333
+ if (trimmed.includes(char)) count++;
334
+ if (count >= 2) return true;
335
+ }
336
+ return count >= 2;
337
+ }
338
+
339
+ /**
340
+ * Check if a line looks like a new log entry (not a continuation).
341
+ *
342
+ * New entries typically start with:
343
+ * - Timestamp followed by log level
344
+ * - HTTP method followed by path
345
+ * - Component/module tag
346
+ *
347
+ * @param trimmed - Trimmed line to check
348
+ * @returns true if line looks like a new entry
349
+ * @private
350
+ */
351
+ private looksLikeNewEntry(trimmed: string): boolean {
352
+ // Pattern: timestamp followed by level (e.g., "01:18:52 INFO")
353
+ const timestampLevelPattern = /^\d{1,2}:\d{2}:\d{2}(\.\d+)?\s+(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)/i;
354
+ if (timestampLevelPattern.test(trimmed)) {
355
+ return true;
356
+ }
357
+
358
+ // Pattern: ISO timestamp followed by level
359
+ const isoTimestampPattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
360
+ if (isoTimestampPattern.test(trimmed)) {
361
+ return true;
362
+ }
363
+
364
+ // Pattern: HTTP method at start (e.g., "GET /api/...")
365
+ const httpPattern = /^(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|CONNECT|TRACE)\s+/i;
366
+ if (httpPattern.test(trimmed)) {
367
+ return true;
368
+ }
369
+
370
+ // Pattern: Component tag at start (e.g., "⦗API⦘")
371
+ if (trimmed.startsWith('⦗') && trimmed.includes('⦘')) {
372
+ return true;
373
+ }
374
+
375
+ return false;
376
+ }
377
+
378
+ /**
379
+ * Check if a trimmed line is a JSON/structured data continuation.
380
+ *
381
+ * This handles lines that have their own timestamp/level metadata
382
+ * but are actually continuations of a multiline JSON block.
383
+ *
384
+ * Examples:
385
+ * - `container: "name",` - ends with comma
386
+ * - `tail: 100,` - ends with comma
387
+ * - `key: "value"` - key-value pattern
388
+ * - `}` - closing brace
389
+ * - Lines with pipe characters (table rows)
390
+ *
391
+ * @param trimmed - Trimmed line to check
392
+ * @returns true if line is a JSON continuation
393
+ * @private
394
+ */
395
+ private isJsonContinuation(trimmed: string): boolean {
396
+ // Line is just a closing brace - closes the multiline
397
+ if (trimmed === '}' || trimmed === ']') {
398
+ return true;
399
+ }
400
+
401
+ // Line ends with comma - likely JSON continuation
402
+ if (trimmed.endsWith(',')) {
403
+ return true;
404
+ }
405
+
406
+ // Line ends with opening brace - extends multiline
407
+ if (trimmed.endsWith('{') || trimmed.endsWith('[')) {
408
+ return true;
409
+ }
410
+
411
+ // Line contains pipe characters (table row with content)
412
+ // Pattern: │ key │ value │
413
+ if (trimmed.includes('│') && !this.isTableLine(trimmed)) {
414
+ // Has pipe but not enough box-drawing chars to be a border line
415
+ // This is likely a table content row
416
+ return true;
417
+ }
418
+
419
+ // Check for key-value pattern after timestamp/level removal
420
+ // Remove common prefixes: "01:18:52 INFO " or "[INFO] "
421
+ let content = trimmed
422
+ .replace(/^\d{1,2}:\d{2}:\d{2}(\.\d+)?\s+(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\s*/i, '')
423
+ .replace(/^\[(TRACE|DEBUG|INFO|WARN|ERROR|FATAL)\]\s*/i, '')
424
+ .replace(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.*?\s+/, '')
425
+ .trim();
426
+
427
+ // Pattern: "key": value or key: value or "key": "value"
428
+ const keyValuePatterns = [
429
+ /^[\w"']+\s*:\s*[\w"'\{[]/, // "key": { or key: [
430
+ /^[\w"']+\s*:\s*".*",?\s*$/, // "key": "value",
431
+ /^[\w"']+\s*:\s*\d+/, // key: 123
432
+ /^[\w"']+\s*:\s*true|false/, // key: true
433
+ ];
434
+
435
+ if (keyValuePatterns.some(pattern => pattern.test(content))) {
436
+ return true;
437
+ }
438
+
439
+ return false;
440
+ }
441
+
442
+ /**
443
+ * Check if a line looks like a continuation line (indented content).
444
+ *
445
+ * @param line - Line to check (not trimmed, to check indentation)
446
+ * @returns true if line appears to be a continuation
447
+ * @private
448
+ */
449
+ private isContinuationLine(line: string): boolean {
450
+ // Check if line starts with whitespace (indented)
451
+ return line.length > 0 && (line[0] === ' ' || line[0] === '\t');
452
+ }
453
+
454
+ /**
455
+ * Create initial multiline state.
456
+ *
457
+ * @returns Fresh multiline state
458
+ */
459
+ createInitialState(): IMultilineState {
460
+ return {
461
+ buffer: [],
462
+ isMultiline: false,
463
+ depth: 0,
464
+ };
465
+ }
466
+ }