@seed-ship/mcp-ui-solid 6.23.0 → 6.25.1
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/CHANGELOG.md +167 -0
- package/README.md +154 -2
- package/dist/components/ActionGroupRenderer.cjs +6 -6
- package/dist/components/ActionGroupRenderer.cjs.map +1 -1
- package/dist/components/ActionGroupRenderer.js +6 -6
- package/dist/components/ActionGroupRenderer.js.map +1 -1
- package/dist/components/AutocompleteDropdown.cjs +6 -6
- package/dist/components/AutocompleteDropdown.cjs.map +1 -1
- package/dist/components/AutocompleteDropdown.js +6 -6
- package/dist/components/AutocompleteDropdown.js.map +1 -1
- package/dist/components/AutocompleteFormField.cjs +6 -5
- package/dist/components/AutocompleteFormField.cjs.map +1 -1
- package/dist/components/AutocompleteFormField.d.ts.map +1 -1
- package/dist/components/AutocompleteFormField.js +6 -5
- package/dist/components/AutocompleteFormField.js.map +1 -1
- package/dist/components/ChartJSRenderer.cjs +406 -70
- package/dist/components/ChartJSRenderer.cjs.map +1 -1
- package/dist/components/ChartJSRenderer.d.ts.map +1 -1
- package/dist/components/ChartJSRenderer.js +407 -71
- package/dist/components/ChartJSRenderer.js.map +1 -1
- package/dist/components/ChatPrompt.cjs +5 -5
- package/dist/components/ChatPrompt.cjs.map +1 -1
- package/dist/components/ChatPrompt.js +5 -5
- package/dist/components/ChatPrompt.js.map +1 -1
- package/dist/components/ComponentToolbar.cjs +5 -5
- package/dist/components/ComponentToolbar.cjs.map +1 -1
- package/dist/components/ComponentToolbar.js +5 -5
- package/dist/components/ComponentToolbar.js.map +1 -1
- package/dist/components/DegradedFallback.cjs +35 -3
- package/dist/components/DegradedFallback.cjs.map +1 -1
- package/dist/components/DegradedFallback.d.ts +7 -0
- package/dist/components/DegradedFallback.d.ts.map +1 -1
- package/dist/components/DegradedFallback.js +35 -3
- package/dist/components/DegradedFallback.js.map +1 -1
- package/dist/components/ExpandableWrapper.cjs +10 -7
- package/dist/components/ExpandableWrapper.cjs.map +1 -1
- package/dist/components/ExpandableWrapper.d.ts.map +1 -1
- package/dist/components/ExpandableWrapper.js +10 -7
- package/dist/components/ExpandableWrapper.js.map +1 -1
- package/dist/components/FormFieldRenderer.cjs +13 -12
- package/dist/components/FormFieldRenderer.cjs.map +1 -1
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +13 -12
- package/dist/components/FormFieldRenderer.js.map +1 -1
- package/dist/components/FormRenderer.cjs +1 -1
- package/dist/components/FormRenderer.cjs.map +1 -1
- package/dist/components/FormRenderer.js +1 -1
- package/dist/components/FormRenderer.js.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.cjs +1 -1
- package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.js +1 -1
- package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
- package/dist/components/GhostText.cjs +2 -2
- package/dist/components/GhostText.cjs.map +1 -1
- package/dist/components/GhostText.js +2 -2
- package/dist/components/GhostText.js.map +1 -1
- package/dist/components/GraphRenderer.cjs +100 -29
- package/dist/components/GraphRenderer.cjs.map +1 -1
- package/dist/components/GraphRenderer.d.ts +1 -1
- package/dist/components/GraphRenderer.d.ts.map +1 -1
- package/dist/components/GraphRenderer.js +100 -29
- package/dist/components/GraphRenderer.js.map +1 -1
- package/dist/components/MissingValue.cjs +43 -0
- package/dist/components/MissingValue.cjs.map +1 -0
- package/dist/components/MissingValue.d.ts +27 -0
- package/dist/components/MissingValue.d.ts.map +1 -0
- package/dist/components/MissingValue.js +43 -0
- package/dist/components/MissingValue.js.map +1 -0
- package/dist/components/ModalRenderer.cjs +39 -31
- package/dist/components/ModalRenderer.cjs.map +1 -1
- package/dist/components/ModalRenderer.d.ts.map +1 -1
- package/dist/components/ModalRenderer.js +40 -32
- package/dist/components/ModalRenderer.js.map +1 -1
- package/dist/components/PortalDropdownMenu.cjs +6 -3
- package/dist/components/PortalDropdownMenu.cjs.map +1 -1
- package/dist/components/PortalDropdownMenu.d.ts.map +1 -1
- package/dist/components/PortalDropdownMenu.js +7 -4
- package/dist/components/PortalDropdownMenu.js.map +1 -1
- package/dist/components/ScratchpadPanel.cjs +38 -44
- package/dist/components/ScratchpadPanel.cjs.map +1 -1
- package/dist/components/ScratchpadPanel.d.ts.map +1 -1
- package/dist/components/ScratchpadPanel.js +38 -44
- package/dist/components/ScratchpadPanel.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +255 -217
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +255 -217
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/components/chart-data-table.cjs +30 -5
- package/dist/components/chart-data-table.cjs.map +1 -1
- package/dist/components/chart-data-table.d.ts +18 -1
- package/dist/components/chart-data-table.d.ts.map +1 -1
- package/dist/components/chart-data-table.js +30 -5
- package/dist/components/chart-data-table.js.map +1 -1
- package/dist/components/chart-missing-plugin.cjs +194 -0
- package/dist/components/chart-missing-plugin.cjs.map +1 -0
- package/dist/components/chart-missing-plugin.d.ts +129 -0
- package/dist/components/chart-missing-plugin.d.ts.map +1 -0
- package/dist/components/chart-missing-plugin.js +194 -0
- package/dist/components/chart-missing-plugin.js.map +1 -0
- package/dist/context/MCPUIStringsContext.cjs +12 -1
- package/dist/context/MCPUIStringsContext.cjs.map +1 -1
- package/dist/context/MCPUIStringsContext.d.ts +62 -0
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
- package/dist/context/MCPUIStringsContext.js +12 -1
- package/dist/context/MCPUIStringsContext.js.map +1 -1
- package/dist/services/component-registry.cjs +9 -2
- package/dist/services/component-registry.cjs.map +1 -1
- package/dist/services/component-registry.d.ts.map +1 -1
- package/dist/services/component-registry.js +9 -2
- package/dist/services/component-registry.js.map +1 -1
- package/dist/services/validation.cjs +31 -8
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +31 -8
- package/dist/services/validation.js.map +1 -1
- package/dist/types/index.d.ts +14 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/degraded-projections.cjs +19 -3
- package/dist/utils/degraded-projections.cjs.map +1 -1
- package/dist/utils/degraded-projections.d.ts +22 -2
- package/dist/utils/degraded-projections.d.ts.map +1 -1
- package/dist/utils/degraded-projections.js +19 -3
- package/dist/utils/degraded-projections.js.map +1 -1
- package/dist/utils/math-markdown.cjs +1 -1
- package/dist/utils/math-markdown.cjs.map +1 -1
- package/dist/utils/math-markdown.js +1 -1
- package/dist/utils/math-markdown.js.map +1 -1
- package/dist/utils/missing-value.cjs +60 -0
- package/dist/utils/missing-value.cjs.map +1 -0
- package/dist/utils/missing-value.d.ts +79 -0
- package/dist/utils/missing-value.d.ts.map +1 -0
- package/dist/utils/missing-value.js +60 -0
- package/dist/utils/missing-value.js.map +1 -0
- package/dist/utils/theme.cjs +91 -0
- package/dist/utils/theme.cjs.map +1 -0
- package/dist/utils/theme.d.ts +11 -0
- package/dist/utils/theme.d.ts.map +1 -0
- package/dist/utils/theme.js +91 -0
- package/dist/utils/theme.js.map +1 -0
- package/docs/SECURITY-DEPENDENCIES.md +81 -0
- package/docs/THEMING.md +205 -0
- package/package.json +7 -5
- package/src/components/ActionGroupRenderer.tsx +6 -6
- package/src/components/AutocompleteDropdown.tsx +17 -17
- package/src/components/AutocompleteFormField.tsx +10 -9
- package/src/components/ChartJSRenderer.tsx +609 -212
- package/src/components/ChatPrompt.tsx +16 -16
- package/src/components/ComponentToolbar.tsx +5 -5
- package/src/components/DegradedFallback.tsx +33 -11
- package/src/components/ExpandableWrapper.tsx +15 -11
- package/src/components/FormFieldRenderer.tsx +52 -51
- package/src/components/FormRenderer.tsx +12 -12
- package/src/components/GenerativeUIErrorBoundary.tsx +6 -6
- package/src/components/GhostText.tsx +7 -7
- package/src/components/GraphRenderer.tsx +83 -67
- package/src/components/MissingValue.tsx +61 -0
- package/src/components/ModalRenderer.tsx +11 -5
- package/src/components/PortalDropdownMenu.tsx +6 -2
- package/src/components/ScratchpadPanel.tsx +144 -141
- package/src/components/UIResourceRenderer.tsx +143 -110
- package/src/components/chart-data-table.ts +50 -6
- package/src/components/chart-missing-plugin.ts +336 -0
- package/src/context/MCPUIStringsContext.tsx +76 -0
- package/src/services/component-registry.ts +10 -2
- package/src/services/validation.ts +44 -9
- package/src/styles/autocomplete.css +53 -53
- package/src/types/index.ts +13 -1
- package/src/utils/degraded-projections.ts +44 -4
- package/src/utils/math-markdown.ts +1 -1
- package/src/utils/missing-value.ts +127 -0
- package/src/utils/theme.ts +101 -0
|
@@ -63,13 +63,13 @@ const STATUS_BADGES: Record<
|
|
|
63
63
|
ScratchpadState['status'],
|
|
64
64
|
{ labelKey: StatusLabelKey; class: string }
|
|
65
65
|
> = {
|
|
66
|
-
loading: { labelKey: 'statusLoading', class: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900
|
|
67
|
-
ready: { labelKey: 'statusActionAvailable', class: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900
|
|
68
|
-
waiting_human: { labelKey: 'statusYourTurn', class: 'bg-blue-100 text-blue-700 dark:bg-blue-900
|
|
69
|
-
processing: { labelKey: 'statusProcessing', class: 'bg-purple-100 text-purple-700 dark:bg-purple-900
|
|
70
|
-
complete: { labelKey: 'statusComplete', class: 'bg-green-100 text-green-600 dark:bg-green-900
|
|
66
|
+
loading: { labelKey: 'statusLoading', class: 'bg-[color:var(--mcp-ui-warning-soft,var(--color-yellow-100))] text-[color:var(--mcp-ui-warning,var(--color-yellow-700))] dark:bg-[color:var(--mcp-ui-warning-soft,color-mix(in_oklab,var(--color-yellow-900)_30%,transparent))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-400))]' },
|
|
67
|
+
ready: { labelKey: 'statusActionAvailable', class: 'bg-[color:var(--mcp-ui-info-soft,var(--color-cyan-100))] text-[color:var(--mcp-ui-info,var(--color-cyan-700))] dark:bg-[color:var(--mcp-ui-info-soft,color-mix(in_oklab,var(--color-cyan-900)_30%,transparent))] dark:text-[color:var(--mcp-ui-info,var(--color-cyan-400))]' },
|
|
68
|
+
waiting_human: { labelKey: 'statusYourTurn', class: 'bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-100))] text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_30%,transparent))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] animate-pulse' },
|
|
69
|
+
processing: { labelKey: 'statusProcessing', class: 'bg-[color:var(--mcp-ui-secondary-soft,var(--color-purple-100))] text-[color:var(--mcp-ui-secondary,var(--color-purple-700))] dark:bg-[color:var(--mcp-ui-secondary-soft,color-mix(in_oklab,var(--color-purple-900)_30%,transparent))] dark:text-[color:var(--mcp-ui-secondary,var(--color-purple-400))]' },
|
|
70
|
+
complete: { labelKey: 'statusComplete', class: 'bg-[color:var(--mcp-ui-success-soft,var(--color-green-100))] text-[color:var(--mcp-ui-success,var(--color-green-600))] dark:bg-[color:var(--mcp-ui-success-soft,color-mix(in_oklab,var(--color-green-900)_30%,transparent))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]' },
|
|
71
71
|
// The error badge reuses the existing `scratchpadError` key ('Error').
|
|
72
|
-
error: { labelKey: 'scratchpadError', class: 'bg-red-100 text-red-600 dark:bg-red-900
|
|
72
|
+
error: { labelKey: 'scratchpadError', class: 'bg-[color:var(--mcp-ui-danger-soft,var(--color-red-100))] text-[color:var(--mcp-ui-danger,var(--color-red-600))] dark:bg-[color:var(--mcp-ui-danger-soft,color-mix(in_oklab,var(--color-red-900)_30%,transparent))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]' },
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
@@ -188,21 +188,24 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
188
188
|
|
|
189
189
|
return (
|
|
190
190
|
<div
|
|
191
|
-
class={`w-full bg-white dark:bg-gray-800 rounded-xl border shadow-lg overflow-visible ${
|
|
191
|
+
class={`mcp-ui-root w-full bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] rounded-xl border shadow-[var(--mcp-ui-shadow,var(--shadow-lg))] overflow-visible ${
|
|
192
192
|
props.state.status === 'waiting_human'
|
|
193
|
-
? 'border-blue-300 dark:border-blue-600'
|
|
194
|
-
: 'border-gray-200 dark:border-gray-700'
|
|
193
|
+
? 'border-[color:var(--mcp-ui-accent-border,var(--color-blue-300))] dark:border-[color:var(--mcp-ui-accent-border,var(--color-blue-600))]'
|
|
194
|
+
: 'border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))]'
|
|
195
195
|
} ${props.pinned ? 'sticky top-0 z-40' : ''}`}
|
|
196
|
-
style={{
|
|
196
|
+
style={{
|
|
197
|
+
animation: 'scratchpad-slide-down 0.2s ease-out',
|
|
198
|
+
'scrollbar-color': 'var(--mcp-ui-scrollbar-thumb,auto) var(--mcp-ui-scrollbar-track,transparent)',
|
|
199
|
+
}}
|
|
197
200
|
>
|
|
198
201
|
{/* Header */}
|
|
199
202
|
<div
|
|
200
|
-
class={`flex items-center justify-between px-4 py-3 border-b border-gray-100 dark:border-gray-700 ${isCollapsible() ? 'cursor-pointer select-none hover:bg-gray-50 dark:hover:bg-gray-750' : ''}`}
|
|
203
|
+
class={`flex items-center justify-between px-4 py-3 border-b border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] ${isCollapsible() ? 'cursor-pointer select-none hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-50,#f9fafb))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-750))]' : ''}`}
|
|
201
204
|
onClick={() => isCollapsible() && setCollapsed(!collapsed())}
|
|
202
205
|
>
|
|
203
206
|
<div class="flex items-center gap-2">
|
|
204
207
|
<span class="text-base">📝</span>
|
|
205
|
-
<h3 class="text-sm font-semibold text-gray-900 dark:text-white">{props.state.title}</h3>
|
|
208
|
+
<h3 class="text-sm font-semibold text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{props.state.title}</h3>
|
|
206
209
|
{/* AgentStatusBadge — auto-detected from agent_card sections (v4.1.0) */}
|
|
207
210
|
{(() => {
|
|
208
211
|
const agentSection = props.state.sections.find(s => s.type === 'agent_card')
|
|
@@ -212,7 +215,7 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
212
215
|
return <AgentStatusBadge agentName={ac.name} status={ac.status || 'idle'} />
|
|
213
216
|
})()}
|
|
214
217
|
<Show when={isCollapsible()}>
|
|
215
|
-
<svg class={`w-3.5 h-3.5 text-gray-400 transition-transform ${collapsed() ? '-rotate-90' : ''}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
218
|
+
<svg class={`w-3.5 h-3.5 text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] transition-transform ${collapsed() ? '-rotate-90' : ''}`} fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
216
219
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
217
220
|
</svg>
|
|
218
221
|
</Show>
|
|
@@ -220,7 +223,7 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
220
223
|
<div class="flex items-center gap-2">
|
|
221
224
|
<span class={`px-2 py-0.5 text-xs font-medium rounded-full ${badge().class}`}>{strings[badge().labelKey]}</span>
|
|
222
225
|
<Show when={isClosable() && props.onClose}>
|
|
223
|
-
<button onClick={(e) => { e.stopPropagation(); props.onClose?.() }} class="p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors" aria-label={strings.scratchpadClose}>
|
|
226
|
+
<button onClick={(e) => { e.stopPropagation(); props.onClose?.() }} class="p-1 text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] hover:text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] dark:hover:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] rounded-full hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))] transition-colors" aria-label={strings.scratchpadClose}>
|
|
224
227
|
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" /></svg>
|
|
225
228
|
</button>
|
|
226
229
|
</Show>
|
|
@@ -232,18 +235,18 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
232
235
|
<div style={{ "max-height": props.maxHeight || "500px", "overflow-y": "auto" }}>
|
|
233
236
|
{/* Turn history header */}
|
|
234
237
|
<Show when={props.state.turnHistory && props.state.turnHistory.length > 0}>
|
|
235
|
-
<div class="px-4 py-2 border-b border-gray-100 dark:border-gray-700 flex flex-wrap items-center gap-1.5">
|
|
238
|
+
<div class="px-4 py-2 border-b border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] flex flex-wrap items-center gap-1.5">
|
|
236
239
|
<For each={props.state.turnHistory}>
|
|
237
240
|
{(turn, i) => (
|
|
238
241
|
<>
|
|
239
242
|
<Show when={i() > 0}>
|
|
240
|
-
<svg class="w-3 h-3 text-gray-300 dark:text-gray-600 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
243
|
+
<svg class="w-3 h-3 text-[color:var(--mcp-ui-fg-muted,var(--color-gray-300,#d1d5db))] dark:text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
241
244
|
</Show>
|
|
242
245
|
<span class={`text-xs font-medium px-2 py-0.5 rounded-full ${
|
|
243
|
-
turn.status === 'done' ? 'bg-green-100 dark:bg-green-900
|
|
244
|
-
: turn.status === 'active' ? 'bg-blue-100 dark:bg-blue-900
|
|
245
|
-
: turn.status === 'skipped' ? 'bg-gray-100 dark:bg-gray-700 text-gray-400 line-through'
|
|
246
|
-
: 'bg-gray-100 dark:bg-gray-700 text-gray-400'
|
|
246
|
+
turn.status === 'done' ? 'bg-[color:var(--mcp-ui-success-soft,var(--color-green-100))] dark:bg-[color:var(--mcp-ui-success-soft,color-mix(in_oklab,var(--color-green-900)_30%,transparent))] text-[color:var(--mcp-ui-success,var(--color-green-700))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]'
|
|
247
|
+
: turn.status === 'active' ? 'bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-100))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_30%,transparent))] text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))]'
|
|
248
|
+
: turn.status === 'skipped' ? 'bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-100,#f3f4f6))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-700,#374151))] text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] line-through'
|
|
249
|
+
: 'bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-100,#f3f4f6))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-700,#374151))] text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]'
|
|
247
250
|
}`}>
|
|
248
251
|
{turn.status === 'done' ? '✅' : turn.status === 'active' ? '●' : '○'} {turn.label}
|
|
249
252
|
<Show when={turn.summary}><span class="ml-1 font-normal opacity-75">— {turn.summary}</span></Show>
|
|
@@ -255,7 +258,7 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
255
258
|
</Show>
|
|
256
259
|
|
|
257
260
|
{/* Sections */}
|
|
258
|
-
<div class="divide-y divide-gray-100 dark:divide-gray-700">
|
|
261
|
+
<div class="divide-y divide-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:divide-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))]">
|
|
259
262
|
<For each={props.state.sections}>
|
|
260
263
|
{(section) => (
|
|
261
264
|
<SectionRenderer
|
|
@@ -273,13 +276,13 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
273
276
|
|
|
274
277
|
{/* Agent messages */}
|
|
275
278
|
<Show when={props.state.agentMessages.length > 0}>
|
|
276
|
-
<div class="px-4 py-3 border-t border-gray-100 dark:border-gray-700 space-y-2">
|
|
279
|
+
<div class="px-4 py-3 border-t border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] space-y-2">
|
|
277
280
|
<For each={props.state.agentMessages}>
|
|
278
281
|
{(msg) => (
|
|
279
282
|
<div class={`flex items-start gap-2 text-sm rounded-lg px-3 py-2 ${
|
|
280
|
-
msg.type === 'warning' ? 'bg-amber-50 dark:bg-amber-900
|
|
281
|
-
: msg.type === 'question' ? 'bg-blue-50 dark:bg-blue-900
|
|
282
|
-
: 'bg-gray-50 dark:bg-gray-700
|
|
283
|
+
msg.type === 'warning' ? 'bg-[color:var(--mcp-ui-warning-soft,var(--color-amber-50))] dark:bg-[color:var(--mcp-ui-warning-soft,color-mix(in_oklab,var(--color-amber-900)_10%,transparent))] text-[color:var(--mcp-ui-warning,var(--color-amber-700))] dark:text-[color:var(--mcp-ui-warning,var(--color-amber-400))]'
|
|
284
|
+
: msg.type === 'question' ? 'bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_10%,transparent))] text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] border border-[color:var(--mcp-ui-accent-border,var(--color-blue-200))] dark:border-[color:var(--mcp-ui-accent-border,var(--color-blue-800))]'
|
|
285
|
+
: 'bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-50,#f9fafb))] dark:bg-[color:var(--mcp-ui-surface-muted,color-mix(in_oklab,var(--color-gray-700,#374151)_50%,transparent))] text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]'
|
|
283
286
|
}`}>
|
|
284
287
|
<span class="flex-shrink-0 mt-0.5">{msg.type === 'warning' ? '⚠️' : msg.type === 'question' ? '❓' : 'ℹ️'}</span>
|
|
285
288
|
<p>{msg.text}</p>
|
|
@@ -291,19 +294,19 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
291
294
|
|
|
292
295
|
{/* Preview */}
|
|
293
296
|
<Show when={preview()}>
|
|
294
|
-
<div class="px-4 py-3 border-t border-gray-100 dark:border-gray-700">
|
|
297
|
+
<div class="px-4 py-3 border-t border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))]">
|
|
295
298
|
<Show when={preview()!.count === 0} fallback={
|
|
296
299
|
<>
|
|
297
300
|
<div class="flex items-center gap-2 mb-2">
|
|
298
|
-
<span class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide">{strings.scratchpadPreview}</span>
|
|
299
|
-
<span class="px-1.5 py-0.5 text-xs font-bold bg-blue-100 dark:bg-blue-900
|
|
301
|
+
<span class="text-xs font-medium text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] uppercase tracking-wide">{strings.scratchpadPreview}</span>
|
|
302
|
+
<span class="px-1.5 py-0.5 text-xs font-bold bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-100))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_30%,transparent))] text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-300))] rounded">{preview()!.count.toLocaleString(strings.locale)}</span>
|
|
300
303
|
</div>
|
|
301
|
-
<p class="text-sm text-gray-700 dark:text-gray-300">{preview()!.summary}</p>
|
|
304
|
+
<p class="text-sm text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]">{preview()!.summary}</p>
|
|
302
305
|
<Show when={preview()!.rows && preview()!.rows!.length > 0}>
|
|
303
306
|
<div class="mt-2 overflow-x-auto">
|
|
304
307
|
<table class="min-w-full text-xs">
|
|
305
|
-
<thead><tr><For each={Object.keys(preview()!.rows![0])}>{(k) => <th class="px-2 py-1 text-left font-medium text-gray-500 dark:text-gray-400">{k}</th>}</For></tr></thead>
|
|
306
|
-
<tbody><For each={preview()!.rows!.slice(0, 5)}>{(row) => <tr class="border-t border-gray-100 dark:border-gray-700"><For each={Object.values(row)}>{(v) => <td class="px-2 py-1 text-gray-700 dark:text-gray-300">{String(v)}</td>}</For></tr>}</For></tbody>
|
|
308
|
+
<thead><tr><For each={Object.keys(preview()!.rows![0])}>{(k) => <th class="px-2 py-1 text-left font-medium text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">{k}</th>}</For></tr></thead>
|
|
309
|
+
<tbody><For each={preview()!.rows!.slice(0, 5)}>{(row) => <tr class="border-t border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))]"><For each={Object.values(row)}>{(v) => <td class="px-2 py-1 text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]">{String(v)}</td>}</For></tr>}</For></tbody>
|
|
307
310
|
</table>
|
|
308
311
|
</div>
|
|
309
312
|
</Show>
|
|
@@ -311,8 +314,8 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
311
314
|
}>
|
|
312
315
|
<div class="flex flex-col items-center gap-2 py-4 text-center">
|
|
313
316
|
<span class="text-2xl">🔍</span>
|
|
314
|
-
<p class="text-sm text-gray-500 dark:text-gray-400">{strings.scratchpadNoResults}</p>
|
|
315
|
-
<button type="button" onClick={() => props.onAction?.('refine_filters')} class="px-3 py-1.5 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900
|
|
317
|
+
<p class="text-sm text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">{strings.scratchpadNoResults}</p>
|
|
318
|
+
<button type="button" onClick={() => props.onAction?.('refine_filters')} class="px-3 py-1.5 text-xs font-medium text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] hover:bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:hover:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_20%,transparent))] rounded-lg transition-colors">{strings.scratchpadModifyFilters}</button>
|
|
316
319
|
</div>
|
|
317
320
|
</Show>
|
|
318
321
|
</div>
|
|
@@ -320,13 +323,13 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
320
323
|
|
|
321
324
|
{/* Error state with retry */}
|
|
322
325
|
<Show when={props.state.status === 'error' && props.state.error}>
|
|
323
|
-
<div class="px-4 py-3 border-t border-red-100 dark:border-red-900
|
|
324
|
-
<div class="flex items-start gap-2 text-sm text-red-700 dark:text-red-400">
|
|
326
|
+
<div class="px-4 py-3 border-t border-[color:var(--mcp-ui-danger-border,var(--color-red-100))] dark:border-[color:var(--mcp-ui-danger-border,color-mix(in_oklab,var(--color-red-900)_30%,transparent))] bg-[color:var(--mcp-ui-danger-soft,var(--color-red-50))] dark:bg-[color:var(--mcp-ui-danger-soft,color-mix(in_oklab,var(--color-red-900)_10%,transparent))]">
|
|
327
|
+
<div class="flex items-start gap-2 text-sm text-[color:var(--mcp-ui-danger,var(--color-red-700))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]">
|
|
325
328
|
<span class="flex-shrink-0 mt-0.5">⚠️</span>
|
|
326
329
|
<div class="flex-1">
|
|
327
330
|
<p class="font-medium">{props.state.error!.message}</p>
|
|
328
331
|
<Show when={props.state.error!.code}>
|
|
329
|
-
<p class="text-xs text-red-500 dark:text-red-500 mt-0.5">
|
|
332
|
+
<p class="text-xs text-[color:var(--mcp-ui-danger,var(--color-red-500))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-500))] mt-0.5">
|
|
330
333
|
{formatMCPUIString(strings.scratchpadErrorCode, { code: props.state.error!.code! })}
|
|
331
334
|
</p>
|
|
332
335
|
</Show>
|
|
@@ -335,13 +338,13 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
335
338
|
<div class="flex gap-2 mt-2">
|
|
336
339
|
<Show when={props.state.error!.retryable !== false}>
|
|
337
340
|
<button type="button" onClick={() => props.onRetry?.()}
|
|
338
|
-
class="px-3 py-1.5 text-sm font-medium rounded-lg bg-red-600 text-white hover:bg-red-700 transition-colors flex items-center gap-1">
|
|
341
|
+
class="px-3 py-1.5 text-sm font-medium rounded-lg bg-[color:var(--mcp-ui-danger,var(--color-red-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] hover:bg-[color:var(--mcp-ui-danger-hover,var(--color-red-700))] transition-colors flex items-center gap-1">
|
|
339
342
|
🔄 {strings.retry}
|
|
340
343
|
</button>
|
|
341
344
|
</Show>
|
|
342
345
|
<Show when={props.onClose}>
|
|
343
346
|
<button type="button" onClick={() => props.onClose?.()}
|
|
344
|
-
class="px-3 py-1.5 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">
|
|
347
|
+
class="px-3 py-1.5 text-sm font-medium rounded-lg border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))] transition-colors">
|
|
345
348
|
{strings.scratchpadClose}
|
|
346
349
|
</button>
|
|
347
350
|
</Show>
|
|
@@ -351,11 +354,11 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
351
354
|
|
|
352
355
|
{/* Search button when waiting_human */}
|
|
353
356
|
<Show when={props.state.status === 'waiting_human' && hasFilters()}>
|
|
354
|
-
<div class="px-4 py-3 border-t border-gray-100 dark:border-gray-700">
|
|
357
|
+
<div class="px-4 py-3 border-t border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))]">
|
|
355
358
|
<button
|
|
356
359
|
type="button"
|
|
357
360
|
onClick={() => handleAction('search', { filters: props.state.filters })}
|
|
358
|
-
class="w-full px-4 py-2.5 text-sm font-semibold rounded-lg text-white bg-blue-600 hover:bg-blue-700 transition-colors flex items-center justify-center gap-2"
|
|
361
|
+
class="w-full px-4 py-2.5 text-sm font-semibold rounded-lg text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] bg-[color:var(--mcp-ui-accent,var(--color-blue-600))] hover:bg-[color:var(--mcp-ui-accent-hover,var(--color-blue-700))] transition-colors flex items-center justify-center gap-2"
|
|
359
362
|
>
|
|
360
363
|
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /></svg>
|
|
361
364
|
{strings.scratchpadSearch}
|
|
@@ -371,7 +374,7 @@ export const ScratchpadPanel: Component<ScratchpadPanelProps> = (props) => {
|
|
|
371
374
|
|
|
372
375
|
{/* Debug overlay */}
|
|
373
376
|
<Show when={props.debugOverlay}>
|
|
374
|
-
<div class="absolute bottom-1 right-1 px-2 py-1 text-[9px] font-mono bg-black
|
|
377
|
+
<div class="absolute bottom-1 right-1 px-2 py-1 text-[9px] font-mono bg-[color:var(--mcp-ui-overlay,color-mix(in_oklab,var(--color-black,#000)_80%,transparent))] text-[color:var(--mcp-ui-success,var(--color-green-400))] rounded z-50 pointer-events-none">
|
|
375
378
|
{props.state.id} | ev:{eventCount()} | sec:{props.state.sections?.length || 0} | {props.state.status} | last:{lastEvent()}
|
|
376
379
|
</div>
|
|
377
380
|
</Show>
|
|
@@ -402,11 +405,11 @@ const SectionRenderer: Component<{
|
|
|
402
405
|
}> = (props) => {
|
|
403
406
|
return (
|
|
404
407
|
<div class="px-4 py-3 animate-[slideDown_0.2s_ease-out]">
|
|
405
|
-
<h4 class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-2">{props.section.title}</h4>
|
|
408
|
+
<h4 class="text-xs font-medium text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] uppercase tracking-wide mb-2">{props.section.title}</h4>
|
|
406
409
|
<Switch>
|
|
407
410
|
<Match when={props.section.type === 'data'}><DataSection content={parseContent(props.section.content)} /></Match>
|
|
408
411
|
<Match when={props.section.type === 'filter'}><InteractiveFilterSection content={parseContent(props.section.content)} filters={props.filters} onFilterChange={props.onFilterChange} /></Match>
|
|
409
|
-
<Match when={props.section.type === 'message'}><p class="text-sm text-gray-700 dark:text-gray-300">{String(props.section.content)}</p></Match>
|
|
412
|
+
<Match when={props.section.type === 'message'}><p class="text-sm text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]">{String(props.section.content)}</p></Match>
|
|
410
413
|
<Match when={props.section.type === 'action'}><ActionSection content={parseContent(props.section.content)} onAction={props.onAction} /></Match>
|
|
411
414
|
<Match when={props.section.type === 'steps'}><EnrichedStepsSection content={parseContent(props.section.content)} onAction={props.onAction} onFilterChange={props.onFilterChange} /></Match>
|
|
412
415
|
<Match when={props.section.type === 'form'}><EmbeddedFormSection content={parseContent(props.section.content)} sectionId={props.section.id} onAction={props.onAction} onSubmit={props.onSubmit} debugTrace={props.debugTrace} /></Match>
|
|
@@ -425,7 +428,7 @@ const SectionRenderer: Component<{
|
|
|
425
428
|
<Match when={props.section.type === 'split_stepper'}><SplitStepper content={parseContent(props.section.content) as SplitStepperContent} /></Match>
|
|
426
429
|
<Match when={props.section.type === 'agent_handoff'}><AgentHandoff content={parseContent(props.section.content) as AgentHandoffContent} /></Match>
|
|
427
430
|
<Match when={props.section.type === 'briefing_diff'}><BriefingDiff content={parseContent(props.section.content) as BriefingDiffContent} /></Match>
|
|
428
|
-
<Match when={true}><pre class="text-xs text-gray-500 overflow-auto">{JSON.stringify(props.section.content, null, 2)}</pre></Match>
|
|
431
|
+
<Match when={true}><pre class="text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] overflow-auto">{JSON.stringify(props.section.content, null, 2)}</pre></Match>
|
|
429
432
|
</Switch>
|
|
430
433
|
</div>
|
|
431
434
|
)
|
|
@@ -437,7 +440,7 @@ const DataSection: Component<{ content: unknown }> = (props) => {
|
|
|
437
440
|
const entries = () => typeof props.content === 'object' && props.content ? Object.entries(props.content as Record<string, unknown>) : []
|
|
438
441
|
return (
|
|
439
442
|
<div class="space-y-1">
|
|
440
|
-
<For each={entries()}>{([k, v]) => <div class="flex gap-2 text-xs"><span class="text-gray-500 dark:text-gray-400 font-mono min-w-[120px]">{k}:</span><span class="text-gray-900 dark:text-white">{Array.isArray(v) ? v.join(', ') : String(v)}</span></div>}</For>
|
|
443
|
+
<For each={entries()}>{([k, v]) => <div class="flex gap-2 text-xs"><span class="text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] font-mono min-w-[120px]">{k}:</span><span class="text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{Array.isArray(v) ? v.join(', ') : String(v)}</span></div>}</For>
|
|
441
444
|
</div>
|
|
442
445
|
)
|
|
443
446
|
}
|
|
@@ -491,37 +494,37 @@ const InteractiveFilterSection: Component<{
|
|
|
491
494
|
<div class="relative">
|
|
492
495
|
<Show when={hasValue()} fallback={
|
|
493
496
|
<button type="button" onClick={() => { setEditingKey(key); setEditValue('') }}
|
|
494
|
-
class="inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium border border-dashed border-gray-300 dark:border-gray-600 text-gray-500 dark:text-gray-400 rounded-full hover:border-blue-400 hover:text-blue-500 transition-colors">
|
|
497
|
+
class="inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium border border-dashed border-[color:var(--mcp-ui-border,var(--color-gray-300,#d1d5db))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] rounded-full hover:border-[color:var(--mcp-ui-accent-border,var(--color-blue-400))] hover:text-[color:var(--mcp-ui-accent,var(--color-blue-500))] transition-colors">
|
|
495
498
|
+ {def()?.label || key}
|
|
496
499
|
</button>
|
|
497
500
|
}>
|
|
498
|
-
<span class="inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium bg-blue-100 dark:bg-blue-900
|
|
501
|
+
<span class="inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-100))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_30%,transparent))] text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-300))] rounded-full">
|
|
499
502
|
<button type="button" onClick={() => { setEditingKey(key); setEditValue(String(value() || '')) }} class="hover:underline">
|
|
500
|
-
<span class="text-blue-500 dark:text-blue-400">{def()?.label || key}:</span> {Array.isArray(value()) ? (value() as string[]).join(', ') : String(value())}
|
|
503
|
+
<span class="text-[color:var(--mcp-ui-accent,var(--color-blue-500))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))]">{def()?.label || key}:</span> {Array.isArray(value()) ? (value() as string[]).join(', ') : String(value())}
|
|
501
504
|
</button>
|
|
502
505
|
<Show when={props.onFilterChange}>
|
|
503
|
-
<button type="button" onClick={() => removeFilter(key)} class="ml-0.5 hover:text-blue-900 dark:hover:text-blue-100" aria-label={formatMCPUIString(strings.removeItem, { name: key })}>×</button>
|
|
506
|
+
<button type="button" onClick={() => removeFilter(key)} class="ml-0.5 hover:text-[color:var(--mcp-ui-accent,var(--color-blue-900))] dark:hover:text-[color:var(--mcp-ui-accent,var(--color-blue-100))]" aria-label={formatMCPUIString(strings.removeItem, { name: key })}>×</button>
|
|
504
507
|
</Show>
|
|
505
508
|
</span>
|
|
506
509
|
</Show>
|
|
507
510
|
|
|
508
511
|
{/* Inline editor */}
|
|
509
512
|
<Show when={editingKey() === key}>
|
|
510
|
-
<div class="absolute z-50 mt-1 left-0 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-lg shadow-lg p-2 min-w-[200px]">
|
|
513
|
+
<div class="absolute z-50 mt-1 left-0 bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] rounded-lg shadow-[var(--mcp-ui-shadow,var(--shadow-lg))] p-2 min-w-[200px]">
|
|
511
514
|
<Show when={def()?.options} fallback={
|
|
512
515
|
<form onSubmit={(e) => { e.preventDefault(); setFilter(key, editValue()) }} class="flex gap-1">
|
|
513
516
|
<input type="text" value={editValue()} onInput={(e) => setEditValue(e.currentTarget.value)} placeholder={def()?.placeholder || key} autofocus
|
|
514
|
-
class="flex-1 px-2 py-1 text-sm border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 outline-none" />
|
|
515
|
-
<button type="submit" class="px-2 py-1 text-xs bg-blue-600 text-white rounded hover:bg-blue-700">{strings.ok}</button>
|
|
516
|
-
<button type="button" onClick={() => setEditingKey(null)} class="px-2 py-1 text-xs text-gray-500 hover:text-gray-700">{strings.cancel}</button>
|
|
517
|
+
class="flex-1 px-2 py-1 text-sm border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] rounded bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-700,#374151))] text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))] focus:border-[color:var(--mcp-ui-focus,var(--color-blue-400))] outline-none" />
|
|
518
|
+
<button type="submit" class="px-2 py-1 text-xs bg-[color:var(--mcp-ui-accent,var(--color-blue-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] rounded hover:bg-[color:var(--mcp-ui-accent-hover,var(--color-blue-700))]">{strings.ok}</button>
|
|
519
|
+
<button type="button" onClick={() => setEditingKey(null)} class="px-2 py-1 text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] hover:text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))]">{strings.cancel}</button>
|
|
517
520
|
</form>
|
|
518
521
|
}>
|
|
519
522
|
<div class="max-h-48 overflow-y-auto">
|
|
520
523
|
<For each={def().options as Array<{ value: string; label: string }>}>
|
|
521
524
|
{(opt) => (
|
|
522
525
|
<button type="button" onClick={() => setFilter(key, opt.value)}
|
|
523
|
-
class={`w-full text-left px-2 py-1.5 text-sm rounded hover:bg-blue-50 dark:hover:bg-blue-900
|
|
524
|
-
String(value()) === opt.value ? 'text-blue-600 dark:text-blue-400 bg-blue-50
|
|
526
|
+
class={`w-full text-left px-2 py-1.5 text-sm rounded hover:bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:hover:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_20%,transparent))] ${
|
|
527
|
+
String(value()) === opt.value ? 'text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-50)_50%,transparent))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_10%,transparent))]' : 'text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]'
|
|
525
528
|
}`}>
|
|
526
529
|
{opt.label}
|
|
527
530
|
<Show when={String(value()) === opt.value}><span class="ml-1">✓</span></Show>
|
|
@@ -529,7 +532,7 @@ const InteractiveFilterSection: Component<{
|
|
|
529
532
|
)}
|
|
530
533
|
</For>
|
|
531
534
|
</div>
|
|
532
|
-
<button type="button" onClick={() => setEditingKey(null)} class="mt-1 w-full px-2 py-1 text-xs text-gray-500 hover:text-gray-700 text-center">{strings.cancel}</button>
|
|
535
|
+
<button type="button" onClick={() => setEditingKey(null)} class="mt-1 w-full px-2 py-1 text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] hover:text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] text-center">{strings.cancel}</button>
|
|
533
536
|
</Show>
|
|
534
537
|
</div>
|
|
535
538
|
</Show>
|
|
@@ -538,7 +541,7 @@ const InteractiveFilterSection: Component<{
|
|
|
538
541
|
}}
|
|
539
542
|
</For>
|
|
540
543
|
<Show when={allKeys().length === 0}>
|
|
541
|
-
<p class="text-xs text-gray-400 italic">{strings.scratchpadNoFilters}</p>
|
|
544
|
+
<p class="text-xs text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] italic">{strings.scratchpadNoFilters}</p>
|
|
542
545
|
</Show>
|
|
543
546
|
</div>
|
|
544
547
|
)
|
|
@@ -707,21 +710,21 @@ const EmbeddedFormSection: Component<{
|
|
|
707
710
|
return (
|
|
708
711
|
<>
|
|
709
712
|
<Show when={!showToast()} fallback={
|
|
710
|
-
<div class="flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900
|
|
711
|
-
<span class="flex-1 text-blue-800 dark:text-blue-200 font-medium">
|
|
713
|
+
<div class="flex items-center gap-3 p-3 bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_20%,transparent))] border border-[color:var(--mcp-ui-accent-border,var(--color-blue-200))] dark:border-[color:var(--mcp-ui-accent-border,var(--color-blue-800))] rounded-lg text-sm">
|
|
714
|
+
<span class="flex-1 text-[color:var(--mcp-ui-accent,var(--color-blue-800))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-200))] font-medium">
|
|
712
715
|
{config().fields.map((f: any) => f.displayHint || f.prefill).join(', ')}
|
|
713
716
|
</span>
|
|
714
|
-
<span class="text-blue-600 dark:text-blue-300">{countdown()}s...</span>
|
|
717
|
+
<span class="text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-300))]">{countdown()}s...</span>
|
|
715
718
|
<button type="button" onClick={() => { setExpanded(true); cancelCountdown(); setUserInteracted(true) }}
|
|
716
|
-
class="text-blue-600 dark:text-blue-400 underline text-xs">{strings.scratchpadEdit}</button>
|
|
719
|
+
class="text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] underline text-xs">{strings.scratchpadEdit}</button>
|
|
717
720
|
<button type="button" onClick={() => { cancelCountdown(); setUserInteracted(true) }}
|
|
718
|
-
class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300">×</button>
|
|
721
|
+
class="text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] hover:text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] dark:hover:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]">×</button>
|
|
719
722
|
</div>
|
|
720
723
|
}>
|
|
721
724
|
<form id={`scratchpad-form-${props.sectionId}`} onSubmit={handleSubmit} class="flex flex-col gap-3">
|
|
722
725
|
{/* Proposal 3: prefill summary */}
|
|
723
726
|
<Show when={prefillSummary().prefilled > 0}>
|
|
724
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">
|
|
727
|
+
<p class="text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">
|
|
725
728
|
{formatMCPUIString(
|
|
726
729
|
prefillSummary().prefilled === 1 ? strings.formPrefilledOne : strings.formPrefilledMany,
|
|
727
730
|
{ count: prefillSummary().prefilled, total: prefillSummary().total }
|
|
@@ -739,8 +742,8 @@ const EmbeddedFormSection: Component<{
|
|
|
739
742
|
)}
|
|
740
743
|
</For>
|
|
741
744
|
<Show when={countdown() != null}>
|
|
742
|
-
<div class="flex items-center gap-3 p-2 bg-blue-50 dark:bg-blue-900
|
|
743
|
-
<span class="text-blue-700 dark:text-blue-300">
|
|
745
|
+
<div class="flex items-center gap-3 p-2 bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_20%,transparent))] border border-[color:var(--mcp-ui-accent-border,var(--color-blue-200))] dark:border-[color:var(--mcp-ui-accent-border,var(--color-blue-800))] rounded-md text-sm">
|
|
746
|
+
<span class="text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-300))]">
|
|
744
747
|
{formatMCPUIString(strings.formSubmitCountdown, {
|
|
745
748
|
label: config().submitLabel,
|
|
746
749
|
seconds: countdown()!,
|
|
@@ -749,14 +752,14 @@ const EmbeddedFormSection: Component<{
|
|
|
749
752
|
<button
|
|
750
753
|
type="button"
|
|
751
754
|
onClick={() => { cancelCountdown(); setUserInteracted(true) }}
|
|
752
|
-
class="text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200"
|
|
755
|
+
class="text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] underline hover:text-[color:var(--mcp-ui-accent,var(--color-blue-800))] dark:hover:text-[color:var(--mcp-ui-accent,var(--color-blue-200))]"
|
|
753
756
|
>
|
|
754
757
|
{strings.cancel}
|
|
755
758
|
</button>
|
|
756
759
|
</div>
|
|
757
760
|
</Show>
|
|
758
761
|
<div class="flex justify-end">
|
|
759
|
-
<button type="submit" class="px-4 py-2 text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 transition-colors">
|
|
762
|
+
<button type="submit" class="px-4 py-2 text-sm font-medium rounded-lg text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] bg-[color:var(--mcp-ui-accent,var(--color-blue-600))] hover:bg-[color:var(--mcp-ui-accent-hover,var(--color-blue-700))] transition-colors">
|
|
760
763
|
{config().submitLabel}
|
|
761
764
|
</button>
|
|
762
765
|
</div>
|
|
@@ -807,28 +810,28 @@ const FormDebugTrace: Component<{
|
|
|
807
810
|
const serverDebug = () => (props.rawContent as any)?._debug
|
|
808
811
|
|
|
809
812
|
return (
|
|
810
|
-
<div class="mt-2 border border-gray-200 dark:border-gray-700 rounded-md text-xs font-mono">
|
|
813
|
+
<div class="mt-2 border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] rounded-md text-xs font-mono">
|
|
811
814
|
<button
|
|
812
815
|
type="button"
|
|
813
816
|
onClick={() => setOpen(!open())}
|
|
814
|
-
class="w-full px-3 py-1.5 text-left text-gray-500 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 flex items-center gap-1"
|
|
817
|
+
class="w-full px-3 py-1.5 text-left text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-50,#f9fafb))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-800,#1f2937))] flex items-center gap-1"
|
|
815
818
|
>
|
|
816
819
|
<span>{open() ? '\u25BE' : '\u25B8'}</span>
|
|
817
820
|
Debug trace ({prefilledCount()}/{props.fields.length} prefilled)
|
|
818
821
|
</button>
|
|
819
822
|
<Show when={open()}>
|
|
820
|
-
<div class="px-3 pb-3 space-y-2 text-gray-600 dark:text-gray-400 border-t border-gray-200 dark:border-gray-700 pt-2">
|
|
823
|
+
<div class="px-3 pb-3 space-y-2 text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] border-t border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] pt-2">
|
|
821
824
|
<div>Fields: {props.fields.length} total, {prefilledCount()} prefilled</div>
|
|
822
825
|
|
|
823
826
|
<For each={props.fields}>
|
|
824
827
|
{(field: any) => (
|
|
825
|
-
<div class="pl-2 border-l-2 border-gray-200 dark:border-gray-600 space-y-0.5">
|
|
826
|
-
<div class="text-gray-800 dark:text-gray-200 font-medium">{field.name}:</div>
|
|
828
|
+
<div class="pl-2 border-l-2 border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] space-y-0.5">
|
|
829
|
+
<div class="text-[color:var(--mcp-ui-fg,var(--color-gray-800,#1f2937))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-200,#e5e7eb))] font-medium">{field.name}:</div>
|
|
827
830
|
<Show when={field.prefill != null}>
|
|
828
831
|
<div> prefill: {JSON.stringify(field.prefill)}</div>
|
|
829
832
|
</Show>
|
|
830
833
|
<Show when={!field.prefill}>
|
|
831
|
-
<div class="text-amber-500"> prefill: (none)</div>
|
|
834
|
+
<div class="text-[color:var(--mcp-ui-warning,var(--color-amber-500))]"> prefill: (none)</div>
|
|
832
835
|
</Show>
|
|
833
836
|
<Show when={field.source}><div> source: {field.source}</div></Show>
|
|
834
837
|
<Show when={field.displayHint}><div> displayHint: "{field.displayHint}"</div></Show>
|
|
@@ -840,7 +843,7 @@ const FormDebugTrace: Component<{
|
|
|
840
843
|
const v = props.submittedValues![field.name]
|
|
841
844
|
const hasValue = v !== undefined && v !== '' && !(Array.isArray(v) && v.length === 0)
|
|
842
845
|
return (
|
|
843
|
-
<div class={hasValue ? 'text-green-600 dark:text-green-400' : 'text-gray-400'}>
|
|
846
|
+
<div class={hasValue ? 'text-[color:var(--mcp-ui-success,var(--color-green-600))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]' : 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]'}>
|
|
844
847
|
{'\u2192'} submitted: {hasValue ? `${JSON.stringify(v)} \u2713` : '(empty)'}
|
|
845
848
|
</div>
|
|
846
849
|
)
|
|
@@ -850,15 +853,15 @@ const FormDebugTrace: Component<{
|
|
|
850
853
|
)}
|
|
851
854
|
</For>
|
|
852
855
|
|
|
853
|
-
<div class="pt-1 border-t border-gray-200 dark:border-gray-600">
|
|
856
|
+
<div class="pt-1 border-t border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))]">
|
|
854
857
|
autoSubmit: {props.autoSubmitDelay ? 'true' : 'false'}
|
|
855
858
|
{props.autoSubmitDelay ? ` (${props.autoSubmitDelay}ms)` : ''}
|
|
856
859
|
<div> reason: {autoSubmitReason()}</div>
|
|
857
860
|
</div>
|
|
858
861
|
|
|
859
862
|
<Show when={serverDebug()}>
|
|
860
|
-
<div class="pt-1 border-t border-gray-200 dark:border-gray-600">
|
|
861
|
-
<div class="font-medium text-gray-800 dark:text-gray-200">Server _debug:</div>
|
|
863
|
+
<div class="pt-1 border-t border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))]">
|
|
864
|
+
<div class="font-medium text-[color:var(--mcp-ui-fg,var(--color-gray-800,#1f2937))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-200,#e5e7eb))]">Server _debug:</div>
|
|
862
865
|
<Show when={serverDebug()?.resolvers}>
|
|
863
866
|
<For each={serverDebug().resolvers}>
|
|
864
867
|
{(r: any) => (
|
|
@@ -872,17 +875,17 @@ const FormDebugTrace: Component<{
|
|
|
872
875
|
<div class="pl-2">routing: {serverDebug().routing.topic} via {serverDebug().routing.method} ({serverDebug().routing.ms}ms)</div>
|
|
873
876
|
</Show>
|
|
874
877
|
<Show when={serverDebug()?.missingFields}>
|
|
875
|
-
<div class="pl-2 text-amber-500">missing: {serverDebug().missingFields.join(', ')}</div>
|
|
878
|
+
<div class="pl-2 text-[color:var(--mcp-ui-warning,var(--color-amber-500))]">missing: {serverDebug().missingFields.join(', ')}</div>
|
|
876
879
|
</Show>
|
|
877
880
|
</div>
|
|
878
881
|
</Show>
|
|
879
882
|
|
|
880
|
-
<div class="pt-1 border-t border-gray-200 dark:border-gray-600">
|
|
881
|
-
<button type="button" onClick={() => setShowRaw(!showRaw())} class="text-blue-500 hover:text-blue-700 underline">
|
|
883
|
+
<div class="pt-1 border-t border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))]">
|
|
884
|
+
<button type="button" onClick={() => setShowRaw(!showRaw())} class="text-[color:var(--mcp-ui-accent,var(--color-blue-500))] hover:text-[color:var(--mcp-ui-accent,var(--color-blue-700))] underline">
|
|
882
885
|
{showRaw() ? strings.scratchpadHideRaw : strings.scratchpadShowRaw}
|
|
883
886
|
</button>
|
|
884
887
|
<Show when={showRaw()}>
|
|
885
|
-
<pre class="mt-1 p-2 bg-gray-50 dark:bg-gray-900 rounded max-h-48 overflow-auto text-[10px]">
|
|
888
|
+
<pre class="mt-1 p-2 bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-50,#f9fafb))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-900,#111827))] rounded max-h-48 overflow-auto text-[10px]">
|
|
886
889
|
{JSON.stringify(props.rawContent, null, 2)}
|
|
887
890
|
</pre>
|
|
888
891
|
</Show>
|
|
@@ -910,16 +913,16 @@ const EnrichedStepsSection: Component<{
|
|
|
910
913
|
<div class="space-y-3">
|
|
911
914
|
<For each={stepsData().steps}>
|
|
912
915
|
{(step: any) => (
|
|
913
|
-
<div class={`rounded-lg ${step.status === 'active' ? 'bg-blue-50
|
|
916
|
+
<div class={`rounded-lg ${step.status === 'active' ? 'bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-50)_50%,transparent))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_10%,transparent))] border border-[color:var(--mcp-ui-accent-border,var(--color-blue-200))] dark:border-[color:var(--mcp-ui-accent-border,var(--color-blue-800))] p-3 animate-pulse' : 'px-1'}`}>
|
|
914
917
|
<div class={`flex items-center gap-2 text-sm font-medium ${
|
|
915
|
-
step.status === 'done' ? 'text-green-600 dark:text-green-400'
|
|
916
|
-
: step.status === 'active' ? 'text-blue-600 dark:text-blue-400'
|
|
917
|
-
: 'text-gray-400'
|
|
918
|
+
step.status === 'done' ? 'text-[color:var(--mcp-ui-success,var(--color-green-600))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]'
|
|
919
|
+
: step.status === 'active' ? 'text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))]'
|
|
920
|
+
: 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]'
|
|
918
921
|
}`}>
|
|
919
922
|
<span>{step.status === 'done' ? '✅' : step.status === 'active' ? '●' : '○'}</span>
|
|
920
923
|
{step.label}
|
|
921
924
|
<Show when={step.description && step.status === 'active'}>
|
|
922
|
-
<span class="text-xs font-normal text-gray-500 dark:text-gray-400">— {step.description}</span>
|
|
925
|
+
<span class="text-xs font-normal text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">— {step.description}</span>
|
|
923
926
|
</Show>
|
|
924
927
|
</div>
|
|
925
928
|
|
|
@@ -942,7 +945,7 @@ const EnrichedStepsSection: Component<{
|
|
|
942
945
|
<Show when={stepsData().steps.some((s: any) => s.status === 'active')}>
|
|
943
946
|
<div class="flex justify-end">
|
|
944
947
|
<button type="button" onClick={() => props.onAction?.('next_step', { step: stepsData().currentStep })}
|
|
945
|
-
class="px-3 py-1.5 text-sm font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900
|
|
948
|
+
class="px-3 py-1.5 text-sm font-medium text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] hover:bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:hover:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_20%,transparent))] rounded-lg transition-colors flex items-center gap-1">
|
|
946
949
|
{strings.scratchpadNextStep} <svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
947
950
|
</button>
|
|
948
951
|
</div>
|
|
@@ -969,13 +972,13 @@ const ActionSection: Component<{
|
|
|
969
972
|
<div>
|
|
970
973
|
{/* Confirm checkpoint: title + preview (v4.1.0) */}
|
|
971
974
|
<Show when={data().title}>
|
|
972
|
-
<p class="text-sm font-medium text-gray-800 dark:text-gray-200 mb-2">{data().title}</p>
|
|
975
|
+
<p class="text-sm font-medium text-[color:var(--mcp-ui-fg,var(--color-gray-800,#1f2937))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-200,#e5e7eb))] mb-2">{data().title}</p>
|
|
973
976
|
</Show>
|
|
974
977
|
<Show when={data().preview}>
|
|
975
978
|
{(preview) => (
|
|
976
|
-
<div class="mb-2 p-2 rounded bg-gray-50 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 text-xs text-gray-600 dark:text-gray-400">
|
|
979
|
+
<div class="mb-2 p-2 rounded bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-50,#f9fafb))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">
|
|
977
980
|
<Show when={preview().count != null}>
|
|
978
|
-
<span class="font-medium text-gray-800 dark:text-gray-200">{preview().count}</span> {strings.scratchpadItems}
|
|
981
|
+
<span class="font-medium text-[color:var(--mcp-ui-fg,var(--color-gray-800,#1f2937))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-200,#e5e7eb))]">{preview().count}</span> {strings.scratchpadItems}
|
|
979
982
|
</Show>
|
|
980
983
|
<Show when={preview().summary}>
|
|
981
984
|
<span class="ml-1">— {preview().summary}</span>
|
|
@@ -986,16 +989,16 @@ const ActionSection: Component<{
|
|
|
986
989
|
<Show when={data().validation && data().validation.confidence != null}>
|
|
987
990
|
<div class="mb-2 flex items-center gap-2 text-xs">
|
|
988
991
|
<span classList={{
|
|
989
|
-
'text-green-600 dark:text-green-400': data().validation.confidence >= 0.8,
|
|
990
|
-
'text-amber-600 dark:text-amber-400': data().validation.confidence >= 0.5 && data().validation.confidence < 0.8,
|
|
991
|
-
'text-red-600 dark:text-red-400': data().validation.confidence < 0.5,
|
|
992
|
+
'text-[color:var(--mcp-ui-success,var(--color-green-600))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]': data().validation.confidence >= 0.8,
|
|
993
|
+
'text-[color:var(--mcp-ui-warning,var(--color-amber-600))] dark:text-[color:var(--mcp-ui-warning,var(--color-amber-400))]': data().validation.confidence >= 0.5 && data().validation.confidence < 0.8,
|
|
994
|
+
'text-[color:var(--mcp-ui-danger,var(--color-red-600))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]': data().validation.confidence < 0.5,
|
|
992
995
|
}}>
|
|
993
996
|
{formatMCPUIString(strings.verifiedConfidence, {
|
|
994
997
|
pct: Math.round(data().validation.confidence * 100),
|
|
995
998
|
})}
|
|
996
999
|
</span>
|
|
997
1000
|
<Show when={data().validation.hallucinated?.length > 0}>
|
|
998
|
-
<span class="text-amber-600">
|
|
1001
|
+
<span class="text-[color:var(--mcp-ui-warning,var(--color-amber-600))]">
|
|
999
1002
|
{formatMCPUIString(strings.verifiedUnverifiedCount, {
|
|
1000
1003
|
count: data().validation.hallucinated.length,
|
|
1001
1004
|
})}
|
|
@@ -1010,10 +1013,10 @@ const ActionSection: Component<{
|
|
|
1010
1013
|
{(item) => (
|
|
1011
1014
|
<button type="button" on:click={() => props.onAction?.(item.value || item.action || item.label, item)}
|
|
1012
1015
|
class={`px-3 py-1.5 text-sm font-medium rounded-lg transition-colors ${
|
|
1013
|
-
item.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700'
|
|
1014
|
-
: item.variant === 'danger' ? 'bg-red-600 text-white hover:bg-red-700'
|
|
1015
|
-
: item.variant === 'secondary' ? 'border border-blue-300 dark:border-blue-600 text-blue-700 dark:text-blue-300 hover:bg-blue-50 dark:hover:bg-blue-900
|
|
1016
|
-
: 'border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'
|
|
1016
|
+
item.variant === 'primary' ? 'bg-[color:var(--mcp-ui-accent,var(--color-blue-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] hover:bg-[color:var(--mcp-ui-accent-hover,var(--color-blue-700))]'
|
|
1017
|
+
: item.variant === 'danger' ? 'bg-[color:var(--mcp-ui-danger,var(--color-red-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] hover:bg-[color:var(--mcp-ui-danger-hover,var(--color-red-700))]'
|
|
1018
|
+
: item.variant === 'secondary' ? 'border border-[color:var(--mcp-ui-accent-border,var(--color-blue-300))] dark:border-[color:var(--mcp-ui-accent-border,var(--color-blue-600))] text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-300))] hover:bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:hover:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_20%,transparent))]'
|
|
1019
|
+
: 'border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))]'
|
|
1017
1020
|
}`}>
|
|
1018
1021
|
<Show when={item.icon}><span class="mr-1">{item.icon}</span></Show>
|
|
1019
1022
|
{item.label}
|
|
@@ -1035,10 +1038,10 @@ const UnderstandingSection: Component<{ content: unknown }> = (props) => {
|
|
|
1035
1038
|
|
|
1036
1039
|
const confidenceClass = (conf?: string) => {
|
|
1037
1040
|
switch (conf) {
|
|
1038
|
-
case 'high': return 'bg-green-100 dark:bg-green-900
|
|
1039
|
-
case 'medium': return 'bg-yellow-100 dark:bg-yellow-900
|
|
1040
|
-
case 'low': return 'bg-red-100 dark:bg-red-900
|
|
1041
|
-
default: return 'bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400'
|
|
1041
|
+
case 'high': return 'bg-[color:var(--mcp-ui-success-soft,var(--color-green-100))] dark:bg-[color:var(--mcp-ui-success-soft,color-mix(in_oklab,var(--color-green-900)_30%,transparent))] text-[color:var(--mcp-ui-success,var(--color-green-700))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]'
|
|
1042
|
+
case 'medium': return 'bg-[color:var(--mcp-ui-warning-soft,var(--color-yellow-100))] dark:bg-[color:var(--mcp-ui-warning-soft,color-mix(in_oklab,var(--color-yellow-900)_30%,transparent))] text-[color:var(--mcp-ui-warning,var(--color-yellow-700))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-400))]'
|
|
1043
|
+
case 'low': return 'bg-[color:var(--mcp-ui-danger-soft,var(--color-red-100))] dark:bg-[color:var(--mcp-ui-danger-soft,color-mix(in_oklab,var(--color-red-900)_30%,transparent))] text-[color:var(--mcp-ui-danger,var(--color-red-700))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]'
|
|
1044
|
+
default: return 'bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-100,#f3f4f6))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-700,#374151))] text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]'
|
|
1042
1045
|
}
|
|
1043
1046
|
}
|
|
1044
1047
|
|
|
@@ -1051,7 +1054,7 @@ const UnderstandingSection: Component<{ content: unknown }> = (props) => {
|
|
|
1051
1054
|
<span class={`px-1.5 py-0.5 text-xs font-medium rounded ${confidenceClass(det.confidence)}`}>
|
|
1052
1055
|
{det.label}
|
|
1053
1056
|
</span>
|
|
1054
|
-
<span class="text-gray-900 dark:text-white">{det.value}</span>
|
|
1057
|
+
<span class="text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{det.value}</span>
|
|
1055
1058
|
</div>
|
|
1056
1059
|
)}
|
|
1057
1060
|
</For>
|
|
@@ -1060,7 +1063,7 @@ const UnderstandingSection: Component<{ content: unknown }> = (props) => {
|
|
|
1060
1063
|
<div class="space-y-1">
|
|
1061
1064
|
<For each={data().warnings}>
|
|
1062
1065
|
{(w: string) => (
|
|
1063
|
-
<div class="flex items-start gap-1.5 text-xs text-amber-600 dark:text-amber-400">
|
|
1066
|
+
<div class="flex items-start gap-1.5 text-xs text-[color:var(--mcp-ui-warning,var(--color-amber-600))] dark:text-[color:var(--mcp-ui-warning,var(--color-amber-400))]">
|
|
1064
1067
|
<span class="flex-shrink-0">⚠️</span>
|
|
1065
1068
|
<span>{w}</span>
|
|
1066
1069
|
</div>
|
|
@@ -1123,15 +1126,15 @@ const FeedbackSection: Component<{
|
|
|
1123
1126
|
|
|
1124
1127
|
return (
|
|
1125
1128
|
<div class="space-y-3">
|
|
1126
|
-
<p class="text-sm text-gray-700 dark:text-gray-300">{data().question}</p>
|
|
1129
|
+
<p class="text-sm text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]">{data().question}</p>
|
|
1127
1130
|
|
|
1128
1131
|
{/* Already submitted — show micro-badge */}
|
|
1129
1132
|
<Show when={submitted()}>
|
|
1130
|
-
<div class="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400">
|
|
1133
|
+
<div class="flex items-center gap-2 text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">
|
|
1131
1134
|
<span classList={{
|
|
1132
|
-
'text-green-600': submitted() === 'approve',
|
|
1133
|
-
'text-red-600': submitted() === 'reject',
|
|
1134
|
-
'text-blue-600': submitted() !== 'approve' && submitted() !== 'reject',
|
|
1135
|
+
'text-[color:var(--mcp-ui-success,var(--color-green-600))]': submitted() === 'approve',
|
|
1136
|
+
'text-[color:var(--mcp-ui-danger,var(--color-red-600))]': submitted() === 'reject',
|
|
1137
|
+
'text-[color:var(--mcp-ui-accent,var(--color-blue-600))]': submitted() !== 'approve' && submitted() !== 'reject',
|
|
1135
1138
|
}}>
|
|
1136
1139
|
{submitted() === 'approve' ? '\u2705' : submitted() === 'reject' ? '\u274C' : '\uD83D\uDCAC'} {submittedLabel()}
|
|
1137
1140
|
</span>
|
|
@@ -1148,9 +1151,9 @@ const FeedbackSection: Component<{
|
|
|
1148
1151
|
{(option) => (
|
|
1149
1152
|
<button type="button" on:click={() => handleOption(option)}
|
|
1150
1153
|
class={`px-3 py-1.5 text-sm font-medium rounded-lg transition-colors flex items-center gap-1 ${
|
|
1151
|
-
option.variant === 'primary' ? 'bg-blue-600 text-white hover:bg-blue-700'
|
|
1152
|
-
: option.variant === 'danger' ? 'bg-red-600 text-white hover:bg-red-700'
|
|
1153
|
-
: 'border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'
|
|
1154
|
+
option.variant === 'primary' ? 'bg-[color:var(--mcp-ui-accent,var(--color-blue-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] hover:bg-[color:var(--mcp-ui-accent-hover,var(--color-blue-700))]'
|
|
1155
|
+
: option.variant === 'danger' ? 'bg-[color:var(--mcp-ui-danger,var(--color-red-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] hover:bg-[color:var(--mcp-ui-danger-hover,var(--color-red-700))]'
|
|
1156
|
+
: 'border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))]'
|
|
1154
1157
|
}`}>
|
|
1155
1158
|
<Show when={option.icon}><span>{option.icon}</span></Show>
|
|
1156
1159
|
{option.label}
|
|
@@ -1162,9 +1165,9 @@ const FeedbackSection: Component<{
|
|
|
1162
1165
|
<div class="flex gap-1">
|
|
1163
1166
|
<input type="text" value={comment()} onInput={(e) => setComment(e.currentTarget.value)}
|
|
1164
1167
|
placeholder={data().placeholder} autofocus={showComment()}
|
|
1165
|
-
class="flex-1 px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 outline-none" />
|
|
1168
|
+
class="flex-1 px-3 py-2 text-sm border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] rounded-lg bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-700,#374151))] text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))] focus:border-[color:var(--mcp-ui-focus,var(--color-blue-400))] outline-none" />
|
|
1166
1169
|
<button type="button" on:click={() => { setSubmitted('comment'); setSubmittedLabel(''); props.onAction?.('feedback', { option: 'comment', comment: comment(), agentId: data().agentId, stepId: data().stepId }) }}
|
|
1167
|
-
class="px-3 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700">{strings.scratchpadSend}</button>
|
|
1170
|
+
class="px-3 py-2 text-sm bg-[color:var(--mcp-ui-accent,var(--color-blue-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] rounded-lg hover:bg-[color:var(--mcp-ui-accent-hover,var(--color-blue-700))]">{strings.scratchpadSend}</button>
|
|
1168
1171
|
</div>
|
|
1169
1172
|
</Show>
|
|
1170
1173
|
</Show>
|
|
@@ -1193,26 +1196,26 @@ const PromptSection: Component<{
|
|
|
1193
1196
|
return (
|
|
1194
1197
|
<div class="space-y-2">
|
|
1195
1198
|
<Show when={data().originalQuery}>
|
|
1196
|
-
<p class="text-xs text-gray-500 dark:text-gray-400 italic">"{data().originalQuery}"</p>
|
|
1199
|
+
<p class="text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] italic">"{data().originalQuery}"</p>
|
|
1197
1200
|
</Show>
|
|
1198
1201
|
<div class="space-y-1">
|
|
1199
1202
|
<For each={Object.entries(data().extracted)}>
|
|
1200
1203
|
{([key, value]) => (
|
|
1201
1204
|
<div class="flex gap-2 text-sm">
|
|
1202
|
-
<span class="text-gray-500 dark:text-gray-400 font-medium min-w-[80px]">{key}:</span>
|
|
1203
|
-
<span class="text-gray-900 dark:text-white">{String(value)}</span>
|
|
1205
|
+
<span class="text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] font-medium min-w-[80px]">{key}:</span>
|
|
1206
|
+
<span class="text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{String(value)}</span>
|
|
1204
1207
|
</div>
|
|
1205
1208
|
)}
|
|
1206
1209
|
</For>
|
|
1207
1210
|
</div>
|
|
1208
1211
|
<Show when={data().plan}>
|
|
1209
|
-
<div class="mt-2 px-3 py-2 bg-blue-50 dark:bg-blue-900
|
|
1212
|
+
<div class="mt-2 px-3 py-2 bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_10%,transparent))] rounded-lg text-sm text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-300))]">
|
|
1210
1213
|
<span class="font-medium">{strings.scratchpadPlan}</span> {data().plan}
|
|
1211
1214
|
</div>
|
|
1212
1215
|
</Show>
|
|
1213
1216
|
<Show when={data().editable}>
|
|
1214
1217
|
<button type="button" onClick={() => props.onAction?.('edit_prompt', data())}
|
|
1215
|
-
class="text-xs text-blue-600 dark:text-blue-400 hover:underline flex items-center gap-1">
|
|
1218
|
+
class="text-xs text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] hover:underline flex items-center gap-1">
|
|
1216
1219
|
✎ {strings.scratchpadModify}
|
|
1217
1220
|
</button>
|
|
1218
1221
|
</Show>
|
|
@@ -1247,15 +1250,15 @@ const StepperProgressSection: Component<{ content: unknown }> = (props) => {
|
|
|
1247
1250
|
<div class="space-y-2">
|
|
1248
1251
|
<For each={data().steps}>
|
|
1249
1252
|
{(step) => (
|
|
1250
|
-
<div class={`flex items-start gap-2 text-sm ${step.status === 'active' ? 'font-medium' : ''} ${step.status === 'pending' ? 'text-gray-400' : 'text-gray-700 dark:text-gray-300'}`}>
|
|
1253
|
+
<div class={`flex items-start gap-2 text-sm ${step.status === 'active' ? 'font-medium' : ''} ${step.status === 'pending' ? 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]' : 'text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]'}`}>
|
|
1251
1254
|
<span class="flex-shrink-0">{statusIcon(step.status)}</span>
|
|
1252
1255
|
<div>
|
|
1253
1256
|
<span>{step.label}</span>
|
|
1254
1257
|
<Show when={step.summary}>
|
|
1255
|
-
<span class="ml-1 text-xs text-gray-500 dark:text-gray-400">— {step.summary}</span>
|
|
1258
|
+
<span class="ml-1 text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">— {step.summary}</span>
|
|
1256
1259
|
</Show>
|
|
1257
1260
|
<Show when={step.duration_ms}>
|
|
1258
|
-
<span class="ml-1 text-xs text-gray-400">({step.duration_ms}ms)</span>
|
|
1261
|
+
<span class="ml-1 text-xs text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">({step.duration_ms}ms)</span>
|
|
1259
1262
|
</Show>
|
|
1260
1263
|
</div>
|
|
1261
1264
|
</div>
|
|
@@ -1268,13 +1271,13 @@ const StepperProgressSection: Component<{ content: unknown }> = (props) => {
|
|
|
1268
1271
|
{(step, i) => (
|
|
1269
1272
|
<>
|
|
1270
1273
|
<Show when={i() > 0}>
|
|
1271
|
-
<svg class="w-3 h-3 text-gray-300 dark:text-gray-600 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
1274
|
+
<svg class="w-3 h-3 text-[color:var(--mcp-ui-fg-muted,var(--color-gray-300,#d1d5db))] dark:text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /></svg>
|
|
1272
1275
|
</Show>
|
|
1273
1276
|
<div class={`flex items-center gap-1 px-2 py-1 rounded text-xs ${
|
|
1274
|
-
step.status === 'done' ? 'bg-green-50 dark:bg-green-900
|
|
1275
|
-
: step.status === 'active' ? 'bg-blue-50 dark:bg-blue-900
|
|
1276
|
-
: step.status === 'error' ? 'bg-red-50 dark:bg-red-900
|
|
1277
|
-
: 'text-gray-400'
|
|
1277
|
+
step.status === 'done' ? 'bg-[color:var(--mcp-ui-success-soft,var(--color-green-50))] dark:bg-[color:var(--mcp-ui-success-soft,color-mix(in_oklab,var(--color-green-900)_20%,transparent))] text-[color:var(--mcp-ui-success,var(--color-green-700))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]'
|
|
1278
|
+
: step.status === 'active' ? 'bg-[color:var(--mcp-ui-accent-soft,var(--color-blue-50))] dark:bg-[color:var(--mcp-ui-accent-soft,color-mix(in_oklab,var(--color-blue-900)_20%,transparent))] text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))] font-medium animate-pulse'
|
|
1279
|
+
: step.status === 'error' ? 'bg-[color:var(--mcp-ui-danger-soft,var(--color-red-50))] dark:bg-[color:var(--mcp-ui-danger-soft,color-mix(in_oklab,var(--color-red-900)_20%,transparent))] text-[color:var(--mcp-ui-danger,var(--color-red-700))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]'
|
|
1280
|
+
: 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]'
|
|
1278
1281
|
}`}>
|
|
1279
1282
|
<span>{statusIcon(step.status)}</span>
|
|
1280
1283
|
<span>{step.label}</span>
|
|
@@ -1308,14 +1311,14 @@ const ErrorSectionRenderer: Component<{
|
|
|
1308
1311
|
const isWarning = () => data().severity === 'warning'
|
|
1309
1312
|
|
|
1310
1313
|
return (
|
|
1311
|
-
<div class={`rounded-lg px-3 py-2 text-sm ${isWarning() ? 'bg-amber-50 dark:bg-amber-900
|
|
1314
|
+
<div class={`rounded-lg px-3 py-2 text-sm ${isWarning() ? 'bg-[color:var(--mcp-ui-warning-soft,var(--color-amber-50))] dark:bg-[color:var(--mcp-ui-warning-soft,color-mix(in_oklab,var(--color-amber-900)_10%,transparent))] text-[color:var(--mcp-ui-warning,var(--color-amber-700))] dark:text-[color:var(--mcp-ui-warning,var(--color-amber-400))] border border-[color:var(--mcp-ui-warning-border,var(--color-amber-200))] dark:border-[color:var(--mcp-ui-warning-border,var(--color-amber-800))]' : 'bg-[color:var(--mcp-ui-danger-soft,var(--color-red-50))] dark:bg-[color:var(--mcp-ui-danger-soft,color-mix(in_oklab,var(--color-red-900)_10%,transparent))] text-[color:var(--mcp-ui-danger,var(--color-red-700))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))] border border-[color:var(--mcp-ui-danger-border,var(--color-red-200))] dark:border-[color:var(--mcp-ui-danger-border,var(--color-red-800))]'}`}>
|
|
1312
1315
|
<div class="flex items-start gap-2">
|
|
1313
1316
|
<span class="flex-shrink-0">{isWarning() ? '⚠️' : '❌'}</span>
|
|
1314
1317
|
<div class="flex-1">
|
|
1315
1318
|
<p>{data().message}</p>
|
|
1316
1319
|
<div class="flex gap-2 mt-2">
|
|
1317
1320
|
<Show when={data().retryAction}>
|
|
1318
|
-
<button type="button" onClick={() => props.onAction?.(data().retryAction!)} class={`px-2 py-1 text-xs font-medium rounded ${isWarning() ? 'bg-amber-600 text-white hover:bg-amber-700' : 'bg-red-600 text-white hover:bg-red-700'} transition-colors`}>🔄 {data().retryLabel}</button>
|
|
1321
|
+
<button type="button" onClick={() => props.onAction?.(data().retryAction!)} class={`px-2 py-1 text-xs font-medium rounded ${isWarning() ? 'bg-[color:var(--mcp-ui-warning,var(--color-amber-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] hover:bg-[color:var(--mcp-ui-warning-hover,var(--color-amber-700))]' : 'bg-[color:var(--mcp-ui-danger,var(--color-red-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] hover:bg-[color:var(--mcp-ui-danger-hover,var(--color-red-700))]'} transition-colors`}>🔄 {data().retryLabel}</button>
|
|
1319
1322
|
</Show>
|
|
1320
1323
|
<Show when={data().details}>
|
|
1321
1324
|
<button type="button" onClick={() => setShowDetails(!showDetails())} class="px-2 py-1 text-xs opacity-70 hover:opacity-100">▶ {strings.scratchpadDetails}</button>
|
|
@@ -1341,11 +1344,11 @@ const SourceCardSection: Component<{ content: unknown }> = (props) => {
|
|
|
1341
1344
|
const statusIcon = () => ({ queried: '✅', available: '📦', error: '❌' } as Record<string, string>)[data().status] || '📦'
|
|
1342
1345
|
|
|
1343
1346
|
return (
|
|
1344
|
-
<div class="rounded-lg border border-gray-200 dark:border-gray-700 px-3 py-2">
|
|
1347
|
+
<div class="rounded-lg border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] px-3 py-2">
|
|
1345
1348
|
<div class="flex items-center justify-between mb-1.5">
|
|
1346
|
-
<span class="text-sm font-medium text-gray-900 dark:text-white">{statusIcon()} {data().name}</span>
|
|
1349
|
+
<span class="text-sm font-medium text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{statusIcon()} {data().name}</span>
|
|
1347
1350
|
<Show when={data().row_count !== undefined}>
|
|
1348
|
-
<span class="text-xs font-bold text-blue-600 dark:text-blue-400">
|
|
1351
|
+
<span class="text-xs font-bold text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))]">
|
|
1349
1352
|
{formatMCPUIString(strings.scratchpadResultCount, {
|
|
1350
1353
|
count: data().row_count?.toLocaleString(strings.locale) ?? '',
|
|
1351
1354
|
})}
|
|
@@ -1355,14 +1358,14 @@ const SourceCardSection: Component<{ content: unknown }> = (props) => {
|
|
|
1355
1358
|
<div class="flex flex-wrap gap-1.5 mb-1">
|
|
1356
1359
|
<For each={data().capabilities}>
|
|
1357
1360
|
{(cap: any) => (
|
|
1358
|
-
<span class={`text-[10px] px-1.5 py-0.5 rounded ${cap.supported ? 'bg-green-100 dark:bg-green-900
|
|
1361
|
+
<span class={`text-[10px] px-1.5 py-0.5 rounded ${cap.supported ? 'bg-[color:var(--mcp-ui-success-soft,var(--color-green-100))] dark:bg-[color:var(--mcp-ui-success-soft,color-mix(in_oklab,var(--color-green-900)_30%,transparent))] text-[color:var(--mcp-ui-success,var(--color-green-700))] dark:text-[color:var(--mcp-ui-success,var(--color-green-400))]' : 'bg-[color:var(--mcp-ui-danger-soft,var(--color-red-100))] dark:bg-[color:var(--mcp-ui-danger-soft,color-mix(in_oklab,var(--color-red-900)_30%,transparent))] text-[color:var(--mcp-ui-danger,var(--color-red-600))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]'}`}>
|
|
1359
1362
|
{cap.supported ? '✅' : '❌'} {cap.label}
|
|
1360
1363
|
</span>
|
|
1361
1364
|
)}
|
|
1362
1365
|
</For>
|
|
1363
1366
|
</div>
|
|
1364
1367
|
<Show when={data().freshness || data().latency_ms}>
|
|
1365
|
-
<p class="text-[10px] text-gray-400">{[data().freshness, data().latency_ms ? `${data().latency_ms}ms` : ''].filter(Boolean).join(' · ')}</p>
|
|
1368
|
+
<p class="text-[10px] text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">{[data().freshness, data().latency_ms ? `${data().latency_ms}ms` : ''].filter(Boolean).join(' · ')}</p>
|
|
1366
1369
|
</Show>
|
|
1367
1370
|
</div>
|
|
1368
1371
|
)
|
|
@@ -1386,9 +1389,9 @@ const DiffSection: Component<{ content: unknown }> = (props) => {
|
|
|
1386
1389
|
<table class="min-w-full text-xs">
|
|
1387
1390
|
<thead>
|
|
1388
1391
|
<tr>
|
|
1389
|
-
<th class="px-2 py-1 text-left text-gray-500 dark:text-gray-400"></th>
|
|
1390
|
-
<th class="px-2 py-1 text-left font-medium text-blue-600 dark:text-blue-400">{data().left.label}</th>
|
|
1391
|
-
<th class="px-2 py-1 text-left font-medium text-purple-600 dark:text-purple-400">{data().right.label}</th>
|
|
1392
|
+
<th class="px-2 py-1 text-left text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]"></th>
|
|
1393
|
+
<th class="px-2 py-1 text-left font-medium text-[color:var(--mcp-ui-accent,var(--color-blue-600))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))]">{data().left.label}</th>
|
|
1394
|
+
<th class="px-2 py-1 text-left font-medium text-[color:var(--mcp-ui-secondary,var(--color-purple-600))] dark:text-[color:var(--mcp-ui-secondary,var(--color-purple-400))]">{data().right.label}</th>
|
|
1392
1395
|
</tr>
|
|
1393
1396
|
</thead>
|
|
1394
1397
|
<tbody>
|
|
@@ -1398,10 +1401,10 @@ const DiffSection: Component<{ content: unknown }> = (props) => {
|
|
|
1398
1401
|
const rVal = () => data().right.rows[0]?.[key]
|
|
1399
1402
|
const isDiff = () => String(lVal()) !== String(rVal()) && data().highlight.includes(key)
|
|
1400
1403
|
return (
|
|
1401
|
-
<tr class={`border-t border-gray-100 dark:border-gray-700 ${isDiff() ? 'bg-yellow-50 dark:bg-yellow-900
|
|
1402
|
-
<td class="px-2 py-1 font-mono text-gray-500 dark:text-gray-400">{key}</td>
|
|
1403
|
-
<td class="px-2 py-1 text-gray-900 dark:text-white">{lVal() !== undefined ? String(lVal()) : '—'}</td>
|
|
1404
|
-
<td class="px-2 py-1 text-gray-900 dark:text-white">{rVal() !== undefined ? String(rVal()) : '—'}</td>
|
|
1404
|
+
<tr class={`border-t border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] ${isDiff() ? 'bg-[color:var(--mcp-ui-warning-soft,var(--color-yellow-50))] dark:bg-[color:var(--mcp-ui-warning-soft,color-mix(in_oklab,var(--color-yellow-900)_10%,transparent))]' : ''}`}>
|
|
1405
|
+
<td class="px-2 py-1 font-mono text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">{key}</td>
|
|
1406
|
+
<td class="px-2 py-1 text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{lVal() !== undefined ? String(lVal()) : '—'}</td>
|
|
1407
|
+
<td class="px-2 py-1 text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{rVal() !== undefined ? String(rVal()) : '—'}</td>
|
|
1405
1408
|
</tr>
|
|
1406
1409
|
)
|
|
1407
1410
|
}}
|