@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,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalFilterTabs Component.
|
|
3
|
+
*
|
|
4
|
+
* Tab-style filter buttons with badge counts and glow effects.
|
|
5
|
+
* Replaces pill-style filter buttons with Ghostty-inspired tab design.
|
|
6
|
+
*
|
|
7
|
+
* @module components/devenv/terminal/panel/filter-tabs
|
|
8
|
+
*/
|
|
9
|
+
import type { TLogLevelFilter, TLogLevel } from './TerminalLogsPanel.types';
|
|
10
|
+
/**
|
|
11
|
+
* Props for TerminalFilterTabs component.
|
|
12
|
+
*/
|
|
13
|
+
export interface ITerminalFilterTabsProps {
|
|
14
|
+
/** Current log level filter */
|
|
15
|
+
filterLevel: TLogLevelFilter;
|
|
16
|
+
/** Log level counts for badges */
|
|
17
|
+
levelCounts: Partial<Record<TLogLevel, number>>;
|
|
18
|
+
/** Callback when filter level changes */
|
|
19
|
+
onFilterChange: (level: TLogLevelFilter) => void;
|
|
20
|
+
/** Custom class name */
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* TerminalFilterTabs Component.
|
|
25
|
+
*
|
|
26
|
+
* Displays tab-style filter buttons with:
|
|
27
|
+
* - Tab-style layout (not pill buttons)
|
|
28
|
+
* - Badge count integration with glow on active
|
|
29
|
+
* - Keyboard shortcuts in tooltips
|
|
30
|
+
* - Compact horizontal arrangement
|
|
31
|
+
* - Smooth animations on state changes
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* <TerminalFilterTabs
|
|
36
|
+
* filterLevel="all"
|
|
37
|
+
* levelCounts={{ info: 42, warn: 3, error: 1 }}
|
|
38
|
+
* onFilterChange={(level) => setFilterLevel(level)}
|
|
39
|
+
* />
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function TerminalFilterTabs({ filterLevel, levelCounts, onFilterChange, className, }: ITerminalFilterTabsProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
//# sourceMappingURL=TerminalFilterTabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalFilterTabs.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/blocks/Terminal/panel/TerminalFilterTabs.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,+BAA+B;IAC/B,WAAW,EAAE,eAAe,CAAC;IAE7B,kCAAkC;IAClC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhD,yCAAyC;IACzC,cAAc,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAEjD,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,WAAW,EACX,cAAc,EACd,SAAS,GACV,EAAE,wBAAwB,2CA6D1B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalInteractivePanel Router.
|
|
3
|
+
*
|
|
4
|
+
* Thin router that delegates to the xterm or restty panel based on
|
|
5
|
+
* the `renderer` prop or global terminal settings. Both panels are
|
|
6
|
+
* lazy-loaded for code-splitting — restty's WASM bundle is only
|
|
7
|
+
* fetched when the user selects the GPU renderer.
|
|
8
|
+
*
|
|
9
|
+
* @module components/devenv/terminal/panel/interactive
|
|
10
|
+
*/
|
|
11
|
+
import type { ITerminalInteractivePanelProps, ITerminalInteractivePanelRef } from './TerminalInteractivePanel.types';
|
|
12
|
+
/**
|
|
13
|
+
* TerminalInteractivePanel Component.
|
|
14
|
+
*
|
|
15
|
+
* Routes to the appropriate renderer-specific panel. The `renderer`
|
|
16
|
+
* prop overrides the global setting from `useTerminalSettings`,
|
|
17
|
+
* allowing per-panel control when needed.
|
|
18
|
+
*
|
|
19
|
+
* Consumer code is unchanged — same component name, same props, same ref.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* // Uses global setting (default: xterm)
|
|
24
|
+
* <TerminalInteractivePanel
|
|
25
|
+
* containerName="mks-devenv"
|
|
26
|
+
* wsUrl="ws://localhost:3100/terminal/session-1"
|
|
27
|
+
* />
|
|
28
|
+
*
|
|
29
|
+
* // Force restty renderer for this instance
|
|
30
|
+
* <TerminalInteractivePanel
|
|
31
|
+
* renderer="restty"
|
|
32
|
+
* containerName="mks-devenv"
|
|
33
|
+
* wsUrl="ws://localhost:3100/terminal/session-1"
|
|
34
|
+
* />
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare const TerminalInteractivePanel: import("react").ForwardRefExoticComponent<ITerminalInteractivePanelProps & import("react").RefAttributes<ITerminalInteractivePanelRef>>;
|
|
38
|
+
//# sourceMappingURL=TerminalInteractivePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalInteractivePanel.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAUrH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,yIAgBnC,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useTerminalSettings } from "../hooks/useTerminalSettings.js";
|
|
4
|
+
import { Suspense, forwardRef, lazy } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.tsx
|
|
8
|
+
/**
|
|
9
|
+
* TerminalInteractivePanel Router.
|
|
10
|
+
*
|
|
11
|
+
* Thin router that delegates to the xterm or restty panel based on
|
|
12
|
+
* the `renderer` prop or global terminal settings. Both panels are
|
|
13
|
+
* lazy-loaded for code-splitting — restty's WASM bundle is only
|
|
14
|
+
* fetched when the user selects the GPU renderer.
|
|
15
|
+
*
|
|
16
|
+
* @module components/devenv/terminal/panel/interactive
|
|
17
|
+
*/
|
|
18
|
+
const TerminalInteractivePanelXterm = lazy(() => import("./TerminalInteractivePanelXterm.js").then((m) => ({ default: m.TerminalInteractivePanelXterm })));
|
|
19
|
+
const TerminalInteractivePanelRestty = lazy(() => import("./TerminalInteractivePanelRestty.js").then((m) => ({ default: m.TerminalInteractivePanelRestty })));
|
|
20
|
+
/**
|
|
21
|
+
* TerminalInteractivePanel Component.
|
|
22
|
+
*
|
|
23
|
+
* Routes to the appropriate renderer-specific panel. The `renderer`
|
|
24
|
+
* prop overrides the global setting from `useTerminalSettings`,
|
|
25
|
+
* allowing per-panel control when needed.
|
|
26
|
+
*
|
|
27
|
+
* Consumer code is unchanged — same component name, same props, same ref.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* // Uses global setting (default: xterm)
|
|
32
|
+
* <TerminalInteractivePanel
|
|
33
|
+
* containerName="mks-devenv"
|
|
34
|
+
* wsUrl="ws://localhost:3100/terminal/session-1"
|
|
35
|
+
* />
|
|
36
|
+
*
|
|
37
|
+
* // Force restty renderer for this instance
|
|
38
|
+
* <TerminalInteractivePanel
|
|
39
|
+
* renderer="restty"
|
|
40
|
+
* containerName="mks-devenv"
|
|
41
|
+
* wsUrl="ws://localhost:3100/terminal/session-1"
|
|
42
|
+
* />
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
const TerminalInteractivePanel = forwardRef((props, ref) => {
|
|
46
|
+
const { settings } = useTerminalSettings();
|
|
47
|
+
const renderer = props.renderer ?? settings.renderer;
|
|
48
|
+
return /* @__PURE__ */ jsx(Suspense, {
|
|
49
|
+
fallback: /* @__PURE__ */ jsx("div", { className: "min-h-[400px] bg-[#241B2F]" }),
|
|
50
|
+
children: renderer === "restty" ? /* @__PURE__ */ jsx(TerminalInteractivePanelRestty, {
|
|
51
|
+
ref,
|
|
52
|
+
...props
|
|
53
|
+
}) : /* @__PURE__ */ jsx(TerminalInteractivePanelXterm, {
|
|
54
|
+
ref,
|
|
55
|
+
...props
|
|
56
|
+
})
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
TerminalInteractivePanel.displayName = "TerminalInteractivePanel";
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { TerminalInteractivePanel };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for TerminalInteractivePanel component.
|
|
3
|
+
*
|
|
4
|
+
* @module components/devenv/terminal/panel/interactive/types
|
|
5
|
+
*/
|
|
6
|
+
import type { ITerminalSession } from './TerminalLogsPanel.types';
|
|
7
|
+
/**
|
|
8
|
+
* Props for TerminalInteractivePanel component.
|
|
9
|
+
*
|
|
10
|
+
* Configures the interactive terminal with WebSocket connection,
|
|
11
|
+
* session management, and lifecycle callbacks.
|
|
12
|
+
*/
|
|
13
|
+
export interface ITerminalInteractivePanelProps {
|
|
14
|
+
/** Container/session name displayed in header */
|
|
15
|
+
containerName: string;
|
|
16
|
+
/** WebSocket URL for terminal connection (ws:// or wss://) */
|
|
17
|
+
wsUrl: string;
|
|
18
|
+
/**
|
|
19
|
+
* Terminal renderer to use.
|
|
20
|
+
* - `xterm`: xterm.js DOM/canvas renderer (default)
|
|
21
|
+
* - `restty`: GPU-accelerated WebGPU/WebGL2 renderer
|
|
22
|
+
*/
|
|
23
|
+
renderer?: 'xterm' | 'restty';
|
|
24
|
+
/**
|
|
25
|
+
* PTY backend type.
|
|
26
|
+
* - `nodepty`: node-pty via WebSocket (default)
|
|
27
|
+
* - `webcontainer`: @webcontainer/api in-browser
|
|
28
|
+
*/
|
|
29
|
+
ptyBackend?: 'nodepty' | 'webcontainer';
|
|
30
|
+
/** Session tabs (optional for single-session mode) */
|
|
31
|
+
sessions?: ITerminalSession[];
|
|
32
|
+
/** Currently active session ID */
|
|
33
|
+
activeSessionId?: string | null;
|
|
34
|
+
/** Callback when session tab is clicked */
|
|
35
|
+
onSessionChange?: (sessionId: string) => void;
|
|
36
|
+
/** Callback when session tab close is clicked */
|
|
37
|
+
onSessionClose?: (sessionId: string) => void;
|
|
38
|
+
/** Callback when new session button is clicked */
|
|
39
|
+
onNewSession?: () => void;
|
|
40
|
+
/** Lifecycle: connection established */
|
|
41
|
+
onConnect?: () => void;
|
|
42
|
+
/** Lifecycle: connection lost */
|
|
43
|
+
onDisconnect?: () => void;
|
|
44
|
+
/** Lifecycle: error occurred */
|
|
45
|
+
onError?: (error: string) => void;
|
|
46
|
+
/** Custom class name */
|
|
47
|
+
className?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Imperative handle for TerminalInteractivePanel.
|
|
51
|
+
*
|
|
52
|
+
* Exposes terminal control methods to parent components
|
|
53
|
+
* via React.forwardRef + useImperativeHandle.
|
|
54
|
+
*/
|
|
55
|
+
export interface ITerminalInteractivePanelRef {
|
|
56
|
+
/** Write text directly to terminal display */
|
|
57
|
+
write: (text: string) => void;
|
|
58
|
+
/** Clear terminal display */
|
|
59
|
+
clear: () => void;
|
|
60
|
+
/** Focus terminal for input */
|
|
61
|
+
focus: () => void;
|
|
62
|
+
/** Send raw input to backend via WebSocket */
|
|
63
|
+
sendInput: (data: string) => void;
|
|
64
|
+
/** Check if WebSocket is connected */
|
|
65
|
+
isConnected: () => boolean;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=TerminalInteractivePanel.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalInteractivePanel.types.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/blocks/Terminal/panel/TerminalInteractivePanel.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE;;;;;GAKG;AACH,MAAM,WAAW,8BAA8B;IAC7C,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IAEtB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAE9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC;IAExC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAE9B,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC,2CAA2C;IAC3C,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9C,iDAAiD;IACjD,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAE1B,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IAEvB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAE1B,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C,8CAA8C;IAC9C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAE9B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,8CAA8C;IAC9C,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,sCAAsC;IACtC,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalInteractivePanelRestty Component.
|
|
3
|
+
*
|
|
4
|
+
* Interactive terminal panel using restty's GPU-accelerated renderer.
|
|
5
|
+
* Mirrors TerminalInteractivePanel's UI (Ghostty chrome, action bar,
|
|
6
|
+
* footer) but uses restty for rendering and its own PTY transport
|
|
7
|
+
* instead of useTerminalWebSocket.
|
|
8
|
+
*
|
|
9
|
+
* @module components/devenv/terminal/panel/interactive-restty
|
|
10
|
+
*/
|
|
11
|
+
import type { ITerminalInteractivePanelProps, ITerminalInteractivePanelRef } from './TerminalInteractivePanel.types';
|
|
12
|
+
/**
|
|
13
|
+
* TerminalInteractivePanelRestty Component.
|
|
14
|
+
*
|
|
15
|
+
* GPU-accelerated interactive terminal combining:
|
|
16
|
+
* - TerminalPanelChrome (Ghostty glassmorphism shell)
|
|
17
|
+
* - restty with WebGPU/WebGL2 rendering
|
|
18
|
+
* - Custom DevenvPtyTransport for mks-devenv WebSocket protocol
|
|
19
|
+
* - Action bar (clear, font size controls, reconnect)
|
|
20
|
+
* - Footer with connection status and terminal dimensions
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <TerminalInteractivePanelRestty
|
|
25
|
+
* containerName="mks-devenv"
|
|
26
|
+
* wsUrl="ws://localhost:3100/terminal/session-1"
|
|
27
|
+
* onConnect={() => console.log('Connected')}
|
|
28
|
+
* />
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const TerminalInteractivePanelRestty: import("react").ForwardRefExoticComponent<Omit<ITerminalInteractivePanelProps, "renderer" | "ptyBackend"> & import("react").RefAttributes<ITerminalInteractivePanelRef>>;
|
|
32
|
+
//# sourceMappingURL=TerminalInteractivePanelRestty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalInteractivePanelRestty.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AA0BrH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,8BAA8B,0KA0T1C,CAAC"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { cn } from "../../../lib/utils.js";
|
|
4
|
+
import { DeleteIcon } from "../../../icons/lucide-animated/delete.js";
|
|
5
|
+
import { PlusIcon } from "../../../icons/lucide-animated/plus.js";
|
|
6
|
+
import { TerminalIcon } from "../../../icons/lucide-animated/terminal.js";
|
|
7
|
+
import "../../../icons/lucide-animated/index.js";
|
|
8
|
+
import { useTerminalSettings } from "../hooks/useTerminalSettings.js";
|
|
9
|
+
import { TerminalPanelChrome } from "./TerminalPanelChrome.js";
|
|
10
|
+
import { TerminalRestty } from "../TerminalRestty.js";
|
|
11
|
+
import { TerminalSettingsPopover } from "./TerminalSettingsPopover.js";
|
|
12
|
+
import { TerminalDebugPanel } from "./TerminalDebugPanel.js";
|
|
13
|
+
import { forwardRef, useCallback, useImperativeHandle, useRef, useState } from "react";
|
|
14
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
+
|
|
16
|
+
//#region src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelRestty.tsx
|
|
17
|
+
/**
|
|
18
|
+
* TerminalInteractivePanelRestty Component.
|
|
19
|
+
*
|
|
20
|
+
* Interactive terminal panel using restty's GPU-accelerated renderer.
|
|
21
|
+
* Mirrors TerminalInteractivePanel's UI (Ghostty chrome, action bar,
|
|
22
|
+
* footer) but uses restty for rendering and its own PTY transport
|
|
23
|
+
* instead of useTerminalWebSocket.
|
|
24
|
+
*
|
|
25
|
+
* @module components/devenv/terminal/panel/interactive-restty
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Min/max font size bounds.
|
|
29
|
+
*/
|
|
30
|
+
const MIN_FONT_SIZE = 10;
|
|
31
|
+
const MAX_FONT_SIZE = 24;
|
|
32
|
+
/**
|
|
33
|
+
* Action button base styles.
|
|
34
|
+
*/
|
|
35
|
+
const actionBtnStyles = "h-8 px-2 rounded-md transition-all hover:bg-muted/20 active:bg-muted/30 flex items-center justify-center gap-1 text-xs font-mono text-muted-foreground hover:text-foreground flex-shrink-0";
|
|
36
|
+
/**
|
|
37
|
+
* TerminalInteractivePanelRestty Component.
|
|
38
|
+
*
|
|
39
|
+
* GPU-accelerated interactive terminal combining:
|
|
40
|
+
* - TerminalPanelChrome (Ghostty glassmorphism shell)
|
|
41
|
+
* - restty with WebGPU/WebGL2 rendering
|
|
42
|
+
* - Custom DevenvPtyTransport for mks-devenv WebSocket protocol
|
|
43
|
+
* - Action bar (clear, font size controls, reconnect)
|
|
44
|
+
* - Footer with connection status and terminal dimensions
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```tsx
|
|
48
|
+
* <TerminalInteractivePanelRestty
|
|
49
|
+
* containerName="mks-devenv"
|
|
50
|
+
* wsUrl="ws://localhost:3100/terminal/session-1"
|
|
51
|
+
* onConnect={() => console.log('Connected')}
|
|
52
|
+
* />
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
const TerminalInteractivePanelRestty = forwardRef(({ containerName, wsUrl, sessions, activeSessionId, onSessionChange, onSessionClose, onNewSession, onConnect, onDisconnect, onError, className }, ref) => {
|
|
56
|
+
const resttyRef = useRef(null);
|
|
57
|
+
const { settings } = useTerminalSettings();
|
|
58
|
+
const [fontSize, setFontSize] = useState(settings.fontSize);
|
|
59
|
+
const [dimensions, setDimensions] = useState({
|
|
60
|
+
cols: 80,
|
|
61
|
+
rows: 24
|
|
62
|
+
});
|
|
63
|
+
const [connectionStatus, setConnectionStatus] = useState("disconnected");
|
|
64
|
+
const [uptimeStart, setUptimeStart] = useState(null);
|
|
65
|
+
/**
|
|
66
|
+
* Handle PTY connection status changes from restty.
|
|
67
|
+
*/
|
|
68
|
+
const handlePtyStatus = useCallback((status) => {
|
|
69
|
+
if (status === "connected" || status === "attached" || status === "welcome" || status === "created") setConnectionStatus("connected");
|
|
70
|
+
else if (status === "connecting") setConnectionStatus("connecting");
|
|
71
|
+
else if (status === "error") setConnectionStatus("error");
|
|
72
|
+
}, []);
|
|
73
|
+
/**
|
|
74
|
+
* Handle PTY connection open.
|
|
75
|
+
*/
|
|
76
|
+
const handleConnect = useCallback(() => {
|
|
77
|
+
setConnectionStatus("connected");
|
|
78
|
+
setUptimeStart(Date.now());
|
|
79
|
+
onConnect?.();
|
|
80
|
+
}, [onConnect]);
|
|
81
|
+
/**
|
|
82
|
+
* Handle PTY connection close.
|
|
83
|
+
*/
|
|
84
|
+
const handleDisconnect = useCallback(() => {
|
|
85
|
+
setConnectionStatus("disconnected");
|
|
86
|
+
setUptimeStart(null);
|
|
87
|
+
onDisconnect?.();
|
|
88
|
+
}, [onDisconnect]);
|
|
89
|
+
/**
|
|
90
|
+
* Handle PTY errors.
|
|
91
|
+
*/
|
|
92
|
+
const handleError = useCallback((message) => {
|
|
93
|
+
setConnectionStatus("error");
|
|
94
|
+
onError?.(message);
|
|
95
|
+
}, [onError]);
|
|
96
|
+
/**
|
|
97
|
+
* Handle terminal resize from restty.
|
|
98
|
+
*/
|
|
99
|
+
const handleResize = useCallback((cols, rows) => {
|
|
100
|
+
setDimensions({
|
|
101
|
+
cols,
|
|
102
|
+
rows
|
|
103
|
+
});
|
|
104
|
+
}, []);
|
|
105
|
+
const isConnected = connectionStatus === "connected";
|
|
106
|
+
/**
|
|
107
|
+
* Clear terminal display.
|
|
108
|
+
*/
|
|
109
|
+
const handleClear = useCallback(() => {
|
|
110
|
+
resttyRef.current?.clear();
|
|
111
|
+
}, []);
|
|
112
|
+
/**
|
|
113
|
+
* Increase font size.
|
|
114
|
+
*/
|
|
115
|
+
const handleFontIncrease = useCallback(() => {
|
|
116
|
+
setFontSize((prev) => {
|
|
117
|
+
const next = Math.min(prev + 1, MAX_FONT_SIZE);
|
|
118
|
+
resttyRef.current?.setFontSize(next);
|
|
119
|
+
return next;
|
|
120
|
+
});
|
|
121
|
+
}, []);
|
|
122
|
+
/**
|
|
123
|
+
* Decrease font size.
|
|
124
|
+
*/
|
|
125
|
+
const handleFontDecrease = useCallback(() => {
|
|
126
|
+
setFontSize((prev) => {
|
|
127
|
+
const next = Math.max(prev - 1, MIN_FONT_SIZE);
|
|
128
|
+
resttyRef.current?.setFontSize(next);
|
|
129
|
+
return next;
|
|
130
|
+
});
|
|
131
|
+
}, []);
|
|
132
|
+
/**
|
|
133
|
+
* Reconnect to PTY.
|
|
134
|
+
*/
|
|
135
|
+
const handleReconnect = useCallback(() => {
|
|
136
|
+
if (!wsUrl) return;
|
|
137
|
+
resttyRef.current?.disconnectPty();
|
|
138
|
+
resttyRef.current?.connectPty(wsUrl);
|
|
139
|
+
setConnectionStatus("connecting");
|
|
140
|
+
}, [wsUrl]);
|
|
141
|
+
/**
|
|
142
|
+
* Expose imperative methods to parent.
|
|
143
|
+
*/
|
|
144
|
+
useImperativeHandle(ref, () => ({
|
|
145
|
+
write: (_text) => {},
|
|
146
|
+
clear: () => {
|
|
147
|
+
resttyRef.current?.clear();
|
|
148
|
+
},
|
|
149
|
+
focus: () => {
|
|
150
|
+
resttyRef.current?.focus();
|
|
151
|
+
},
|
|
152
|
+
sendInput: (data) => {
|
|
153
|
+
resttyRef.current?.sendInput(data);
|
|
154
|
+
},
|
|
155
|
+
isConnected: () => resttyRef.current?.isPtyConnected() ?? false
|
|
156
|
+
}));
|
|
157
|
+
/**
|
|
158
|
+
* Get connection status label with color.
|
|
159
|
+
*/
|
|
160
|
+
const getStatusLabel = () => {
|
|
161
|
+
switch (connectionStatus) {
|
|
162
|
+
case "connected": return {
|
|
163
|
+
text: "Connected (GPU)",
|
|
164
|
+
color: "text-success"
|
|
165
|
+
};
|
|
166
|
+
case "connecting": return {
|
|
167
|
+
text: "Connecting...",
|
|
168
|
+
color: "text-yellow-500"
|
|
169
|
+
};
|
|
170
|
+
case "error": return {
|
|
171
|
+
text: "Error",
|
|
172
|
+
color: "text-destructive"
|
|
173
|
+
};
|
|
174
|
+
default: return {
|
|
175
|
+
text: "Disconnected",
|
|
176
|
+
color: "text-muted-foreground"
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const statusLabel = getStatusLabel();
|
|
181
|
+
return /* @__PURE__ */ jsxs(TerminalPanelChrome, {
|
|
182
|
+
containerName,
|
|
183
|
+
isConnected,
|
|
184
|
+
crtEffect: settings.crtEffect,
|
|
185
|
+
sessions,
|
|
186
|
+
activeSessionId,
|
|
187
|
+
onSessionTabClick: onSessionChange,
|
|
188
|
+
onSessionClose,
|
|
189
|
+
onNewSession,
|
|
190
|
+
actionBar: /* @__PURE__ */ jsxs("div", {
|
|
191
|
+
className: "flex items-center gap-2 px-3 h-10 bg-muted/10 border-b border-white/10",
|
|
192
|
+
children: [
|
|
193
|
+
/* @__PURE__ */ jsxs("button", {
|
|
194
|
+
type: "button",
|
|
195
|
+
onClick: handleClear,
|
|
196
|
+
className: actionBtnStyles,
|
|
197
|
+
title: "Clear terminal",
|
|
198
|
+
children: [/* @__PURE__ */ jsx(DeleteIcon, { className: "w-3.5 h-3.5 flex-shrink-0" }), /* @__PURE__ */ jsx("span", { children: "Clear" })]
|
|
199
|
+
}),
|
|
200
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1" }),
|
|
201
|
+
/* @__PURE__ */ jsx(TerminalSettingsPopover, {}),
|
|
202
|
+
/* @__PURE__ */ jsx("span", {
|
|
203
|
+
className: "text-[10px] font-mono text-primary/70 uppercase tracking-wider px-1.5 py-0.5 rounded border border-primary/20 bg-primary/5",
|
|
204
|
+
children: "restty"
|
|
205
|
+
}),
|
|
206
|
+
connectionStatus === "disconnected" && /* @__PURE__ */ jsx("button", {
|
|
207
|
+
type: "button",
|
|
208
|
+
onClick: handleReconnect,
|
|
209
|
+
className: cn(actionBtnStyles, "text-primary hover:text-primary"),
|
|
210
|
+
title: "Reconnect",
|
|
211
|
+
children: "Reconnect"
|
|
212
|
+
}),
|
|
213
|
+
/* @__PURE__ */ jsxs("div", {
|
|
214
|
+
className: "flex items-center gap-1",
|
|
215
|
+
children: [
|
|
216
|
+
/* @__PURE__ */ jsx("span", {
|
|
217
|
+
className: "text-[10px] text-muted-foreground font-mono uppercase tracking-wider mr-1",
|
|
218
|
+
children: "Font"
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ jsx("button", {
|
|
221
|
+
type: "button",
|
|
222
|
+
onClick: handleFontDecrease,
|
|
223
|
+
className: cn(actionBtnStyles, "w-7 h-7 px-0"),
|
|
224
|
+
title: "Decrease font size",
|
|
225
|
+
disabled: fontSize <= MIN_FONT_SIZE,
|
|
226
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
227
|
+
className: "text-sm font-bold",
|
|
228
|
+
children: "−"
|
|
229
|
+
})
|
|
230
|
+
}),
|
|
231
|
+
/* @__PURE__ */ jsx("span", {
|
|
232
|
+
className: "text-xs font-mono text-foreground w-7 text-center",
|
|
233
|
+
children: fontSize
|
|
234
|
+
}),
|
|
235
|
+
/* @__PURE__ */ jsx("button", {
|
|
236
|
+
type: "button",
|
|
237
|
+
onClick: handleFontIncrease,
|
|
238
|
+
className: cn(actionBtnStyles, "w-7 h-7 px-0"),
|
|
239
|
+
title: "Increase font size",
|
|
240
|
+
disabled: fontSize >= MAX_FONT_SIZE,
|
|
241
|
+
children: /* @__PURE__ */ jsx(PlusIcon, { className: "w-3 h-3 flex-shrink-0" })
|
|
242
|
+
})
|
|
243
|
+
]
|
|
244
|
+
})
|
|
245
|
+
]
|
|
246
|
+
}),
|
|
247
|
+
footer: /* @__PURE__ */ jsxs("div", {
|
|
248
|
+
className: "flex items-center justify-between px-4 h-10 bg-muted/20 border-t border-white/10",
|
|
249
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
250
|
+
className: "flex items-center gap-3",
|
|
251
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
252
|
+
className: "flex items-center gap-1.5",
|
|
253
|
+
children: [/* @__PURE__ */ jsx("div", { className: cn("w-2 h-2 rounded-full transition-all duration-300", isConnected ? "bg-success/80 shadow-[0_0_8px_hsla(142,100%,62%,0.5)]" : connectionStatus === "connecting" ? "bg-yellow-500/80 animate-pulse" : connectionStatus === "error" ? "bg-destructive/80" : "bg-muted-foreground/60") }), /* @__PURE__ */ jsx("span", {
|
|
254
|
+
className: cn("text-xs font-mono", statusLabel.color),
|
|
255
|
+
children: statusLabel.text
|
|
256
|
+
})]
|
|
257
|
+
})
|
|
258
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
259
|
+
className: "flex items-center gap-3",
|
|
260
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
261
|
+
className: "text-xs font-mono text-muted-foreground",
|
|
262
|
+
children: [
|
|
263
|
+
dimensions.cols,
|
|
264
|
+
"×",
|
|
265
|
+
dimensions.rows
|
|
266
|
+
]
|
|
267
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
268
|
+
className: "text-xs font-mono text-muted-foreground",
|
|
269
|
+
children: [fontSize, "px"]
|
|
270
|
+
})]
|
|
271
|
+
})]
|
|
272
|
+
}),
|
|
273
|
+
className,
|
|
274
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
275
|
+
className: "relative min-h-[400px]",
|
|
276
|
+
children: [/* @__PURE__ */ jsx(TerminalRestty, {
|
|
277
|
+
ref: resttyRef,
|
|
278
|
+
wsUrl,
|
|
279
|
+
fontSize,
|
|
280
|
+
resttyThemeName: settings.resttyThemeName,
|
|
281
|
+
gpuRenderer: "auto",
|
|
282
|
+
onResize: handleResize,
|
|
283
|
+
onPtyStatus: handlePtyStatus,
|
|
284
|
+
onConnect: handleConnect,
|
|
285
|
+
onDisconnect: handleDisconnect,
|
|
286
|
+
onError: handleError,
|
|
287
|
+
className: "w-full h-full min-h-[400px] bg-[#241B2F]"
|
|
288
|
+
}), connectionStatus === "disconnected" && /* @__PURE__ */ jsx("div", {
|
|
289
|
+
className: "absolute inset-0 flex items-center justify-center bg-black/40 backdrop-blur-sm pointer-events-none",
|
|
290
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
291
|
+
className: "text-center pointer-events-auto",
|
|
292
|
+
children: [
|
|
293
|
+
/* @__PURE__ */ jsx(TerminalIcon, { className: "w-12 h-12 mx-auto mb-3 text-muted-foreground/50" }),
|
|
294
|
+
/* @__PURE__ */ jsx("p", {
|
|
295
|
+
className: "text-sm text-muted-foreground/70 font-mono mb-3",
|
|
296
|
+
children: "Terminal disconnected"
|
|
297
|
+
}),
|
|
298
|
+
/* @__PURE__ */ jsx("button", {
|
|
299
|
+
type: "button",
|
|
300
|
+
onClick: handleReconnect,
|
|
301
|
+
className: cn("px-4 py-2 rounded-lg text-sm font-mono transition-colors", "bg-primary/20 text-primary hover:bg-primary/30", "border border-primary/40", "shadow-[0_0_10px_hsla(330,85%,43%,0.2)]"),
|
|
302
|
+
children: "Reconnect"
|
|
303
|
+
})
|
|
304
|
+
]
|
|
305
|
+
})
|
|
306
|
+
})]
|
|
307
|
+
}), /* @__PURE__ */ jsx(TerminalDebugPanel, {
|
|
308
|
+
visible: settings.debugPanel,
|
|
309
|
+
renderer: connectionStatus === "connected" ? "restty (GPU)" : void 0,
|
|
310
|
+
gridSize: dimensions.cols > 0 ? {
|
|
311
|
+
cols: dimensions.cols,
|
|
312
|
+
rows: dimensions.rows
|
|
313
|
+
} : void 0,
|
|
314
|
+
font: `JetBrains Mono ${fontSize}px`,
|
|
315
|
+
ptyStatus: connectionStatus,
|
|
316
|
+
ptyUrl: wsUrl,
|
|
317
|
+
themeName: settings.resttyThemeName,
|
|
318
|
+
crtEffect: settings.crtEffect,
|
|
319
|
+
uptimeSeconds: uptimeStart ? Math.floor((Date.now() - uptimeStart) / 1e3) : 0
|
|
320
|
+
})]
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
TerminalInteractivePanelRestty.displayName = "TerminalInteractivePanelRestty";
|
|
324
|
+
|
|
325
|
+
//#endregion
|
|
326
|
+
export { TerminalInteractivePanelRestty };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalInteractivePanelXterm Component.
|
|
3
|
+
*
|
|
4
|
+
* Full interactive terminal panel with WebSocket-backed I/O,
|
|
5
|
+
* Ghostty-inspired chrome (via TerminalPanelChrome), xterm.js
|
|
6
|
+
* rendering, and action bar controls. Includes settings popover.
|
|
7
|
+
*
|
|
8
|
+
* @module components/devenv/terminal/panel/interactive-xterm
|
|
9
|
+
*/
|
|
10
|
+
import type { ITerminalInteractivePanelProps, ITerminalInteractivePanelRef } from './TerminalInteractivePanel.types';
|
|
11
|
+
import '@xterm/xterm/css/xterm.css';
|
|
12
|
+
/**
|
|
13
|
+
* TerminalInteractivePanelXterm Component.
|
|
14
|
+
*
|
|
15
|
+
* Interactive terminal panel combining:
|
|
16
|
+
* - TerminalPanelChrome (Ghostty glassmorphism shell)
|
|
17
|
+
* - xterm.js with interactive mode (cursorBlink, stdin enabled)
|
|
18
|
+
* - WebSocket connection via useTerminalWebSocket
|
|
19
|
+
* - Action bar (clear, settings, font size controls)
|
|
20
|
+
* - Footer with connection status and terminal dimensions
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* const termRef = useRef<ITerminalInteractivePanelRef>(null);
|
|
25
|
+
*
|
|
26
|
+
* <TerminalInteractivePanelXterm
|
|
27
|
+
* ref={termRef}
|
|
28
|
+
* containerName="mks-devenv"
|
|
29
|
+
* wsUrl="ws://localhost:3100/terminal/session-1"
|
|
30
|
+
* onConnect={() => console.log('Connected')}
|
|
31
|
+
* onDisconnect={() => console.log('Disconnected')}
|
|
32
|
+
* />
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare const TerminalInteractivePanelXterm: import("react").ForwardRefExoticComponent<ITerminalInteractivePanelProps & import("react").RefAttributes<ITerminalInteractivePanelRef>>;
|
|
36
|
+
//# sourceMappingURL=TerminalInteractivePanelXterm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalInteractivePanelXterm.d.ts","sourceRoot":"","sources":["../../../../../src/react-ui/blocks/Terminal/panel/TerminalInteractivePanelXterm.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,OAAO,KAAK,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAKrH,OAAO,4BAA4B,CAAC;AAoBpC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,6BAA6B,yIAyWzC,CAAC"}
|