From 9cfa9818f9d4b3056221d609afe85e2f839c89b1 Mon Sep 17 00:00:00 2001 From: xpltd Date: Sun, 22 Mar 2026 17:01:35 -0500 Subject: [PATCH] Fix paste broken by isAnalyzing + UI polish batch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Critical fix: - Input field no longer disabled during URL analysis — the race condition fix (isAnalyzing=true on paste) was disabling the input mid-paste, causing the browser to drop the pasted text. Input now only disabled during submission. UI polish: - All action row elements standardized to 42px height - Mobile toggle pills wider (min-width: 42px, matches gear icon) - URL clear button (floating X) in the input field - Footer visible in mobile view (padding above bottom nav) - FormatPicker mobile: ellipsis on codec text, wrapped layout at narrow widths --- frontend/src/components/AppFooter.vue | 6 ++ frontend/src/components/FormatPicker.vue | 29 ++++++++- frontend/src/components/UrlInput.vue | 76 +++++++++++++++++++----- 3 files changed, 94 insertions(+), 17 deletions(-) diff --git a/frontend/src/components/AppFooter.vue b/frontend/src/components/AppFooter.vue index 95865ca..2999339 100644 --- a/frontend/src/components/AppFooter.vue +++ b/frontend/src/components/AppFooter.vue @@ -40,6 +40,12 @@ onMounted(async () => { opacity: 0.7; } +@media (max-width: 767px) { + .app-footer { + padding-bottom: calc(var(--mobile-nav-height) + var(--space-md)); + } +} + .sep { margin: 0 var(--space-sm); opacity: 0.5; diff --git a/frontend/src/components/FormatPicker.vue b/frontend/src/components/FormatPicker.vue index f63f0a9..31b65aa 100644 --- a/frontend/src/components/FormatPicker.vue +++ b/frontend/src/components/FormatPicker.vue @@ -144,6 +144,7 @@ function selectFormat(id: string | null): void { cursor: pointer; min-height: var(--touch-min); transition: background-color 0.15s ease; + gap: var(--space-sm); } .format-option:hover { @@ -157,6 +158,10 @@ function selectFormat(id: string | null): void { .format-label { font-size: var(--font-size-base); + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .format-hint { @@ -165,9 +170,31 @@ function selectFormat(id: string | null): void { } .format-codecs { - font-size: var(--font-size-sm); + font-size: var(--font-size-xs); color: var(--color-text-muted); font-family: var(--font-mono); + white-space: nowrap; + flex-shrink: 0; + max-width: 120px; + overflow: hidden; + text-overflow: ellipsis; +} + +@media (max-width: 540px) { + .format-option { + flex-wrap: wrap; + gap: 2px; + } + + .format-label { + flex: 1 1 100%; + font-size: var(--font-size-sm); + } + + .format-codecs { + font-size: 0.6875rem; + max-width: none; + } } .format-empty { diff --git a/frontend/src/components/UrlInput.vue b/frontend/src/components/UrlInput.vue index 643d1f4..05a0a69 100644 --- a/frontend/src/components/UrlInput.vue +++ b/frontend/src/components/UrlInput.vue @@ -299,16 +299,27 @@ function formatTooltip(fmt: string): string {