@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,96 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { formatTokenCount, PROVIDER_BRAND_COLORS } from '@molecule/app-ai-models';
|
|
4
|
+
import { t } from '@molecule/app-i18n';
|
|
5
|
+
import { getClassMap } from '@molecule/app-ui';
|
|
6
|
+
import { Tooltip } from '@molecule/app-ui-react/components/Tooltip.js';
|
|
7
|
+
import { modelTotalCost, sortModels } from './chat-models-utilities.js';
|
|
8
|
+
import { Icon } from './Icon.js';
|
|
9
|
+
/**
|
|
10
|
+
* Picks the SVG sort glyph for a header: the neutral `chevrons-up-down` when the
|
|
11
|
+
* column is not the active sort, or a single up/down chevron matching the active
|
|
12
|
+
* direction. Keeps one consistent icon family across every header.
|
|
13
|
+
*
|
|
14
|
+
* @param active - Whether this column is the current sort column.
|
|
15
|
+
* @param direction - The current sort direction (only meaningful when `active`).
|
|
16
|
+
* @returns The icon-set glyph name to render.
|
|
17
|
+
*/
|
|
18
|
+
function sortGlyph(active, direction) {
|
|
19
|
+
if (!active)
|
|
20
|
+
return 'chevrons-up-down';
|
|
21
|
+
return direction === 'asc' ? 'chevron-up' : 'chevron-down';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Sortable comparison table of available AI models.
|
|
25
|
+
*
|
|
26
|
+
* @param root0 - Component props.
|
|
27
|
+
* @param root0.models - Models to display (already filtered to the current catalog).
|
|
28
|
+
* @param root0.currentModelId - The id of the project's active model, badged as "current".
|
|
29
|
+
* @param root0.isLight - Whether the current theme is light mode (drives highlight tints).
|
|
30
|
+
* @returns The rendered models table.
|
|
31
|
+
*/
|
|
32
|
+
export function ModelsTable({ models, currentModelId, isLight, }) {
|
|
33
|
+
const cm = getClassMap();
|
|
34
|
+
const [sort, setSort] = useState({
|
|
35
|
+
column: 'name',
|
|
36
|
+
direction: 'asc',
|
|
37
|
+
});
|
|
38
|
+
const sorted = useMemo(() => sortModels(models, sort.column, sort.direction), [models, sort.column, sort.direction]);
|
|
39
|
+
const columns = [
|
|
40
|
+
{ key: 'name', label: t('ide.chat.models.colName', undefined, { defaultValue: 'Model' }) },
|
|
41
|
+
{
|
|
42
|
+
key: 'context',
|
|
43
|
+
label: t('ide.chat.models.colContext', undefined, { defaultValue: 'Context' }),
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
key: 'cost',
|
|
47
|
+
label: t('ide.chat.models.colCost', undefined, { defaultValue: 'Cost / 1M' }),
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
key: 'cutoff',
|
|
51
|
+
label: t('ide.chat.models.colCutoff', undefined, { defaultValue: 'Cutoff' }),
|
|
52
|
+
},
|
|
53
|
+
{ key: 'free', label: t('ide.chat.models.colFree', undefined, { defaultValue: 'Free' }) },
|
|
54
|
+
];
|
|
55
|
+
const freeHighlightBg = isLight ? 'rgba(34,197,94,0.10)' : 'rgba(34,197,94,0.14)';
|
|
56
|
+
const freeBadgeFg = isLight ? 'rgb(21,128,61)' : 'rgb(74,222,128)';
|
|
57
|
+
const cellPad = cm.sp('px', 2);
|
|
58
|
+
const cellPadY = cm.sp('py', 1);
|
|
59
|
+
return (_jsx("div", { "data-mol-id": "models-table", className: cm.cn(cm.surfaceSecondary, cm.textSize('xs')), style: {
|
|
60
|
+
margin: '6px 0',
|
|
61
|
+
borderRadius: 6,
|
|
62
|
+
overflowX: 'auto',
|
|
63
|
+
}, children: _jsxs("table", { style: { width: '100%', borderCollapse: 'collapse', textAlign: 'left' }, children: [_jsx("thead", { children: _jsx("tr", { children: columns.map((col) => {
|
|
64
|
+
const active = sort.column === col.key;
|
|
65
|
+
return (_jsx("th", { className: cm.cn(cellPad, cellPadY, cm.fontWeight('medium')), style: { whiteSpace: 'nowrap' }, children: _jsxs("button", { type: "button", "data-mol-id": `models-sort-${col.key}`, "aria-label": t('ide.chat.models.sortBy', { column: col.label }, { defaultValue: 'Sort by {{column}}' }), onClick: () => setSort((prev) => prev.column === col.key
|
|
66
|
+
? {
|
|
67
|
+
column: col.key,
|
|
68
|
+
direction: prev.direction === 'asc' ? 'desc' : 'asc',
|
|
69
|
+
}
|
|
70
|
+
: { column: col.key, direction: 'asc' }), className: cm.cn(cm.fontWeight('medium'), active ? undefined : cm.textMuted), style: {
|
|
71
|
+
display: 'inline-flex',
|
|
72
|
+
alignItems: 'center',
|
|
73
|
+
gap: 3,
|
|
74
|
+
background: 'none',
|
|
75
|
+
border: 'none',
|
|
76
|
+
cursor: 'pointer',
|
|
77
|
+
color: active ? 'var(--color-primary)' : 'inherit',
|
|
78
|
+
font: 'inherit',
|
|
79
|
+
padding: 0,
|
|
80
|
+
}, children: [col.label, _jsx(Icon, { name: sortGlyph(active, sort.direction), size: 12, "aria-hidden": "true", "data-mol-id": `models-sort-glyph-${col.key}`, style: { flexShrink: 0, opacity: active ? 1 : 0.6 } })] }) }, col.key));
|
|
81
|
+
}) }) }), _jsx("tbody", { children: sorted.map((model) => {
|
|
82
|
+
const accent = PROVIDER_BRAND_COLORS[model.provider] ?? '#888';
|
|
83
|
+
const isCurrent = model.id === currentModelId;
|
|
84
|
+
return (_jsxs("tr", { className: cm.borderT, style: model.freeTier ? { background: freeHighlightBg } : undefined, children: [_jsxs("td", { className: cm.cn(cellPad, cellPadY), style: { borderLeft: `3px solid ${accent}` }, children: [_jsx("span", { className: cm.fontWeight('medium'), children: model.label }), ' ', _jsx("span", { className: cm.textMuted, style: { fontSize: 10 }, children: model.provider }), isCurrent && (_jsx("span", { className: cm.textMuted, style: {
|
|
85
|
+
marginLeft: 4,
|
|
86
|
+
fontSize: 10,
|
|
87
|
+
background: 'rgba(128,128,128,0.2)',
|
|
88
|
+
padding: '0 4px',
|
|
89
|
+
borderRadius: 3,
|
|
90
|
+
}, children: t('ide.chat.currentBadge', undefined, { defaultValue: 'current' }) }))] }), _jsx("td", { className: cm.cn(cellPad, cellPadY), style: { whiteSpace: 'nowrap' }, children: formatTokenCount(model.contextWindow) }), _jsx("td", { className: cm.cn(cellPad, cellPadY), style: { whiteSpace: 'nowrap' }, children: _jsx(Tooltip, { content: t('ide.chat.models.costBreakdown', {
|
|
91
|
+
input: model.inputPricePerMTok.toFixed(2),
|
|
92
|
+
output: model.outputPricePerMTok.toFixed(2),
|
|
93
|
+
}, { defaultValue: 'Input ${{input}} + output ${{output}} per 1M tokens' }), placement: "top", children: _jsxs("span", { "data-mol-id": `models-cost-${model.id}`, children: ["$", modelTotalCost(model).toFixed(2)] }) }) }), _jsx("td", { className: cm.cn(cellPad, cellPadY), style: { whiteSpace: 'nowrap' }, children: model.knowledgeCutoff }), _jsx("td", { className: cm.cn(cellPad, cellPadY), children: model.freeTier ? (_jsx("span", { style: { color: freeBadgeFg, fontWeight: 600 }, children: t('ide.chat.models.freeYes', undefined, { defaultValue: '✓ Free' }) })) : (_jsx("span", { className: cm.textMuted, children: t('ide.chat.models.freeNo', undefined, { defaultValue: '—' }) })) })] }, model.id));
|
|
94
|
+
}) })] }) }));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=ModelsTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelsTable.js","sourceRoot":"","sources":["../../src/components/ModelsTable.tsx"],"names":[],"mappings":";AAuBA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGzC,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,8CAA8C,CAAA;AAGtE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAQhC;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,MAAe,EAAE,SAAwB;IAC1D,IAAI,CAAC,MAAM;QAAE,OAAO,kBAAkB,CAAA;IACtC,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAA;AAC5D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,cAAc,EACd,OAAO,GAKR;IACC,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAwD;QACtF,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK;KACjB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EACrD,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CACtC,CAAA;IAED,MAAM,OAAO,GAAgB;QAC3B,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,yBAAyB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE;QAC1F;YACE,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,CAAC,CAAC,4BAA4B,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;SAC/E;QACD;YACE,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,CAAC,CAAC,yBAAyB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;SAC9E;QACD;YACE,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,CAAC,CAAC,2BAA2B,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;SAC7E;QACD,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,yBAAyB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE;KAC1F,CAAA;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAA;IACjF,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAElE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAC9B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAE/B,OAAO,CACL,6BACc,cAAc,EAC1B,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EACxD,KAAK,EAAE;YACL,MAAM,EAAE,OAAO;YACf,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,MAAM;SAClB,YAED,iBAAO,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,aAC5E,0BACE,uBACG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;4BACnB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAA;4BACtC,OAAO,CACL,aAEE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAC5D,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YAE/B,kBACE,IAAI,EAAC,QAAQ,iBACA,eAAe,GAAG,CAAC,GAAG,EAAE,gBACzB,CAAC,CACX,wBAAwB,EACxB,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,EACrB,EAAE,YAAY,EAAE,oBAAoB,EAAE,CACvC,EACD,OAAO,EAAE,GAAG,EAAE,CACZ,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACf,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG;wCACrB,CAAC,CAAC;4CACE,MAAM,EAAE,GAAG,CAAC,GAAG;4CACf,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;yCACrD;wCACH,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAC1C,EAEH,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAC5E,KAAK,EAAE;wCACL,OAAO,EAAE,aAAa;wCACtB,UAAU,EAAE,QAAQ;wCACpB,GAAG,EAAE,CAAC;wCACN,UAAU,EAAE,MAAM;wCAClB,MAAM,EAAE,MAAM;wCACd,MAAM,EAAE,SAAS;wCACjB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,SAAS;wCAClD,IAAI,EAAE,SAAS;wCACf,OAAO,EAAE,CAAC;qCACX,aAEA,GAAG,CAAC,KAAK,EACV,KAAC,IAAI,IACH,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EACvC,IAAI,EAAE,EAAE,iBACI,MAAM,iBACL,qBAAqB,GAAG,CAAC,GAAG,EAAE,EAC3C,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GACnD,IACK,IA3CJ,GAAG,CAAC,GAAG,CA4CT,CACN,CAAA;wBACH,CAAC,CAAC,GACC,GACC,EACR,0BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpB,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAA;wBAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,EAAE,KAAK,cAAc,CAAA;wBAC7C,OAAO,CACL,cAEE,SAAS,EAAE,EAAE,CAAC,OAAO,EACrB,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,aAEnE,cACE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnC,KAAK,EAAE,EAAE,UAAU,EAAE,aAAa,MAAM,EAAE,EAAE,aAE5C,eAAM,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAG,KAAK,CAAC,KAAK,GAAQ,EAAC,GAAG,EAClE,eAAM,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YACnD,KAAK,CAAC,QAAQ,GACV,EACN,SAAS,IAAI,CACZ,eACE,SAAS,EAAE,EAAE,CAAC,SAAS,EACvB,KAAK,EAAE;gDACL,UAAU,EAAE,CAAC;gDACb,QAAQ,EAAE,EAAE;gDACZ,UAAU,EAAE,uBAAuB;gDACnC,OAAO,EAAE,OAAO;gDAChB,YAAY,EAAE,CAAC;6CAChB,YAEA,CAAC,CAAC,uBAAuB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,GAC9D,CACR,IACE,EACL,aAAI,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YACrE,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,GACnC,EACL,aAAI,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YAOtE,KAAC,OAAO,IACN,OAAO,EAAE,CAAC,CACR,+BAA+B,EAC/B;4CACE,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;4CACzC,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;yCAC5C,EACD,EAAE,YAAY,EAAE,qDAAqD,EAAE,CACxE,EACD,SAAS,EAAC,KAAK,YAEf,+BAAmB,eAAe,KAAK,CAAC,EAAE,EAAE,kBACxC,cAAc,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAC7B,GACC,GACP,EACL,aAAI,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,YACrE,KAAK,CAAC,eAAe,GACnB,EACL,aAAI,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,YACpC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAChB,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,YACjD,CAAC,CAAC,yBAAyB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,GAC/D,CACR,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAE,EAAE,CAAC,SAAS,YAC1B,CAAC,CAAC,wBAAwB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GACzD,CACR,GACE,KAlEA,KAAK,CAAC,EAAE,CAmEV,CACN,CAAA;oBACH,CAAC,CAAC,GACI,IACF,GACJ,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live preview panel with iframe and device frame selection.
|
|
3
|
+
*
|
|
4
|
+
* Two states:
|
|
5
|
+
* 1. "Loading preview" — polling until the first successful fetch
|
|
6
|
+
* 2. "Loading preview" — server was up before but fetch is now failing
|
|
7
|
+
*
|
|
8
|
+
* The iframe is always mounted (behind the overlay) once we have a URL. The overlay REVEAL is
|
|
9
|
+
* driven by TWO regimes, keyed on whether this load target has rendered before this session
|
|
10
|
+
* (`hasEverRendered`):
|
|
11
|
+
* - FIRST cold boot (never rendered yet): reveal ONLY on the `molecule:ready` handshake. A fresh
|
|
12
|
+
* project's cold Vite server can take many seconds to pre-bundle deps + compile the app before
|
|
13
|
+
* React mounts; `onLoad` fires on the shell HTML long BEFORE that, so revealing on `onLoad`
|
|
14
|
+
* here would flash a white, still-compiling iframe and then let a naive timer falsely accuse it
|
|
15
|
+
* of being "blank"/"unable to load" (with an "Open in new tab" button) — the exact reason a
|
|
16
|
+
* fresh preview "wouldn't load until I opened it in a new tab and refreshed the IDE". Instead we
|
|
17
|
+
* keep an honest "Starting your app…" overlay until the scaffold's inline bridge posts
|
|
18
|
+
* `molecule:ready` the instant #root mounts (reliable — verified to fire even while the overlay
|
|
19
|
+
* occludes the cross-origin iframe; the old "rAF frozen under occlusion" deadlock was actually
|
|
20
|
+
* the overlay's `backdrop-filter` freezing the whole renderer, since removed).
|
|
21
|
+
* - RELOAD of an app that already rendered (`hasEverRendered`): reveal on `onLoad` (+ a short
|
|
22
|
+
* grace) as a flash-free fast path, with `molecule:ready` faster still.
|
|
23
|
+
* A genuinely blank/broken app is surfaced by the app's OWN signals — an explicit `molecule:blank`,
|
|
24
|
+
* a crash, a dead (no-heartbeat) document, or an alive-but-never-mounts backstop — never by a
|
|
25
|
+
* timer that can't tell "still cold-compiling" from "rendered nothing".
|
|
26
|
+
*
|
|
27
|
+
* Recovery features:
|
|
28
|
+
* - Never-give-up polling with exponential backoff, single-chain (epoch-guarded +
|
|
29
|
+
* AbortController) so leaked poll chains can't starve the preview's connections
|
|
30
|
+
* - onLoad grace fallback: clears the overlay when the document loaded but the
|
|
31
|
+
* ready handshake never came (and no crash fired)
|
|
32
|
+
* - Stuck-load detection: gated on the document NOT having loaded (so it never
|
|
33
|
+
* interrupts a progressing load), backs off, and is CAPPED — after the cap it
|
|
34
|
+
* stops thrashing and shows a themed "Preview can't load here" loop-breaker
|
|
35
|
+
* panel (Reload + Open in new tab) instead of remounting forever
|
|
36
|
+
* - Last-good-frame: stores the sandbox's `molecule:snapshot` data-URL and shows
|
|
37
|
+
* it blurred behind the overlay while the app is rebuilding / blank
|
|
38
|
+
* - Pre-render error forwarding: module/import errors sent to the agent for auto-fix
|
|
39
|
+
* - Freeze watchdog: the scaffold heartbeats every ~3s; if its thread locks up the
|
|
40
|
+
* beats stop, so we surface a reload banner (the IDE stays responsive because the
|
|
41
|
+
* preview origin is isolated via Origin-Agent-Cluster)
|
|
42
|
+
* - Blank page detection: catches pages that render but show nothing
|
|
43
|
+
* - Wake patience: when the preview server restarts (detected by the load-target URL
|
|
44
|
+
* changing — a wake always reassigns the sandbox's docker port — or the host's `wakeAt`
|
|
45
|
+
* hint), the fast blank accusations stand down and the patient cold-boot regime governs
|
|
46
|
+
* for WAKE_PATIENCE_MS: a post-wake reload that renders nothing for a while is expected,
|
|
47
|
+
* not blank; only the generous never-rendered ceiling may accuse
|
|
48
|
+
* - Trust boundary: inbound `molecule:*` postMessages are accepted only from the
|
|
49
|
+
* preview iframe's own window (`event.source === iframe.contentWindow`) — a window-
|
|
50
|
+
* identity check, robust to origin-string divergence (Origin-Agent-Cluster, IP host,
|
|
51
|
+
* cache-buster, redirect) and unforgeable by any other window
|
|
52
|
+
*
|
|
53
|
+
* @module
|
|
54
|
+
*/
|
|
55
|
+
import { type JSX } from 'react';
|
|
56
|
+
import type { PreviewPanelProps } from '../types.js';
|
|
57
|
+
/**
|
|
58
|
+
* Live preview panel with iframe, device frame selector, and URL bar.
|
|
59
|
+
* @param props - Component props.
|
|
60
|
+
* @returns The rendered preview panel element.
|
|
61
|
+
*/
|
|
62
|
+
export declare function PreviewPanel({ loadingIndicator, restartingIndicator, className, onPreviewError, onPreviewStuck, onRenderState, uiCommand, onUiResult, fileChangeTick, buildingHint, isBuilding, wakeAt, }: PreviewPanelProps): JSX.Element;
|
|
63
|
+
export declare namespace PreviewPanel {
|
|
64
|
+
var displayName: string;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=PreviewPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewPanel.d.ts","sourceRoot":"","sources":["../../src/components/PreviewPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,OAAO,EAAE,KAAK,GAAG,EAA4C,MAAM,OAAO,CAAA;AAW1E,OAAO,KAAK,EAAE,iBAAiB,EAAuC,MAAM,aAAa,CAAA;AA8NzF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,cAAc,EACd,aAAa,EACb,SAAS,EACT,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,MAAM,GACP,EAAE,iBAAiB,GAAG,GAAG,CAAC,OAAO,CA+lDjC;yBA5mDe,YAAY"}
|