+ {/* ── Static fields — always visible ── */}
+
+ {/* Config Name */}
+
+
+ setConfigName(e.target.value)}
+ placeholder="e.g. my-pii-remover-config"
+ className="w-full text-sm rounded-md border px-2.5 py-1.5 outline-none focus:ring-1"
+ style={{
+ borderColor: colors.border,
+ backgroundColor: colors.bg.primary,
+ color: colors.text.primary,
+ }}
+ />
+
+
+ {/* Stage */}
+
+
+
+
+
+ {/* On Fail Action */}
+
+
+
+
+
+ {/* Enabled */}
+
+
+ {/* ── Validator Type — divider then type selector ── */}
+
+
+ {validatorsLoading ? (
+
+ ) : (
+
+ )}
+ {typeDescription && (
+
+ {typeDescription}
+
+ )}
+
+
+ {/* ── Dynamic fields — only when a type is selected ── */}
+ {validator && (
+ <>
+ {/* Ban list */}
+ {isBanList && (
+
+ handleFieldChange("ban_list_id", id)}
+ apiKey={apiKey}
+ />
+
+ )}
+
+ {/* Dynamic schema fields */}
+ {editableProperties.length > 0 && (
+
+
+ {editableProperties.map(([key, prop]) => (
+
+ ))}
+
+
+ )}
+ >
+ )}
+
+
+ {/* Save button — always visible once there's a name and type */}
+