@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
|
@@ -64,14 +64,15 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
64
64
|
|
|
65
65
|
const baseInputClass = () => `
|
|
66
66
|
w-full px-3 py-2 border rounded-md
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
${!isMuted() ? 'text-[color:var(--mcp-ui-fg,inherit)]' : ''}
|
|
68
|
+
focus:ring-2 focus:ring-[color:var(--mcp-ui-focus,var(--color-blue-500))] focus:border-[color:var(--mcp-ui-focus,var(--color-blue-500))]
|
|
69
|
+
disabled:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-100,#f3f4f6))] disabled:cursor-not-allowed
|
|
69
70
|
${props.error
|
|
70
|
-
? 'border-red-500 focus:ring-red-500'
|
|
71
|
-
: 'border-gray-300 dark:border-gray-600'}
|
|
72
|
-
dark:bg-gray-700 dark:text-white
|
|
71
|
+
? 'border-[color:var(--mcp-ui-danger-border,var(--color-red-500))] focus:ring-[color:var(--mcp-ui-focus,var(--color-red-500))]'
|
|
72
|
+
: 'border-[color:var(--mcp-ui-border-control,var(--color-gray-300,#d1d5db))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))]'}
|
|
73
|
+
dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]
|
|
73
74
|
${isUnsupported() ? 'opacity-50' : ''}
|
|
74
|
-
${isMuted() ? 'bg-gray-50 dark:bg-gray-700
|
|
75
|
+
${isMuted() ? '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-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]' : ''}
|
|
75
76
|
`
|
|
76
77
|
|
|
77
78
|
const fieldId = () => `field-${props.field.name}`
|
|
@@ -83,20 +84,20 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
83
84
|
<Show when={props.field.label && props.field.type !== 'checkbox'}>
|
|
84
85
|
<label
|
|
85
86
|
for={fieldId()}
|
|
86
|
-
class={`block text-sm font-medium ${isUnsupported() ? 'text-gray-400 dark:text-gray-500' : isMuted() ? 'text-gray-400 dark:text-gray-500' : 'text-gray-700 dark:text-gray-300'}`}
|
|
87
|
+
class={`block text-sm font-medium ${isUnsupported() ? 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] dark:text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))]' : isMuted() ? 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] dark:text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))]' : 'text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]'}`}
|
|
87
88
|
>
|
|
88
89
|
<Show when={sourceBadge()}>
|
|
89
90
|
<span class="mr-1" title={strings[sourceBadge()!.titleKey]}>{sourceBadge()!.icon}</span>
|
|
90
91
|
</Show>
|
|
91
92
|
{props.field.label}
|
|
92
93
|
<Show when={props.field.required || status() === 'required'}>
|
|
93
|
-
<span class="text-red-500 ml-1" aria-hidden="true">*</span>
|
|
94
|
+
<span class="text-[color:var(--mcp-ui-danger,var(--color-red-500))] ml-1" aria-hidden="true">*</span>
|
|
94
95
|
</Show>
|
|
95
96
|
<Show when={isUnsupported()}>
|
|
96
|
-
<span class="ml-2 text-[10px] font-medium bg-orange-100 dark:bg-orange-900
|
|
97
|
+
<span class="ml-2 text-[10px] font-medium bg-[color:var(--mcp-ui-warning-soft,var(--color-orange-100))] dark:bg-[color:var(--mcp-ui-warning-soft,color-mix(in_oklab,var(--color-orange-900)_30%,transparent))] text-[color:var(--mcp-ui-warning,var(--color-orange-600))] dark:text-[color:var(--mcp-ui-warning,var(--color-orange-400))] px-1.5 py-0.5 rounded">{strings.fieldNotSupported}</span>
|
|
97
98
|
</Show>
|
|
98
99
|
<Show when={status() === 'unknown'}>
|
|
99
|
-
<span class="ml-2 text-[10px] font-medium bg-yellow-100 dark:bg-yellow-900
|
|
100
|
+
<span class="ml-2 text-[10px] font-medium 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-600))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-400))] px-1.5 py-0.5 rounded">?</span>
|
|
100
101
|
</Show>
|
|
101
102
|
</label>
|
|
102
103
|
</Show>
|
|
@@ -217,12 +218,12 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
217
218
|
disabled={props.disabled}
|
|
218
219
|
aria-invalid={!!props.error}
|
|
219
220
|
aria-describedby={props.error ? errorId() : undefined}
|
|
220
|
-
class="w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-gray-600 dark:bg-gray-700"
|
|
221
|
+
class="w-4 h-4 rounded border-[color:var(--mcp-ui-border-control,var(--color-gray-300,#d1d5db))] text-[color:var(--mcp-ui-accent,var(--color-blue-600))] focus:ring-[color:var(--mcp-ui-focus,var(--color-blue-500))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-700,#374151))]"
|
|
221
222
|
/>
|
|
222
|
-
<span class="text-sm text-gray-700 dark:text-gray-300">
|
|
223
|
+
<span 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))]">
|
|
223
224
|
{props.field.checkboxLabel || props.field.label}
|
|
224
225
|
<Show when={props.field.required}>
|
|
225
|
-
<span class="text-red-500 ml-1" aria-hidden="true">*</span>
|
|
226
|
+
<span class="text-[color:var(--mcp-ui-danger,var(--color-red-500))] ml-1" aria-hidden="true">*</span>
|
|
226
227
|
</Show>
|
|
227
228
|
</span>
|
|
228
229
|
</label>
|
|
@@ -270,9 +271,9 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
270
271
|
checked={props.value === option.value}
|
|
271
272
|
onChange={() => props.onChange(option.value)}
|
|
272
273
|
disabled={props.disabled || option.disabled}
|
|
273
|
-
class="w-4 h-4 border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-gray-600"
|
|
274
|
+
class="w-4 h-4 border-[color:var(--mcp-ui-border-control,var(--color-gray-300,#d1d5db))] text-[color:var(--mcp-ui-accent,var(--color-blue-600))] focus:ring-[color:var(--mcp-ui-focus,var(--color-blue-500))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))]"
|
|
274
275
|
/>
|
|
275
|
-
<span class="text-sm text-gray-700 dark:text-gray-300">
|
|
276
|
+
<span 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))]">
|
|
276
277
|
{option.label}
|
|
277
278
|
</span>
|
|
278
279
|
</label>
|
|
@@ -294,9 +295,9 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
294
295
|
max={props.field.max}
|
|
295
296
|
step={props.field.step || 1}
|
|
296
297
|
disabled={isFieldDisabled()}
|
|
297
|
-
class="flex-1 h-2 bg-gray-200 dark:bg-gray-600 rounded-lg appearance-none cursor-pointer accent-blue-600"
|
|
298
|
+
class="flex-1 h-2 bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-200,#e5e7eb))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-600,#4b5563))] rounded-lg appearance-none cursor-pointer accent-[color:var(--mcp-ui-accent,var(--color-blue-600))]"
|
|
298
299
|
/>
|
|
299
|
-
<span class="text-sm font-mono text-gray-700 dark:text-gray-300 min-w-[3rem] text-right">{props.value ?? props.field.min ?? 0}</span>
|
|
300
|
+
<span class="text-sm font-mono text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] min-w-[3rem] text-right">{props.value ?? props.field.min ?? 0}</span>
|
|
300
301
|
</div>
|
|
301
302
|
</Match>
|
|
302
303
|
|
|
@@ -314,19 +315,19 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
314
315
|
aria-checked={!!props.value}
|
|
315
316
|
onClick={() => props.onChange(!props.value)}
|
|
316
317
|
disabled={isFieldDisabled()}
|
|
317
|
-
class={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${props.value ? 'bg-blue-600' : 'bg-gray-300 dark:bg-gray-600'} ${isFieldDisabled() ? 'opacity-50 cursor-not-allowed' : ''}`}
|
|
318
|
+
class={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${props.value ? 'bg-[color:var(--mcp-ui-accent,var(--color-blue-600))]' : 'bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-300,#d1d5db))] dark:bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-600,#4b5563))]'} ${isFieldDisabled() ? 'opacity-50 cursor-not-allowed' : ''}`}
|
|
318
319
|
>
|
|
319
|
-
<span class={`inline-block h-3.5 w-3.5 transform rounded-full bg-white transition-transform ${props.value ? 'translate-x-4' : 'translate-x-0.5'}`} />
|
|
320
|
+
<span class={`inline-block h-3.5 w-3.5 transform rounded-full bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] transition-transform ${props.value ? 'translate-x-4' : 'translate-x-0.5'}`} />
|
|
320
321
|
</button>
|
|
321
|
-
<span class="text-sm text-gray-700 dark:text-gray-300">{props.field.checkboxLabel || props.field.label}</span>
|
|
322
|
+
<span 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))]">{props.field.checkboxLabel || props.field.label}</span>
|
|
322
323
|
</label>
|
|
323
324
|
</Match>
|
|
324
325
|
|
|
325
326
|
{/* Fieldset/Group */}
|
|
326
327
|
<Match when={props.field.type === 'fieldset'}>
|
|
327
|
-
<fieldset class="border border-gray-200 dark:border-gray-600 rounded-lg p-3">
|
|
328
|
-
<legend class="text-xs font-medium text-gray-500 dark:text-gray-400 px-1">{props.field.label}</legend>
|
|
329
|
-
<p class="text-xs text-gray-400">{props.field.helpText || strings.fieldGroupContainer}</p>
|
|
328
|
+
<fieldset class="border border-[color:var(--mcp-ui-border-control,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))] rounded-lg p-3">
|
|
329
|
+
<legend 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))] px-1">{props.field.label}</legend>
|
|
330
|
+
<p class="text-xs text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">{props.field.helpText || strings.fieldGroupContainer}</p>
|
|
330
331
|
</fieldset>
|
|
331
332
|
</Match>
|
|
332
333
|
|
|
@@ -342,7 +343,7 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
342
343
|
disabled={props.disabled}
|
|
343
344
|
class={baseInputClass()}
|
|
344
345
|
/>
|
|
345
|
-
<p class="text-xs text-amber-500 mt-0.5">
|
|
346
|
+
<p class="text-xs text-[color:var(--mcp-ui-warning,var(--color-amber-500))] mt-0.5">
|
|
346
347
|
{formatMCPUIString(strings.fieldUnknownType, { type: props.field.type })}
|
|
347
348
|
</p>
|
|
348
349
|
</Match>
|
|
@@ -350,27 +351,27 @@ export const FormFieldRenderer: Component<FormFieldRendererProps> = (props) => {
|
|
|
350
351
|
|
|
351
352
|
<Show when={props.field.statusReason}>
|
|
352
353
|
<p class={`text-xs ${
|
|
353
|
-
isUnsupported() ? 'text-orange-500 dark:text-orange-400'
|
|
354
|
-
: status() === 'unknown' ? 'text-yellow-500 dark:text-yellow-400'
|
|
355
|
-
: status() === 'required' ? 'text-blue-500 dark:text-blue-400'
|
|
356
|
-
: 'text-gray-500 dark:text-gray-400'
|
|
354
|
+
isUnsupported() ? 'text-[color:var(--mcp-ui-warning,var(--color-orange-500))] dark:text-[color:var(--mcp-ui-warning,var(--color-orange-400))]'
|
|
355
|
+
: status() === 'unknown' ? 'text-[color:var(--mcp-ui-warning,var(--color-yellow-500))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-400))]'
|
|
356
|
+
: status() === 'required' ? 'text-[color:var(--mcp-ui-accent,var(--color-blue-500))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-400))]'
|
|
357
|
+
: '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))]'
|
|
357
358
|
}`}>
|
|
358
359
|
{props.field.statusReason}
|
|
359
360
|
</p>
|
|
360
361
|
</Show>
|
|
361
362
|
|
|
362
363
|
<Show when={props.field.displayHint && props.field.prefill != null}>
|
|
363
|
-
<p class={`text-xs italic ${isMuted() ? 'text-gray-400 dark:text-gray-500' : 'text-gray-500 dark:text-gray-400'}`}>
|
|
364
|
+
<p class={`text-xs italic ${isMuted() ? 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))] dark:text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))]' : '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))]'}`}>
|
|
364
365
|
{props.field.displayHint}
|
|
365
366
|
</p>
|
|
366
367
|
</Show>
|
|
367
368
|
|
|
368
369
|
<Show when={props.field.helpText && !props.error && !props.field.statusReason && !props.field.displayHint}>
|
|
369
|
-
<p class="text-xs text-gray-500 dark:text-gray-400">{props.field.helpText}</p>
|
|
370
|
+
<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))]">{props.field.helpText}</p>
|
|
370
371
|
</Show>
|
|
371
372
|
|
|
372
373
|
<Show when={props.error}>
|
|
373
|
-
<p id={errorId()} role="alert" class="text-xs text-red-600 dark:text-red-400">
|
|
374
|
+
<p id={errorId()} role="alert" class="text-xs text-[color:var(--mcp-ui-danger,var(--color-red-600))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]">
|
|
374
375
|
{props.error}
|
|
375
376
|
</p>
|
|
376
377
|
</Show>
|
|
@@ -423,12 +424,12 @@ const MultiSelectField: Component<{
|
|
|
423
424
|
<div class="flex flex-wrap gap-1 mb-1">
|
|
424
425
|
<For each={props.value}>
|
|
425
426
|
{(val) => (
|
|
426
|
-
<span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-blue-100 dark:bg-blue-900
|
|
427
|
+
<span class="inline-flex items-center gap-1 px-2 py-0.5 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">
|
|
427
428
|
{getLabel(val)}
|
|
428
429
|
<button
|
|
429
430
|
type="button"
|
|
430
431
|
onClick={() => removeChip(val)}
|
|
431
|
-
class="hover:text-blue-900 dark:hover:text-blue-100"
|
|
432
|
+
class="hover:text-[color:var(--mcp-ui-accent,var(--color-blue-900))] dark:hover:text-[color:var(--mcp-ui-accent,var(--color-blue-100))]"
|
|
432
433
|
aria-label={formatMCPUIString(strings.removeItem, { name: getLabel(val) })}
|
|
433
434
|
>
|
|
434
435
|
×
|
|
@@ -446,12 +447,12 @@ const MultiSelectField: Component<{
|
|
|
446
447
|
disabled={props.disabled}
|
|
447
448
|
class={`${props.baseClass} text-left flex items-center justify-between`}
|
|
448
449
|
>
|
|
449
|
-
<span class={props.value.length ? 'text-gray-900 dark:text-white' : 'text-gray-400'}>
|
|
450
|
+
<span class={props.value.length ? 'text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]' : 'text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]'}>
|
|
450
451
|
{props.value.length
|
|
451
452
|
? formatMCPUIString(strings.fieldSelectedCount, { count: props.value.length })
|
|
452
453
|
: props.field.placeholder || strings.fieldSelectPlaceholder}
|
|
453
454
|
</span>
|
|
454
|
-
<svg class="w-4 h-4 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
455
|
+
<svg class="w-4 h-4 text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
455
456
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
456
457
|
</svg>
|
|
457
458
|
</button>
|
|
@@ -459,18 +460,18 @@ const MultiSelectField: Component<{
|
|
|
459
460
|
{/* Dropdown with filter */}
|
|
460
461
|
<Show when={open()}>
|
|
461
462
|
<div
|
|
462
|
-
class="absolute z-50 mt-1 w-full bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-md shadow-lg"
|
|
463
|
+
class="absolute z-50 mt-1 w-full 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-control,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))] rounded-md shadow-[var(--mcp-ui-shadow,var(--shadow-lg))]"
|
|
463
464
|
style={{ "max-height": "320px", display: "flex", "flex-direction": "column" }}
|
|
464
465
|
>
|
|
465
466
|
{/* Search filter */}
|
|
466
467
|
<Show when={(props.field.options?.length || 0) > 10}>
|
|
467
|
-
<div class="p-2 border-b border-gray-200 dark:border-gray-600 flex-shrink-0">
|
|
468
|
+
<div class="p-2 border-b border-[color:var(--mcp-ui-border-control,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))] flex-shrink-0">
|
|
468
469
|
<input
|
|
469
470
|
type="text"
|
|
470
471
|
value={filter()}
|
|
471
472
|
onInput={(e) => setFilter(e.currentTarget.value)}
|
|
472
473
|
placeholder={strings.filterPlaceholder}
|
|
473
|
-
class="w-full 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"
|
|
474
|
+
class="w-full px-2 py-1 text-sm border border-[color:var(--mcp-ui-border-control,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border-control,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"
|
|
474
475
|
autofocus
|
|
475
476
|
/>
|
|
476
477
|
</div>
|
|
@@ -479,19 +480,19 @@ const MultiSelectField: Component<{
|
|
|
479
480
|
<div style={{ "overflow-y": "auto", "flex": "1", "-webkit-overflow-scrolling": "touch" }}>
|
|
480
481
|
<For each={filteredOptions()}>
|
|
481
482
|
{(option) => (
|
|
482
|
-
<label class="flex items-center gap-2 px-3 py-2 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer text-sm">
|
|
483
|
+
<label class="flex items-center gap-2 px-3 py-2 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))] cursor-pointer text-sm">
|
|
483
484
|
<input
|
|
484
485
|
type="checkbox"
|
|
485
486
|
checked={(props.value || []).includes(option.value)}
|
|
486
487
|
onChange={() => toggle(option.value)}
|
|
487
|
-
class="w-4 h-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 dark:border-gray-600"
|
|
488
|
+
class="w-4 h-4 rounded border-[color:var(--mcp-ui-border-control,var(--color-gray-300,#d1d5db))] text-[color:var(--mcp-ui-accent,var(--color-blue-600))] focus:ring-[color:var(--mcp-ui-focus,var(--color-blue-500))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))]"
|
|
488
489
|
/>
|
|
489
|
-
<span class="text-gray-900 dark:text-white">{option.label}</span>
|
|
490
|
+
<span class="text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">{option.label}</span>
|
|
490
491
|
</label>
|
|
491
492
|
)}
|
|
492
493
|
</For>
|
|
493
494
|
<Show when={filteredOptions().length === 0}>
|
|
494
|
-
<p class="px-3 py-2 text-sm text-gray-400">{strings.fieldNoMatches}</p>
|
|
495
|
+
<p class="px-3 py-2 text-sm text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">{strings.fieldNoMatches}</p>
|
|
495
496
|
</Show>
|
|
496
497
|
</div>
|
|
497
498
|
</div>
|
|
@@ -681,8 +682,8 @@ const AutocompleteField: Component<{
|
|
|
681
682
|
<div class="relative">
|
|
682
683
|
{/* Resolving indicator */}
|
|
683
684
|
<Show when={resolving()}>
|
|
684
|
-
<div class="flex items-center gap-1 mb-1 text-xs text-gray-400">
|
|
685
|
-
<span class="animate-spin h-3 w-3 border border-gray-400 border-t-transparent rounded-full" />
|
|
685
|
+
<div class="flex items-center gap-1 mb-1 text-xs text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">
|
|
686
|
+
<span class="animate-spin h-3 w-3 border border-[color:var(--mcp-ui-border-control,var(--color-gray-400,#9ca3af))] border-t-transparent rounded-full" />
|
|
686
687
|
{strings.fieldResolving}
|
|
687
688
|
</div>
|
|
688
689
|
</Show>
|
|
@@ -692,12 +693,12 @@ const AutocompleteField: Component<{
|
|
|
692
693
|
<div class="flex flex-wrap gap-1 mb-1">
|
|
693
694
|
<For each={selectedValues()}>
|
|
694
695
|
{(val) => (
|
|
695
|
-
<span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-blue-100 dark:bg-blue-900
|
|
696
|
+
<span class="inline-flex items-center gap-1 px-2 py-0.5 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">
|
|
696
697
|
{getLabel(val)}
|
|
697
698
|
<button
|
|
698
699
|
type="button"
|
|
699
700
|
onClick={() => removeChip(val)}
|
|
700
|
-
class="hover:text-blue-900 dark:hover:text-blue-100"
|
|
701
|
+
class="hover:text-[color:var(--mcp-ui-accent,var(--color-blue-900))] dark:hover:text-[color:var(--mcp-ui-accent,var(--color-blue-100))]"
|
|
701
702
|
aria-label={formatMCPUIString(strings.removeItem, { name: getLabel(val) })}
|
|
702
703
|
>
|
|
703
704
|
×
|
|
@@ -723,7 +724,7 @@ const AutocompleteField: Component<{
|
|
|
723
724
|
/>
|
|
724
725
|
|
|
725
726
|
<Show when={isOpen() && suggestions().length > 0}>
|
|
726
|
-
<div class="absolute z-20 mt-1 w-full bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-md shadow-lg max-h-72 overflow-y-auto">
|
|
727
|
+
<div class="absolute z-20 mt-1 w-full 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-control,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border-control,var(--color-gray-600,#4b5563))] rounded-md shadow-[var(--mcp-ui-shadow,var(--shadow-lg))] max-h-72 overflow-y-auto">
|
|
727
728
|
<For each={suggestions()}>
|
|
728
729
|
{(item) => {
|
|
729
730
|
const isSelected = () => isMultiple() && selectedValues().includes(item.value)
|
|
@@ -732,8 +733,8 @@ const AutocompleteField: Component<{
|
|
|
732
733
|
type="button"
|
|
733
734
|
onMouseDown={(e) => e.preventDefault()}
|
|
734
735
|
onClick={() => selectSuggestion(item)}
|
|
735
|
-
class={`w-full text-left px-3 py-2 text-sm hover:bg-blue-50 dark:hover:bg-blue-900
|
|
736
|
-
isSelected() ? 'text-blue-600 dark:text-blue-400 bg-blue-50
|
|
736
|
+
class={`w-full text-left px-3 py-2 text-sm 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))] ${
|
|
737
|
+
isSelected() ? '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))]'
|
|
737
738
|
}`}
|
|
738
739
|
disabled={isSelected()}
|
|
739
740
|
>
|
|
@@ -791,9 +792,9 @@ const TagsField: Component<{
|
|
|
791
792
|
<div class="flex flex-wrap gap-1 mb-1">
|
|
792
793
|
<For each={props.value || []}>
|
|
793
794
|
{(tag) => (
|
|
794
|
-
<span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-blue-100 dark:bg-blue-900
|
|
795
|
+
<span class="inline-flex items-center gap-1 px-2 py-0.5 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">
|
|
795
796
|
{tag}
|
|
796
|
-
<button type="button" onClick={() => removeTag(tag)} class="hover:text-blue-900 dark:hover:text-blue-100" aria-label={formatMCPUIString(strings.removeItem, { name: tag })}>×</button>
|
|
797
|
+
<button type="button" onClick={() => removeTag(tag)} class="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: tag })}>×</button>
|
|
797
798
|
</span>
|
|
798
799
|
)}
|
|
799
800
|
</For>
|
|
@@ -262,9 +262,9 @@ export const FormRenderer: Component<FormRendererProps> = (props) => {
|
|
|
262
262
|
}
|
|
263
263
|
|
|
264
264
|
return (
|
|
265
|
-
<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4">
|
|
265
|
+
<div 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-lg shadow-[var(--mcp-ui-shadow,var(--shadow-sm))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] p-4">
|
|
266
266
|
<Show when={params().title}>
|
|
267
|
-
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">
|
|
267
|
+
<h3 class="text-lg font-semibold text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))] mb-4">
|
|
268
268
|
{params().title}
|
|
269
269
|
</h3>
|
|
270
270
|
</Show>
|
|
@@ -276,7 +276,7 @@ export const FormRenderer: Component<FormRendererProps> = (props) => {
|
|
|
276
276
|
const prefilled = params().fields.filter((f) => f.prefill != null).length
|
|
277
277
|
const total = params().fields.length
|
|
278
278
|
return (
|
|
279
|
-
<p class="text-xs text-gray-500 dark:text-gray-400 mb-3">
|
|
279
|
+
<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))] mb-3">
|
|
280
280
|
{formatMCPUIString(
|
|
281
281
|
prefilled === 1 ? strings.formPrefilledOne : strings.formPrefilledMany,
|
|
282
282
|
{ count: prefilled, total }
|
|
@@ -301,8 +301,8 @@ export const FormRenderer: Component<FormRendererProps> = (props) => {
|
|
|
301
301
|
</div>
|
|
302
302
|
|
|
303
303
|
<Show when={errors()._form}>
|
|
304
|
-
<div class="mt-4 p-3 bg-red-50 dark:bg-red-900
|
|
305
|
-
<p class="text-sm text-red-600 dark:text-red-400" role="alert">
|
|
304
|
+
<div class="mt-4 p-3 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))] border border-[color:var(--mcp-ui-danger-border,var(--color-red-200))] dark:border-[color:var(--mcp-ui-danger-border,var(--color-red-800))] rounded-md">
|
|
305
|
+
<p class="text-sm text-[color:var(--mcp-ui-danger,var(--color-red-600))] dark:text-[color:var(--mcp-ui-danger,var(--color-red-400))]" role="alert">
|
|
306
306
|
{errors()._form}
|
|
307
307
|
</p>
|
|
308
308
|
</div>
|
|
@@ -310,8 +310,8 @@ export const FormRenderer: Component<FormRendererProps> = (props) => {
|
|
|
310
310
|
|
|
311
311
|
{/* Auto-submit countdown (v4.2.0) */}
|
|
312
312
|
<Show when={countdown() != null}>
|
|
313
|
-
<div class="mt-4 flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900
|
|
314
|
-
<span class="text-sm text-blue-700 dark:text-blue-300">
|
|
313
|
+
<div class="mt-4 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-md">
|
|
314
|
+
<span class="text-sm text-[color:var(--mcp-ui-accent,var(--color-blue-700))] dark:text-[color:var(--mcp-ui-accent,var(--color-blue-300))]">
|
|
315
315
|
{formatMCPUIString(strings.formSubmitCountdown, {
|
|
316
316
|
label: params().submitLabel || strings.submit,
|
|
317
317
|
seconds: countdown()!,
|
|
@@ -320,22 +320,22 @@ export const FormRenderer: Component<FormRendererProps> = (props) => {
|
|
|
320
320
|
<button
|
|
321
321
|
type="button"
|
|
322
322
|
onClick={() => { cancelCountdown(); setUserInteracted(true) }}
|
|
323
|
-
class="text-sm text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200"
|
|
323
|
+
class="text-sm 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))]"
|
|
324
324
|
>
|
|
325
325
|
{strings.cancel}
|
|
326
326
|
</button>
|
|
327
327
|
</div>
|
|
328
328
|
</Show>
|
|
329
329
|
|
|
330
|
-
<div class="flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700">
|
|
330
|
+
<div class="flex gap-2 pt-4 mt-4 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))]">
|
|
331
331
|
<button
|
|
332
332
|
type="submit"
|
|
333
333
|
disabled={isSubmitting()}
|
|
334
|
-
class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
334
|
+
class="px-4 py-2 bg-[color:var(--mcp-ui-accent,var(--color-blue-600))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] rounded-md hover:bg-[color:var(--mcp-ui-accent-hover,var(--color-blue-700))] focus:outline-none focus:ring-2 focus:ring-[color:var(--mcp-ui-focus,var(--color-blue-500))] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
335
335
|
>
|
|
336
336
|
{isSubmitting() ? (
|
|
337
337
|
<span class="flex items-center gap-2">
|
|
338
|
-
<span class="animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full" />
|
|
338
|
+
<span class="animate-spin h-4 w-4 border-2 border-[color:var(--mcp-ui-border,var(--color-white,#fff))] border-t-transparent rounded-full" />
|
|
339
339
|
{strings.formSubmitting}
|
|
340
340
|
</span>
|
|
341
341
|
) : (
|
|
@@ -347,7 +347,7 @@ export const FormRenderer: Component<FormRendererProps> = (props) => {
|
|
|
347
347
|
type="button"
|
|
348
348
|
onClick={() => initializeForm(true)}
|
|
349
349
|
disabled={isSubmitting()}
|
|
350
|
-
class="px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
350
|
+
class="px-4 py-2 border 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,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] rounded-md 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-700,#374151))] focus:outline-none focus:ring-2 focus:ring-[color:var(--mcp-ui-focus,var(--color-gray-500,#6b7280))] focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"
|
|
351
351
|
>
|
|
352
352
|
{strings.formReset}
|
|
353
353
|
</button>
|
|
@@ -66,11 +66,11 @@ function DefaultErrorFallback(props: {
|
|
|
66
66
|
}) {
|
|
67
67
|
const strings = useMCPUIStrings()
|
|
68
68
|
return (
|
|
69
|
-
<div class="w-full h-full bg-yellow-50 dark:bg-yellow-900
|
|
69
|
+
<div class="w-full h-full 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)_20%,transparent))] border border-[color:var(--mcp-ui-warning-border,var(--color-yellow-200))] dark:border-[color:var(--mcp-ui-warning-border,var(--color-yellow-800))] rounded-lg p-4">
|
|
70
70
|
<div class="flex items-start gap-3">
|
|
71
71
|
<div class="flex-shrink-0">
|
|
72
72
|
<svg
|
|
73
|
-
class="w-5 h-5 text-yellow-600 dark:text-yellow-400"
|
|
73
|
+
class="w-5 h-5 text-[color:var(--mcp-ui-warning,var(--color-yellow-600))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-400))]"
|
|
74
74
|
fill="none"
|
|
75
75
|
stroke="currentColor"
|
|
76
76
|
viewBox="0 0 24 24"
|
|
@@ -84,24 +84,24 @@ function DefaultErrorFallback(props: {
|
|
|
84
84
|
</svg>
|
|
85
85
|
</div>
|
|
86
86
|
<div class="flex-1 min-w-0">
|
|
87
|
-
<p class="text-sm font-medium text-yellow-900 dark:text-yellow-100">
|
|
87
|
+
<p class="text-sm font-medium text-[color:var(--mcp-ui-warning,var(--color-yellow-900))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-100))]">
|
|
88
88
|
{strings.errorBoundaryTitle}
|
|
89
89
|
</p>
|
|
90
|
-
<p class="text-xs text-yellow-700 dark:text-yellow-300 mt-1">
|
|
90
|
+
<p class="text-xs text-[color:var(--mcp-ui-warning,var(--color-yellow-700))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-300))] mt-1">
|
|
91
91
|
{formatMCPUIString(strings.errorBoundaryMeta, {
|
|
92
92
|
type: props.componentType || strings.unknown,
|
|
93
93
|
id: props.componentId?.slice(0, 8) || strings.unknown,
|
|
94
94
|
})}
|
|
95
95
|
</p>
|
|
96
96
|
<Show when={import.meta.env.DEV}>
|
|
97
|
-
<p class="text-xs text-yellow-600 dark:text-yellow-400 mt-2 font-mono">
|
|
97
|
+
<p class="text-xs text-[color:var(--mcp-ui-warning,var(--color-yellow-600))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-400))] mt-2 font-mono">
|
|
98
98
|
{props.error.message}
|
|
99
99
|
</p>
|
|
100
100
|
</Show>
|
|
101
101
|
<Show when={props.allowRetry}>
|
|
102
102
|
<button
|
|
103
103
|
onClick={props.onRetry}
|
|
104
|
-
class="mt-3 text-xs font-medium text-yellow-800 dark:text-yellow-200 hover:text-yellow-900 dark:hover:text-yellow-100 underline"
|
|
104
|
+
class="mt-3 text-xs font-medium text-[color:var(--mcp-ui-warning,var(--color-yellow-800))] dark:text-[color:var(--mcp-ui-warning,var(--color-yellow-200))] hover:text-[color:var(--mcp-ui-warning,var(--color-yellow-900))] dark:hover:text-[color:var(--mcp-ui-warning,var(--color-yellow-100))] underline"
|
|
105
105
|
>
|
|
106
106
|
{strings.errorBoundaryRetry}
|
|
107
107
|
</button>
|
|
@@ -58,7 +58,7 @@ export const GhostText: Component<GhostTextProps> = (props) => {
|
|
|
58
58
|
|
|
59
59
|
return (
|
|
60
60
|
<div
|
|
61
|
-
class={`mcp-ghost-text-container ${props.class || ''}`}
|
|
61
|
+
class={`mcp-ui-root mcp-ghost-text-container ${props.class || ''}`}
|
|
62
62
|
style={{
|
|
63
63
|
position: 'relative',
|
|
64
64
|
display: 'inline-block',
|
|
@@ -91,7 +91,7 @@ export const GhostText: Component<GhostTextProps> = (props) => {
|
|
|
91
91
|
<span
|
|
92
92
|
class={`mcp-ghost-text ${props.ghostClass || ''}`}
|
|
93
93
|
style={{
|
|
94
|
-
color: '#9ca3af',
|
|
94
|
+
color: 'var(--mcp-ui-fg-subtle, #9ca3af)',
|
|
95
95
|
opacity: '0.7'
|
|
96
96
|
}}
|
|
97
97
|
>
|
|
@@ -110,8 +110,8 @@ export const GhostText: Component<GhostTextProps> = (props) => {
|
|
|
110
110
|
top: '50%',
|
|
111
111
|
transform: 'translateY(-50%)',
|
|
112
112
|
'font-size': '0.75rem',
|
|
113
|
-
color: '#6b7280',
|
|
114
|
-
'background-color': 'rgba(255, 255, 255, 0.9)',
|
|
113
|
+
color: 'var(--mcp-ui-fg-muted, #6b7280)',
|
|
114
|
+
'background-color': 'var(--mcp-ui-surface, rgba(255, 255, 255, 0.9))',
|
|
115
115
|
padding: '2px 6px',
|
|
116
116
|
'border-radius': '4px',
|
|
117
117
|
'pointer-events': 'none'
|
|
@@ -137,8 +137,8 @@ export const GhostText: Component<GhostTextProps> = (props) => {
|
|
|
137
137
|
display: 'inline-block',
|
|
138
138
|
width: '12px',
|
|
139
139
|
height: '12px',
|
|
140
|
-
border: '2px solid #e5e7eb',
|
|
141
|
-
'border-top-color': '#3b82f6',
|
|
140
|
+
border: '2px solid var(--mcp-ui-border, #e5e7eb)',
|
|
141
|
+
'border-top-color': 'var(--mcp-ui-accent, #3b82f6)',
|
|
142
142
|
'border-radius': '50%',
|
|
143
143
|
animation: 'mcp-spin 0.6s linear infinite'
|
|
144
144
|
}}
|
|
@@ -230,7 +230,7 @@ export interface GhostTextInputProps {
|
|
|
230
230
|
*/
|
|
231
231
|
export const GhostTextInput: Component<GhostTextInputProps> = (props) => {
|
|
232
232
|
return (
|
|
233
|
-
<div class="mcp-ghost-text-input-wrapper" style={{ position: 'relative' }}>
|
|
233
|
+
<div class="mcp-ui-root mcp-ghost-text-input-wrapper" style={{ position: 'relative' }}>
|
|
234
234
|
<GhostText
|
|
235
235
|
inputValue={props.value}
|
|
236
236
|
ghostText={props.ghostText}
|