@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.
- package/dist/react-ui/blocks/Terminal/ResttyAdapter.d.ts +146 -0
- package/dist/react-ui/blocks/Terminal/ResttyAdapter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/ResttyAdapter.js +213 -0
- package/dist/react-ui/blocks/Terminal/Terminal.adapter.d.ts +55 -0
- package/dist/react-ui/blocks/Terminal/Terminal.adapter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/Terminal.adapter.js +68 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.d.ts +43 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.js +59 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.d.ts +63 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/Terminal.theme.restty.js +109 -0
- package/dist/react-ui/blocks/Terminal/Terminal.types.d.ts +351 -0
- package/dist/react-ui/blocks/Terminal/Terminal.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.d.ts +46 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.js +168 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.d.ts +21 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.styles.js +31 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.types.d.ts +56 -0
- package/dist/react-ui/blocks/Terminal/TerminalDisplay.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts +60 -0
- package/dist/react-ui/blocks/Terminal/TerminalPanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalPanel.js +183 -0
- package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts +111 -0
- package/dist/react-ui/blocks/Terminal/TerminalRestty.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalRestty.js +185 -0
- package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts +58 -0
- package/dist/react-ui/blocks/Terminal/TerminalXterm.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/TerminalXterm.js +143 -0
- package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts +87 -0
- package/dist/react-ui/blocks/Terminal/XTermAdapter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/XTermAdapter.js +135 -0
- package/dist/react-ui/blocks/Terminal/chrome.d.ts +14 -0
- package/dist/react-ui/blocks/Terminal/chrome.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/chrome.js +6 -0
- package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts +160 -0
- package/dist/react-ui/blocks/Terminal/components/LogLineBadges.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/LogLineBadges.js +185 -0
- package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts +48 -0
- package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.js +139 -0
- package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts +60 -0
- package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/SyntaxHighlight.js +352 -0
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts +36 -0
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/TerminalLogBadge.js +52 -0
- package/dist/react-ui/blocks/Terminal/components/index.d.ts +10 -0
- package/dist/react-ui/blocks/Terminal/components/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/components/index.js +4 -0
- package/dist/react-ui/blocks/Terminal/display.d.ts +20 -0
- package/dist/react-ui/blocks/Terminal/display.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/display.js +9 -0
- package/dist/react-ui/blocks/Terminal/hooks/index.d.ts +11 -0
- package/dist/react-ui/blocks/Terminal/hooks/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/hooks/index.js +2 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts +69 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalSettings.js +162 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts +104 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.js +180 -0
- package/dist/react-ui/blocks/Terminal/index.d.ts +43 -0
- package/dist/react-ui/blocks/Terminal/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/index.js +41 -0
- package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts +58 -0
- package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/LogLinesViewer.js +222 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts +74 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalDebugPanel.js +168 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts +42 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.js +175 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts +43 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalFilterTabs.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts +38 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.js +62 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts +67 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts +32 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.js +326 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts +36 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.js +371 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts +67 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.js +417 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts +197 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts +55 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.js +214 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.d.ts +35 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.js +57 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts +62 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts +30 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelFooter.js +126 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts +31 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelHeader.js +149 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts +35 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts +58 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionControl.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts +63 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSessionTabs.js +245 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts +24 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.js +225 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts +35 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/TerminalThemeSelector.js +187 -0
- package/dist/react-ui/blocks/Terminal/panel/index.d.ts +30 -0
- package/dist/react-ui/blocks/Terminal/panel/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module-CNVWCefU.css +60 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.js +5 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module-cmyJ11jP.css +60 -0
- package/dist/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.js +5 -0
- package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts +73 -0
- package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/BadgeFormatter.js +136 -0
- package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts +117 -0
- package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/HttpLogParser.js +174 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts +221 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParser.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts +184 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParserService.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/LogParserService.js +478 -0
- package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts +173 -0
- package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/MultilineAggregator.js +313 -0
- package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts +181 -0
- package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.js +221 -0
- package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts +69 -0
- package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.js +142 -0
- package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts +125 -0
- package/dist/react-ui/blocks/Terminal/parsing/TableParser.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/TableParser.js +245 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts +165 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.js +225 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts +164 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.js +285 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts +188 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.js +178 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts +12 -0
- package/dist/react-ui/blocks/Terminal/parsing/ansi/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/index.d.ts +24 -0
- package/dist/react-ui/blocks/Terminal/parsing/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts +56 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts +140 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.d.ts.map +1 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.js +325 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts +10 -0
- package/dist/react-ui/blocks/Terminal/parsing/levels/index.d.ts.map +1 -0
- package/dist/react-ui/blocks/index.d.ts +11 -0
- package/dist/react-ui/blocks/index.d.ts.map +1 -0
- package/dist/react-ui/icons/lucide-animated/activity.js +1 -1
- package/dist/react-ui/icons/lucide-animated/bell-electric.js +1 -1
- package/dist/react-ui/icons/lucide-animated/bell.js +1 -1
- package/dist/react-ui/icons/lucide-animated/bot.js +1 -1
- package/dist/react-ui/icons/lucide-animated/box.js +1 -1
- package/dist/react-ui/icons/lucide-animated/circle-check.js +1 -1
- package/dist/react-ui/icons/lucide-animated/delete.js +1 -1
- package/dist/react-ui/icons/lucide-animated/download.js +1 -1
- package/dist/react-ui/icons/lucide-animated/home.js +1 -1
- package/dist/react-ui/icons/lucide-animated/layout-panel-top.js +1 -1
- package/dist/react-ui/icons/lucide-animated/plus.js +1 -1
- package/dist/react-ui/icons/lucide-animated/search.js +1 -1
- package/dist/react-ui/icons/lucide-animated/settings.js +1 -1
- package/dist/react-ui/icons/lucide-animated/trending-down.js +1 -1
- package/dist/react-ui/icons/lucide-animated/trending-up.js +1 -1
- package/dist/react-ui/icons/lucide-animated/x.js +1 -1
- package/dist/react-ui/index.js +3 -1
- package/dist/react-ui/lib/icon-wrapper.d.ts +37 -0
- package/dist/react-ui/lib/icon-wrapper.d.ts.map +1 -0
- package/dist/react-ui/lib/icon-wrapper.js +55 -0
- package/dist/react-ui/lib/index.d.ts +1 -0
- package/dist/react-ui/lib/index.d.ts.map +1 -1
- package/dist/react-ui/lib/index.js +1 -0
- package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.js +2 -0
- package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.js +2 -0
- package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.js +2 -0
- package/dist/react-ui/primitives/waapi/Morph/useMorph.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Morph/useMorph.js +2 -0
- package/dist/react-ui/primitives/waapi/Reorder/useReorder.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Reorder/useReorder.js +2 -0
- package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/Reorder/useReorderPresence.js +2 -0
- package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/useAnimationOrchestrator.js +2 -0
- package/dist/react-ui/primitives/waapi/core/useElementRegistry.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/useElementRegistry.js +2 -0
- package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/useFLIPAnimation.js +2 -0
- package/dist/react-ui/primitives/waapi/core/usePositionCapture.d.ts.map +1 -1
- package/dist/react-ui/primitives/waapi/core/usePositionCapture.js +2 -0
- package/dist/react-ui/ui/Button/Button.styles.d.ts +1 -1
- package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.d.ts +1 -1
- package/dist/react-ui/ui/CornerBracket/CornerBracket.styles.js +1 -1
- package/dist/react-ui/ui/InputGroup/index.d.ts.map +1 -1
- package/dist/react-ui/ui/InputGroup/index.js +2 -0
- package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts +43 -25
- package/dist/react-ui/ui/Tabs/Tabs.styles.d.ts.map +1 -1
- package/dist/react-ui/ui/Tabs/Tabs.styles.js +105 -13
- package/dist/react-ui/ui/Tabs/Tabs.types.d.ts +6 -3
- package/dist/react-ui/ui/Tabs/Tabs.types.d.ts.map +1 -1
- package/dist/react-ui/ui/Tabs/index.d.ts +18 -9
- package/dist/react-ui/ui/Tabs/index.d.ts.map +1 -1
- package/dist/react-ui/ui/Tabs/index.js +99 -27
- package/dist/react-ui/ui/index.js +1 -0
- package/package.json +84 -29
- package/src/css.d.ts +6 -0
- package/src/react-ui/blocks/Terminal/ResttyAdapter.ts +278 -0
- package/src/react-ui/blocks/Terminal/Terminal.adapter.ts +97 -0
- package/src/react-ui/blocks/Terminal/Terminal.theme.restty.ts +155 -0
- package/src/react-ui/blocks/Terminal/Terminal.theme.ts +80 -0
- package/src/react-ui/blocks/Terminal/Terminal.types.ts +438 -0
- package/src/react-ui/blocks/Terminal/TerminalDisplay.styles.ts +38 -0
- package/src/react-ui/blocks/Terminal/TerminalDisplay.tsx +243 -0
- package/src/react-ui/blocks/Terminal/TerminalDisplay.types.ts +73 -0
- package/src/react-ui/blocks/Terminal/TerminalPanel.tsx +269 -0
- package/src/react-ui/blocks/Terminal/TerminalRestty.tsx +326 -0
- package/src/react-ui/blocks/Terminal/TerminalXterm.tsx +230 -0
- package/src/react-ui/blocks/Terminal/XTermAdapter.ts +163 -0
- package/src/react-ui/blocks/Terminal/chrome.ts +25 -0
- package/src/react-ui/blocks/Terminal/components/LogLineBadges.tsx +316 -0
- package/src/react-ui/blocks/Terminal/components/SpecializedSyntaxHighlighter.tsx +218 -0
- package/src/react-ui/blocks/Terminal/components/SyntaxHighlight.tsx +386 -0
- package/src/react-ui/blocks/Terminal/components/TerminalLogBadge.tsx +67 -0
- package/src/react-ui/blocks/Terminal/components/index.ts +10 -0
- package/src/react-ui/blocks/Terminal/display.ts +46 -0
- package/src/react-ui/blocks/Terminal/hooks/index.ts +22 -0
- package/src/react-ui/blocks/Terminal/hooks/useTerminalSettings.ts +229 -0
- package/src/react-ui/blocks/Terminal/hooks/useTerminalWebSocket.ts +292 -0
- package/src/react-ui/blocks/Terminal/index.ts +111 -0
- package/src/react-ui/blocks/Terminal/panel/LogLinesViewer.tsx +330 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalDebugPanel.tsx +242 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterDropdown.tsx +202 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx +140 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx +68 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts +85 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx +383 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx +439 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.tsx +550 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalLogsPanel.types.ts +259 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.styles.ts +75 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.tsx +266 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelChrome.types.ts +82 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelFooter.tsx +112 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelHeader.tsx +178 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalPanelToolbar.tsx +203 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionControl.tsx +252 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalSessionTabs.tsx +334 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalSettingsPopover.tsx +261 -0
- package/src/react-ui/blocks/Terminal/panel/TerminalThemeSelector.tsx +248 -0
- package/src/react-ui/blocks/Terminal/panel/index.ts +72 -0
- package/src/react-ui/blocks/Terminal/panel/terminal-filter-dropdown.module.css +59 -0
- package/src/react-ui/blocks/Terminal/panel/terminal-session-tabs.module.css +59 -0
- package/src/react-ui/blocks/Terminal/parsing/BadgeFormatter.ts +180 -0
- package/src/react-ui/blocks/Terminal/parsing/HttpLogParser.ts +248 -0
- package/src/react-ui/blocks/Terminal/parsing/LogParser.types.ts +283 -0
- package/src/react-ui/blocks/Terminal/parsing/LogParserService.ts +686 -0
- package/src/react-ui/blocks/Terminal/parsing/MultilineAggregator.ts +466 -0
- package/src/react-ui/blocks/Terminal/parsing/PersistentLogBuffer.ts +343 -0
- package/src/react-ui/blocks/Terminal/parsing/SyntaxHighlighter.ts +167 -0
- package/src/react-ui/blocks/Terminal/parsing/TableParser.ts +348 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiColorMapper.ts +251 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/AnsiParser.ts +390 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/ansi.constants.ts +320 -0
- package/src/react-ui/blocks/Terminal/parsing/ansi/index.ts +20 -0
- package/src/react-ui/blocks/Terminal/parsing/index.ts +69 -0
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevel.types.ts +68 -0
- package/src/react-ui/blocks/Terminal/parsing/levels/LogLevelDetector.ts +436 -0
- package/src/react-ui/blocks/Terminal/parsing/levels/index.ts +14 -0
- package/src/react-ui/blocks/index.ts +11 -0
- package/src/react-ui/icons/lucide-animated/activity.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/bell-electric.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/bell.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/bot.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/box.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/circle-check.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/delete.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/download.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/home.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/layout-panel-top.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/plus.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/search.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/settings.tsx +1 -1
- package/src/react-ui/icons/lucide-animated/trending-down.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/trending-up.tsx +2 -2
- package/src/react-ui/icons/lucide-animated/x.tsx +2 -2
- package/src/react-ui/lib/icon-wrapper.tsx +70 -0
- package/src/react-ui/lib/index.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/techniques/useCSSGridMorph.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/techniques/useFLIPClipPath.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/techniques/useViewTransitions.ts +1 -0
- package/src/react-ui/primitives/waapi/Morph/useMorph.ts +1 -0
- package/src/react-ui/primitives/waapi/Reorder/useReorder.ts +1 -0
- package/src/react-ui/primitives/waapi/Reorder/useReorderPresence.ts +1 -0
- package/src/react-ui/primitives/waapi/core/useAnimationOrchestrator.ts +1 -0
- package/src/react-ui/primitives/waapi/core/useElementRegistry.ts +1 -0
- package/src/react-ui/primitives/waapi/core/useFLIPAnimation.ts +1 -0
- package/src/react-ui/primitives/waapi/core/usePositionCapture.ts +1 -0
- package/src/react-ui/ui/Accordion/index.tsx +3 -3
- package/src/react-ui/ui/CornerBracket/CornerBracket.styles.ts +1 -1
- package/src/react-ui/ui/InputGroup/index.tsx +2 -0
- package/src/react-ui/ui/Tabs/Tabs.css +39 -0
- package/src/react-ui/ui/Tabs/Tabs.styles.ts +119 -31
- package/src/react-ui/ui/Tabs/Tabs.types.ts +8 -3
- package/src/react-ui/ui/Tabs/index.tsx +135 -27
|
@@ -0,0 +1,261 @@
|
|
|
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">−</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 & 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 & 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
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalThemeSelector Component.
|
|
3
|
+
*
|
|
4
|
+
* Searchable dropdown for restty's 458 built-in terminal themes.
|
|
5
|
+
* Uses Popover for the dropdown UI with glassmorphism styling
|
|
6
|
+
* matching the existing TerminalFilterDropdown pattern.
|
|
7
|
+
*
|
|
8
|
+
* @module components/devenv/terminal/panel/TerminalThemeSelector
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use client';
|
|
12
|
+
|
|
13
|
+
import { useState, useMemo, useCallback, useRef, useEffect } from 'react';
|
|
14
|
+
import { Popover, PopoverTrigger, PopoverPortal, PopoverPositioner, PopoverPopup } from '@/react-ui/ui/Popover';
|
|
15
|
+
import { cn } from '@/react-ui/lib/utils';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Props for the TerminalThemeSelector component.
|
|
19
|
+
*/
|
|
20
|
+
export interface ITerminalThemeSelectorProps {
|
|
21
|
+
/** Currently active theme name */
|
|
22
|
+
currentTheme: string;
|
|
23
|
+
|
|
24
|
+
/** Callback when user selects a new theme */
|
|
25
|
+
onThemeChange: (themeName: string) => void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Favorite themes displayed at the top of the list.
|
|
30
|
+
*/
|
|
31
|
+
const FAVORITE_THEMES = [
|
|
32
|
+
'Synthwave Alpha',
|
|
33
|
+
'Synthwave',
|
|
34
|
+
'Dracula',
|
|
35
|
+
'Nord',
|
|
36
|
+
'One Dark',
|
|
37
|
+
'Tokyo Night',
|
|
38
|
+
'Catppuccin Mocha',
|
|
39
|
+
'Gruvbox Dark',
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Action button base styles (matches TerminalInteractivePanel pattern).
|
|
44
|
+
*/
|
|
45
|
+
const triggerStyles =
|
|
46
|
+
'h-8 px-2.5 rounded-md transition-all hover:bg-muted/20 active:bg-muted/30 flex items-center justify-center gap-1.5 text-xs font-mono text-muted-foreground hover:text-foreground flex-shrink-0 border border-border/30';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* TerminalThemeSelector Component.
|
|
50
|
+
*
|
|
51
|
+
* Searchable dropdown for restty's built-in theme catalog.
|
|
52
|
+
* Favorites are pinned to the top, followed by alphabetically
|
|
53
|
+
* sorted themes. Search filters by case-insensitive substring.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```tsx
|
|
57
|
+
* <TerminalThemeSelector
|
|
58
|
+
* currentTheme="Synthwave Alpha"
|
|
59
|
+
* onThemeChange={(name) => setResttyThemeName(name)}
|
|
60
|
+
* />
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function TerminalThemeSelector({ currentTheme, onThemeChange }: ITerminalThemeSelectorProps) {
|
|
64
|
+
const [open, setOpen] = useState(false);
|
|
65
|
+
const [search, setSearch] = useState('');
|
|
66
|
+
const [themeNames, setThemeNames] = useState<string[]>([]);
|
|
67
|
+
const searchInputRef = useRef<HTMLInputElement>(null);
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Load the theme catalog from restty on first open.
|
|
71
|
+
*/
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (!open || themeNames.length > 0) return;
|
|
74
|
+
|
|
75
|
+
import('restty').then(({ listBuiltinThemeNames }) => {
|
|
76
|
+
const names = listBuiltinThemeNames();
|
|
77
|
+
if (Array.isArray(names)) {
|
|
78
|
+
setThemeNames(names.sort((a: string, b: string) => a.localeCompare(b)));
|
|
79
|
+
}
|
|
80
|
+
}).catch(() => {
|
|
81
|
+
// restty not available — show favorites only
|
|
82
|
+
});
|
|
83
|
+
}, [open, themeNames.length]);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Focus search input on open.
|
|
87
|
+
*/
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
if (open) {
|
|
90
|
+
requestAnimationFrame(() => searchInputRef.current?.focus());
|
|
91
|
+
} else {
|
|
92
|
+
setSearch('');
|
|
93
|
+
}
|
|
94
|
+
}, [open]);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Filter and group themes based on search query.
|
|
98
|
+
*/
|
|
99
|
+
const { favorites, others } = useMemo(() => {
|
|
100
|
+
const query = search.toLowerCase().trim();
|
|
101
|
+
const allNames = themeNames.length > 0 ? themeNames : FAVORITE_THEMES;
|
|
102
|
+
|
|
103
|
+
const favSet = new Set(FAVORITE_THEMES);
|
|
104
|
+
|
|
105
|
+
const filteredFavorites = FAVORITE_THEMES.filter(
|
|
106
|
+
(name) => !query || name.toLowerCase().includes(query)
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const filteredOthers = allNames.filter(
|
|
110
|
+
(name) => !favSet.has(name) && (!query || name.toLowerCase().includes(query))
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
return { favorites: filteredFavorites, others: filteredOthers };
|
|
114
|
+
}, [search, themeNames]);
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Handle theme selection.
|
|
118
|
+
*/
|
|
119
|
+
const handleSelect = useCallback(
|
|
120
|
+
(themeName: string) => {
|
|
121
|
+
onThemeChange(themeName);
|
|
122
|
+
setOpen(false);
|
|
123
|
+
},
|
|
124
|
+
[onThemeChange]
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<Popover open={open} onOpenChange={setOpen}>
|
|
129
|
+
<PopoverTrigger>
|
|
130
|
+
<button type="button" className={triggerStyles} title="Select terminal theme">
|
|
131
|
+
<span className="truncate max-w-[140px]">{currentTheme}</span>
|
|
132
|
+
<svg
|
|
133
|
+
className={cn('w-3 h-3 transition-transform flex-shrink-0', open && 'rotate-180')}
|
|
134
|
+
viewBox="0 0 12 12"
|
|
135
|
+
fill="none"
|
|
136
|
+
stroke="currentColor"
|
|
137
|
+
strokeWidth="2"
|
|
138
|
+
>
|
|
139
|
+
<path d="M3 5l3 3 3-3" />
|
|
140
|
+
</svg>
|
|
141
|
+
</button>
|
|
142
|
+
</PopoverTrigger>
|
|
143
|
+
|
|
144
|
+
<PopoverPortal>
|
|
145
|
+
<PopoverPositioner align="start" sideOffset={6}>
|
|
146
|
+
<PopoverPopup className="w-64 p-0 glass-subtle rounded-lg">
|
|
147
|
+
{/* Search */}
|
|
148
|
+
<div className="p-2 border-b border-border/30">
|
|
149
|
+
<input
|
|
150
|
+
ref={searchInputRef}
|
|
151
|
+
type="text"
|
|
152
|
+
value={search}
|
|
153
|
+
onChange={(e) => setSearch(e.target.value)}
|
|
154
|
+
placeholder="Search themes..."
|
|
155
|
+
className="w-full h-8 px-2.5 rounded-md bg-muted/20 border border-border/30 text-xs font-mono text-foreground placeholder:text-muted-foreground/50 outline-none focus:border-primary/40 focus:ring-1 focus:ring-primary/20 transition-colors"
|
|
156
|
+
/>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
{/* Theme list */}
|
|
160
|
+
<div className="max-h-[300px] overflow-y-auto py-1">
|
|
161
|
+
{/* Favorites section */}
|
|
162
|
+
{favorites.length > 0 && (
|
|
163
|
+
<>
|
|
164
|
+
<div className="px-3 py-1.5">
|
|
165
|
+
<span className="text-[10px] font-mono text-muted-foreground/60 uppercase tracking-wider">
|
|
166
|
+
Favorites
|
|
167
|
+
</span>
|
|
168
|
+
</div>
|
|
169
|
+
{favorites.map((name) => (
|
|
170
|
+
<ThemeOption
|
|
171
|
+
key={`fav-${name}`}
|
|
172
|
+
name={name}
|
|
173
|
+
isActive={name === currentTheme}
|
|
174
|
+
onSelect={handleSelect}
|
|
175
|
+
/>
|
|
176
|
+
))}
|
|
177
|
+
</>
|
|
178
|
+
)}
|
|
179
|
+
|
|
180
|
+
{/* All themes section */}
|
|
181
|
+
{others.length > 0 && (
|
|
182
|
+
<>
|
|
183
|
+
{favorites.length > 0 && (
|
|
184
|
+
<div className="mx-2 my-1 h-px bg-border/20" />
|
|
185
|
+
)}
|
|
186
|
+
<div className="px-3 py-1.5">
|
|
187
|
+
<span className="text-[10px] font-mono text-muted-foreground/60 uppercase tracking-wider">
|
|
188
|
+
All Themes ({others.length})
|
|
189
|
+
</span>
|
|
190
|
+
</div>
|
|
191
|
+
{others.map((name) => (
|
|
192
|
+
<ThemeOption
|
|
193
|
+
key={name}
|
|
194
|
+
name={name}
|
|
195
|
+
isActive={name === currentTheme}
|
|
196
|
+
onSelect={handleSelect}
|
|
197
|
+
/>
|
|
198
|
+
))}
|
|
199
|
+
</>
|
|
200
|
+
)}
|
|
201
|
+
|
|
202
|
+
{/* No results */}
|
|
203
|
+
{favorites.length === 0 && others.length === 0 && (
|
|
204
|
+
<div className="px-3 py-4 text-center">
|
|
205
|
+
<span className="text-xs font-mono text-muted-foreground/50">
|
|
206
|
+
No themes match "{search}"
|
|
207
|
+
</span>
|
|
208
|
+
</div>
|
|
209
|
+
)}
|
|
210
|
+
</div>
|
|
211
|
+
</PopoverPopup>
|
|
212
|
+
</PopoverPositioner>
|
|
213
|
+
</PopoverPortal>
|
|
214
|
+
</Popover>
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Individual theme option in the dropdown list.
|
|
220
|
+
*/
|
|
221
|
+
function ThemeOption({
|
|
222
|
+
name,
|
|
223
|
+
isActive,
|
|
224
|
+
onSelect,
|
|
225
|
+
}: {
|
|
226
|
+
name: string;
|
|
227
|
+
isActive: boolean;
|
|
228
|
+
onSelect: (name: string) => void;
|
|
229
|
+
}) {
|
|
230
|
+
return (
|
|
231
|
+
<button
|
|
232
|
+
type="button"
|
|
233
|
+
onClick={() => onSelect(name)}
|
|
234
|
+
className={cn(
|
|
235
|
+
'w-full text-left px-3 py-1.5 text-xs font-mono transition-colors',
|
|
236
|
+
'hover:bg-muted/20',
|
|
237
|
+
isActive
|
|
238
|
+
? 'text-primary bg-primary/10'
|
|
239
|
+
: 'text-foreground/80'
|
|
240
|
+
)}
|
|
241
|
+
>
|
|
242
|
+
{isActive && (
|
|
243
|
+
<span className="inline-block w-1.5 h-1.5 rounded-full bg-primary mr-2 align-middle" />
|
|
244
|
+
)}
|
|
245
|
+
{name}
|
|
246
|
+
</button>
|
|
247
|
+
);
|
|
248
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Panel Module.
|
|
3
|
+
*
|
|
4
|
+
* Complete terminal panel with session tabs, header, filter tabs,
|
|
5
|
+
* action bar, display, and footer. Ghostty-inspired design with
|
|
6
|
+
* glassmorphism effects and premium visual details.
|
|
7
|
+
*
|
|
8
|
+
* @module components/devenv/terminal/panel
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// Main components
|
|
12
|
+
export { TerminalLogsPanel } from './TerminalLogsPanel';
|
|
13
|
+
export { TerminalInteractivePanel } from './TerminalInteractivePanel';
|
|
14
|
+
export { TerminalInteractivePanelRestty } from './TerminalInteractivePanelRestty';
|
|
15
|
+
export { TerminalPanelChrome } from './TerminalPanelChrome';
|
|
16
|
+
|
|
17
|
+
// Settings UI
|
|
18
|
+
export { TerminalSettingsPopover } from './TerminalSettingsPopover';
|
|
19
|
+
export { TerminalThemeSelector } from './TerminalThemeSelector';
|
|
20
|
+
|
|
21
|
+
// Debug panel
|
|
22
|
+
export { TerminalDebugPanel, type ITerminalDebugPanelProps } from './TerminalDebugPanel';
|
|
23
|
+
|
|
24
|
+
// Shared constants (noise texture, scroll styles)
|
|
25
|
+
export { NOISE_TEXTURE_SVG, terminalScrollStyles } from './TerminalPanelChrome';
|
|
26
|
+
|
|
27
|
+
// Sub-components
|
|
28
|
+
export { TerminalPanelHeader } from './TerminalPanelHeader';
|
|
29
|
+
export { TerminalPanelFooter } from './TerminalPanelFooter';
|
|
30
|
+
|
|
31
|
+
// Ghostty-inspired components
|
|
32
|
+
export { TerminalSessionTabs } from './TerminalSessionTabs';
|
|
33
|
+
export { TerminalFilterTabs } from './TerminalFilterTabs';
|
|
34
|
+
export { TerminalFilterDropdown } from './TerminalFilterDropdown';
|
|
35
|
+
export { TerminalSessionControl } from './TerminalSessionControl';
|
|
36
|
+
|
|
37
|
+
// React viewer components
|
|
38
|
+
export { LogLinesViewer } from './LogLinesViewer';
|
|
39
|
+
|
|
40
|
+
// Types - Chrome
|
|
41
|
+
export type { ITerminalPanelChromeProps } from './TerminalPanelChrome.types';
|
|
42
|
+
|
|
43
|
+
// Types - Interactive panel
|
|
44
|
+
export type {
|
|
45
|
+
ITerminalInteractivePanelProps,
|
|
46
|
+
ITerminalInteractivePanelRef,
|
|
47
|
+
} from './TerminalInteractivePanel.types';
|
|
48
|
+
|
|
49
|
+
// Types - Theme selector
|
|
50
|
+
export type { ITerminalThemeSelectorProps } from './TerminalThemeSelector';
|
|
51
|
+
|
|
52
|
+
// Types - Logs panel and sub-components
|
|
53
|
+
export type {
|
|
54
|
+
ITerminalLogsPanelProps,
|
|
55
|
+
ITerminalLogsPanelRef,
|
|
56
|
+
ITerminalPanelHeaderProps,
|
|
57
|
+
ITerminalPanelToolbarProps,
|
|
58
|
+
ITerminalPanelFooterProps,
|
|
59
|
+
ITerminalSession,
|
|
60
|
+
ITerminalSessionTabsProps,
|
|
61
|
+
ITerminalFilterTabsProps,
|
|
62
|
+
ITerminalFilterDropdownProps,
|
|
63
|
+
ITerminalSessionControlProps,
|
|
64
|
+
TLogLevelFilter,
|
|
65
|
+
ILevelFilterButton,
|
|
66
|
+
TTerminalAction,
|
|
67
|
+
TLogLevel,
|
|
68
|
+
} from './TerminalLogsPanel.types';
|
|
69
|
+
|
|
70
|
+
export type {
|
|
71
|
+
ILogLinesViewerProps,
|
|
72
|
+
} from './LogLinesViewer';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalFilterDropdown Styles.
|
|
3
|
+
*
|
|
4
|
+
* Uses CSS Anchor Positioning API for dropdown placement.
|
|
5
|
+
* Button acts as anchor, dropdown is positioned relative to it
|
|
6
|
+
* with automatic flip behavior at viewport edges.
|
|
7
|
+
*
|
|
8
|
+
* @module components/devenv/terminal/panel/terminal-filter-dropdown/styles
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/* Trigger button - acts as CSS anchor */
|
|
12
|
+
.triggerButton {
|
|
13
|
+
anchor-name: --filter-dropdown-anchor;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Dropdown menu - anchored to trigger button */
|
|
17
|
+
.dropdownMenu {
|
|
18
|
+
position-anchor: --filter-dropdown-anchor;
|
|
19
|
+
position: fixed;
|
|
20
|
+
|
|
21
|
+
/* Position below and left-aligned */
|
|
22
|
+
left: anchor(left);
|
|
23
|
+
top: anchor(bottom);
|
|
24
|
+
margin-top: 4px;
|
|
25
|
+
|
|
26
|
+
/* Flip to above if no room below */
|
|
27
|
+
position-try-fallbacks: flip-block, flip-inline;
|
|
28
|
+
|
|
29
|
+
min-width: 180px;
|
|
30
|
+
z-index: 50;
|
|
31
|
+
|
|
32
|
+
/* Hidden by default */
|
|
33
|
+
display: none;
|
|
34
|
+
opacity: 0;
|
|
35
|
+
transform: translateY(-4px);
|
|
36
|
+
transition: opacity 0.15s ease-out, transform 0.15s ease-out;
|
|
37
|
+
pointer-events: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.dropdownMenu[data-open="true"] {
|
|
41
|
+
display: block;
|
|
42
|
+
opacity: 1;
|
|
43
|
+
transform: translateY(0);
|
|
44
|
+
pointer-events: auto;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Fallback for browsers without CSS Anchor Positioning */
|
|
48
|
+
@supports not (anchor-name: none) {
|
|
49
|
+
.dropdownMenu {
|
|
50
|
+
position: absolute;
|
|
51
|
+
left: 0;
|
|
52
|
+
top: calc(100% + 4px);
|
|
53
|
+
z-index: 50;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.dropdownMenu[data-open="true"] {
|
|
57
|
+
display: block;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalSessionTabs Dropdown Styles.
|
|
3
|
+
*
|
|
4
|
+
* Uses CSS Anchor Positioning API for the "add container" dropdown.
|
|
5
|
+
* The + button acts as anchor, dropdown is positioned below it
|
|
6
|
+
* with automatic flip behavior at viewport edges.
|
|
7
|
+
*
|
|
8
|
+
* @module components/devenv/terminal/panel/terminal-session-tabs/styles
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/* + button - acts as CSS anchor */
|
|
12
|
+
.addButton {
|
|
13
|
+
anchor-name: --session-tabs-add-anchor;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Container dropdown - anchored to + button */
|
|
17
|
+
.containerDropdown {
|
|
18
|
+
position-anchor: --session-tabs-add-anchor;
|
|
19
|
+
position: fixed;
|
|
20
|
+
|
|
21
|
+
/* Position below and left-aligned */
|
|
22
|
+
left: anchor(left);
|
|
23
|
+
top: anchor(bottom);
|
|
24
|
+
margin-top: 4px;
|
|
25
|
+
|
|
26
|
+
/* Flip to above if no room below */
|
|
27
|
+
position-try-fallbacks: flip-block, flip-inline;
|
|
28
|
+
|
|
29
|
+
min-width: 200px;
|
|
30
|
+
z-index: 50;
|
|
31
|
+
|
|
32
|
+
/* Hidden by default */
|
|
33
|
+
display: none;
|
|
34
|
+
opacity: 0;
|
|
35
|
+
transform: translateY(-4px);
|
|
36
|
+
transition: opacity 0.15s ease-out, transform 0.15s ease-out;
|
|
37
|
+
pointer-events: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.containerDropdown[data-open="true"] {
|
|
41
|
+
display: block;
|
|
42
|
+
opacity: 1;
|
|
43
|
+
transform: translateY(0);
|
|
44
|
+
pointer-events: auto;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Fallback for browsers without CSS Anchor Positioning */
|
|
48
|
+
@supports not (anchor-name: none) {
|
|
49
|
+
.containerDropdown {
|
|
50
|
+
position: absolute;
|
|
51
|
+
left: 0;
|
|
52
|
+
top: calc(100% + 4px);
|
|
53
|
+
z-index: 50;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.containerDropdown[data-open="true"] {
|
|
57
|
+
display: block;
|
|
58
|
+
}
|
|
59
|
+
}
|