Feat: Adjust the style of mcp and checkbox. #10427 (#11150)

### What problem does this PR solve?

Feat: Adjust the style of mcp and checkbox. #10427

### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu
2025-11-10 19:02:41 +08:00
committed by GitHub
parent a191933f81
commit 29ea059f90
8 changed files with 72 additions and 48 deletions

View File

@ -272,7 +272,7 @@ export function FileUploader(props: FileUploaderProps) {
<div <div
{...getRootProps()} {...getRootProps()}
className={cn( className={cn(
'group relative grid h-72 w-full cursor-pointer place-items-center rounded-lg border-2 border-dashed border-muted-foreground/25 px-5 py-2.5 text-center transition hover:bg-muted/25', 'group relative grid h-72 w-full cursor-pointer place-items-center rounded-lg border-2 border-dashed border-border-default px-5 py-2.5 text-center transition hover:bg-muted/25 bg-accent-primary-5',
'ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
isDragActive && 'border-muted-foreground/50', isDragActive && 'border-muted-foreground/50',
isDisabled && 'pointer-events-none opacity-60', isDisabled && 'pointer-events-none opacity-60',
@ -305,7 +305,7 @@ export function FileUploader(props: FileUploaderProps) {
<p className="font-medium text-muted-foreground"> <p className="font-medium text-muted-foreground">
{t('knowledgeDetails.uploadTitle')} {t('knowledgeDetails.uploadTitle')}
</p> </p>
<p className="text-sm text-muted-foreground/70"> <p className="text-sm text-text-secondary">
{description || t('knowledgeDetails.uploadDescription')} {description || t('knowledgeDetails.uploadDescription')}
{/* You can upload {/* You can upload
{maxFileCount > 1 {maxFileCount > 1

View File

@ -11,6 +11,8 @@ export interface JsonSchemaVisualizerProps {
schema: JSONSchema; schema: JSONSchema;
className?: string; className?: string;
onChange?: (schema: JSONSchema) => void; onChange?: (schema: JSONSchema) => void;
readOnly?: boolean;
showHeader?: boolean;
} }
/** @public */ /** @public */
@ -18,6 +20,8 @@ const JsonSchemaVisualizer: FC<JsonSchemaVisualizerProps> = ({
schema, schema,
className, className,
onChange, onChange,
readOnly = false,
showHeader = true,
}) => { }) => {
const editorRef = useRef<Parameters<OnMount>[0] | null>(null); const editorRef = useRef<Parameters<OnMount>[0] | null>(null);
const { const {
@ -73,6 +77,7 @@ const JsonSchemaVisualizer: FC<JsonSchemaVisualizerProps> = ({
'jsonjoy', 'jsonjoy',
)} )}
> >
{showHeader && (
<div className="flex items-center justify-between bg-secondary/80 backdrop-blur-xs px-4 py-2 border-b shrink-0"> <div className="flex items-center justify-between bg-secondary/80 backdrop-blur-xs px-4 py-2 border-b shrink-0">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<FileJson size={18} /> <FileJson size={18} />
@ -87,6 +92,7 @@ const JsonSchemaVisualizer: FC<JsonSchemaVisualizerProps> = ({
<Download size={16} /> <Download size={16} />
</button> </button>
</div> </div>
)}
<div className="grow flex min-h-0"> <div className="grow flex min-h-0">
<Editor <Editor
height="100%" height="100%"
@ -101,7 +107,7 @@ const JsonSchemaVisualizer: FC<JsonSchemaVisualizerProps> = ({
<Loader2 className="h-6 w-6 animate-spin" /> <Loader2 className="h-6 w-6 animate-spin" />
</div> </div>
} }
options={defaultEditorOptions} options={{ ...defaultEditorOptions, readOnly }}
theme={currentTheme} theme={currentTheme}
/> />
</div> </div>

View File

@ -1,5 +1,5 @@
import { useIsDarkTheme } from '@/components/theme-provider';
import type * as Monaco from 'monaco-editor'; import type * as Monaco from 'monaco-editor';
import { useEffect, useState } from 'react';
import type { JSONSchema } from '../types/json-schema.js'; import type { JSONSchema } from '../types/json-schema.js';
export interface MonacoEditorOptions { export interface MonacoEditorOptions {
@ -63,36 +63,37 @@ export const defaultEditorOptions: MonacoEditorOptions = {
}; };
export function useMonacoTheme() { export function useMonacoTheme() {
const [isDarkMode, setIsDarkMode] = useState(false); // const [isDarkTheme, setisDarkTheme] = useState(false);
const isDarkTheme = useIsDarkTheme();
// Check for dark mode by examining CSS variables // Check for dark mode by examining CSS variables
useEffect(() => { // useEffect(() => {
const checkDarkMode = () => { // const checkDarkMode = () => {
// Get the current background color value // // Get the current background color value
const backgroundColor = getComputedStyle(document.documentElement) // const backgroundColor = getComputedStyle(document.documentElement)
.getPropertyValue('--background') // .getPropertyValue('--background')
.trim(); // .trim();
// If the background color HSL has a low lightness value, it's likely dark mode // // If the background color HSL has a low lightness value, it's likely dark mode
const isDark = // const isDark =
backgroundColor.includes('222.2') || // backgroundColor.includes('222.2') ||
backgroundColor.includes('84% 4.9%'); // backgroundColor.includes('84% 4.9%');
setIsDarkMode(isDark); // setisDarkTheme(isDark);
}; // };
// Check initially // // Check initially
checkDarkMode(); // checkDarkMode();
// Set up a mutation observer to detect theme changes // // Set up a mutation observer to detect theme changes
const observer = new MutationObserver(checkDarkMode); // const observer = new MutationObserver(checkDarkMode);
observer.observe(document.documentElement, { // observer.observe(document.documentElement, {
attributes: true, // attributes: true,
attributeFilter: ['class', 'style'], // attributeFilter: ['class', 'style'],
}); // });
return () => observer.disconnect(); // return () => observer.disconnect();
}, []); // }, []);
const defineMonacoThemes = (monaco: typeof Monaco) => { const defineMonacoThemes = (monaco: typeof Monaco) => {
// Define custom light theme that matches app colors // Define custom light theme that matches app colors
@ -199,8 +200,8 @@ export function useMonacoTheme() {
}; };
return { return {
isDarkMode, isDarkTheme,
currentTheme: isDarkMode ? 'appDarkTheme' : 'appLightTheme', currentTheme: isDarkTheme ? 'appDarkTheme' : 'appLightTheme',
defineMonacoThemes, defineMonacoThemes,
configureJsonDefaults, configureJsonDefaults,
defaultEditorOptions, defaultEditorOptions,

View File

@ -13,11 +13,11 @@ const Checkbox = React.forwardRef<
<CheckboxPrimitive.Root <CheckboxPrimitive.Root
ref={ref} ref={ref}
className={cn( className={cn(
'peer size-4 shrink-0 rounded-sm border border-border-button outline-0 transition-colors bg-bg-component', 'peer size-4 shrink-0 rounded-sm border border-text-secondary outline-0 transition-colors bg-bg-component',
'hover:border-border-default hover:bg-border-button', 'hover:border-border-default hover:bg-border-button',
'focus-visible:border-border-default focus-visible:bg-border-default', 'focus-visible:border-border-default focus-visible:bg-border-default',
'disabled:cursor-not-allowed disabled:opacity-50', 'disabled:cursor-not-allowed disabled:opacity-50',
'data-[state=checked]:text-text-primary data-[state=checked]:border-border-default', 'data-[state=checked]:text-text-primary data-[state=checked]:border-text-primary',
className, className,
)} )}
{...props} {...props}

View File

@ -41,6 +41,7 @@ import { PromptEditor } from '../components/prompt-editor';
import { QueryVariable } from '../components/query-variable'; import { QueryVariable } from '../components/query-variable';
import { AgentTools, Agents } from './agent-tools'; import { AgentTools, Agents } from './agent-tools';
import { StructuredOutputDialog } from './structured-output-dialog'; import { StructuredOutputDialog } from './structured-output-dialog';
import { StructuredOutputPanel } from './structured-output-panel';
import { useBuildPromptExtraPromptOptions } from './use-build-prompt-options'; import { useBuildPromptExtraPromptOptions } from './use-build-prompt-options';
import { useShowStructuredOutputDialog } from './use-show-structured-output-dialog'; import { useShowStructuredOutputDialog } from './use-show-structured-output-dialog';
import { useValues } from './use-values'; import { useValues } from './use-values';
@ -275,13 +276,16 @@ function AgentForm({ node }: INextOperatorForm) {
</section> </section>
</Collapse> </Collapse>
<Output list={outputList}></Output> <Output list={outputList}></Output>
<section> <section className="space-y-2">
<div className="flex justify-between items-center"> <div className="flex justify-between items-center">
structured_output {t('flow.structuredOutput.structuredOutput')}
<Button variant={'outline'} onClick={showStructuredOutputDialog}> <Button variant={'outline'} onClick={showStructuredOutputDialog}>
{t('flow.structuredOutput.configuration')} {t('flow.structuredOutput.configuration')}
</Button> </Button>
</div> </div>
<StructuredOutputPanel
value={initialStructuredOutput}
></StructuredOutputPanel>
</section> </section>
</FormWrapper> </FormWrapper>
</Form> </Form>

View File

@ -0,0 +1,13 @@
import { JSONSchema, JsonSchemaVisualizer } from '@/components/jsonjoy-builder';
export function StructuredOutputPanel({ value }: { value: JSONSchema }) {
return (
<section className="h-48">
<JsonSchemaVisualizer
schema={value}
readOnly
showHeader={false}
></JsonSchemaVisualizer>
</section>
);
}

View File

@ -190,7 +190,7 @@ const Chunk = () => {
<BreadcrumbSeparator /> <BreadcrumbSeparator />
<BreadcrumbItem> <BreadcrumbItem>
<BreadcrumbPage> <BreadcrumbPage>
{knowledgeId ? documentInfo?.name : t('dataflow.viewResult')} {knowledgeId ? documentInfo?.name : t('flow.viewResult')}
</BreadcrumbPage> </BreadcrumbPage>
</BreadcrumbItem> </BreadcrumbItem>
</BreadcrumbList> </BreadcrumbList>

View File

@ -124,7 +124,7 @@ export function EditMcpDialog({
form={form} form={form}
setFieldChanged={setFieldChanged} setFieldChanged={setFieldChanged}
></EditMcpForm> ></EditMcpForm>
<Card> <Card className="bg-transparent">
<CardContent className="p-3"> <CardContent className="p-3">
<Collapse <Collapse
title={ title={