mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-09-01 03:27:01 +00:00
89 lines
4.4 KiB
JavaScript
89 lines
4.4 KiB
JavaScript
import React from 'react';
|
|
import TextareaAutosize from 'react-textarea-autosize';
|
|
import { Button } from '~/components/ui/Button.tsx';
|
|
import { Label } from '~/components/ui/Label.tsx';
|
|
import { Plus, Minus } from 'lucide-react';
|
|
import { cn } from '~/utils/';
|
|
const defaultTextProps =
|
|
'rounded-md border border-gray-200 focus:border-slate-400 focus:bg-gray-50 bg-transparent text-sm shadow-[0_0_10px_rgba(0,0,0,0.05)] outline-none placeholder:text-gray-400 focus:outline-none focus:ring-gray-400 focus:ring-opacity-20 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-500 dark:bg-gray-700 focus:dark:bg-gray-600 dark:text-gray-50 dark:shadow-[0_0_15px_rgba(0,0,0,0.10)] dark:focus:border-gray-400 dark:focus:outline-none dark:focus:ring-0 dark:focus:ring-gray-400 dark:focus:ring-offset-0';
|
|
|
|
function Examples({ readonly, examples, setExample, addExample, removeExample, edit = false }) {
|
|
const maxHeight = edit ? 'max-h-[233px]' : 'max-h-[350px]';
|
|
return (
|
|
<>
|
|
<div className={`${maxHeight} overflow-y-auto`}>
|
|
<div id="examples-grid" className="grid gap-6 sm:grid-cols-2">
|
|
{examples.map((example, idx) => (
|
|
<React.Fragment key={idx}>
|
|
{/* Input */}
|
|
<div
|
|
className={`col-span-${
|
|
examples.length === 1 ? '1' : 'full'
|
|
} flex flex-col items-center justify-start gap-6 sm:col-span-1`}
|
|
>
|
|
<div className="grid w-full items-center gap-2">
|
|
<Label htmlFor={`input-${idx}`} className="text-left text-sm font-medium">
|
|
Input <small className="opacity-40">(default: blank)</small>
|
|
</Label>
|
|
<TextareaAutosize
|
|
id={`input-${idx}`}
|
|
disabled={readonly}
|
|
value={example?.input?.content || ''}
|
|
onChange={(e) => setExample(idx, 'input', e.target.value || null)}
|
|
placeholder="Set example input. Example is ignored if empty."
|
|
className={cn(
|
|
defaultTextProps,
|
|
'flex max-h-[300px] min-h-[75px] w-full resize-none px-3 py-2 '
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Output */}
|
|
<div
|
|
className={`col-span-${
|
|
examples.length === 1 ? '1' : 'full'
|
|
} flex flex-col items-center justify-start gap-6 sm:col-span-1`}
|
|
>
|
|
<div className="grid w-full items-center gap-2">
|
|
<Label htmlFor={`output-${idx}`} className="text-left text-sm font-medium">
|
|
Output <small className="opacity-40">(default: blank)</small>
|
|
</Label>
|
|
<TextareaAutosize
|
|
id={`output-${idx}`}
|
|
disabled={readonly}
|
|
value={example?.output?.content || ''}
|
|
onChange={(e) => setExample(idx, 'output', e.target.value || null)}
|
|
placeholder={`Set example output. Example is ignored if empty.`}
|
|
className={cn(
|
|
defaultTextProps,
|
|
'flex max-h-[300px] min-h-[75px] w-full resize-none px-3 py-2 '
|
|
)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</React.Fragment>
|
|
))}
|
|
</div>
|
|
</div>
|
|
<div className="flex justify-center">
|
|
<Button
|
|
type="button"
|
|
className="mr-2 mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-slate-200 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-600 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0"
|
|
onClick={removeExample}
|
|
>
|
|
<Minus className="w-[16px]" />
|
|
</Button>
|
|
<Button
|
|
type="button"
|
|
className="mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-slate-200 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-600 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0"
|
|
onClick={addExample}
|
|
>
|
|
<Plus className="w-[16px]" />
|
|
</Button>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default Examples;
|