+ {/* Name */}
+
+
+ {
+ const val = e.target.value.replace(/\s+/g, '-').replace(/[^a-zA-Z0-9-_]/g, '');
+ set('name', val || 'myAnimation');
+ }}
+ className="font-mono text-xs"
+ />
+
+
+ {/* Duration + Delay */}
+
+
+
+
+ set('duration', Math.max(50, Number(e.target.value)))}
+ className="text-xs"
+ />
+ ms
+
+
+
+
+
+ set('delay', Math.max(0, Number(e.target.value)))}
+ className="text-xs"
+ />
+ ms
+
+
+
+
+ {/* Easing */}
+
+
+
+
+
+ {/* Cubic-bezier inputs */}
+ {isCubic && (
+
+
+
+ {(['P1x', 'P1y', 'P2x', 'P2y'] as const).map((label, i) => (
+
+
+ setCubic(i, Number(e.target.value))}
+ className="text-xs px-1.5"
+ />
+
+ ))}
+
+
+ )}
+
+ {/* Iteration */}
+
+
+
+ set('iterationCount', Math.max(1, Number(e.target.value)))}
+ className="text-xs flex-1"
+ placeholder="1"
+ />
+
+
+
+
+ {/* Direction */}
+
+
+
+
+
+ {/* Fill Mode */}
+
+
+
+
+
+