@mks2508/mks-ui 0.5.7 → 0.6.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 (271) hide show
  1. package/dist/react-ui/index.js +2 -2
  2. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts +2 -0
  3. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts.map +1 -1
  4. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts +1 -1
  5. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts.map +1 -1
  6. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.js +173 -43
  7. package/dist/react-ui/ui/Dialog/Dialog.styles.d.ts.map +1 -1
  8. package/dist/react-ui/ui/Dialog/Dialog.styles.js +1 -0
  9. package/dist/react-ui/ui/Dialog/Dialog.types.d.ts +20 -1
  10. package/dist/react-ui/ui/Dialog/Dialog.types.d.ts.map +1 -1
  11. package/dist/react-ui/ui/Dialog/index.d.ts +28 -7
  12. package/dist/react-ui/ui/Dialog/index.d.ts.map +1 -1
  13. package/dist/react-ui/ui/Dialog/index.js +32 -5
  14. package/dist/react-ui/ui/DynamicToggle/{DynamicToggle-DOR3Ld-k.css → DynamicToggle-DJLwEkHr.css} +12 -19
  15. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.css +12 -20
  16. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts +1 -0
  17. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts.map +1 -1
  18. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.js +7 -1
  19. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts +55 -31
  20. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts.map +1 -1
  21. package/dist/react-ui/ui/DynamicToggle/index.d.ts +9 -3
  22. package/dist/react-ui/ui/DynamicToggle/index.d.ts.map +1 -1
  23. package/dist/react-ui/ui/DynamicToggle/index.js +47 -34
  24. package/dist/react-ui/ui/index.js +1 -1
  25. package/package.json +52 -13
  26. package/src/assets/react.svg +0 -1
  27. package/src/core/index.ts +0 -7
  28. package/src/core/types.ts +0 -82
  29. package/src/css.d.ts +0 -7
  30. package/src/index.css +0 -129
  31. package/src/index.ts +0 -29
  32. package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +0 -278
  33. package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +0 -97
  34. package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +0 -155
  35. package/src/react-ui/blocks/Terminal/Terminal.theme.ts +0 -80
  36. package/src/react-ui/blocks/Terminal/Terminal.types.ts +0 -438
  37. package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +0 -38
  38. package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +0 -254
  39. package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +0 -73
  40. package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +0 -269
  41. package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +0 -326
  42. package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +0 -230
  43. package/src/react-ui/blocks/Terminal/XTermAdapter.ts +0 -163
  44. package/src/react-ui/blocks/Terminal/chrome.ts +0 -25
  45. package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +0 -316
  46. package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +0 -218
  47. package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +0 -386
  48. package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +0 -67
  49. package/src/react-ui/blocks/Terminal/components/index.ts +0 -10
  50. package/src/react-ui/blocks/Terminal/display.ts +0 -46
  51. package/src/react-ui/blocks/Terminal/hooks/index.ts +0 -22
  52. package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +0 -229
  53. package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +0 -292
  54. package/src/react-ui/blocks/Terminal/index.ts +0 -111
  55. package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +0 -330
  56. package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +0 -242
  57. package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +0 -202
  58. package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +0 -140
  59. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +0 -68
  60. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +0 -85
  61. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +0 -383
  62. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +0 -439
  63. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +0 -550
  64. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +0 -259
  65. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +0 -75
  66. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +0 -266
  67. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +0 -82
  68. package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +0 -112
  69. package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +0 -178
  70. package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +0 -203
  71. package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +0 -252
  72. package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +0 -334
  73. package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +0 -261
  74. package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +0 -248
  75. package/src/react-ui/blocks/Terminal/panel/index.ts +0 -72
  76. package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +0 -59
  77. package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +0 -59
  78. package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +0 -180
  79. package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +0 -248
  80. package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +0 -283
  81. package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +0 -686
  82. package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +0 -466
  83. package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +0 -343
  84. package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +0 -167
  85. package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +0 -348
  86. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +0 -251
  87. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +0 -390
  88. package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +0 -320
  89. package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +0 -20
  90. package/src/react-ui/blocks/Terminal/parsing/index.ts +0 -69
  91. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +0 -68
  92. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +0 -436
  93. package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +0 -14
  94. package/src/react-ui/blocks/index.ts +0 -11
  95. package/src/react-ui/components/MorphingPopover/MorphingPopover.types.ts +0 -49
  96. package/src/react-ui/components/MorphingPopover/index.tsx +0 -186
  97. package/src/react-ui/components/MorphingPopover/morphing-popover.module.css +0 -153
  98. package/src/react-ui/components/index.ts +0 -9
  99. package/src/react-ui/hooks/Animation/UseAutoHeight.tsx +0 -123
  100. package/src/react-ui/hooks/DOM/UseIsInView.tsx +0 -44
  101. package/src/react-ui/hooks/Formatting/UseListFormat.ts +0 -134
  102. package/src/react-ui/hooks/State/UseControlledState.tsx +0 -57
  103. package/src/react-ui/hooks/State/UseDataState.tsx +0 -76
  104. package/src/react-ui/hooks/index.ts +0 -20
  105. package/src/react-ui/icons/index.ts +0 -12
  106. package/src/react-ui/icons/lucide-animated/activity.tsx +0 -109
  107. package/src/react-ui/icons/lucide-animated/arrow-down-to-line.tsx +0 -51
  108. package/src/react-ui/icons/lucide-animated/arrow-up.tsx +0 -50
  109. package/src/react-ui/icons/lucide-animated/bell-electric.tsx +0 -124
  110. package/src/react-ui/icons/lucide-animated/bell.tsx +0 -93
  111. package/src/react-ui/icons/lucide-animated/bot.tsx +0 -122
  112. package/src/react-ui/icons/lucide-animated/box.tsx +0 -117
  113. package/src/react-ui/icons/lucide-animated/check.tsx +0 -21
  114. package/src/react-ui/icons/lucide-animated/circle-check.tsx +0 -107
  115. package/src/react-ui/icons/lucide-animated/delete.tsx +0 -133
  116. package/src/react-ui/icons/lucide-animated/download.tsx +0 -99
  117. package/src/react-ui/icons/lucide-animated/edit-2.tsx +0 -21
  118. package/src/react-ui/icons/lucide-animated/globe.tsx +0 -23
  119. package/src/react-ui/icons/lucide-animated/home.tsx +0 -103
  120. package/src/react-ui/icons/lucide-animated/index.ts +0 -38
  121. package/src/react-ui/icons/lucide-animated/layers.tsx +0 -23
  122. package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +0 -143
  123. package/src/react-ui/icons/lucide-animated/list.tsx +0 -54
  124. package/src/react-ui/icons/lucide-animated/package.tsx +0 -24
  125. package/src/react-ui/icons/lucide-animated/palette.tsx +0 -25
  126. package/src/react-ui/icons/lucide-animated/plus.tsx +0 -92
  127. package/src/react-ui/icons/lucide-animated/refresh-cw.tsx +0 -24
  128. package/src/react-ui/icons/lucide-animated/rocket.tsx +0 -24
  129. package/src/react-ui/icons/lucide-animated/save.tsx +0 -23
  130. package/src/react-ui/icons/lucide-animated/search.tsx +0 -94
  131. package/src/react-ui/icons/lucide-animated/settings.tsx +0 -92
  132. package/src/react-ui/icons/lucide-animated/terminal.tsx +0 -46
  133. package/src/react-ui/icons/lucide-animated/trash-2.tsx +0 -25
  134. package/src/react-ui/icons/lucide-animated/trending-down.tsx +0 -151
  135. package/src/react-ui/icons/lucide-animated/trending-up.tsx +0 -150
  136. package/src/react-ui/icons/lucide-animated/type.tsx +0 -23
  137. package/src/react-ui/icons/lucide-animated/upload.tsx +0 -23
  138. package/src/react-ui/icons/lucide-animated/x.tsx +0 -102
  139. package/src/react-ui/index.ts +0 -30
  140. package/src/react-ui/lib/get-strict-context.tsx +0 -56
  141. package/src/react-ui/lib/icon-wrapper.tsx +0 -70
  142. package/src/react-ui/lib/index.ts +0 -9
  143. package/src/react-ui/lib/utils.ts +0 -24
  144. package/src/react-ui/primitives/AutoHeight/index.tsx +0 -74
  145. package/src/react-ui/primitives/CountingNumber/index.tsx +0 -147
  146. package/src/react-ui/primitives/Highlight/Highlight.types.ts +0 -136
  147. package/src/react-ui/primitives/Highlight/index.tsx +0 -577
  148. package/src/react-ui/primitives/Slot/index.tsx +0 -128
  149. package/src/react-ui/primitives/index.ts +0 -16
  150. package/src/react-ui/primitives/waapi/Gooey/Gooey.types.ts +0 -141
  151. package/src/react-ui/primitives/waapi/Gooey/GooeyCanvas.tsx +0 -217
  152. package/src/react-ui/primitives/waapi/Gooey/GooeyFilter.tsx +0 -77
  153. package/src/react-ui/primitives/waapi/Gooey/MorphPath.tsx +0 -58
  154. package/src/react-ui/primitives/waapi/Gooey/gooey-utils.ts +0 -253
  155. package/src/react-ui/primitives/waapi/Gooey/index.ts +0 -50
  156. package/src/react-ui/primitives/waapi/Gooey/useMorphPath.ts +0 -48
  157. package/src/react-ui/primitives/waapi/Morph/Morph.types.ts +0 -106
  158. package/src/react-ui/primitives/waapi/Morph/MorphContext.tsx +0 -21
  159. package/src/react-ui/primitives/waapi/Morph/index.tsx +0 -56
  160. package/src/react-ui/primitives/waapi/Morph/techniques/index.ts +0 -12
  161. package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +0 -89
  162. package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +0 -176
  163. package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +0 -87
  164. package/src/react-ui/primitives/waapi/Morph/useMorph.ts +0 -101
  165. package/src/react-ui/primitives/waapi/Reorder/Reorder.types.ts +0 -177
  166. package/src/react-ui/primitives/waapi/Reorder/index.tsx +0 -260
  167. package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +0 -47
  168. package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +0 -209
  169. package/src/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.ts +0 -104
  170. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.ts +0 -14
  171. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.ts +0 -84
  172. package/src/react-ui/primitives/waapi/SlidingNumber/index.tsx +0 -474
  173. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.styles.ts +0 -32
  174. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.types.ts +0 -69
  175. package/src/react-ui/primitives/waapi/SlidingText/index.tsx +0 -140
  176. package/src/react-ui/primitives/waapi/core/animationConstants.ts +0 -215
  177. package/src/react-ui/primitives/waapi/core/index.ts +0 -53
  178. package/src/react-ui/primitives/waapi/core/types.ts +0 -200
  179. package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +0 -430
  180. package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +0 -81
  181. package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +0 -138
  182. package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +0 -106
  183. package/src/react-ui/primitives/waapi/index.ts +0 -139
  184. package/src/react-ui/styles/animations.css +0 -369
  185. package/src/react-ui/ui/Accordion/Accordion.styles.ts +0 -72
  186. package/src/react-ui/ui/Accordion/Accordion.types.ts +0 -199
  187. package/src/react-ui/ui/Accordion/index.tsx +0 -362
  188. package/src/react-ui/ui/AlertDialog/AlertDialog.styles.ts +0 -38
  189. package/src/react-ui/ui/AlertDialog/AlertDialog.types.ts +0 -296
  190. package/src/react-ui/ui/AlertDialog/index.tsx +0 -540
  191. package/src/react-ui/ui/Badge/Badge.styles.ts +0 -43
  192. package/src/react-ui/ui/Badge/Badge.types.ts +0 -26
  193. package/src/react-ui/ui/Badge/index.tsx +0 -34
  194. package/src/react-ui/ui/Button/Button.styles.ts +0 -57
  195. package/src/react-ui/ui/Button/Button.types.ts +0 -63
  196. package/src/react-ui/ui/Button/index.tsx +0 -155
  197. package/src/react-ui/ui/Card/Card.styles.ts +0 -32
  198. package/src/react-ui/ui/Card/Card.types.ts +0 -39
  199. package/src/react-ui/ui/Card/index.tsx +0 -130
  200. package/src/react-ui/ui/Checkbox/Checkbox.styles.ts +0 -40
  201. package/src/react-ui/ui/Checkbox/Checkbox.types.ts +0 -98
  202. package/src/react-ui/ui/Checkbox/index.tsx +0 -233
  203. package/src/react-ui/ui/Combobox/Combobox.styles.ts +0 -34
  204. package/src/react-ui/ui/Combobox/Combobox.types.ts +0 -89
  205. package/src/react-ui/ui/Combobox/index.tsx +0 -331
  206. package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +0 -38
  207. package/src/react-ui/ui/CornerBracket/CornerBracket.types.ts +0 -15
  208. package/src/react-ui/ui/CornerBracket/index.tsx +0 -49
  209. package/src/react-ui/ui/DataCard/DataCard.styles.ts +0 -94
  210. package/src/react-ui/ui/DataCard/DataCard.types.ts +0 -125
  211. package/src/react-ui/ui/DataCard/index.tsx +0 -340
  212. package/src/react-ui/ui/Dialog/Dialog.styles.ts +0 -59
  213. package/src/react-ui/ui/Dialog/Dialog.types.ts +0 -284
  214. package/src/react-ui/ui/Dialog/index.tsx +0 -452
  215. package/src/react-ui/ui/DropdownMenu/DropdownMenu.styles.ts +0 -35
  216. package/src/react-ui/ui/DropdownMenu/DropdownMenu.types.ts +0 -81
  217. package/src/react-ui/ui/DropdownMenu/index.tsx +0 -300
  218. package/src/react-ui/ui/DynamicToggle/DynamicToggle.css +0 -376
  219. package/src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts +0 -85
  220. package/src/react-ui/ui/DynamicToggle/DynamicToggle.types.ts +0 -180
  221. package/src/react-ui/ui/DynamicToggle/index.tsx +0 -316
  222. package/src/react-ui/ui/DynamicToggle/prototype-v7-ios.html +0 -413
  223. package/src/react-ui/ui/DynamicToggle/prototype-v7.html +0 -615
  224. package/src/react-ui/ui/DynamicToggle/prototype-v8-gooey-safari.html +0 -560
  225. package/src/react-ui/ui/DynamicToggle/prototype-v8b-react-structure.html +0 -227
  226. package/src/react-ui/ui/DynamicToggle/prototype.html +0 -419
  227. package/src/react-ui/ui/Field/Field.styles.ts +0 -47
  228. package/src/react-ui/ui/Field/Field.types.ts +0 -60
  229. package/src/react-ui/ui/Field/index.tsx +0 -254
  230. package/src/react-ui/ui/Input/Input.styles.ts +0 -11
  231. package/src/react-ui/ui/Input/Input.types.ts +0 -10
  232. package/src/react-ui/ui/Input/index.tsx +0 -32
  233. package/src/react-ui/ui/InputGroup/InputGroup.styles.ts +0 -53
  234. package/src/react-ui/ui/InputGroup/InputGroup.types.ts +0 -44
  235. package/src/react-ui/ui/InputGroup/index.tsx +0 -149
  236. package/src/react-ui/ui/Label/Label.styles.ts +0 -10
  237. package/src/react-ui/ui/Label/Label.types.ts +0 -9
  238. package/src/react-ui/ui/Label/index.tsx +0 -27
  239. package/src/react-ui/ui/Menu/Menu.styles.ts +0 -71
  240. package/src/react-ui/ui/Menu/Menu.types.ts +0 -425
  241. package/src/react-ui/ui/Menu/index.tsx +0 -900
  242. package/src/react-ui/ui/Popover/Popover.styles.ts +0 -55
  243. package/src/react-ui/ui/Popover/Popover.types.ts +0 -261
  244. package/src/react-ui/ui/Popover/index.tsx +0 -422
  245. package/src/react-ui/ui/Progress/Progress.styles.ts +0 -36
  246. package/src/react-ui/ui/Progress/Progress.types.ts +0 -162
  247. package/src/react-ui/ui/Progress/index.tsx +0 -254
  248. package/src/react-ui/ui/Select/Select.styles.ts +0 -30
  249. package/src/react-ui/ui/Select/Select.types.ts +0 -51
  250. package/src/react-ui/ui/Select/index.tsx +0 -225
  251. package/src/react-ui/ui/Separator/Separator.styles.ts +0 -10
  252. package/src/react-ui/ui/Separator/Separator.types.ts +0 -10
  253. package/src/react-ui/ui/Separator/index.tsx +0 -37
  254. package/src/react-ui/ui/Switch/Switch.styles.ts +0 -50
  255. package/src/react-ui/ui/Switch/Switch.types.ts +0 -155
  256. package/src/react-ui/ui/Switch/index.tsx +0 -253
  257. package/src/react-ui/ui/Tabs/Tabs.css +0 -39
  258. package/src/react-ui/ui/Tabs/Tabs.styles.ts +0 -148
  259. package/src/react-ui/ui/Tabs/Tabs.types.ts +0 -255
  260. package/src/react-ui/ui/Tabs/index.tsx +0 -529
  261. package/src/react-ui/ui/TextFlow/TextFlow.styles.ts +0 -36
  262. package/src/react-ui/ui/TextFlow/TextFlow.types.ts +0 -118
  263. package/src/react-ui/ui/TextFlow/index.tsx +0 -276
  264. package/src/react-ui/ui/Textarea/Textarea.styles.ts +0 -10
  265. package/src/react-ui/ui/Textarea/Textarea.types.ts +0 -9
  266. package/src/react-ui/ui/Textarea/index.tsx +0 -27
  267. package/src/react-ui/ui/Tooltip/Tooltip.styles.ts +0 -43
  268. package/src/react-ui/ui/Tooltip/Tooltip.types.ts +0 -253
  269. package/src/react-ui/ui/Tooltip/index.tsx +0 -394
  270. package/src/react-ui/ui/index.ts +0 -41
  271. package/src/types/css-modules.d.ts +0 -18
@@ -1,254 +0,0 @@
1
- /**
2
- * TerminalDisplay — Readonly GPU-rendered terminal for ANSI content.
3
- *
4
- * Uses restty directly (not xterm) for GPU-accelerated rendering of
5
- * ANSI-formatted text without PTY connection. Content is written via
6
- * `restty.sendInput(data, "pty")` which feeds text to the WASM terminal
7
- * engine for parsing and rendering.
8
- *
9
- * Optionally wrapped in TerminalPanelChrome glassmorphism shell.
10
- *
11
- * @module components/devenv/terminal/TerminalDisplay
12
- */
13
-
14
- 'use client';
15
-
16
- import {
17
- useRef,
18
- useEffect,
19
- useCallback,
20
- forwardRef,
21
- useImperativeHandle,
22
- useState,
23
- } from 'react';
24
- import type { Restty } from 'restty';
25
- import type { ITerminalDisplayProps, ITerminalDisplayRef } from './TerminalDisplay.types';
26
- import { terminalDisplayStyles, terminalDisplayVariants } from './TerminalDisplay.styles';
27
- import { TerminalPanelChrome } from './panel/TerminalPanelChrome';
28
- import { getSynthwaveGhosttyTheme, xtermThemeToGhostty } from './Terminal.theme.restty';
29
- import { cn } from '@/react-ui/lib/utils';
30
-
31
- /**
32
- * TerminalDisplay — Readonly restty terminal for displaying ANSI content.
33
- *
34
- * @example
35
- * ```tsx
36
- * <TerminalDisplay
37
- * content={"\x1b[31mError:\x1b[0m Something failed"}
38
- * title="Error Output"
39
- * variant="error"
40
- * fontSize={12}
41
- * />
42
- * ```
43
- *
44
- * @example
45
- * ```tsx
46
- * // Without chrome shell
47
- * <TerminalDisplay
48
- * content={ansiOutput}
49
- * chrome={false}
50
- * minHeight={100}
51
- * />
52
- * ```
53
- *
54
- * @example
55
- * ```tsx
56
- * // With imperative handle
57
- * const ref = useRef<ITerminalDisplayRef>(null);
58
- * ref.current?.write("Additional output\r\n");
59
- * ref.current?.clear();
60
- * ```
61
- */
62
- export const TerminalDisplay = forwardRef<ITerminalDisplayRef, ITerminalDisplayProps>(
63
- (
64
- {
65
- content,
66
- title = 'Output',
67
- variant = 'default',
68
- chrome = true,
69
- fontSize = 13,
70
- minHeight = 200,
71
- theme,
72
- resttyThemeName,
73
- gpuRenderer = 'auto',
74
- slots,
75
- className,
76
- emptyText,
77
- onReady,
78
- },
79
- ref,
80
- ) => {
81
- const containerRef = useRef<HTMLDivElement>(null);
82
- const resttyRef = useRef<Restty | null>(null);
83
- const [isReady, setIsReady] = useState(false);
84
-
85
- // Store callbacks in refs
86
- const callbacksRef = useRef({ onReady });
87
- callbacksRef.current = { onReady };
88
-
89
- // Store content in ref to avoid re-creating restty on content change
90
- const contentRef = useRef(content);
91
- contentRef.current = content;
92
-
93
- /**
94
- * Initialize restty on mount.
95
- * Dynamic import for SSR safety and code-splitting.
96
- */
97
- useEffect(() => {
98
- if (!containerRef.current) return;
99
- let destroyed = false;
100
-
101
- const init = async () => {
102
- const { Restty: ResttyClass, getBuiltinTheme } = await import('restty');
103
- if (destroyed || !containerRef.current) return;
104
-
105
- const restty = new ResttyClass({
106
- root: containerRef.current,
107
- appOptions: {
108
- renderer: gpuRenderer,
109
- fontSize,
110
- autoResize: true,
111
- },
112
- fontSources: [
113
- {
114
- type: 'local',
115
- matchers: [
116
- 'jetbrains mono',
117
- 'fira code',
118
- 'sf mono',
119
- 'cascadia code',
120
- 'meslo',
121
- ],
122
- },
123
- ],
124
- createInitialPane: true,
125
- shortcuts: false,
126
- defaultContextMenu: false,
127
- });
128
-
129
- resttyRef.current = restty;
130
-
131
- // Apply theme
132
- if (resttyThemeName) {
133
- const builtinTheme = getBuiltinTheme(resttyThemeName);
134
- if (builtinTheme) restty.applyTheme(builtinTheme);
135
- } else if (theme) {
136
- restty.applyTheme(xtermThemeToGhostty(theme));
137
- } else {
138
- restty.applyTheme(getSynthwaveGhosttyTheme());
139
- }
140
-
141
- // Wait for WASM to be ready before writing content.
142
- // Restty loads WASM async internally — panes() returns empty until ready.
143
- const waitForWasm = () => {
144
- if (destroyed) return;
145
- const panes = restty.panes();
146
- if (panes && panes.length > 0) {
147
- // WASM loaded, pane created — safe to write
148
- if (contentRef.current) {
149
- restty.sendInput(contentRef.current, 'pty');
150
- }
151
- setIsReady(true);
152
- callbacksRef.current.onReady?.(restty);
153
- } else {
154
- // Not ready yet, retry
155
- requestAnimationFrame(waitForWasm);
156
- }
157
- };
158
- requestAnimationFrame(waitForWasm);
159
- };
160
-
161
- init().catch(() => {
162
- // Silently fail — container will show empty
163
- });
164
-
165
- return () => {
166
- destroyed = true;
167
- resttyRef.current?.destroy();
168
- resttyRef.current = null;
169
- setIsReady(false);
170
- };
171
- }, []); // Mount once
172
-
173
- /**
174
- * Re-write content when it changes after initialization.
175
- */
176
- useEffect(() => {
177
- if (!isReady || !resttyRef.current) return;
178
- resttyRef.current.clearScreen();
179
- if (content) {
180
- resttyRef.current.sendInput(content, 'pty');
181
- }
182
- }, [content, isReady]);
183
-
184
- /**
185
- * Handle fontSize changes after initialization.
186
- */
187
- useEffect(() => {
188
- if (!isReady || !resttyRef.current) return;
189
- resttyRef.current.setFontSize(fontSize);
190
- }, [fontSize, isReady]);
191
-
192
- /**
193
- * Expose imperative handle.
194
- */
195
- useImperativeHandle(ref, () => ({
196
- getRestty: () => resttyRef.current,
197
- clear: () => resttyRef.current?.clearScreen(),
198
- write: (data: string) => resttyRef.current?.sendInput(data, 'pty'),
199
- }));
200
-
201
- /** Map variant to chrome variant */
202
- const chromeVariant = variant === 'error' ? 'error' : 'default';
203
- const chromeSize = variant === 'compact' ? 'compact' : 'default';
204
-
205
- /** The terminal content area */
206
- const terminalElement = (
207
- <div
208
- className={cn(
209
- terminalDisplayVariants({ variant }),
210
- slots?.root,
211
- className,
212
- )}
213
- style={{ minHeight: `${minHeight}px` }}
214
- >
215
- {/* Empty state */}
216
- {!content && emptyText && (
217
- <div
218
- className={cn(terminalDisplayStyles.emptyState, slots?.emptyState)}
219
- style={{ minHeight: `${minHeight}px` }}
220
- >
221
- {emptyText}
222
- </div>
223
- )}
224
-
225
- {/* Restty container */}
226
- <div
227
- ref={containerRef}
228
- className={cn(terminalDisplayStyles.terminal, slots?.terminal)}
229
- style={{
230
- minHeight: `${minHeight}px`,
231
- display: !content && emptyText ? 'none' : undefined,
232
- }}
233
- />
234
- </div>
235
- );
236
-
237
- if (!chrome) return terminalElement;
238
-
239
- return (
240
- <TerminalPanelChrome
241
- containerName={title}
242
- isConnected={isReady}
243
- variant={chromeVariant}
244
- size={chromeSize}
245
- slots={{ root: slots?.chrome }}
246
- className={className}
247
- >
248
- {terminalElement}
249
- </TerminalPanelChrome>
250
- );
251
- },
252
- );
253
-
254
- TerminalDisplay.displayName = 'TerminalDisplay';
@@ -1,73 +0,0 @@
1
- /**
2
- * TerminalDisplay component types.
3
- *
4
- * Readonly GPU-rendered terminal for displaying ANSI-formatted text
5
- * without PTY connection, using restty.
6
- *
7
- * @module components/devenv/terminal/TerminalDisplay.types
8
- */
9
-
10
- import type { SlotOverrides } from '@/core/types';
11
- import type { Restty } from 'restty';
12
- import type { ITerminalTheme } from './Terminal.types';
13
-
14
- /** Slot names for TerminalDisplay sub-regions */
15
- export type TerminalDisplaySlot = 'root' | 'chrome' | 'terminal' | 'emptyState';
16
-
17
- /**
18
- * Props for TerminalDisplay component.
19
- */
20
- export interface ITerminalDisplayProps {
21
- /** ANSI-formatted string content to display */
22
- content: string;
23
-
24
- /** Title shown in the chrome header */
25
- title?: string;
26
-
27
- /** Visual variant — 'error' uses red accent line */
28
- variant?: 'default' | 'compact' | 'error';
29
-
30
- /** Whether to show the glassmorphism chrome shell (default: true) */
31
- chrome?: boolean;
32
-
33
- /** Font size in CSS pixels (default: 13) */
34
- fontSize?: number;
35
-
36
- /** Minimum height in CSS pixels (default: 200) */
37
- minHeight?: number;
38
-
39
- /** Terminal theme in xterm.js format (auto-converted to Ghostty) */
40
- theme?: ITerminalTheme;
41
-
42
- /** Restty built-in theme name from the 458-theme catalog */
43
- resttyThemeName?: string;
44
-
45
- /** GPU renderer preference (default: 'auto') */
46
- gpuRenderer?: 'auto' | 'webgpu' | 'webgl2';
47
-
48
- /** Slot class overrides for each visual region */
49
- slots?: SlotOverrides<TerminalDisplaySlot>;
50
-
51
- /** Custom class name on root element */
52
- className?: string;
53
-
54
- /** Placeholder text when content is empty */
55
- emptyText?: string;
56
-
57
- /** Callback when restty instance is ready */
58
- onReady?: (restty: Restty) => void;
59
- }
60
-
61
- /**
62
- * Imperative handle for TerminalDisplay.
63
- */
64
- export interface ITerminalDisplayRef {
65
- /** Get the underlying Restty instance */
66
- getRestty: () => Restty | null;
67
-
68
- /** Clear the terminal display */
69
- clear: () => void;
70
-
71
- /** Write additional ANSI content (appends) */
72
- write: (data: string) => void;
73
- }
@@ -1,269 +0,0 @@
1
- /**
2
- * Terminal Panel Component.
3
- *
4
- * Main UI component with toolbar, terminal display, and status indicator.
5
- * Configurable backend adapter (xterm.js, WebContainer, Monaco) with
6
- * Synthwave Industrial Dark theme matching the design system.
7
- *
8
- * @module components/devenv/terminal
9
- */
10
-
11
- 'use client';
12
-
13
- import { useState, useCallback, useRef, useEffect } from 'react';
14
- import { XTermWrapper } from './TerminalXterm';
15
- import { getTerminalTheme } from './Terminal.theme';
16
- import { TerminalIcon } from '@/react-ui/icons/lucide-animated';
17
- import type { ITerminalBackendType, ITerminalMode } from './Terminal.types';
18
-
19
- /**
20
- * Props for the TerminalPanel component.
21
- */
22
- export interface ITerminalPanelProps {
23
- /** Backend type to use (default: 'xterm') */
24
- backend?: ITerminalBackendType;
25
-
26
- /** Terminal mode (default: 'interactive') */
27
- mode?: ITerminalMode;
28
-
29
- /** WebSocket URL for interactive mode */
30
- wsUrl?: string;
31
-
32
- /** SSE URL for readonly mode */
33
- sseUrl?: string;
34
-
35
- /** Custom class name for styling */
36
- className?: string;
37
-
38
- /** Display title (default: 'Terminal') */
39
- title?: string;
40
-
41
- /** Show/hide toolbar (default: true) */
42
- showToolbar?: boolean;
43
-
44
- /** Enable search functionality (default: true) */
45
- enableSearch?: boolean;
46
-
47
- /** Callback when connection status changes */
48
- onStatusChange?: (status: 'connected' | 'disconnected' | 'error' | 'connecting') => void;
49
-
50
- /** Callback when user types data */
51
- onData?: (data: string) => void;
52
- }
53
-
54
- /**
55
- * Connection status type for state management.
56
- */
57
- type TConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
58
-
59
- /**
60
- * Terminal Panel Component.
61
- *
62
- * Full-featured terminal UI with toolbar, status indicator, search,
63
- * and xterm.js integration. Supports both interactive (WebSocket)
64
- * and readonly (SSE) modes with proper cleanup and error handling.
65
- *
66
- * @example
67
- * ```tsx
68
- * // Interactive mode with WebSocket
69
- * <TerminalPanel
70
- * mode="interactive"
71
- * wsUrl="ws://localhost:3100/api/terminal/session-123"
72
- * onData={(data) => sendMessage({ type: 'input', data })}
73
- * />
74
- *
75
- * // Readonly mode with SSE
76
- * <TerminalPanel
77
- * mode="readonly"
78
- * sseUrl="http://localhost:3100/api/logs/containers/devenv/stream"
79
- * />
80
- * ```
81
- */
82
- export function TerminalPanel({
83
- backend = 'xterm',
84
- mode = 'interactive',
85
- wsUrl,
86
- sseUrl,
87
- className,
88
- title = 'Terminal',
89
- showToolbar = true,
90
- onStatusChange,
91
- onData,
92
- }: ITerminalPanelProps) {
93
- const [status, setStatus] = useState<TConnectionStatus>('disconnected');
94
- const terminalRef = useRef<any>(null);
95
- const wsRef = useRef<WebSocket | null>(null);
96
- const eventSourceRef = useRef<EventSource | null>(null);
97
-
98
- /**
99
- * Update connection status and notify parent.
100
- */
101
- const updateStatus = useCallback(
102
- (newStatus: TConnectionStatus) => {
103
- setStatus(newStatus);
104
- onStatusChange?.(newStatus);
105
- },
106
- [onStatusChange]
107
- );
108
-
109
- /**
110
- * Handle terminal data input from user.
111
- */
112
- const handleData = useCallback(
113
- (data: string) => {
114
- // Send to parent callback
115
- onData?.(data);
116
-
117
- // Send to WebSocket if connected
118
- if (mode === 'interactive' && wsRef.current?.readyState === WebSocket.OPEN) {
119
- wsRef.current.send(data);
120
- }
121
- },
122
- [mode, onData]
123
- );
124
-
125
- /**
126
- * Handle terminal ready state.
127
- */
128
- const handleReady = useCallback(
129
- (terminal: any) => {
130
- terminalRef.current = terminal;
131
- updateStatus('connected');
132
-
133
- // Establish WebSocket or SSE connection
134
- if (mode === 'interactive' && wsUrl) {
135
- connectWebSocket(wsUrl);
136
- } else if (mode === 'readonly' && sseUrl) {
137
- connectSSE(sseUrl);
138
- }
139
- },
140
- [mode, wsUrl, sseUrl, updateStatus]
141
- );
142
-
143
- /**
144
- * Establish WebSocket connection for interactive mode.
145
- */
146
- const connectWebSocket = useCallback((url: string) => {
147
- updateStatus('connecting');
148
-
149
- const ws = new WebSocket(url);
150
- wsRef.current = ws;
151
-
152
- ws.onopen = () => {
153
- updateStatus('connected');
154
- };
155
-
156
- ws.onmessage = (event) => {
157
- terminalRef.current?.write(event.data);
158
- };
159
-
160
- ws.onerror = () => {
161
- updateStatus('error');
162
- };
163
-
164
- ws.onclose = () => {
165
- updateStatus('disconnected');
166
- };
167
- }, [updateStatus]);
168
-
169
- /**
170
- * Establish SSE connection for readonly mode.
171
- */
172
- const connectSSE = useCallback((url: string) => {
173
- updateStatus('connecting');
174
-
175
- const eventSource = new EventSource(url);
176
- eventSourceRef.current = eventSource;
177
-
178
- eventSource.onopen = () => {
179
- updateStatus('connected');
180
- };
181
-
182
- eventSource.onmessage = (event) => {
183
- terminalRef.current?.writeln(event.data);
184
- };
185
-
186
- eventSource.onerror = () => {
187
- updateStatus('error');
188
- eventSource.close();
189
- };
190
- }, [updateStatus]);
191
-
192
- /**
193
- * Cleanup connections on unmount.
194
- */
195
- useEffect(() => {
196
- return () => {
197
- wsRef.current?.close();
198
- eventSourceRef.current?.close();
199
- };
200
- }, []);
201
-
202
- /**
203
- * Get status color class.
204
- */
205
- const getStatusColor = (): string => {
206
- switch (status) {
207
- case 'connected':
208
- return 'text-success';
209
- case 'error':
210
- return 'text-destructive';
211
- case 'connecting':
212
- return 'text-warning';
213
- default:
214
- return 'text-muted-foreground';
215
- }
216
- };
217
-
218
- return (
219
- <section className={className}>
220
- {/* Toolbar */}
221
- {showToolbar && (
222
- <div className="flex items-center justify-between mb-2 px-2">
223
- {/* Left: Title and Status */}
224
- <div className="flex items-center gap-2">
225
- <TerminalIcon className="w-4 h-4 text-primary" />
226
- <h2 className="text-sm font-semibold font-mono text-foreground">{title}</h2>
227
-
228
- {/* Status Badge */}
229
- <span
230
- className={`text-xs font-mono font-medium ${getStatusColor()}`}
231
- data-terminal-status
232
- >
233
- {status.toUpperCase()}
234
- </span>
235
- </div>
236
-
237
- {/* Right: Toolbar Actions */}
238
- <div className="flex items-center gap-1" />
239
- </div>
240
- )}
241
-
242
- {/* Terminal Display */}
243
- <XTermWrapper
244
- options={{
245
- backend,
246
- mode,
247
- wsUrl,
248
- sseUrl,
249
- onData: handleData,
250
- onError: (error) => {
251
- console.error('[TerminalPanel] Error:', error);
252
- updateStatus('error');
253
- },
254
- }}
255
- theme={getTerminalTheme()}
256
- onReady={handleReady}
257
- />
258
-
259
- {/* Footer with hints */}
260
- {mode === 'interactive' && status === 'connected' && (
261
- <div className="mt-2 px-2 flex items-center justify-between text-xs text-muted-foreground font-mono">
262
- <span>Ctrl+C to interrupt • Ctrl+D to exit</span>
263
- <span>{terminalRef.current?.cols ?? 0}x{terminalRef.current?.rows ?? 0}</span>
264
- </div>
265
- )}
266
- </section>
267
- );
268
- }
269
-