diff --git a/src/components/nodes/BaseNode.tsx b/src/components/nodes/BaseNode.tsx index bb35711b..e38fc7bc 100644 --- a/src/components/nodes/BaseNode.tsx +++ b/src/components/nodes/BaseNode.tsx @@ -180,7 +180,7 @@ export function BaseNode({ return (
diff --git a/src/components/nodes/InlineParameterPanel.tsx b/src/components/nodes/InlineParameterPanel.tsx index d9f6238b..a088769a 100644 --- a/src/components/nodes/InlineParameterPanel.tsx +++ b/src/components/nodes/InlineParameterPanel.tsx @@ -49,7 +49,7 @@ export function InlineParameterPanel({ {expanded && (
{children}
diff --git a/src/components/nodes/ModelParameters.tsx b/src/components/nodes/ModelParameters.tsx index d95f723c..93e6a154 100644 --- a/src/components/nodes/ModelParameters.tsx +++ b/src/components/nodes/ModelParameters.tsx @@ -40,6 +40,20 @@ function setCachedSchema(modelId: string, provider: string, parameters: ModelPar } } +/** Reorder items so they read column-first in a row-based CSS grid. + * e.g. [1,2,3,4,5,6,7,8] with 2 cols → [1,5,2,6,3,7,4,8] */ +function reorderColumnFirst(items: T[], cols: number): T[] { + const rows = Math.ceil(items.length / cols); + const result: T[] = []; + for (let r = 0; r < rows; r++) { + for (let c = 0; c < cols; c++) { + const idx = c * rows + r; + if (idx < items.length) result.push(items[idx]); + } + } + return result; +} + interface ModelParametersProps { modelId: string; provider: ProviderType; @@ -162,6 +176,31 @@ export function ModelParameters({ [parameters, onParametersChange] ); + const sortedSchema = [...schema].sort((a, b) => { + // Sort order: dropdowns first, then numbers, then strings, then checkboxes last + const typeOrder = (p: ModelParameter) => { + if (p.enum && p.enum.length > 0) return 0; // dropdowns first + if (p.type === "number" || p.type === "integer") return 1; + if (p.type === "boolean") return 3; // checkboxes last + return 2; // string and other + }; + return typeOrder(a) - typeOrder(b); + }); + const useGrid = sortedSchema.length > 4; + const gridRef = useRef(null); + const [colCount, setColCount] = useState(1); + + useEffect(() => { + const el = gridRef.current; + if (!el || !useGrid) { setColCount(1); return; } + const observer = new ResizeObserver(() => { + const cols = getComputedStyle(el).gridTemplateColumns.split(" ").length; + setColCount(cols); + }); + observer.observe(el); + return () => observer.disconnect(); + }, [useGrid]); + // Don't render anything for Gemini or if no model selected if (provider === "gemini" || !modelId) { return null; @@ -172,8 +211,12 @@ export function ModelParameters({ return null; } + const displaySchema = useGrid && colCount > 1 + ? reorderColumnFirst(sortedSchema, colCount) + : sortedSchema; + return ( -
+
{error ? ( {error} ) : isLoading ? ( @@ -181,14 +224,22 @@ export function ModelParameters({ ) : schema.length === 0 ? ( No parameters available ) : ( - schema.map((param) => ( - handleParameterChange(param.name, value)} - /> - )) +
+ {displaySchema.map((param) => ( + handleParameterChange(param.name, value)} + /> + ))} +
)}
);