ui(deploy): extract VariablesTab component

Pure presentational tab receiving VariablesFormState via value/onChange.
Rows use the new .envVarsList / .envVarRow CSS grid (1fr 2fr auto).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-22 22:56:31 +02:00
parent 5c48b780b2
commit bb06c4c689

View File

@@ -0,0 +1,60 @@
import { Button, Input } from '@cameleer/design-system';
import type { VariablesFormState } from '../hooks/useDeploymentPageState';
import styles from '../AppDeploymentPage.module.css';
interface Props {
value: VariablesFormState;
onChange: (next: VariablesFormState) => void;
disabled?: boolean;
}
export function VariablesTab({ value, onChange, disabled }: Props) {
function updateRow(index: number, field: 'key' | 'value', v: string) {
const next = value.envVars.map((row, i) => (i === index ? { ...row, [field]: v } : row));
onChange({ envVars: next });
}
function removeRow(index: number) {
onChange({ envVars: value.envVars.filter((_, i) => i !== index) });
}
function addRow() {
onChange({ envVars: [...value.envVars, { key: '', value: '' }] });
}
return (
<div>
<div className={styles.envVarsList}>
{value.envVars.map((row, i) => (
<div key={i} className={styles.envVarRow}>
<Input
disabled={disabled}
value={row.key}
onChange={(e) => updateRow(i, 'key', e.target.value)}
placeholder="KEY"
/>
<Input
disabled={disabled}
value={row.value}
onChange={(e) => updateRow(i, 'value', e.target.value)}
placeholder="value"
/>
<Button
size="sm"
variant="ghost"
disabled={disabled}
onClick={() => removeRow(i)}
>
&times;
</Button>
</div>
))}
</div>
<div style={{ marginTop: 10 }}>
<Button size="sm" variant="secondary" disabled={disabled} onClick={addRow}>
+ Add Variable
</Button>
</div>
</div>
);
}