@mks2508/mks-ui 0.5.4 → 0.5.8

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 (262) hide show
  1. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts +23 -4
  2. package/dist/react-ui/primitives/waapi/Gooey/Gooey.types.d.ts.map +1 -1
  3. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts +2 -2
  4. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.d.ts.map +1 -1
  5. package/dist/react-ui/primitives/waapi/Gooey/GooeyCanvas.js +292 -31
  6. package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.d.ts +7 -0
  7. package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.d.ts.map +1 -1
  8. package/dist/react-ui/primitives/waapi/Gooey/gooey-utils.js +6 -1
  9. package/dist/react-ui/ui/DynamicToggle/{DynamicToggle-Cm6-VceQ.css → DynamicToggle-DJLwEkHr.css} +116 -51
  10. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.css +116 -51
  11. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts +1 -0
  12. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.d.ts.map +1 -1
  13. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.styles.js +9 -3
  14. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts +61 -31
  15. package/dist/react-ui/ui/DynamicToggle/DynamicToggle.types.d.ts.map +1 -1
  16. package/dist/react-ui/ui/DynamicToggle/index.d.ts +9 -3
  17. package/dist/react-ui/ui/DynamicToggle/index.d.ts.map +1 -1
  18. package/dist/react-ui/ui/DynamicToggle/index.js +68 -37
  19. package/package.json +52 -13
  20. package/src/assets/react.svg +0 -1
  21. package/src/core/index.ts +0 -7
  22. package/src/core/types.ts +0 -82
  23. package/src/css.d.ts +0 -7
  24. package/src/index.css +0 -129
  25. package/src/index.ts +0 -29
  26. package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +0 -278
  27. package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +0 -97
  28. package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +0 -155
  29. package/src/react-ui/blocks/Terminal/Terminal.theme.ts +0 -80
  30. package/src/react-ui/blocks/Terminal/Terminal.types.ts +0 -438
  31. package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +0 -38
  32. package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +0 -254
  33. package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +0 -73
  34. package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +0 -269
  35. package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +0 -326
  36. package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +0 -230
  37. package/src/react-ui/blocks/Terminal/XTermAdapter.ts +0 -163
  38. package/src/react-ui/blocks/Terminal/chrome.ts +0 -25
  39. package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +0 -316
  40. package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +0 -218
  41. package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +0 -386
  42. package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +0 -67
  43. package/src/react-ui/blocks/Terminal/components/index.ts +0 -10
  44. package/src/react-ui/blocks/Terminal/display.ts +0 -46
  45. package/src/react-ui/blocks/Terminal/hooks/index.ts +0 -22
  46. package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +0 -229
  47. package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +0 -292
  48. package/src/react-ui/blocks/Terminal/index.ts +0 -111
  49. package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +0 -330
  50. package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +0 -242
  51. package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +0 -202
  52. package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +0 -140
  53. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +0 -68
  54. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +0 -85
  55. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +0 -383
  56. package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +0 -439
  57. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +0 -550
  58. package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +0 -259
  59. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +0 -75
  60. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +0 -266
  61. package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +0 -82
  62. package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +0 -112
  63. package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +0 -178
  64. package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +0 -203
  65. package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +0 -252
  66. package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +0 -334
  67. package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +0 -261
  68. package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +0 -248
  69. package/src/react-ui/blocks/Terminal/panel/index.ts +0 -72
  70. package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +0 -59
  71. package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +0 -59
  72. package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +0 -180
  73. package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +0 -248
  74. package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +0 -283
  75. package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +0 -686
  76. package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +0 -466
  77. package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +0 -343
  78. package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +0 -167
  79. package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +0 -348
  80. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +0 -251
  81. package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +0 -390
  82. package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +0 -320
  83. package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +0 -20
  84. package/src/react-ui/blocks/Terminal/parsing/index.ts +0 -69
  85. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +0 -68
  86. package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +0 -436
  87. package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +0 -14
  88. package/src/react-ui/blocks/index.ts +0 -11
  89. package/src/react-ui/components/MorphingPopover/MorphingPopover.types.ts +0 -49
  90. package/src/react-ui/components/MorphingPopover/index.tsx +0 -186
  91. package/src/react-ui/components/MorphingPopover/morphing-popover.module.css +0 -153
  92. package/src/react-ui/components/index.ts +0 -9
  93. package/src/react-ui/hooks/Animation/UseAutoHeight.tsx +0 -123
  94. package/src/react-ui/hooks/DOM/UseIsInView.tsx +0 -44
  95. package/src/react-ui/hooks/Formatting/UseListFormat.ts +0 -134
  96. package/src/react-ui/hooks/State/UseControlledState.tsx +0 -57
  97. package/src/react-ui/hooks/State/UseDataState.tsx +0 -76
  98. package/src/react-ui/hooks/index.ts +0 -20
  99. package/src/react-ui/icons/index.ts +0 -12
  100. package/src/react-ui/icons/lucide-animated/activity.tsx +0 -109
  101. package/src/react-ui/icons/lucide-animated/arrow-down-to-line.tsx +0 -51
  102. package/src/react-ui/icons/lucide-animated/arrow-up.tsx +0 -50
  103. package/src/react-ui/icons/lucide-animated/bell-electric.tsx +0 -124
  104. package/src/react-ui/icons/lucide-animated/bell.tsx +0 -93
  105. package/src/react-ui/icons/lucide-animated/bot.tsx +0 -122
  106. package/src/react-ui/icons/lucide-animated/box.tsx +0 -117
  107. package/src/react-ui/icons/lucide-animated/check.tsx +0 -21
  108. package/src/react-ui/icons/lucide-animated/circle-check.tsx +0 -107
  109. package/src/react-ui/icons/lucide-animated/delete.tsx +0 -133
  110. package/src/react-ui/icons/lucide-animated/download.tsx +0 -99
  111. package/src/react-ui/icons/lucide-animated/edit-2.tsx +0 -21
  112. package/src/react-ui/icons/lucide-animated/globe.tsx +0 -23
  113. package/src/react-ui/icons/lucide-animated/home.tsx +0 -103
  114. package/src/react-ui/icons/lucide-animated/index.ts +0 -38
  115. package/src/react-ui/icons/lucide-animated/layers.tsx +0 -23
  116. package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +0 -143
  117. package/src/react-ui/icons/lucide-animated/list.tsx +0 -54
  118. package/src/react-ui/icons/lucide-animated/package.tsx +0 -24
  119. package/src/react-ui/icons/lucide-animated/palette.tsx +0 -25
  120. package/src/react-ui/icons/lucide-animated/plus.tsx +0 -92
  121. package/src/react-ui/icons/lucide-animated/refresh-cw.tsx +0 -24
  122. package/src/react-ui/icons/lucide-animated/rocket.tsx +0 -24
  123. package/src/react-ui/icons/lucide-animated/save.tsx +0 -23
  124. package/src/react-ui/icons/lucide-animated/search.tsx +0 -94
  125. package/src/react-ui/icons/lucide-animated/settings.tsx +0 -92
  126. package/src/react-ui/icons/lucide-animated/terminal.tsx +0 -46
  127. package/src/react-ui/icons/lucide-animated/trash-2.tsx +0 -25
  128. package/src/react-ui/icons/lucide-animated/trending-down.tsx +0 -151
  129. package/src/react-ui/icons/lucide-animated/trending-up.tsx +0 -150
  130. package/src/react-ui/icons/lucide-animated/type.tsx +0 -23
  131. package/src/react-ui/icons/lucide-animated/upload.tsx +0 -23
  132. package/src/react-ui/icons/lucide-animated/x.tsx +0 -102
  133. package/src/react-ui/index.ts +0 -30
  134. package/src/react-ui/lib/get-strict-context.tsx +0 -56
  135. package/src/react-ui/lib/icon-wrapper.tsx +0 -70
  136. package/src/react-ui/lib/index.ts +0 -9
  137. package/src/react-ui/lib/utils.ts +0 -24
  138. package/src/react-ui/primitives/AutoHeight/index.tsx +0 -74
  139. package/src/react-ui/primitives/CountingNumber/index.tsx +0 -147
  140. package/src/react-ui/primitives/Highlight/Highlight.types.ts +0 -136
  141. package/src/react-ui/primitives/Highlight/index.tsx +0 -577
  142. package/src/react-ui/primitives/Slot/index.tsx +0 -128
  143. package/src/react-ui/primitives/index.ts +0 -16
  144. package/src/react-ui/primitives/waapi/Gooey/Gooey.types.ts +0 -123
  145. package/src/react-ui/primitives/waapi/Gooey/GooeyCanvas.tsx +0 -80
  146. package/src/react-ui/primitives/waapi/Gooey/GooeyFilter.tsx +0 -77
  147. package/src/react-ui/primitives/waapi/Gooey/MorphPath.tsx +0 -58
  148. package/src/react-ui/primitives/waapi/Gooey/gooey-utils.ts +0 -244
  149. package/src/react-ui/primitives/waapi/Gooey/index.ts +0 -50
  150. package/src/react-ui/primitives/waapi/Gooey/useMorphPath.ts +0 -48
  151. package/src/react-ui/primitives/waapi/Morph/Morph.types.ts +0 -106
  152. package/src/react-ui/primitives/waapi/Morph/MorphContext.tsx +0 -21
  153. package/src/react-ui/primitives/waapi/Morph/index.tsx +0 -56
  154. package/src/react-ui/primitives/waapi/Morph/techniques/index.ts +0 -12
  155. package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +0 -89
  156. package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +0 -176
  157. package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +0 -87
  158. package/src/react-ui/primitives/waapi/Morph/useMorph.ts +0 -101
  159. package/src/react-ui/primitives/waapi/Reorder/Reorder.types.ts +0 -177
  160. package/src/react-ui/primitives/waapi/Reorder/index.tsx +0 -260
  161. package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +0 -47
  162. package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +0 -209
  163. package/src/react-ui/primitives/waapi/Reorder/utils/separatorCoordination.ts +0 -104
  164. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.styles.ts +0 -14
  165. package/src/react-ui/primitives/waapi/SlidingNumber/SlidingNumber.types.ts +0 -84
  166. package/src/react-ui/primitives/waapi/SlidingNumber/index.tsx +0 -474
  167. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.styles.ts +0 -32
  168. package/src/react-ui/primitives/waapi/SlidingText/SlidingText.types.ts +0 -69
  169. package/src/react-ui/primitives/waapi/SlidingText/index.tsx +0 -140
  170. package/src/react-ui/primitives/waapi/core/animationConstants.ts +0 -215
  171. package/src/react-ui/primitives/waapi/core/index.ts +0 -53
  172. package/src/react-ui/primitives/waapi/core/types.ts +0 -200
  173. package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +0 -430
  174. package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +0 -81
  175. package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +0 -138
  176. package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +0 -106
  177. package/src/react-ui/primitives/waapi/index.ts +0 -139
  178. package/src/react-ui/styles/animations.css +0 -369
  179. package/src/react-ui/ui/Accordion/Accordion.styles.ts +0 -72
  180. package/src/react-ui/ui/Accordion/Accordion.types.ts +0 -199
  181. package/src/react-ui/ui/Accordion/index.tsx +0 -362
  182. package/src/react-ui/ui/AlertDialog/AlertDialog.styles.ts +0 -38
  183. package/src/react-ui/ui/AlertDialog/AlertDialog.types.ts +0 -296
  184. package/src/react-ui/ui/AlertDialog/index.tsx +0 -540
  185. package/src/react-ui/ui/Badge/Badge.styles.ts +0 -43
  186. package/src/react-ui/ui/Badge/Badge.types.ts +0 -26
  187. package/src/react-ui/ui/Badge/index.tsx +0 -34
  188. package/src/react-ui/ui/Button/Button.styles.ts +0 -57
  189. package/src/react-ui/ui/Button/Button.types.ts +0 -63
  190. package/src/react-ui/ui/Button/index.tsx +0 -155
  191. package/src/react-ui/ui/Card/Card.styles.ts +0 -32
  192. package/src/react-ui/ui/Card/Card.types.ts +0 -39
  193. package/src/react-ui/ui/Card/index.tsx +0 -130
  194. package/src/react-ui/ui/Checkbox/Checkbox.styles.ts +0 -40
  195. package/src/react-ui/ui/Checkbox/Checkbox.types.ts +0 -98
  196. package/src/react-ui/ui/Checkbox/index.tsx +0 -233
  197. package/src/react-ui/ui/Combobox/Combobox.styles.ts +0 -34
  198. package/src/react-ui/ui/Combobox/Combobox.types.ts +0 -89
  199. package/src/react-ui/ui/Combobox/index.tsx +0 -331
  200. package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +0 -38
  201. package/src/react-ui/ui/CornerBracket/CornerBracket.types.ts +0 -15
  202. package/src/react-ui/ui/CornerBracket/index.tsx +0 -49
  203. package/src/react-ui/ui/DataCard/DataCard.styles.ts +0 -94
  204. package/src/react-ui/ui/DataCard/DataCard.types.ts +0 -125
  205. package/src/react-ui/ui/DataCard/index.tsx +0 -340
  206. package/src/react-ui/ui/Dialog/Dialog.styles.ts +0 -59
  207. package/src/react-ui/ui/Dialog/Dialog.types.ts +0 -284
  208. package/src/react-ui/ui/Dialog/index.tsx +0 -452
  209. package/src/react-ui/ui/DropdownMenu/DropdownMenu.styles.ts +0 -35
  210. package/src/react-ui/ui/DropdownMenu/DropdownMenu.types.ts +0 -81
  211. package/src/react-ui/ui/DropdownMenu/index.tsx +0 -300
  212. package/src/react-ui/ui/DynamicToggle/DynamicToggle.css +0 -303
  213. package/src/react-ui/ui/DynamicToggle/DynamicToggle.styles.ts +0 -85
  214. package/src/react-ui/ui/DynamicToggle/DynamicToggle.types.ts +0 -174
  215. package/src/react-ui/ui/DynamicToggle/index.tsx +0 -294
  216. package/src/react-ui/ui/DynamicToggle/prototype-v7.html +0 -615
  217. package/src/react-ui/ui/DynamicToggle/prototype.html +0 -419
  218. package/src/react-ui/ui/Field/Field.styles.ts +0 -47
  219. package/src/react-ui/ui/Field/Field.types.ts +0 -60
  220. package/src/react-ui/ui/Field/index.tsx +0 -254
  221. package/src/react-ui/ui/Input/Input.styles.ts +0 -11
  222. package/src/react-ui/ui/Input/Input.types.ts +0 -10
  223. package/src/react-ui/ui/Input/index.tsx +0 -32
  224. package/src/react-ui/ui/InputGroup/InputGroup.styles.ts +0 -53
  225. package/src/react-ui/ui/InputGroup/InputGroup.types.ts +0 -44
  226. package/src/react-ui/ui/InputGroup/index.tsx +0 -149
  227. package/src/react-ui/ui/Label/Label.styles.ts +0 -10
  228. package/src/react-ui/ui/Label/Label.types.ts +0 -9
  229. package/src/react-ui/ui/Label/index.tsx +0 -27
  230. package/src/react-ui/ui/Menu/Menu.styles.ts +0 -71
  231. package/src/react-ui/ui/Menu/Menu.types.ts +0 -425
  232. package/src/react-ui/ui/Menu/index.tsx +0 -900
  233. package/src/react-ui/ui/Popover/Popover.styles.ts +0 -55
  234. package/src/react-ui/ui/Popover/Popover.types.ts +0 -261
  235. package/src/react-ui/ui/Popover/index.tsx +0 -422
  236. package/src/react-ui/ui/Progress/Progress.styles.ts +0 -36
  237. package/src/react-ui/ui/Progress/Progress.types.ts +0 -162
  238. package/src/react-ui/ui/Progress/index.tsx +0 -254
  239. package/src/react-ui/ui/Select/Select.styles.ts +0 -30
  240. package/src/react-ui/ui/Select/Select.types.ts +0 -51
  241. package/src/react-ui/ui/Select/index.tsx +0 -225
  242. package/src/react-ui/ui/Separator/Separator.styles.ts +0 -10
  243. package/src/react-ui/ui/Separator/Separator.types.ts +0 -10
  244. package/src/react-ui/ui/Separator/index.tsx +0 -37
  245. package/src/react-ui/ui/Switch/Switch.styles.ts +0 -50
  246. package/src/react-ui/ui/Switch/Switch.types.ts +0 -155
  247. package/src/react-ui/ui/Switch/index.tsx +0 -253
  248. package/src/react-ui/ui/Tabs/Tabs.css +0 -39
  249. package/src/react-ui/ui/Tabs/Tabs.styles.ts +0 -148
  250. package/src/react-ui/ui/Tabs/Tabs.types.ts +0 -255
  251. package/src/react-ui/ui/Tabs/index.tsx +0 -529
  252. package/src/react-ui/ui/TextFlow/TextFlow.styles.ts +0 -36
  253. package/src/react-ui/ui/TextFlow/TextFlow.types.ts +0 -118
  254. package/src/react-ui/ui/TextFlow/index.tsx +0 -276
  255. package/src/react-ui/ui/Textarea/Textarea.styles.ts +0 -10
  256. package/src/react-ui/ui/Textarea/Textarea.types.ts +0 -9
  257. package/src/react-ui/ui/Textarea/index.tsx +0 -27
  258. package/src/react-ui/ui/Tooltip/Tooltip.styles.ts +0 -43
  259. package/src/react-ui/ui/Tooltip/Tooltip.types.ts +0 -253
  260. package/src/react-ui/ui/Tooltip/index.tsx +0 -394
  261. package/src/react-ui/ui/index.ts +0 -41
  262. package/src/types/css-modules.d.ts +0 -18
@@ -1,261 +0,0 @@
1
- /**
2
- * TerminalSettingsPopover Component.
3
- *
4
- * Gear icon popover for global terminal settings:
5
- * renderer (xterm/restty), theme (458 built-in), PTY backend,
6
- * and font size. Reads and writes via useTerminalSettings hook.
7
- *
8
- * @module components/devenv/terminal/panel/TerminalSettingsPopover
9
- */
10
-
11
- 'use client';
12
-
13
- import { Popover, PopoverTrigger, PopoverPortal, PopoverPositioner, PopoverPopup } from '@/react-ui/ui/Popover';
14
- import { Separator } from '@/react-ui/ui/Separator';
15
- import { SettingsIcon } from '@/react-ui/icons/lucide-animated';
16
- import { useTerminalSettings } from '../hooks/useTerminalSettings';
17
- import { TerminalThemeSelector } from './TerminalThemeSelector';
18
- import { cn } from '@/react-ui/lib/utils';
19
-
20
- /**
21
- * Action button base styles for the trigger icon.
22
- */
23
- const triggerBtnStyles =
24
- 'h-8 w-8 rounded-md transition-all hover:bg-muted/20 active:bg-muted/30 flex items-center justify-center text-muted-foreground hover:text-foreground flex-shrink-0';
25
-
26
- /**
27
- * Segmented control button styles.
28
- */
29
- const segmentedBase = 'flex items-center gap-1.5 px-2.5 py-1 rounded-md text-xs font-medium transition-all';
30
- const segmentedInactive = 'text-muted-foreground hover:text-foreground hover:bg-white/5 hover:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)]';
31
- const segmentedActive = 'bg-primary/20 text-primary border border-primary/30 shadow-[0_0_8px_hsla(330,85%,43%,0.15)] hover:shadow-[0_0_12px_hsla(330,85%,43%,0.25)]';
32
-
33
- /**
34
- * Min/max font size bounds.
35
- */
36
- const MIN_FONT_SIZE = 10;
37
- const MAX_FONT_SIZE = 24;
38
-
39
- /**
40
- * Small control button for font size +/-.
41
- */
42
- const fontBtnStyles =
43
- 'h-7 w-7 rounded-md transition-all hover:bg-muted/20 active:bg-muted/30 flex items-center justify-center text-muted-foreground hover:text-foreground disabled:opacity-30 disabled:pointer-events-none';
44
-
45
- /**
46
- * TerminalSettingsPopover Component.
47
- *
48
- * Renders a settings gear icon that opens a popover with
49
- * terminal configuration options. Reads settings from
50
- * `useTerminalSettings` — no prop drilling needed.
51
- *
52
- * @example
53
- * ```tsx
54
- * // In action bar:
55
- * <TerminalSettingsPopover />
56
- * ```
57
- */
58
- export function TerminalSettingsPopover() {
59
- const {
60
- settings,
61
- setRenderer,
62
- setPtyBackend,
63
- setResttyThemeName,
64
- setFontSize,
65
- setCrtEffect,
66
- setDebugPanel,
67
- resetToDefaults,
68
- } = useTerminalSettings();
69
-
70
- return (
71
- <Popover>
72
- <PopoverTrigger>
73
- <button type="button" className={triggerBtnStyles} title="Terminal settings">
74
- <SettingsIcon size={16} />
75
- </button>
76
- </PopoverTrigger>
77
-
78
- <PopoverPortal>
79
- <PopoverPositioner align="end" sideOffset={6}>
80
- <PopoverPopup className="w-72 p-0 glass-subtle">
81
- {/* Header */}
82
- <div className="flex items-center gap-2 px-4 py-3">
83
- <SettingsIcon size={14} className="text-muted-foreground" />
84
- <span className="text-sm font-medium text-foreground">Terminal Settings</span>
85
- </div>
86
-
87
- <Separator className="bg-border/30" />
88
-
89
- {/* Renderer */}
90
- <div className="px-4 py-3 space-y-2">
91
- <label className="text-[10px] font-mono text-muted-foreground uppercase tracking-wider">
92
- Renderer
93
- </label>
94
- <div className="flex items-center gap-1 bg-muted/10 rounded-lg p-0.5">
95
- <button
96
- type="button"
97
- onClick={() => setRenderer('xterm')}
98
- className={cn(segmentedBase, settings.renderer === 'xterm' ? segmentedActive : segmentedInactive, 'flex-1 justify-center')}
99
- >
100
- xterm
101
- </button>
102
- <button
103
- type="button"
104
- onClick={() => setRenderer('restty')}
105
- className={cn(segmentedBase, settings.renderer === 'restty' ? segmentedActive : segmentedInactive, 'flex-1 justify-center')}
106
- >
107
- restty
108
- </button>
109
- </div>
110
- </div>
111
-
112
- {/* Theme (restty only) */}
113
- {settings.renderer === 'restty' && (
114
- <>
115
- <Separator className="bg-border/30" />
116
- <div className="px-4 py-3 space-y-2">
117
- <label className="text-[10px] font-mono text-muted-foreground uppercase tracking-wider">
118
- Theme
119
- </label>
120
- <TerminalThemeSelector
121
- currentTheme={settings.resttyThemeName}
122
- onThemeChange={setResttyThemeName}
123
- />
124
- </div>
125
- </>
126
- )}
127
-
128
- <Separator className="bg-border/30" />
129
-
130
- {/* PTY Backend */}
131
- <div className="px-4 py-3 space-y-2">
132
- <label className="text-[10px] font-mono text-muted-foreground uppercase tracking-wider">
133
- PTY Backend
134
- </label>
135
- <div className="flex items-center gap-1 bg-muted/10 rounded-lg p-0.5">
136
- <button
137
- type="button"
138
- onClick={() => setPtyBackend('nodepty')}
139
- className={cn(segmentedBase, settings.ptyBackend === 'nodepty' ? segmentedActive : segmentedInactive, 'flex-1 justify-center')}
140
- >
141
- nodepty
142
- </button>
143
- <button
144
- type="button"
145
- onClick={() => setPtyBackend('webcontainer')}
146
- className={cn(segmentedBase, settings.ptyBackend === 'webcontainer' ? segmentedActive : segmentedInactive, 'flex-1 justify-center')}
147
- >
148
- webcontainer
149
- </button>
150
- </div>
151
- </div>
152
-
153
- <Separator className="bg-border/30" />
154
-
155
- {/* Font Size */}
156
- <div className="px-4 py-3 space-y-2">
157
- <label className="text-[10px] font-mono text-muted-foreground uppercase tracking-wider">
158
- Font Size
159
- </label>
160
- <div className="flex items-center gap-2">
161
- <button
162
- type="button"
163
- onClick={() => setFontSize(settings.fontSize - 1)}
164
- className={fontBtnStyles}
165
- disabled={settings.fontSize <= MIN_FONT_SIZE}
166
- title="Decrease font size"
167
- >
168
- <span className="text-sm font-bold">&minus;</span>
169
- </button>
170
- <span className="text-sm font-mono text-foreground w-8 text-center">
171
- {settings.fontSize}
172
- </span>
173
- <button
174
- type="button"
175
- onClick={() => setFontSize(settings.fontSize + 1)}
176
- className={fontBtnStyles}
177
- disabled={settings.fontSize >= MAX_FONT_SIZE}
178
- title="Increase font size"
179
- >
180
- <span className="text-sm font-bold">+</span>
181
- </button>
182
- <span className="text-[10px] font-mono text-muted-foreground/50 ml-auto">px</span>
183
- </div>
184
- </div>
185
-
186
- <Separator className="bg-border/30" />
187
-
188
- {/* CRT Effect */}
189
- <div className="px-4 py-3 space-y-2">
190
- <label className="text-[10px] font-mono text-muted-foreground uppercase tracking-wider">
191
- CRT Effect
192
- </label>
193
- <div className="flex items-center justify-between">
194
- <span className="text-xs text-muted-foreground">
195
- Scanlines, bloom &amp; vignette
196
- </span>
197
- <button
198
- type="button"
199
- onClick={() => setCrtEffect(!settings.crtEffect)}
200
- className={cn(
201
- 'relative w-9 h-5 rounded-full transition-colors',
202
- settings.crtEffect
203
- ? 'bg-primary/60 shadow-[0_0_8px_hsla(330,85%,43%,0.3)]'
204
- : 'bg-muted/30'
205
- )}
206
- >
207
- <span className={cn(
208
- 'absolute top-0.5 h-4 w-4 rounded-full bg-foreground transition-all',
209
- settings.crtEffect ? 'left-[18px]' : 'left-0.5'
210
- )} />
211
- </button>
212
- </div>
213
- </div>
214
-
215
- <Separator className="bg-border/30" />
216
-
217
- {/* Debug Panel */}
218
- <div className="px-4 py-3 space-y-2">
219
- <label className="text-[10px] font-mono text-muted-foreground uppercase tracking-wider">
220
- Debug Panel
221
- </label>
222
- <div className="flex items-center justify-between">
223
- <span className="text-xs text-muted-foreground">
224
- GPU, FPS, grid &amp; connection info
225
- </span>
226
- <button
227
- type="button"
228
- onClick={() => setDebugPanel(!settings.debugPanel)}
229
- className={cn(
230
- 'relative w-9 h-5 rounded-full transition-colors',
231
- settings.debugPanel
232
- ? 'bg-primary/60 shadow-[0_0_8px_hsla(330,85%,43%,0.3)]'
233
- : 'bg-muted/30'
234
- )}
235
- >
236
- <span className={cn(
237
- 'absolute top-0.5 h-4 w-4 rounded-full bg-foreground transition-all',
238
- settings.debugPanel ? 'left-[18px]' : 'left-0.5'
239
- )} />
240
- </button>
241
- </div>
242
- </div>
243
-
244
- <Separator className="bg-border/30" />
245
-
246
- {/* Reset */}
247
- <div className="px-4 py-3">
248
- <button
249
- type="button"
250
- onClick={resetToDefaults}
251
- className="w-full h-8 rounded-md text-xs font-mono text-muted-foreground hover:text-foreground hover:bg-muted/20 transition-colors"
252
- >
253
- Reset to Defaults
254
- </button>
255
- </div>
256
- </PopoverPopup>
257
- </PopoverPositioner>
258
- </PopoverPortal>
259
- </Popover>
260
- );
261
- }
@@ -1,248 +0,0 @@
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
- }
@@ -1,72 +0,0 @@
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';
@@ -1,59 +0,0 @@
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
- }
@@ -1,59 +0,0 @@
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
- }