diff --git a/static/css/01-agent-chat.css b/static/css/01-agent-chat.css index 87a17a117..8686048a8 100644 --- a/static/css/01-agent-chat.css +++ b/static/css/01-agent-chat.css @@ -6481,6 +6481,13 @@ body.bg-pattern-ascii-fireflies { display:flex; justify-content:flex-end; gap:8px; padding-top:6px; border-top:1px solid var(--border); margin-top:4px; } + /* The global `button { height:32px }` would hold a wrapped label (e.g. + "Delete chat and images") to one line's height, so its second line + spills out below the button. Let confirm buttons grow to fit; 32px + stays the minimum, so single-line buttons look the same. */ + .styled-confirm-box .confirm-btn { + height:auto; min-height:32px; + } @media (max-width:768px) { .styled-confirm-box { width: 85vw; diff --git a/static/index.html b/static/index.html index 93b6895e2..3c3a95c30 100644 --- a/static/index.html +++ b/static/index.html @@ -247,32 +247,32 @@ real request is discarded and the font fetched a second time. --> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + @@ -2709,7 +2709,7 @@ - + diff --git a/static/sw.js b/static/sw.js index 628b0d872..c0af08e4b 100644 --- a/static/sw.js +++ b/static/sw.js @@ -7,7 +7,7 @@ // - Other static assets (images/fonts/libs): cache-first with bg refresh. // - API / non-GET: never cached. // Bump CACHE_NAME whenever the precache list or SW logic changes. -const CACHE_NAME = 'odysseus-v1135-pr40-editor-precache'; +const CACHE_NAME = 'odysseus-v1136-pr40-editor-precache'; // KaTeX resolves these from its own stylesheet, so caching the CSS without them // gives offline math fallback glyphs instead of proper typesetting. @@ -40,28 +40,28 @@ const KATEX_FONTS = [ const PRECACHE = [ '/static/js/compare/sse.js', '/', - '/static/css/00-tokens.css?v=20261007detailscroll1', - '/static/css/01-agent-chat.css?v=20261007detailscroll1', - '/static/css/02-compare.css?v=20261007detailscroll1', - '/static/css/03-agent-chat.css?v=20261007detailscroll1', - '/static/css/04-memory.css?v=20261007detailscroll1', - '/static/css/05-documents.css?v=20261007detailscroll1', - '/static/css/06-admin-settings.css?v=20261007detailscroll1', - '/static/css/07-documents.css?v=20261007detailscroll1', - '/static/css/08-skills.css?v=20261007detailscroll1', - '/static/css/09-gallery.css?v=20261007detailscroll1', - '/static/css/10-cookbook.css?v=20261007detailscroll1', - '/static/css/11-tasks.css?v=20261007detailscroll1', - '/static/css/12-gallery.css?v=20261007detailscroll1', - '/static/css/13-image-editor.css?v=20261007detailscroll1', - '/static/css/14-email.css?v=20261007detailscroll1', - '/static/css/15-notes.css?v=20261007detailscroll1', - '/static/css/16-calendar.css?v=20261007detailscroll1', - '/static/css/17-research.css?v=20261007detailscroll1', - '/static/css/documents-gallery-editor.css?v=20261007detailscroll1', - '/static/css/email-calendar-notes-tasks.css?v=20261007detailscroll1', - '/static/css/cookbook-research-memory-settings.css?v=20261007detailscroll1', - '/static/app.js?v=20261007detailscroll1', + '/static/css/00-tokens.css?v=20261008confirmwrap1', + '/static/css/01-agent-chat.css?v=20261008confirmwrap1', + '/static/css/02-compare.css?v=20261008confirmwrap1', + '/static/css/03-agent-chat.css?v=20261008confirmwrap1', + '/static/css/04-memory.css?v=20261008confirmwrap1', + '/static/css/05-documents.css?v=20261008confirmwrap1', + '/static/css/06-admin-settings.css?v=20261008confirmwrap1', + '/static/css/07-documents.css?v=20261008confirmwrap1', + '/static/css/08-skills.css?v=20261008confirmwrap1', + '/static/css/09-gallery.css?v=20261008confirmwrap1', + '/static/css/10-cookbook.css?v=20261008confirmwrap1', + '/static/css/11-tasks.css?v=20261008confirmwrap1', + '/static/css/12-gallery.css?v=20261008confirmwrap1', + '/static/css/13-image-editor.css?v=20261008confirmwrap1', + '/static/css/14-email.css?v=20261008confirmwrap1', + '/static/css/15-notes.css?v=20261008confirmwrap1', + '/static/css/16-calendar.css?v=20261008confirmwrap1', + '/static/css/17-research.css?v=20261008confirmwrap1', + '/static/css/documents-gallery-editor.css?v=20261008confirmwrap1', + '/static/css/email-calendar-notes-tasks.css?v=20261008confirmwrap1', + '/static/css/cookbook-research-memory-settings.css?v=20261008confirmwrap1', + '/static/app.js?v=20261008confirmwrap1', '/static/js/storage.js', '/static/js/appConfig.js', '/static/js/ui.js?v=20260916largetoolscroll1', diff --git a/tests/test_dialog_aria.py b/tests/test_dialog_aria.py index 5ce8ce427..f23e252e6 100644 --- a/tests/test_dialog_aria.py +++ b/tests/test_dialog_aria.py @@ -58,6 +58,20 @@ def test_styled_confirm_cancel_or_close_label_is_shifted_without_moving_button() assert "top:2px;" in rule +def test_styled_confirm_buttons_grow_to_fit_wrapped_labels(): + # The global `button { height:32px }` held a two-line label (e.g. + # "Delete chat and images") to one line's height, so its second line + # rendered below the button. Confirm buttons must be allowed to grow, + # with 32px kept as the minimum. + css = app_css() + + assert re.search(r"(^|\n)\s*button\s*\{\s*height:32px;", css) + rule_start = css.index(".styled-confirm-box .confirm-btn {") + rule = css[rule_start:rule_start + 120] + assert "height:auto;" in rule + assert "min-height:32px;" in rule + + def test_styled_dialogs_manage_focus(): # A dialog is only really accessible if it restores focus to the trigger on # close and traps Tab while open. Both styledConfirm and styledPrompt should