import styles from "./sd-panel.module.scss"; import React, { useState } from "react"; import { Select } from "@/app/components/ui-lib"; import { IconButton } from "@/app/components/button"; import locales from "@/app/locales"; const sdCommonParams = (model: string, data: any) => { return [ { name: locales.SdPanel.Prompt, value: "prompt", type: "textarea", placeholder: locales.SdPanel.PleaseInput(locales.SdPanel.Prompt), required: true, }, { name: locales.SdPanel.NegativePrompt, value: "negative_prompt", type: "textarea", placeholder: locales.SdPanel.PleaseInput(locales.SdPanel.NegativePrompt), }, { name: locales.SdPanel.AspectRatio, value: "aspect_ratio", type: "select", default: "1:1", options: [ { name: "1:1", value: "1:1" }, { name: "2:2", value: "2:2" }, ], }, { name: locales.SdPanel.ImageStyle, value: "style", type: "select", default: "3d", support: ["core"], options: [{ name: "3D", value: "3d" }], }, { name: "Seed", value: "seed", type: "number", default: 0 }, { name: locales.SdPanel.OutFormat, value: "output_format", type: "select", default: 0, options: [ { name: "PNG", value: "png" }, { name: "JPEG", value: "jpeg" }, { name: "WebP", value: "webp" }, ], }, ].filter((item) => { return !(item.support && !item.support.includes(model)); }); }; const models = [ { name: "Stable Image Ultra", value: "ultra", params: (data: any) => sdCommonParams("ultra", data), }, { name: "Stable Image Core", value: "core", params: (data: any) => sdCommonParams("core", data), }, { name: "Stable Diffusion 3", value: "sd3", params: (data: any) => { return sdCommonParams("sd3", data); }, }, ]; export function ControlParamItem(props: { title: string; subTitle?: string; children?: JSX.Element | JSX.Element[]; className?: string; }) { return (
{props.title}
{props.children} {props.subTitle && (
{props.subTitle}
)}
); } export function ControlParam(props: { columns: any[]; data: any; set: React.Dispatch>; }) { const handleValueChange = (field: string, val: any) => { props.set((prevParams) => ({ ...prevParams, [field]: val, })); }; return ( <> {props.columns.map((item) => { let element: null | JSX.Element; switch (item.type) { case "textarea": element = ( ); break; case "select": element = ( ); break; case "number": element = ( { handleValueChange(item.value, e.currentTarget.value); }} /> ); break; default: element = ( { handleValueChange(item.value, e.currentTarget.value); }} /> ); } return
{element}
; })} ); } export function SdPanel() { const [currentModel, setCurrentModel] = useState(models[0]); const [params, setParams] = useState({}); return ( <>
{models.map((item) => { return ( { setCurrentModel(item); }} /> ); })}
); }