diff --git a/server/public/home.html b/server/public/home.html index cae5cd1..7eec094 100644 --- a/server/public/home.html +++ b/server/public/home.html @@ -310,7 +310,10 @@ .convo-body .big{font-size:2.4rem;margin-bottom:.4rem;} /* message thread */ .convo-msgs{flex:1;overflow-y:auto;padding:1rem 1.2rem;display:flex;flex-direction:column;gap:.35rem;background:var(--bg);} - .bubble{max-width:72%;padding:.5rem .75rem;border-radius:14px;font-size:.9rem;line-height:1.4;white-space:pre-wrap;word-break:break-word;box-shadow:0 1px 2px rgba(20,30,60,.06);} + /* word-break:normal + overflow-wrap:break-word: still emergency-breaks an over-long word/URL to fit, + but keeps min-content = longest WORD (not 1 glyph) so a bubble can never collapse to ~0 width and + wrap text into hundreds of lines during a transient 0-width layout frame (the "stretch" balloon). */ + .bubble{max-width:72%;padding:.5rem .75rem;border-radius:14px;font-size:.9rem;line-height:1.4;white-space:pre-wrap;word-break:normal;overflow-wrap:break-word;box-shadow:0 1px 2px rgba(20,30,60,.06);} .bubble.them{align-self:flex-start;background:#fff;border:1px solid var(--line);color:var(--ink);border-bottom-left-radius:4px;} .bubble.mine{align-self:flex-end;background:var(--blue);color:#fff;border-bottom-right-radius:4px;} .bubble .t{display:block;font-size:.64rem;opacity:.65;margin-top:.15rem;text-align:right;} @@ -529,7 +532,7 @@ .upd-dot{position:absolute;top:-3px;right:-3px;width:15px;height:15px;border-radius:50%;background:var(--brand);color:var(--blue-d);font-size:.66rem;font-weight:800;font-style:italic;display:grid;place-items:center;border:2px solid var(--blue);pointer-events:none;} #setUpd.has-update{background:var(--brand);color:var(--blue-d);} .set-ver-i{display:inline-grid;place-items:center;width:15px;height:15px;border-radius:50%;background:var(--brand);color:var(--blue-d);font-size:.66rem;font-weight:800;font-style:italic;margin-left:.35rem;vertical-align:middle;} - .bubble .msg-link{color:inherit;text-decoration:underline;text-underline-offset:2px;word-break:break-word;} + .bubble .msg-link{color:inherit;text-decoration:underline;text-underline-offset:2px;overflow-wrap:break-word;} .bubble .msg-tel{color:inherit;text-decoration:underline;text-underline-offset:2px;white-space:nowrap;cursor:pointer;} /* #9 */ .bubble.them .msg-link{color:var(--blue);} .bubble.mine .msg-link{color:#dbe9ff;} .bubble .fwd-label{display:flex;align-items:center;gap:.2rem;font-size:.72rem;font-style:italic;opacity:.7;margin-bottom:.2rem;} @@ -1041,7 +1044,7 @@ /* Stop the page from widening WITHOUT clipping overlays (profile/bell menus, reaction popups): only cap the chat-list scroller and let long words/URLs wrap instead of pushing width. */ .chatlist{overflow-x:hidden;} - .chat-main,.msg,.msg-body,.bubble,.chat-sub,.chat-preview{min-width:0;max-width:100%;overflow-wrap:anywhere;} + .chat-main,.msg,.msg-body,.bubble,.chat-sub,.chat-preview{min-width:0;max-width:100%;overflow-wrap:break-word;} /* #1/#5: the top safe-area inset (notch / Dynamic Island) is applied PER SURFACE — the chat-list column and each content panel — rather than on the whole shell, so nothing hides under the island and there's no double-padding. Bottom inset is handled by the fixed nav + panel bottom below. */ @@ -1093,7 +1096,10 @@ @keyframes bzListParallaxOut{from{transform:translateX(0);filter:brightness(1);}to{transform:translateX(-22%);filter:brightness(.97);}} @keyframes bzListParallaxIn{from{transform:translateX(-22%);filter:brightness(.97);}to{transform:translateX(0);filter:brightness(1);}} /* OPEN: content slides in over the list (list shown beneath, parallax out) */ - body.chat-opening .content{display:block!important;z-index:2;box-shadow:-12px 0 30px rgba(15,23,42,.18);will-change:transform;animation:bzContentIn .3s cubic-bezier(.32,.72,0,1);} + /* width:100vw makes the sliding pane a DEFINITE width regardless of any ancestor's transient 0-width + during the animation frame — so bubbles never collapse, the composer measures at the right width, + and translateX(100%) travels a real screen width (a true slide, not a no-travel "pop"). */ + body.chat-opening .content{display:block!important;width:100vw;max-width:100vw;z-index:2;box-shadow:-12px 0 30px rgba(15,23,42,.18);will-change:transform;animation:bzContentIn .3s cubic-bezier(.32,.72,0,1);} body.chat-opening .chatcol{display:flex!important;position:absolute;inset:0;z-index:0;animation:bzListParallaxOut .3s cubic-bezier(.32,.72,0,1);} /* CLOSE / drag-back: reveal the list underneath (parallax in) while the conversation slides off right (.content moved by an inline transform in showWelcome()/the edge-drag gesture). */ @@ -1126,7 +1132,7 @@
-