fix(lotus): in-call mobile UI fixes (EC audit wave-2)
3-agent survey of the in-call UI at phone width + 2-agent review of the staged diff. All changes are mobile-gated CSS (mobile-first @media on Compound tokens), so desktop rendering is provably unchanged. - CallFooter: wrap the control row and tighten gap/padding at <=500px so the buttons (incl. the destructive hangup) can never be clipped by the grid's overflow-x:hidden. A loudspeaker button was added to the bar without a shed rule, pushing 6-7 lg buttons past the viewport at 320-500px. - OneOnOnePortraitLayout: give the 1:1 self-view the same safe-area-aware inset as SpotlightExpandedLayout so it clears the home indicator / floating footer (was a bare 16px inset). Phone-only layout. - GridTile: enlarge the always-visible camera-flip control to a 44px touch target on coarse pointers (was ~28px). - ReactionToggleButton: enlarge reaction-picker emoji buttons to 44px at <=420px (were ~32px); five still fit a 360px drawer row. - Tabs: scroll the horizontal tab row on the inline axis (overflow-x) so the Settings tabs don't clip in a phone drawer. - SpotlightLandscapeLayout: shrink the 180px filmstrip rail to 132px on short landscape phones (max-height:400px) so the spotlight isn't a sliver. Gates: tsc 0, prettier clean, affected vitest pass. No TS changed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
0ffe247929
commit
e36aef8aa3
@@ -12,8 +12,10 @@
|
|||||||
|
|
||||||
@media (max-width: 420px) {
|
@media (max-width: 420px) {
|
||||||
.reactionPopupMenu {
|
.reactionPopupMenu {
|
||||||
--reaction-button-padding: 8px;
|
/* 20px glyph + 2×12px padding = a 44px square touch target. Five buttons
|
||||||
--reaction-button-fontsize: 16px;
|
still fit a ~360px drawer row; previously these were ~32px. */
|
||||||
|
--reaction-button-padding: 12px;
|
||||||
|
--reaction-button-fontsize: 20px;
|
||||||
--reaction-button-gap: 6px;
|
--reaction-button-gap: 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,20 @@ Once we exceed 500 we hide everything except the buttons.
|
|||||||
@media (max-width: 500px) {
|
@media (max-width: 500px) {
|
||||||
.footer {
|
.footer {
|
||||||
grid-template-areas: "buttons buttons buttons";
|
grid-template-areas: "buttons buttons buttons";
|
||||||
|
/* Reclaim horizontal budget so the control row fits on phones. */
|
||||||
|
padding-left: calc(env(safe-area-inset-left) + var(--cpd-space-3x));
|
||||||
|
padding-right: calc(env(safe-area-inset-right) + var(--cpd-space-3x));
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
/* Fill the row and wrap instead of overflowing: on the narrowest phones the
|
||||||
|
control set (mic/video/loudspeaker/hangup) exceeds the viewport, and the
|
||||||
|
parent's overflow-x: hidden would otherwise clip the outer buttons —
|
||||||
|
including the destructive hangup. Wrapping keeps every control reachable. */
|
||||||
|
justify-self: stretch;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: center;
|
||||||
|
gap: var(--cpd-space-2x);
|
||||||
}
|
}
|
||||||
|
|
||||||
.settingsOnlyShowNarrow {
|
.settingsOnlyShowNarrow {
|
||||||
|
|||||||
@@ -16,7 +16,14 @@ Please see LICENSE in the repository root for full details.
|
|||||||
|
|
||||||
.pip {
|
.pip {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
inset: var(--cpd-space-4x);
|
/* Keep the self-view within the safe area (home indicator) and the inline
|
||||||
|
content insets, and clear of the floating footer — matching the
|
||||||
|
reference-correct SpotlightExpandedLayout. A bare 16px inset let the
|
||||||
|
bottom-right self-tile sit under the controls / device chrome on phones. */
|
||||||
|
inset: calc(env(safe-area-inset-top) + var(--cpd-space-4x))
|
||||||
|
var(--content-inset-right)
|
||||||
|
calc(env(safe-area-inset-bottom) + var(--cpd-space-4x))
|
||||||
|
var(--content-inset-left);
|
||||||
}
|
}
|
||||||
|
|
||||||
.pip[data-size="sm"] {
|
.pip[data-size="sm"] {
|
||||||
|
|||||||
@@ -43,3 +43,17 @@ unconditionally select the container so we can use cq units */
|
|||||||
inline-size: 180px;
|
inline-size: 180px;
|
||||||
block-size: 135px;
|
block-size: 135px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* On a landscape phone the fixed 180px filmstrip rail squeezes the spotlight to
|
||||||
|
a sliver; shrink the rail (keeping the 4:3 tile ratio) to give the spotlight
|
||||||
|
room. Desktop landscape (height > 400px) is unaffected. */
|
||||||
|
@media (max-height: 400px) {
|
||||||
|
.layer {
|
||||||
|
--grid-slot-width: 132px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid > .slot {
|
||||||
|
inline-size: 132px;
|
||||||
|
block-size: 99px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,7 +12,12 @@ Please see LICENSE in the repository root for full details.
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tabList {
|
.tabList {
|
||||||
overflow-y: auto;
|
/* The tab row is horizontal, so scroll along the inline axis when the tabs
|
||||||
|
exceed the width (e.g. the Settings modal as a phone drawer). The prior
|
||||||
|
overflow-y:auto expressed the wrong axis; make the horizontal intent
|
||||||
|
explicit and hide the scrollbar. */
|
||||||
|
overflow-x: auto;
|
||||||
|
overflow-y: hidden;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
|
||||||
/*no scrollbars*/
|
/*no scrollbars*/
|
||||||
@@ -24,4 +29,5 @@ Please see LICENSE in the repository root for full details.
|
|||||||
/*no scrollbars*/
|
/*no scrollbars*/
|
||||||
background: transparent; /* Chrome/Safari/Webkit */
|
background: transparent; /* Chrome/Safari/Webkit */
|
||||||
width: 0px;
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,6 +98,14 @@ borders don't support gradients */
|
|||||||
color: var(--cpd-color-icon-primary);
|
color: var(--cpd-color-icon-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The camera-flip control is always visible and primarily used on phones;
|
||||||
|
its inherited 4px padding yields a ~28px box, below the touch minimum. */
|
||||||
|
@media (hover: none), (pointer: coarse) {
|
||||||
|
.tile .switchCamera {
|
||||||
|
padding: var(--cpd-space-3x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media (hover) {
|
@media (hover) {
|
||||||
.tile .switchCamera:hover {
|
.tile .switchCamera:hover {
|
||||||
background: var(--cpd-color-bg-subtle-secondary);
|
background: var(--cpd-color-bg-subtle-secondary);
|
||||||
|
|||||||
Reference in New Issue
Block a user