Skip to content

Add editable zoom dropdown with custom percentages (APP-4961)#14248

Draft
warp-dev-github-integration[bot] wants to merge 11 commits into
masterfrom
factory/editable-zoom-dropdown
Draft

Add editable zoom dropdown with custom percentages (APP-4961)#14248
warp-dev-github-integration[bot] wants to merge 11 commits into
masterfrom
factory/editable-zoom-dropdown

Conversation

@warp-dev-github-integration

@warp-dev-github-integration warp-dev-github-integration Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Description

Adds a reusable EditableDropdown<A> combobox that preserves preset menu actions while allowing validated free-text entry through EditorView.

Appearance → Window → Zoom now:

  • retains all 15 existing presets from 50% through 350%;
  • accepts any integer percentage in the inclusive 50–350% range, with an optional trailing %;
  • shows the editor error border for invalid text, commits on Enter/blur, and reverts/refocuses on invalid commit;
  • reverts without committing on Escape; and
  • synchronizes its text and preset selection when another writer or Reset changes WindowSettings.zoom_level.

ZoomLevel now owns the shared bounds, percentage parser, and clamp validation.

Linked Issue

Closes #7793

Linear: https://linear.app/warpdotdev/issue/APP-4961/editable-zoom-dropdown-preset-values-plus-free-text-entry-with-input

  • The linked task is gated spec-done / ready to implement.
  • Screenshots and a video of the implementation are included below.

Testing

  • Added view_components::editable_dropdown::tests::typed_values_validate_commit_and_revert.
  • Added view_components::editable_dropdown::tests::presets_and_external_values_stay_synchronized.
  • Added window_settings::tests::parse_zoom_level_percentage with the full accepted/rejected input table.
  • ./script/format --check
  • ./script/check_no_inline_test_modules
  • Full Warp CI passed on Linux, macOS, Windows, and wasm: https://github.com/warpdotdev/warp/actions/runs/30138875970
    • all platform test matrices passed;
    • all formatting/clippy jobs passed;
    • all release-compilation jobs passed;
    • miscellaneous checks passed.
  • I manually tested my changes locally with ./script/run.

Manual QA on final HEAD 9f99ad58 covered the complete preset list; arrow-key highlight + Escape cancellation without stale text; selecting 125%; entering and applying 142%; the invalid 400 red-border/revert/refocus path; and Reset synchronization back to 100%.

Screenshots / Videos

Computer-use screenshots

Warp Settings → Appearance showing the Window section with the Zoom control's editable field reading 100% and a Reset to default link.
The Zoom preset dropdown menu open, showing options 50%, 60%, 70%, 80%, 90%, and 100% (highlighted).
Zoom preset dropdown scrolled to show the middle presets: 80%, 90%, 100% (highlighted), 110%, 125%, 150%.
After choosing the 125% preset: the Zoom field reads 125% and the whole Warp UI is visibly scaled up (larger text and controls) compared to 100%.
After typing 142 and pressing Enter: the Zoom field shows 142% and the entire UI is scaled to 142%, larger than 125% (content overflows the window width).
Invalid Zoom value 400 entered (above the 350% max): the Zoom combobox shows a red error border while the UI remains at the previously applied 142% scale (uncommitted).
After pressing Enter on the invalid 400: the Zoom field reverted to 142% with a normal (non-red) border and the caret still visible; the UI scale stayed at 142% (unchanged).
After clicking Reset to default: the Zoom field synchronized to 100% and the entire UI returned to default 100% scale, matching the original layout.

Computer-use video recordings

View video recording: Full flow of interacting with the Window → Zoom control in Warp Settings → Appearance: opening the preset menu, choosing a preset, typing a custom value (142), entering an invalid value (400), and using Reset to default.

Final-head keyboard navigation and core-flow proof

Initial 100% value on final HEAD.
After arrow-highlighting 110% and pressing Escape, the field remains at the saved 100% value.
125% preset applied on final HEAD.
Custom 142% applied on final HEAD.
Invalid 400 displays the error border.
Invalid 400 reverts to 142% and clears the error border.
Reset synchronizes the field and UI to 100%.

View final-head video recording: arrow highlight + Escape cancellation, 125% preset, custom 142%, invalid 400, and Reset.

Agent Mode

  • Warp Agent Mode - This PR was created via Warp's AI Agent Mode

CHANGELOG-IMPROVEMENT: Enter any integer zoom percentage from 50% through 350% in Appearance settings.

Originating thread: https://warpdev.slack.com/archives/C0BDQDW8V5E/p1784907267342129

Co-Authored-By: Oz oz-agent@warp.dev

Conversation: https://staging.warp.dev/conversation/baa8416a-7862-4068-97ec-80b8e75a558b
Run: https://oz.staging.warp.dev/runs/019f94f9-9196-7cd1-897e-2e4ee829e208
This PR was generated with Oz.

APP-4961)

Spec for APP-4961: replace the Zoom setting's fixed-value dropdown with a
reusable EditableDropdown (combobox) that keeps the existing presets and
lets the user type a percentage directly, validated with the EditorView
conventions (error border, commit on Enter/blur, revert on Escape/invalid).
Resolves the open 350% preset / custom-range ambiguity (50-350% for
consistency, surfaced for product confirmation). Full product + tech spec
with exhaustive checkable validation criteria.

Co-Authored-By: Warp <agent@warp.dev>
Add a reusable editable dropdown that combines preset menu actions with validated free-text entry. Wire Appearance zoom to accept integer percentages from 50% through 350%, preserve existing presets, and keep external setting changes synchronized.

Co-Authored-By: Warp <agent@warp.dev>

Co-Authored-By: Oz <oz-agent@warp.dev>
@warp-dev-github-integration
warp-dev-github-integration Bot force-pushed the factory/editable-zoom-dropdown branch from aa94bce to 7bdc1ed Compare July 24, 2026 17:44
Co-Authored-By: Oz <oz-agent@warp.dev>
@warp-dev-github-integration
warp-dev-github-integration Bot force-pushed the factory/editable-zoom-dropdown branch from 7bdc1ed to 37336d7 Compare July 24, 2026 17:45
oz-agent added 5 commits July 24, 2026 18:05
Keep the test-only dispatch recorder type-erased so EditableDropdown remains generic over DropdownItemAction without requiring an additional Clone bound.

Co-Authored-By: Warp <agent@warp.dev>

Co-Authored-By: Oz <oz-agent@warp.dev>
Keep the spec-required helper surface available for future consumers while explicitly allowing the three helpers not yet wired outside the Zoom setting.

Co-Authored-By: Warp <agent@warp.dev>

Co-Authored-By: Oz <oz-agent@warp.dev>
Register the existing UserWorkspaces mock required when EditorView tests compile with the voice_input feature enabled.

Co-Authored-By: Warp <agent@warp.dev>

Co-Authored-By: Oz <oz-agent@warp.dev>
Use the standard test settings initializer so all feature-gated EditorView dependencies, including AISettings, are registered before constructing EditableDropdown.

Co-Authored-By: Warp <agent@warp.dev>

Co-Authored-By: Oz <oz-agent@warp.dev>
Initialize EditableDropdown tests with the same singleton dependencies used by EditorView tests, including all-features voice input support.

Co-Authored-By: Warp <agent@warp.dev>

Co-Authored-By: Oz <oz-agent@warp.dev>
@warp-dev-github-integration warp-dev-github-integration Bot changed the title Spec: Editable zoom dropdown (combobox) with presets + free-text entry (APP-4961) Add editable zoom dropdown with custom percentages (APP-4961) Jul 24, 2026
oz-agent added 3 commits July 24, 2026 22:28
Co-Authored-By: Oz <oz-agent@warp.dev>
Keep keyboard highlight changes provisional until a preset action is committed, preventing Escape from leaving an uncommitted percentage in the editable field.

Co-Authored-By: Warp <agent@warp.dev>

Co-Authored-By: Oz <oz-agent@warp.dev>
Co-Authored-By: Oz <oz-agent@warp.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for custom values in the Zoom setting

1 participant