## ADDED Requirements ### Requirement: Gizmo drag produces one atomic undo command The system SHALL record the pre-drag TRS state when a viewport gizmo drag begins, and push a single `TransformCommand` to `CommandHistory` when the drag ends (mouse button released). The command SHALL store the prim path, the edit-target layer, and the full TRS (translate, rotate, scale) snapshots from before and after the drag. #### Scenario: Single undo reverses entire drag - **WHEN** the user drags the Move gizmo to translate a prim and then presses Ctrl+Z - **THEN** the prim returns to the position it had before the drag started (not an intermediate position) #### Scenario: Redo restores drag result - **WHEN** the user undoes a gizmo drag and then presses Ctrl+Y - **THEN** the prim moves back to the post-drag position #### Scenario: No command pushed for zero-delta drag - **WHEN** the user clicks a gizmo axis but releases without moving - **THEN** no command is pushed to the history stack ### Requirement: Property panel TRS commits produce undo commands The system SHALL push a `TransformCommand` to `CommandHistory` when a translate, rotate, or scale field in the Property panel loses focus after being edited (`ImGui::IsItemDeactivatedAfterEdit()`). The command SHALL store the pre-edit and post-edit TRS values. #### Scenario: Undo reverts property-panel translate edit - **WHEN** the user types a new X translate value in the Property panel, presses Tab to commit, then presses Ctrl+Z - **THEN** the prim's translate returns to the value it had before the edit #### Scenario: Typing without committing does not push a command - **WHEN** the user begins editing a translate field but presses Escape to cancel - **THEN** no new command is added to the undo stack ### Requirement: Transform command respects the active edit target layer The `TransformCommand` SHALL store and restore the `SdfLayerHandle` that was the active edit target at the time of the edit. `Undo()` and `Redo()` SHALL direct their `UsdGeomXformCommonAPI` writes to that same layer via `UsdEditContext`. #### Scenario: Undo writes to correct layer - **WHEN** the user has Layer B selected as the edit target, moves a prim, then undoes - **THEN** the revert is written to Layer B, not to the root layer