@molecule/app-ide-react 1.0.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/LICENSE +115 -0
- package/dist/chatTimelineOrdering.d.ts +50 -0
- package/dist/chatTimelineOrdering.d.ts.map +1 -0
- package/dist/chatTimelineOrdering.js +46 -0
- package/dist/chatTimelineOrdering.js.map +1 -0
- package/dist/command-metadata.d.ts +78 -0
- package/dist/command-metadata.d.ts.map +1 -0
- package/dist/command-metadata.js +214 -0
- package/dist/command-metadata.js.map +1 -0
- package/dist/components/ActivityCard.d.ts +28 -0
- package/dist/components/ActivityCard.d.ts.map +1 -0
- package/dist/components/ActivityCard.js +62 -0
- package/dist/components/ActivityCard.js.map +1 -0
- package/dist/components/AutoCommitBadge.d.ts +58 -0
- package/dist/components/AutoCommitBadge.d.ts.map +1 -0
- package/dist/components/AutoCommitBadge.js +78 -0
- package/dist/components/AutoCommitBadge.js.map +1 -0
- package/dist/components/ChatPanel.d.ts +184 -0
- package/dist/components/ChatPanel.d.ts.map +1 -0
- package/dist/components/ChatPanel.js +6691 -0
- package/dist/components/ChatPanel.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +18 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +33 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/DeviceFrameSelector.d.ts +60 -0
- package/dist/components/DeviceFrameSelector.d.ts.map +1 -0
- package/dist/components/DeviceFrameSelector.js +230 -0
- package/dist/components/DeviceFrameSelector.js.map +1 -0
- package/dist/components/EditorPanel.d.ts +17 -0
- package/dist/components/EditorPanel.d.ts.map +1 -0
- package/dist/components/EditorPanel.js +241 -0
- package/dist/components/EditorPanel.js.map +1 -0
- package/dist/components/FileExplorer.d.ts +64 -0
- package/dist/components/FileExplorer.d.ts.map +1 -0
- package/dist/components/FileExplorer.js +1111 -0
- package/dist/components/FileExplorer.js.map +1 -0
- package/dist/components/FileExplorerContextMenu.d.ts +37 -0
- package/dist/components/FileExplorerContextMenu.d.ts.map +1 -0
- package/dist/components/FileExplorerContextMenu.js +241 -0
- package/dist/components/FileExplorerContextMenu.js.map +1 -0
- package/dist/components/HelpCard.d.ts +34 -0
- package/dist/components/HelpCard.d.ts.map +1 -0
- package/dist/components/HelpCard.js +28 -0
- package/dist/components/HelpCard.js.map +1 -0
- package/dist/components/Icon.d.ts +50 -0
- package/dist/components/Icon.d.ts.map +1 -0
- package/dist/components/Icon.js +25 -0
- package/dist/components/Icon.js.map +1 -0
- package/dist/components/KeyboardShortcutsPanel.d.ts +19 -0
- package/dist/components/KeyboardShortcutsPanel.d.ts.map +1 -0
- package/dist/components/KeyboardShortcutsPanel.js +187 -0
- package/dist/components/KeyboardShortcutsPanel.js.map +1 -0
- package/dist/components/MarkdownContent.d.ts +52 -0
- package/dist/components/MarkdownContent.d.ts.map +1 -0
- package/dist/components/MarkdownContent.js +303 -0
- package/dist/components/MarkdownContent.js.map +1 -0
- package/dist/components/ModelsTable.d.ts +38 -0
- package/dist/components/ModelsTable.d.ts.map +1 -0
- package/dist/components/ModelsTable.js +96 -0
- package/dist/components/ModelsTable.js.map +1 -0
- package/dist/components/PreviewPanel.d.ts +66 -0
- package/dist/components/PreviewPanel.d.ts.map +1 -0
- package/dist/components/PreviewPanel.js +1752 -0
- package/dist/components/PreviewPanel.js.map +1 -0
- package/dist/components/QuickOpen.d.ts +20 -0
- package/dist/components/QuickOpen.d.ts.map +1 -0
- package/dist/components/QuickOpen.js +72 -0
- package/dist/components/QuickOpen.js.map +1 -0
- package/dist/components/QuickPicker.d.ts +21 -0
- package/dist/components/QuickPicker.d.ts.map +1 -0
- package/dist/components/QuickPicker.js +174 -0
- package/dist/components/QuickPicker.js.map +1 -0
- package/dist/components/RelevantSkillSuggestion.d.ts +41 -0
- package/dist/components/RelevantSkillSuggestion.d.ts.map +1 -0
- package/dist/components/RelevantSkillSuggestion.js +85 -0
- package/dist/components/RelevantSkillSuggestion.js.map +1 -0
- package/dist/components/ReportModal.d.ts +35 -0
- package/dist/components/ReportModal.d.ts.map +1 -0
- package/dist/components/ReportModal.js +112 -0
- package/dist/components/ReportModal.js.map +1 -0
- package/dist/components/ResizeHandle.d.ts +21 -0
- package/dist/components/ResizeHandle.d.ts.map +1 -0
- package/dist/components/ResizeHandle.js +109 -0
- package/dist/components/ResizeHandle.js.map +1 -0
- package/dist/components/ScriptsCard.d.ts +37 -0
- package/dist/components/ScriptsCard.d.ts.map +1 -0
- package/dist/components/ScriptsCard.js +177 -0
- package/dist/components/ScriptsCard.js.map +1 -0
- package/dist/components/SearchPanel.d.ts +18 -0
- package/dist/components/SearchPanel.d.ts.map +1 -0
- package/dist/components/SearchPanel.js +449 -0
- package/dist/components/SearchPanel.js.map +1 -0
- package/dist/components/SettingsCard.d.ts +49 -0
- package/dist/components/SettingsCard.d.ts.map +1 -0
- package/dist/components/SettingsCard.js +59 -0
- package/dist/components/SettingsCard.js.map +1 -0
- package/dist/components/ShareModal.d.ts +32 -0
- package/dist/components/ShareModal.d.ts.map +1 -0
- package/dist/components/ShareModal.js +126 -0
- package/dist/components/ShareModal.js.map +1 -0
- package/dist/components/SidebarTabs.d.ts +18 -0
- package/dist/components/SidebarTabs.d.ts.map +1 -0
- package/dist/components/SidebarTabs.js +20 -0
- package/dist/components/SidebarTabs.js.map +1 -0
- package/dist/components/SkillsCard.d.ts +86 -0
- package/dist/components/SkillsCard.d.ts.map +1 -0
- package/dist/components/SkillsCard.js +227 -0
- package/dist/components/SkillsCard.js.map +1 -0
- package/dist/components/StreamingIndicator.d.ts +50 -0
- package/dist/components/StreamingIndicator.d.ts.map +1 -0
- package/dist/components/StreamingIndicator.js +142 -0
- package/dist/components/StreamingIndicator.js.map +1 -0
- package/dist/components/TabBar.d.ts +37 -0
- package/dist/components/TabBar.d.ts.map +1 -0
- package/dist/components/TabBar.js +187 -0
- package/dist/components/TabBar.js.map +1 -0
- package/dist/components/TipCard.d.ts +22 -0
- package/dist/components/TipCard.d.ts.map +1 -0
- package/dist/components/TipCard.js +73 -0
- package/dist/components/TipCard.js.map +1 -0
- package/dist/components/ToolCallCard.d.ts +18 -0
- package/dist/components/ToolCallCard.d.ts.map +1 -0
- package/dist/components/ToolCallCard.js +716 -0
- package/dist/components/ToolCallCard.js.map +1 -0
- package/dist/components/UserAvatar.d.ts +45 -0
- package/dist/components/UserAvatar.d.ts.map +1 -0
- package/dist/components/UserAvatar.js +80 -0
- package/dist/components/UserAvatar.js.map +1 -0
- package/dist/components/WorkspaceLayout.d.ts +19 -0
- package/dist/components/WorkspaceLayout.d.ts.map +1 -0
- package/dist/components/WorkspaceLayout.js +56 -0
- package/dist/components/WorkspaceLayout.js.map +1 -0
- package/dist/components/activity-utilities.d.ts +107 -0
- package/dist/components/activity-utilities.d.ts.map +1 -0
- package/dist/components/activity-utilities.js +154 -0
- package/dist/components/activity-utilities.js.map +1 -0
- package/dist/components/chat-autocommit-utilities.d.ts +172 -0
- package/dist/components/chat-autocommit-utilities.d.ts.map +1 -0
- package/dist/components/chat-autocommit-utilities.js +185 -0
- package/dist/components/chat-autocommit-utilities.js.map +1 -0
- package/dist/components/chat-card-style.d.ts +64 -0
- package/dist/components/chat-card-style.d.ts.map +1 -0
- package/dist/components/chat-card-style.js +74 -0
- package/dist/components/chat-card-style.js.map +1 -0
- package/dist/components/chat-commands.d.ts +17 -0
- package/dist/components/chat-commands.d.ts.map +1 -0
- package/dist/components/chat-commands.js +17 -0
- package/dist/components/chat-commands.js.map +1 -0
- package/dist/components/chat-commit-utilities.d.ts +29 -0
- package/dist/components/chat-commit-utilities.d.ts.map +1 -0
- package/dist/components/chat-commit-utilities.js +31 -0
- package/dist/components/chat-commit-utilities.js.map +1 -0
- package/dist/components/chat-cost-utilities.d.ts +62 -0
- package/dist/components/chat-cost-utilities.d.ts.map +1 -0
- package/dist/components/chat-cost-utilities.js +66 -0
- package/dist/components/chat-cost-utilities.js.map +1 -0
- package/dist/components/chat-effort-utilities.d.ts +96 -0
- package/dist/components/chat-effort-utilities.d.ts.map +1 -0
- package/dist/components/chat-effort-utilities.js +97 -0
- package/dist/components/chat-effort-utilities.js.map +1 -0
- package/dist/components/chat-help-utilities.d.ts +89 -0
- package/dist/components/chat-help-utilities.d.ts.map +1 -0
- package/dist/components/chat-help-utilities.js +131 -0
- package/dist/components/chat-help-utilities.js.map +1 -0
- package/dist/components/chat-model-mode-utilities.d.ts +143 -0
- package/dist/components/chat-model-mode-utilities.d.ts.map +1 -0
- package/dist/components/chat-model-mode-utilities.js +191 -0
- package/dist/components/chat-model-mode-utilities.js.map +1 -0
- package/dist/components/chat-models-utilities.d.ts +98 -0
- package/dist/components/chat-models-utilities.d.ts.map +1 -0
- package/dist/components/chat-models-utilities.js +136 -0
- package/dist/components/chat-models-utilities.js.map +1 -0
- package/dist/components/chat-report-utilities.d.ts +149 -0
- package/dist/components/chat-report-utilities.d.ts.map +1 -0
- package/dist/components/chat-report-utilities.js +151 -0
- package/dist/components/chat-report-utilities.js.map +1 -0
- package/dist/components/chat-scripts-utilities.d.ts +140 -0
- package/dist/components/chat-scripts-utilities.d.ts.map +1 -0
- package/dist/components/chat-scripts-utilities.js +158 -0
- package/dist/components/chat-scripts-utilities.js.map +1 -0
- package/dist/components/chat-settings-utilities.d.ts +72 -0
- package/dist/components/chat-settings-utilities.d.ts.map +1 -0
- package/dist/components/chat-settings-utilities.js +56 -0
- package/dist/components/chat-settings-utilities.js.map +1 -0
- package/dist/components/chat-share-utilities.d.ts +104 -0
- package/dist/components/chat-share-utilities.d.ts.map +1 -0
- package/dist/components/chat-share-utilities.js +90 -0
- package/dist/components/chat-share-utilities.js.map +1 -0
- package/dist/components/chat-skills-utilities.d.ts +242 -0
- package/dist/components/chat-skills-utilities.d.ts.map +1 -0
- package/dist/components/chat-skills-utilities.js +433 -0
- package/dist/components/chat-skills-utilities.js.map +1 -0
- package/dist/components/chat-stream-utilities.d.ts +74 -0
- package/dist/components/chat-stream-utilities.d.ts.map +1 -0
- package/dist/components/chat-stream-utilities.js +103 -0
- package/dist/components/chat-stream-utilities.js.map +1 -0
- package/dist/components/chat-tips-utilities.d.ts +108 -0
- package/dist/components/chat-tips-utilities.d.ts.map +1 -0
- package/dist/components/chat-tips-utilities.js +137 -0
- package/dist/components/chat-tips-utilities.js.map +1 -0
- package/dist/components/device-cycle.d.ts +84 -0
- package/dist/components/device-cycle.d.ts.map +1 -0
- package/dist/components/device-cycle.js +77 -0
- package/dist/components/device-cycle.js.map +1 -0
- package/dist/components/index.d.ts +36 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +33 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/tool-call-utilities.d.ts +69 -0
- package/dist/components/tool-call-utilities.d.ts.map +1 -0
- package/dist/components/tool-call-utilities.js +368 -0
- package/dist/components/tool-call-utilities.js.map +1 -0
- package/dist/components/user-avatar-utilities.d.ts +41 -0
- package/dist/components/user-avatar-utilities.d.ts.map +1 -0
- package/dist/components/user-avatar-utilities.js +56 -0
- package/dist/components/user-avatar-utilities.js.map +1 -0
- package/dist/components/workspace-layout-utilities.d.ts +37 -0
- package/dist/components/workspace-layout-utilities.d.ts.map +1 -0
- package/dist/components/workspace-layout-utilities.js +58 -0
- package/dist/components/workspace-layout-utilities.js.map +1 -0
- package/dist/customEventCards.d.ts +117 -0
- package/dist/customEventCards.d.ts.map +1 -0
- package/dist/customEventCards.js +36 -0
- package/dist/customEventCards.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +48 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.js +112 -0
- package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/hooks/useViewport.d.ts +42 -0
- package/dist/hooks/useViewport.d.ts.map +1 -0
- package/dist/hooks/useViewport.js +61 -0
- package/dist/hooks/useViewport.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/settings-metadata.d.ts +78 -0
- package/dist/settings-metadata.d.ts.map +1 -0
- package/dist/settings-metadata.js +131 -0
- package/dist/settings-metadata.js.map +1 -0
- package/dist/types.d.ts +751 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming indicator — animated molecule spinner with rotating status
|
|
3
|
+
* messages. Replaces the blinking block cursor during AI response streaming.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { JSX } from 'react';
|
|
8
|
+
/** Props for {@link StreamingIndicator} — the spinner, activity label, and the live turn metrics. */
|
|
9
|
+
export interface StreamingIndicatorProps {
|
|
10
|
+
/** When true, renders only the spinner inline (no message text). */
|
|
11
|
+
inline?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Real current-activity label (e.g. "Reading src/App.tsx", "Writing the
|
|
14
|
+
* plan"). When provided, it replaces the generic rotating messages so the
|
|
15
|
+
* user sees what's actually happening. Falls back to rotation when absent.
|
|
16
|
+
*/
|
|
17
|
+
label?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Turn start timestamp (ms). When provided, a live `m:ss` elapsed counter
|
|
20
|
+
* ticks beside the label so it's unambiguous the response is still alive
|
|
21
|
+
* (vs. a frozen spinner) even during long model-latency gaps.
|
|
22
|
+
*/
|
|
23
|
+
startedAt?: number;
|
|
24
|
+
/**
|
|
25
|
+
* Estimated OUTPUT tokens generated so far this turn — assistant text,
|
|
26
|
+
* thinking, and tool-call arguments, at ~4 chars/token. When > 0, shown beside
|
|
27
|
+
* the timer so the user can see how much work is actually being done.
|
|
28
|
+
*
|
|
29
|
+
* Deliberately not a total: it excludes every input token, and an agentic turn
|
|
30
|
+
* re-sends the whole conversation on each iteration, so the provider's own
|
|
31
|
+
* dashboard will read far higher. That is not a discrepancy — it is a different
|
|
32
|
+
* measure, which the tooltip states (the visible label stays the plain unit to
|
|
33
|
+
* keep the row narrow). `/cost` reports the input, cached and billed figures
|
|
34
|
+
* (mid-stream too; the server folds the in-flight turn into the totals).
|
|
35
|
+
*/
|
|
36
|
+
tokens?: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Animated streaming indicator with molecule spinner. Shows the real current
|
|
40
|
+
* activity (when `label` is passed) plus a live elapsed timer (when `startedAt`
|
|
41
|
+
* is passed); otherwise rotates generic status messages. Pass `inline` for a
|
|
42
|
+
* compact cursor replacement inside flowing text.
|
|
43
|
+
* @param props - Component props (see {@link StreamingIndicatorProps}).
|
|
44
|
+
* @returns The rendered streaming indicator element.
|
|
45
|
+
*/
|
|
46
|
+
export declare function StreamingIndicator({ inline, label, startedAt, tokens, }: StreamingIndicatorProps): JSX.Element;
|
|
47
|
+
export declare namespace StreamingIndicator {
|
|
48
|
+
var displayName: string;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=StreamingIndicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingIndicator.d.ts","sourceRoot":"","sources":["../../src/components/StreamingIndicator.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAuOhC,qGAAqG;AACrG,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,KAAK,EACL,SAAS,EACT,MAAM,GACP,EAAE,uBAAuB,GAAG,GAAG,CAAC,OAAO,CAuHvC;yBA5He,kBAAkB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { t } from '@molecule/app-i18n';
|
|
4
|
+
import { Tooltip } from '@molecule/app-ui-react/components/Tooltip.js';
|
|
5
|
+
import { useNarrowViewport } from '../hooks/useViewport.js';
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Molecule spinner — inline SVG (3-phase atom-swapping animation)
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
const DUR = '1.5s';
|
|
10
|
+
const EASE = '0.42 0 0.58 1';
|
|
11
|
+
const LIN = '0 0 1 1';
|
|
12
|
+
/**
|
|
13
|
+
* Animated molecule logo spinner (pure SVG, no external deps).
|
|
14
|
+
* @param props - Component props (see {@link StreamingIndicatorProps}).
|
|
15
|
+
* @returns The rendered SVG spinner element.
|
|
16
|
+
*/
|
|
17
|
+
function MolSpinner({ size = 16 }) {
|
|
18
|
+
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: size, height: size, viewBox: "0 0 32 32", "aria-hidden": "true", style: { color: 'var(--mol-color-primary, #4070e0)', flexShrink: 0 }, children: _jsxs("g", { children: [_jsx("animateTransform", { attributeName: "transform", type: "rotate", from: "0 16 16", to: "360 16 16", dur: "3s", repeatCount: "indefinite" }), _jsxs("g", { transform: "matrix(.86229 0 0 .86229 -.78879 2.2034)", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeMiterlimit: 10, strokeWidth: 2.4737, fill: "none", children: [_jsx("line", { x1: "16.494", x2: "8.563", y1: "16", y2: "16", children: _jsx("animate", { attributeName: "opacity", dur: DUR, repeatCount: "indefinite", values: "1;0;0;1;1", keyTimes: "0;0.033;0.167;0.217;1", calcMode: "spline", keySplines: [EASE, LIN, EASE, LIN].join(';') }) }), _jsx("line", { x1: "20.959", x2: "24.924", y1: "18.579", y2: "25.446", children: _jsx("animate", { attributeName: "opacity", dur: DUR, repeatCount: "indefinite", values: "1;1;0;0;1;1", keyTimes: "0;0.333;0.367;0.500;0.550;1", calcMode: "spline", keySplines: [LIN, EASE, LIN, EASE, LIN].join(';') }) }), _jsx("line", { x1: "20.959", x2: "24.924", y1: "13.422", y2: "6.555", children: _jsx("animate", { attributeName: "opacity", dur: DUR, repeatCount: "indefinite", values: "1;1;0;0;1;1", keyTimes: "0;0.667;0.700;0.833;0.883;1", calcMode: "spline", keySplines: [LIN, EASE, LIN, EASE, LIN].join(';') }) }), _jsx("circle", { cx: "19.47", cy: "16", r: "2.976", children: _jsx("animate", { attributeName: "cx", dur: DUR, repeatCount: "indefinite", values: "19.47;19.47;5.587;5.587", keyTimes: "0;0.033;0.167;1", calcMode: "spline", keySplines: [LIN, EASE, LIN].join(';') }) }), _jsxs("circle", { cx: "5.587", cy: "16", r: "2.976", children: [_jsx("animate", { attributeName: "cx", dur: DUR, repeatCount: "indefinite", values: "5.587;5.587;19.47;19.47;26.412;26.412", keyTimes: "0;0.033;0.167;0.367;0.500;1", calcMode: "spline", keySplines: [LIN, EASE, LIN, EASE, LIN].join(';') }), _jsx("animate", { attributeName: "cy", dur: DUR, repeatCount: "indefinite", values: "16;16;16;16;28.023;28.023", keyTimes: "0;0.033;0.167;0.367;0.500;1", calcMode: "spline", keySplines: [LIN, EASE, LIN, EASE, LIN].join(';') })] }), _jsxs("circle", { cx: "26.412", cy: "28.023", r: "2.976", children: [_jsx("animate", { attributeName: "cx", dur: DUR, repeatCount: "indefinite", values: "26.412;26.412;19.47;19.47;26.412;26.412", keyTimes: "0;0.367;0.500;0.700;0.833;1", calcMode: "spline", keySplines: [LIN, EASE, LIN, EASE, LIN].join(';') }), _jsx("animate", { attributeName: "cy", dur: DUR, repeatCount: "indefinite", values: "28.023;28.023;16;16;3.977;3.977", keyTimes: "0;0.367;0.500;0.700;0.833;1", calcMode: "spline", keySplines: [LIN, EASE, LIN, EASE, LIN].join(';') })] }), _jsxs("circle", { cx: "26.412", cy: "3.977", r: "2.976", children: [_jsx("animate", { attributeName: "cx", dur: DUR, repeatCount: "indefinite", values: "26.412;26.412;19.47;19.47", keyTimes: "0;0.700;0.833;1", calcMode: "spline", keySplines: [LIN, EASE, LIN].join(';') }), _jsx("animate", { attributeName: "cy", dur: DUR, repeatCount: "indefinite", values: "3.977;3.977;16;16", keyTimes: "0;0.700;0.833;1", calcMode: "spline", keySplines: [LIN, EASE, LIN].join(';') })] })] })] }) }));
|
|
19
|
+
}
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Rotating status messages
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Molecule-themed status phrases. The agent, Synthase, is named after ATP synthase —
|
|
24
|
+
// the enzyme that synthesizes the cell's energy — so the spinner rotates through a
|
|
25
|
+
// biochemical reaction (synthesize → analyze structure → trace pathway → compose →
|
|
26
|
+
// react → catalyze → bond → crystallize) instead of generic "Thinking…/Working…". It
|
|
27
|
+
// reads with personality while still clearly signaling "actively working", and echoes
|
|
28
|
+
// the preview overlay's themed phrases (PreviewPanel). The keys are unchanged so the
|
|
29
|
+
// existing per-locale translations stay valid — the theme is an English flourish in
|
|
30
|
+
// these defaults (the same convention the preview phrases use).
|
|
31
|
+
const MESSAGES = [
|
|
32
|
+
{ key: 'ide.chat.streaming.thinking', defaultValue: 'Synthesizing...' },
|
|
33
|
+
{ key: 'ide.chat.streaming.analyzing', defaultValue: 'Analyzing the structure...' },
|
|
34
|
+
{ key: 'ide.chat.streaming.reasoning', defaultValue: 'Tracing the pathway...' },
|
|
35
|
+
{ key: 'ide.chat.streaming.crafting', defaultValue: 'Composing the response...' },
|
|
36
|
+
{ key: 'ide.chat.streaming.working', defaultValue: 'Reacting to your request...' },
|
|
37
|
+
{ key: 'ide.chat.streaming.processing', defaultValue: 'Catalyzing...' },
|
|
38
|
+
{ key: 'ide.chat.streaming.connecting', defaultValue: 'Bonding the concepts...' },
|
|
39
|
+
{ key: 'ide.chat.streaming.almostThere', defaultValue: 'Crystallizing the answer...' },
|
|
40
|
+
];
|
|
41
|
+
const ROTATE_INTERVAL_MS = 3000;
|
|
42
|
+
/**
|
|
43
|
+
* Format elapsed milliseconds as `m:ss` (or `s.s` under 10s for liveliness).
|
|
44
|
+
* @param ms - Elapsed time in milliseconds.
|
|
45
|
+
* @returns The formatted elapsed string.
|
|
46
|
+
*/
|
|
47
|
+
function formatElapsed(ms) {
|
|
48
|
+
const totalSec = ms / 1000;
|
|
49
|
+
if (totalSec < 10)
|
|
50
|
+
return `${totalSec.toFixed(1)}s`;
|
|
51
|
+
const sec = Math.floor(totalSec);
|
|
52
|
+
return `${Math.floor(sec / 60)}:${String(sec % 60).padStart(2, '0')}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Format a token count compactly (e.g. 1234 → "1.2k").
|
|
56
|
+
* @param n - The token count.
|
|
57
|
+
* @returns The compact string.
|
|
58
|
+
*/
|
|
59
|
+
function formatTokens(n) {
|
|
60
|
+
if (n < 1000)
|
|
61
|
+
return String(n);
|
|
62
|
+
return `${(n / 1000).toFixed(1)}k`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Minimum estimated tokens before the counter is shown. Below this the number
|
|
66
|
+
* is noise — e.g. a `set_mode` tool input is ~4 tokens, which looked silly
|
|
67
|
+
* flashing at the plan switch. Real generation crosses this within a fraction
|
|
68
|
+
* of a second, so the counter still appears effectively immediately.
|
|
69
|
+
*/
|
|
70
|
+
const MIN_TOKENS_SHOWN = 20;
|
|
71
|
+
/**
|
|
72
|
+
* Animated streaming indicator with molecule spinner. Shows the real current
|
|
73
|
+
* activity (when `label` is passed) plus a live elapsed timer (when `startedAt`
|
|
74
|
+
* is passed); otherwise rotates generic status messages. Pass `inline` for a
|
|
75
|
+
* compact cursor replacement inside flowing text.
|
|
76
|
+
* @param props - Component props (see {@link StreamingIndicatorProps}).
|
|
77
|
+
* @returns The rendered streaming indicator element.
|
|
78
|
+
*/
|
|
79
|
+
export function StreamingIndicator({ inline, label, startedAt, tokens, }) {
|
|
80
|
+
const [msgIdx, setMsgIdx] = useState(0);
|
|
81
|
+
const [now, setNow] = useState(() => Date.now());
|
|
82
|
+
const isNarrow = useNarrowViewport();
|
|
83
|
+
// A real, non-empty label (current activity / verification step) takes over;
|
|
84
|
+
// otherwise rotate generic phrases. Guard on a TRIMMED non-empty string so the
|
|
85
|
+
// spinner is NEVER text-less — there should always be some signal of what's
|
|
86
|
+
// happening, even if it's just "Working on it…".
|
|
87
|
+
const hasLabel = label != null && label.trim() !== '';
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
if (inline || hasLabel)
|
|
90
|
+
return;
|
|
91
|
+
const id = setInterval(() => {
|
|
92
|
+
setMsgIdx((prev) => (prev + 1) % MESSAGES.length);
|
|
93
|
+
}, ROTATE_INTERVAL_MS);
|
|
94
|
+
return () => clearInterval(id);
|
|
95
|
+
}, [inline, hasLabel]);
|
|
96
|
+
// Live elapsed time. Tick sub-second while the wait is short so the tenths
|
|
97
|
+
// are real (and it reads as actively working), then drop to once per second
|
|
98
|
+
// past 10s to bound re-renders on long turns.
|
|
99
|
+
const elapsedMs = startedAt !== undefined ? Math.max(0, now - startedAt) : 0;
|
|
100
|
+
const tickFast = startedAt !== undefined && elapsedMs < 10_000;
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
if (inline || startedAt === undefined)
|
|
103
|
+
return;
|
|
104
|
+
const id = setInterval(() => setNow(Date.now()), tickFast ? 100 : 1000);
|
|
105
|
+
return () => clearInterval(id);
|
|
106
|
+
}, [inline, startedAt, tickFast]);
|
|
107
|
+
if (inline) {
|
|
108
|
+
return _jsx(MolSpinner, { size: 14 });
|
|
109
|
+
}
|
|
110
|
+
const generic = MESSAGES[msgIdx];
|
|
111
|
+
const text = hasLabel && label ? label : t(generic.key, undefined, { defaultValue: generic.defaultValue });
|
|
112
|
+
const elapsed = startedAt !== undefined ? formatElapsed(elapsedMs) : null;
|
|
113
|
+
return (_jsxs("div", { role: "status", "aria-label": text, style: {
|
|
114
|
+
display: 'flex',
|
|
115
|
+
alignItems: 'center',
|
|
116
|
+
gap: '8px',
|
|
117
|
+
padding: '6px 0',
|
|
118
|
+
width: '100%',
|
|
119
|
+
minWidth: 0,
|
|
120
|
+
}, children: [_jsx(MolSpinner, { size: 16 }), _jsx("span", { style: {
|
|
121
|
+
fontSize: '13px',
|
|
122
|
+
opacity: 0.7,
|
|
123
|
+
fontStyle: 'italic',
|
|
124
|
+
whiteSpace: 'nowrap',
|
|
125
|
+
overflow: 'hidden',
|
|
126
|
+
textOverflow: 'ellipsis',
|
|
127
|
+
}, children: text }), (elapsed || (!isNarrow && tokens != null && tokens >= MIN_TOKENS_SHOWN)) && (_jsxs("span", { style: {
|
|
128
|
+
marginLeft: 'auto',
|
|
129
|
+
display: 'inline-flex',
|
|
130
|
+
alignItems: 'baseline',
|
|
131
|
+
gap: '8px',
|
|
132
|
+
fontSize: '13px',
|
|
133
|
+
opacity: 0.7,
|
|
134
|
+
fontVariantNumeric: 'tabular-nums',
|
|
135
|
+
whiteSpace: 'nowrap',
|
|
136
|
+
flexShrink: 0,
|
|
137
|
+
}, "aria-hidden": "true", children: [!isNarrow && tokens != null && tokens >= MIN_TOKENS_SHOWN && (_jsx(Tooltip, { content: t('ide.chat.streamingOutputTokensHint', undefined, {
|
|
138
|
+
defaultValue: 'Estimated output tokens this turn — /cost shows input and cached.',
|
|
139
|
+
}), placement: "top", children: _jsx("span", { children: t('ide.chat.streamingOutputTokens', { count: formatTokens(tokens) }, { defaultValue: '~{{count}} tokens' }) }) })), !isNarrow && tokens != null && tokens >= MIN_TOKENS_SHOWN && elapsed && _jsx("span", { children: "\u00B7" }), elapsed && _jsx("span", { children: elapsed })] }))] }));
|
|
140
|
+
}
|
|
141
|
+
StreamingIndicator.displayName = 'StreamingIndicator';
|
|
142
|
+
//# sourceMappingURL=StreamingIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingIndicator.js","sourceRoot":"","sources":["../../src/components/StreamingIndicator.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Horizontal scrollable editor tab bar.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { JSX } from 'react';
|
|
7
|
+
import type { TabBarProps } from '../types.js';
|
|
8
|
+
/** Props for a single editor tab. */
|
|
9
|
+
export interface TabItemProps {
|
|
10
|
+
path: string;
|
|
11
|
+
isDirty?: boolean;
|
|
12
|
+
isActive: boolean;
|
|
13
|
+
isPreview?: boolean;
|
|
14
|
+
isDiff?: boolean;
|
|
15
|
+
gitStatus?: string;
|
|
16
|
+
diagnostics?: {
|
|
17
|
+
errors: number;
|
|
18
|
+
warnings: number;
|
|
19
|
+
};
|
|
20
|
+
onSelect: (path: string) => void;
|
|
21
|
+
onClose: (path: string) => void;
|
|
22
|
+
onDoubleClick?: (path: string) => void;
|
|
23
|
+
statusColors: Record<string, string>;
|
|
24
|
+
diagnosticColors: Record<string, string>;
|
|
25
|
+
/** Touch-first device — taller tab (40px) + larger, always-visible close target. */
|
|
26
|
+
isCoarse: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Horizontally scrollable tab bar for open editor files.
|
|
30
|
+
* @param props - Component props (see {@link TabItemProps}).
|
|
31
|
+
* @returns The rendered tab bar element, or null if no tabs are open.
|
|
32
|
+
*/
|
|
33
|
+
export declare function TabBar({ tabs, activeFile, onSelect, onClose, onDoubleClick, fileStatuses, className, }: TabBarProps): JSX.Element | null;
|
|
34
|
+
export declare namespace TabBar {
|
|
35
|
+
var displayName: string;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=TabBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../src/components/TabBar.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAQhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAoF9C,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,oFAAoF;IACpF,QAAQ,EAAE,OAAO,CAAA;CAClB;AAgJD;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,OAAO,EACP,aAAa,EACb,YAAY,EACZ,SAAS,GACV,EAAE,WAAW,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAwDlC;yBAhEe,MAAM"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Horizontal scrollable editor tab bar.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { getIcon } from 'material-file-icons';
|
|
8
|
+
import { useEffect, useRef, useState } from 'react';
|
|
9
|
+
import { t } from '@molecule/app-i18n';
|
|
10
|
+
import { useThemeMode } from '@molecule/app-react';
|
|
11
|
+
import { getClassMap } from '@molecule/app-ui';
|
|
12
|
+
import { useCoarsePointer } from '../hooks/useViewport.js';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Status colors — dark/light variants for readability
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const DARK_STATUS_COLORS = {
|
|
17
|
+
modified: '#e2c08d',
|
|
18
|
+
added: '#73c991',
|
|
19
|
+
untracked: '#73c991',
|
|
20
|
+
deleted: '#c74e39',
|
|
21
|
+
};
|
|
22
|
+
const LIGHT_STATUS_COLORS = {
|
|
23
|
+
modified: '#8a6010',
|
|
24
|
+
added: '#1a7030',
|
|
25
|
+
untracked: '#1a7030',
|
|
26
|
+
deleted: '#a03020',
|
|
27
|
+
};
|
|
28
|
+
const DARK_DIAGNOSTIC = {
|
|
29
|
+
error: '#f14c4c',
|
|
30
|
+
deleted: '#c74e39',
|
|
31
|
+
warning: '#cca700',
|
|
32
|
+
};
|
|
33
|
+
const LIGHT_DIAGNOSTIC = {
|
|
34
|
+
error: '#c02020',
|
|
35
|
+
deleted: '#a03020',
|
|
36
|
+
warning: '#806000',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Resolve filename color based on diagnostics (highest priority) then git status.
|
|
40
|
+
* @param statusColors - Map of git status names to CSS color values.
|
|
41
|
+
* @param diagnosticColors - Map of diagnostic severity to CSS color values.
|
|
42
|
+
* @param diagnostics - Diagnostic counts for the file.
|
|
43
|
+
* @param diagnostics.errors - Number of error-level diagnostics.
|
|
44
|
+
* @param diagnostics.warnings - Number of warning-level diagnostics.
|
|
45
|
+
* @param gitStatus - The git status string (e.g. "modified", "added").
|
|
46
|
+
* @returns The resolved CSS color string, or undefined for default color.
|
|
47
|
+
*/
|
|
48
|
+
function resolveFileColor(statusColors, diagnosticColors, diagnostics, gitStatus) {
|
|
49
|
+
if (diagnostics?.errors)
|
|
50
|
+
return diagnosticColors.error;
|
|
51
|
+
if (gitStatus === 'deleted')
|
|
52
|
+
return diagnosticColors.deleted;
|
|
53
|
+
if (diagnostics?.warnings)
|
|
54
|
+
return diagnosticColors.warning;
|
|
55
|
+
if (gitStatus)
|
|
56
|
+
return statusColors[gitStatus];
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// FileTypeIcon — mirrors the one in FileExplorer
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
/**
|
|
63
|
+
* File type icon resolved from material-file-icons.
|
|
64
|
+
* @param props - Component props (see {@link TabItemProps}).
|
|
65
|
+
* @returns The rendered file type icon element.
|
|
66
|
+
*/
|
|
67
|
+
function FileTypeIcon({ name }) {
|
|
68
|
+
const { svg } = getIcon(name);
|
|
69
|
+
return (_jsx("span", { style: {
|
|
70
|
+
display: 'inline-block',
|
|
71
|
+
width: '14px',
|
|
72
|
+
height: '14px',
|
|
73
|
+
flexShrink: 0,
|
|
74
|
+
verticalAlign: 'middle',
|
|
75
|
+
}, dangerouslySetInnerHTML: { __html: svg } }));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Individual tab item with hover-gated close button and status coloring.
|
|
79
|
+
* @param props - Component props (see {@link TabItemProps}).
|
|
80
|
+
* @returns The rendered tab item element.
|
|
81
|
+
*/
|
|
82
|
+
function TabItem({ path, isDirty, isActive, isPreview, isDiff, gitStatus, diagnostics, onSelect, onClose, onDoubleClick, statusColors, diagnosticColors, isCoarse, }) {
|
|
83
|
+
const cm = getClassMap();
|
|
84
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
85
|
+
const fileName = path.split('/').pop() || path;
|
|
86
|
+
const fileColor = resolveFileColor(statusColors, diagnosticColors, diagnostics, gitStatus);
|
|
87
|
+
// For diff tabs, suppress the single-click during a double-click so that
|
|
88
|
+
// setActiveTab (which destroys the diff) doesn't fire before onDoubleClick.
|
|
89
|
+
const clickTimerRef = useRef(null);
|
|
90
|
+
const handleClick = isDiff
|
|
91
|
+
? () => {
|
|
92
|
+
// Delay single-click; cancel if double-click fires first
|
|
93
|
+
clickTimerRef.current = setTimeout(() => {
|
|
94
|
+
clickTimerRef.current = null;
|
|
95
|
+
onSelect(path);
|
|
96
|
+
}, 250);
|
|
97
|
+
}
|
|
98
|
+
: () => onSelect(path);
|
|
99
|
+
const handleDoubleClick = isDiff
|
|
100
|
+
? () => {
|
|
101
|
+
if (clickTimerRef.current) {
|
|
102
|
+
clearTimeout(clickTimerRef.current);
|
|
103
|
+
clickTimerRef.current = null;
|
|
104
|
+
}
|
|
105
|
+
onDoubleClick?.(path);
|
|
106
|
+
}
|
|
107
|
+
: () => onDoubleClick?.(path);
|
|
108
|
+
return (_jsxs("div", { role: "tab", title: path, tabIndex: 0, "aria-selected": isActive, onClick: handleClick, onDoubleClick: handleDoubleClick, onKeyDown: (e) => {
|
|
109
|
+
if (e.key === 'Enter' || e.key === ' ')
|
|
110
|
+
onSelect(path);
|
|
111
|
+
}, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false),
|
|
112
|
+
// 40px tall on touch-first devices — the WCAG-acceptable floor for a dense
|
|
113
|
+
// toolbar row; 32px compact height on pointer devices (unchanged).
|
|
114
|
+
style: { userSelect: 'none', height: isCoarse ? '40px' : '32px' }, className: cm.cn(cm.flex({ direction: 'row', align: 'center', gap: 'xs' }), cm.sp('px', 3), cm.textSize('sm'), cm.shrink0, cm.cursorPointer, cm.borderR, isActive && cm.surface, isActive && cm.borderBPrimary), children: [_jsx(FileTypeIcon, { name: fileName }), _jsxs("span", { style: {
|
|
115
|
+
fontStyle: isPreview ? 'italic' : undefined,
|
|
116
|
+
color: fileColor,
|
|
117
|
+
textDecoration: gitStatus === 'deleted' ? 'line-through' : undefined,
|
|
118
|
+
}, children: [fileName, isDirty && _jsxs("span", { className: cm.textWarning, children: [" ", '\u2022'] })] }), _jsx("button", { type: "button", onClick: (e) => {
|
|
119
|
+
e.stopPropagation();
|
|
120
|
+
onClose(path);
|
|
121
|
+
}, onMouseEnter: (e) => {
|
|
122
|
+
e.currentTarget.style.background = 'rgba(128,128,128,0.25)';
|
|
123
|
+
e.currentTarget.style.color = 'var(--color-foreground, #e0e0e0)';
|
|
124
|
+
}, onMouseLeave: (e) => {
|
|
125
|
+
e.currentTarget.style.background = 'transparent';
|
|
126
|
+
e.currentTarget.style.color = '';
|
|
127
|
+
}, className: cm.cn(cm.textMuted, cm.textSize('xs'), cm.cursorPointer), style: {
|
|
128
|
+
// Square button (equal width/height) with the glyph centered on both
|
|
129
|
+
// axes — no asymmetric padding, so the ✕ sits dead-center in the tab.
|
|
130
|
+
// Touch-first devices get a 32px hit area (hover-reveal doesn't exist
|
|
131
|
+
// there, so the close is also always visible, dimmed).
|
|
132
|
+
display: 'inline-flex',
|
|
133
|
+
alignItems: 'center',
|
|
134
|
+
justifyContent: 'center',
|
|
135
|
+
flexShrink: 0,
|
|
136
|
+
width: isCoarse ? '32px' : '16px',
|
|
137
|
+
height: isCoarse ? '32px' : '16px',
|
|
138
|
+
border: 'none',
|
|
139
|
+
padding: 0,
|
|
140
|
+
background: 'transparent',
|
|
141
|
+
lineHeight: 1,
|
|
142
|
+
borderRadius: '3px',
|
|
143
|
+
marginLeft: '4px',
|
|
144
|
+
marginRight: isCoarse ? '-8px' : '-4px',
|
|
145
|
+
opacity: isHovered ? 1 : isCoarse ? 0.6 : 0,
|
|
146
|
+
transition: 'opacity 100ms, background 80ms, color 80ms',
|
|
147
|
+
}, "aria-label": t('ide.tabs.close', { fileName }), children: _jsx("svg", { width: "10", height: "10", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M3 3l10 10M13 3L3 13", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" }) }) })] }));
|
|
148
|
+
}
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// TabBar
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
/**
|
|
153
|
+
* Horizontally scrollable tab bar for open editor files.
|
|
154
|
+
* @param props - Component props (see {@link TabItemProps}).
|
|
155
|
+
* @returns The rendered tab bar element, or null if no tabs are open.
|
|
156
|
+
*/
|
|
157
|
+
export function TabBar({ tabs, activeFile, onSelect, onClose, onDoubleClick, fileStatuses, className, }) {
|
|
158
|
+
const cm = getClassMap();
|
|
159
|
+
const isLight = useThemeMode() === 'light';
|
|
160
|
+
const isCoarse = useCoarsePointer();
|
|
161
|
+
const statusColors = isLight ? LIGHT_STATUS_COLORS : DARK_STATUS_COLORS;
|
|
162
|
+
const diagnosticColors = isLight ? LIGHT_DIAGNOSTIC : DARK_DIAGNOSTIC;
|
|
163
|
+
const scrollRef = useRef(null);
|
|
164
|
+
// Scroll the active tab into view whenever it changes
|
|
165
|
+
useEffect(() => {
|
|
166
|
+
if (!scrollRef.current || !activeFile)
|
|
167
|
+
return;
|
|
168
|
+
const el = scrollRef.current.querySelector('[aria-selected="true"]');
|
|
169
|
+
el?.scrollIntoView({ behavior: 'smooth', inline: 'nearest', block: 'nearest' });
|
|
170
|
+
}, [activeFile]);
|
|
171
|
+
if (tabs.length === 0)
|
|
172
|
+
return null;
|
|
173
|
+
return (_jsx("div", { className: cm.cn(cm.shrink0, cm.surfaceSecondary, cm.borderB, className), children: _jsx("div", { ref: scrollRef, className: cm.flex({ direction: 'row', align: 'center' }), style: {
|
|
174
|
+
overflowX: 'auto',
|
|
175
|
+
scrollbarWidth: 'none',
|
|
176
|
+
height: isCoarse ? '40px' : '32px',
|
|
177
|
+
// Momentum scrolling on legacy iOS; keep a horizontal fling on the tab
|
|
178
|
+
// strip from turning into browser back/forward navigation.
|
|
179
|
+
WebkitOverflowScrolling: 'touch',
|
|
180
|
+
overscrollBehaviorX: 'contain',
|
|
181
|
+
}, role: "tablist", children: tabs.map((tab) => (_jsx(TabItem, { path: tab.path, isDirty: tab.isDirty, isActive: tab.path === activeFile, isPreview: tab.isPreview, isDiff: tab.isDiff, gitStatus: fileStatuses?.[tab.path],
|
|
182
|
+
// Diff tabs show historical content — error/warning coloring from the
|
|
183
|
+
// live file's diagnostics would misread as "the diff has errors".
|
|
184
|
+
diagnostics: tab.isDiff ? undefined : tab.diagnostics, onSelect: onSelect, onClose: onClose, onDoubleClick: onDoubleClick, statusColors: statusColors, diagnosticColors: diagnosticColors, isCoarse: isCoarse }, tab.path))) }) }));
|
|
185
|
+
}
|
|
186
|
+
TabBar.displayName = 'TabBar';
|
|
187
|
+
//# sourceMappingURL=TabBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../src/components/TabBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-tip card.
|
|
3
|
+
*
|
|
4
|
+
* A dismissable, non-interrupting info card surfaced on a fresh conversation
|
|
5
|
+
* and periodically thereafter. It is NOT a chat message — it never triggers the
|
|
6
|
+
* model and never blocks the input. The user can dismiss it with the close
|
|
7
|
+
* button.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import type { JSX } from 'react';
|
|
12
|
+
/**
|
|
13
|
+
* Renders a single dismissable onboarding tip.
|
|
14
|
+
*
|
|
15
|
+
* @param props - Component props.
|
|
16
|
+
* @returns The rendered tip card.
|
|
17
|
+
*/
|
|
18
|
+
export declare function TipCard({ text, onDismiss }: {
|
|
19
|
+
text: string;
|
|
20
|
+
onDismiss: () => void;
|
|
21
|
+
}): JSX.Element;
|
|
22
|
+
//# sourceMappingURL=TipCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TipCard.d.ts","sourceRoot":"","sources":["../../src/components/TipCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAiB,GAAG,EAAa,MAAM,OAAO,CAAA;AAyC1D;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAuEjG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { t } from '@molecule/app-i18n';
|
|
3
|
+
import { getClassMap } from '@molecule/app-ui';
|
|
4
|
+
import { CHAT_CARD_ICON_SIZE, chatCardStyle } from './chat-card-style.js';
|
|
5
|
+
import { Icon } from './Icon.js';
|
|
6
|
+
/** Inline monospace code style for command/`@file` tokens in a tip (mvp #10). */
|
|
7
|
+
const TIP_CODE_STYLE = {
|
|
8
|
+
fontFamily: 'var(--mol-font-mono, monospace)',
|
|
9
|
+
fontSize: '0.92em',
|
|
10
|
+
padding: '1px 5px',
|
|
11
|
+
borderRadius: 4,
|
|
12
|
+
background: 'rgba(128,128,128,0.16)',
|
|
13
|
+
border: '1px solid rgba(128,128,128,0.18)',
|
|
14
|
+
whiteSpace: 'nowrap',
|
|
15
|
+
};
|
|
16
|
+
/** Matches a slash-command or `@file` token (`/plan`, `@filename`, or a bare `/` or `@`). */
|
|
17
|
+
const TIP_TOKEN_RE = /([@/][\w-]*)/g;
|
|
18
|
+
/**
|
|
19
|
+
* Render tip text with command / `@file` tokens as inline monospace code so they
|
|
20
|
+
* stand out (mvp #10) — e.g. "type `/` to browse, or `@filename` to attach".
|
|
21
|
+
*
|
|
22
|
+
* @param text - The (already-localized) tip text.
|
|
23
|
+
* @returns The text split into plain spans + monospace code tokens.
|
|
24
|
+
*/
|
|
25
|
+
function renderTipText(text) {
|
|
26
|
+
return text.split(TIP_TOKEN_RE).map((part, i) => part && /^[@/]/.test(part) ? (_jsx("code", { style: TIP_CODE_STYLE, children: part }, i)) : (_jsx("span", { children: part }, i)));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Renders a single dismissable onboarding tip.
|
|
30
|
+
*
|
|
31
|
+
* @param props - Component props.
|
|
32
|
+
* @returns The rendered tip card.
|
|
33
|
+
*/
|
|
34
|
+
export function TipCard({ text, onDismiss }) {
|
|
35
|
+
const cm = getClassMap();
|
|
36
|
+
return (_jsxs("div", { "data-mol-id": "chat-tip-card", className: cm.cn(cm.textSize('xs'), cm.textMuted), style: {
|
|
37
|
+
display: 'flex',
|
|
38
|
+
alignItems: 'flex-start',
|
|
39
|
+
gap: 8,
|
|
40
|
+
// One chat-timeline rhythm: bottom margin only, never a top margin (matches
|
|
41
|
+
// ChatPanel's TIMELINE_ITEM_GAP so adjacent items never collide — P4-05).
|
|
42
|
+
marginBottom: 16,
|
|
43
|
+
// Shared card chrome: subtle primary tint + a uniform 1px border on all
|
|
44
|
+
// sides. One source of truth with the other chat info cards (chat-card-style).
|
|
45
|
+
...chatCardStyle(),
|
|
46
|
+
lineHeight: 1.5,
|
|
47
|
+
}, children: [_jsx(Icon, { name: "lightbulb", size: CHAT_CARD_ICON_SIZE, "aria-hidden": "true", style: {
|
|
48
|
+
flexShrink: 0,
|
|
49
|
+
marginTop: 1,
|
|
50
|
+
color: 'var(--mol-color-primary, #6366f1)',
|
|
51
|
+
} }), _jsx("span", { style: { flex: 1 }, children: renderTipText(text) }), _jsx("button", { type: "button", "data-mol-id": "chat-tip-dismiss", onClick: onDismiss, "aria-label": t('ide.chat.tip.dismiss', undefined, { defaultValue: 'Dismiss tip' }), title: t('ide.chat.tip.dismiss', undefined, { defaultValue: 'Dismiss tip' }), style: {
|
|
52
|
+
flexShrink: 0,
|
|
53
|
+
display: 'inline-flex',
|
|
54
|
+
alignItems: 'center',
|
|
55
|
+
justifyContent: 'center',
|
|
56
|
+
width: 18,
|
|
57
|
+
height: 18,
|
|
58
|
+
borderRadius: 4,
|
|
59
|
+
border: 'none',
|
|
60
|
+
background: 'transparent',
|
|
61
|
+
color: 'inherit',
|
|
62
|
+
cursor: 'pointer',
|
|
63
|
+
opacity: 0.6,
|
|
64
|
+
transition: 'opacity 100ms, background 100ms',
|
|
65
|
+
}, onMouseEnter: (e) => {
|
|
66
|
+
e.currentTarget.style.opacity = '1';
|
|
67
|
+
e.currentTarget.style.background = 'rgba(128,128,128,0.2)';
|
|
68
|
+
}, onMouseLeave: (e) => {
|
|
69
|
+
e.currentTarget.style.opacity = '0.6';
|
|
70
|
+
e.currentTarget.style.background = 'transparent';
|
|
71
|
+
}, children: _jsx("svg", { width: "11", height: "11", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M3 3l10 10M13 3L3 13", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" }) }) })] }));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=TipCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TipCard.js","sourceRoot":"","sources":["../../src/components/TipCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool call display row — compact, Claude Code-style.
|
|
3
|
+
*
|
|
4
|
+
* Shows a colored status dot, a human-readable action label, and a
|
|
5
|
+
* one-line result summary. Expands on click to reveal formatted IN / OUT
|
|
6
|
+
* sections: diffs for file edits, terminal output for commands, etc.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { JSX } from 'react';
|
|
11
|
+
import type { ToolCallCardProps } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Compact tool-call row with status dot, label, summary, and expandable detail pane.
|
|
14
|
+
* @param props - Component props.
|
|
15
|
+
* @returns The rendered tool call card element.
|
|
16
|
+
*/
|
|
17
|
+
export declare const ToolCallCard: import("react").MemoExoticComponent<({ id, name, input, output, status, fileDiff, isUndone: isUndoneProp, onUndoToggle, onFileOpen, onFileDoubleClick, onFileDiff, onFileRevert, onAskUserResponse, className, }: ToolCallCardProps) => JSX.Element | null>;
|
|
18
|
+
//# sourceMappingURL=ToolCallCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolCallCard.d.ts","sourceRoot":"","sources":["../../src/components/ToolCallCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAa,MAAM,OAAO,CAAA;AAQ3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAklBpD;;;;GAIG;AACH,eAAO,MAAM,YAAY,oNAetB,iBAAiB,KAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAyvBvC,CAAA"}
|