Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
3c40262
fix(ui): synchronize mobile answer chrome
cursoragent Jul 25, 2026
a09ecdb
test(ui): require answer scroll hide without blur
cursoragent Jul 25, 2026
48a0be6
fix(ui): release stale answer composer focus
cursoragent Jul 25, 2026
5ed126b
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
731950a
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
dd2d8c3
fix(ui): bind composer autofocus retries
cursoragent Jul 25, 2026
1b3a358
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
cursoragent Jul 25, 2026
ae77f8c
chore(ui): stay within dashboard line budget
cursoragent Jul 25, 2026
074a965
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
672c3dd
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
d41c283
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
31192aa
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
8487a26
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
bb06441
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
8b05e53
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
3ec7970
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
6a05aa7
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
f1393a5
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
4825d7c
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
b47d001
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
62e20c6
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
0c2b60a
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
68d9f21
fix(ui): hide chrome on compact answer results
cursoragent Jul 25, 2026
3b5ef43
fix(ui): hold chrome through fractional scroll clamp
cursoragent Jul 25, 2026
0808481
docs(review): record mobile chrome Bugbot pass
cursoragent Jul 25, 2026
164139c
test(ui): distinguish range clamps from upward intent
cursoragent Jul 25, 2026
4f9fbf3
fix(ui): distinguish layout clamps from upward scroll
cursoragent Jul 25, 2026
23bbb97
refactor(ui): compact bound composer focus retry
cursoragent Jul 25, 2026
ff3c222
docs(ui): codify geometry-based clamp handling
cursoragent Jul 25, 2026
69dc0db
style: format use-hide-on-scroll.ts to satisfy prettier check
cursoragent Jul 25, 2026
c08ed37
docs(review): record current PR Bugbot pass
cursoragent Jul 25, 2026
80081aa
docs(review): record document scroll behavior findings
cursoragent Jul 25, 2026
3efc68a
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
8b812b1
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
5b5ecf4
fix(ui): clear dock focus latch and refuse near-bottom reserve hides
BigSimmo Jul 25, 2026
6b493e5
docs(review): record PR #1192 Bugbot P1/P2 fixes
BigSimmo Jul 25, 2026
851ecf9
style: format search-chrome-behaviour.md
BigSimmo Jul 25, 2026
e688c6e
Merge remote-tracking branch 'origin/main' into cursor/fix-mobile-com…
cursoragent Jul 25, 2026
70abb74
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
3de3ed1
docs(review): record PR #1192 review after Bugbot fixes and main sync
BigSimmo Jul 25, 2026
a187737
Merge remote PR tip into local review sync
BigSimmo Jul 25, 2026
4424079
Merge remote-tracking branch 'origin/main' into cursor/fix-mobile-com…
cursoragent Jul 25, 2026
73e87da
Merge remote PR tip after concurrent sync
BigSimmo Jul 25, 2026
c508226
docs(review): record final PR #1192 tip after sync
BigSimmo Jul 25, 2026
5143e5a
chore(ui): stay within ClinicalDashboard line budget
BigSimmo Jul 25, 2026
333e67b
chore(ui): compress 3-line comment to restore line budget
cursoragent Jul 25, 2026
aea8a29
docs(ledger): record PR #1192 pr-ci-fix (maintainability budget)
cursoragent Jul 25, 2026
1da4c00
chore(ui): extract composer focus helper for line budget
BigSimmo Jul 25, 2026
83ba0b7
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
cursoragent Jul 25, 2026
477ec92
fix(ui): gate focus pins at sharedChromePinned to fix react-hooks/set…
cursoragent Jul 25, 2026
c0a4641
docs(ledger): record PR #1192 pr-ci-fix (react-hooks/set-state-in-eff…
cursoragent Jul 25, 2026
b200d37
fix(ui): clear chrome focus latch without setState-in-effect
BigSimmo Jul 25, 2026
1ce9ec6
docs(review): record PR #1192 recommended-fix pass
BigSimmo Jul 25, 2026
5f9a195
test(ui): pin focus=1 submit and chrome latch contracts
BigSimmo Jul 25, 2026
efa2ff0
fix(ui): defer stale chrome focus cleanup
cursoragent Jul 25, 2026
5b852ab
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
cursoragent Jul 25, 2026
3329e9e
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
f446b37
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
4fb7e37
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
d5e93a1
Merge concurrent remote tip
BigSimmo Jul 25, 2026
3813f55
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
11e9983
chore(ci): re-trigger checks after main sync
cursoragent Jul 25, 2026
11a4f4a
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
cbe778b
Merge concurrent remote tip
BigSimmo Jul 25, 2026
3d09d08
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
ac28e06
chore: retrigger PR checks
cursoragent Jul 25, 2026
7ce6f39
Merge remote-tracking branch 'origin/main' into cursor/fix-mobile-com…
cursoragent Jul 25, 2026
281e55e
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
d8b019f
chore: retrigger PR checks after branch sync
cursoragent Jul 25, 2026
30dbdce
fix: apply CodeRabbit auto-fixes
coderabbitai[bot] Jul 25, 2026
0bb5ba5
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
28eea53
Merge remote-tracking branch 'origin/main' into cursor/fix-mobile-com…
cursoragent Jul 25, 2026
ec6367a
Revert "fix: apply CodeRabbit auto-fixes"
cursoragent Jul 25, 2026
8ada2fc
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
cursoragent Jul 25, 2026
14304b9
test: make short-runway scroll deterministic
cursoragent Jul 25, 2026
d1896a3
Merge remote-tracking branch 'origin/main' into cursor/fix-mobile-com…
cursoragent Jul 25, 2026
6721ca4
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
github-actions[bot] Jul 25, 2026
600afe1
docs: deduplicate merged review ledger row
cursoragent Jul 25, 2026
cc348da
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
cursoragent Jul 25, 2026
e1b25de
test: assert near-bottom hide refusal and floor the short-runway hide…
BigSimmo Jul 25, 2026
2955bc5
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
BigSimmo Jul 25, 2026
8f1a8ee
test: gesture upward in separated steps after the bottom clamp
BigSimmo Jul 25, 2026
df72c72
fix(ui): release clamp detection when user scroll exceeds reveal thre…
cursoragent Jul 25, 2026
d9fe13d
chore: record PR #1192 scroll clamp detection fix in branch-review-le…
cursoragent Jul 25, 2026
a5b5e36
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
cursoragent Jul 25, 2026
11d1a7e
chore: retrigger PR checks
BigSimmo Jul 25, 2026
a0798f2
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
BigSimmo Jul 25, 2026
f78563e
Merge remote-tracking branch 'origin/main' into cursor/fix-mobile-com…
cursoragent Jul 25, 2026
771683a
Merge remote-tracking branch 'origin/cursor/fix-mobile-composer-edge-…
cursoragent Jul 25, 2026
c8a3568
Merge remote-tracking branch 'origin/main' into cursor/validate-1192-…
BigSimmo Jul 25, 2026
6d56ac2
Merge remote-tracking branch 'origin/main' into cursor/fix-mobile-com…
cursoragent Jul 25, 2026
4c2c79d
docs(ledger): drop duplicate records created by the main merge
BigSimmo Jul 25, 2026
16a4423
docs: deduplicate ledger after main merge
cursoragent Jul 25, 2026
136f38a
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
015d094
Merge origin/main into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
a7db35b
docs(ledger): record the #1222 reconciliation review of PR #1192
BigSimmo Jul 25, 2026
84e5ccf
Merge branch 'cursor/fix-mobile-composer-edge-scroll-5b1d' of https:/…
BigSimmo Jul 25, 2026
61b8de8
docs(ledger): drop the duplicate record from the latest main merge
BigSimmo Jul 25, 2026
68833dd
Merge branch 'main' into cursor/fix-mobile-composer-edge-scroll-5b1d
BigSimmo Jul 25, 2026
2597dd3
fix: apply CodeRabbit auto-fixes
coderabbitai[bot] Jul 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion docs/branch-review-ledger.md

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions docs/search-chrome-behaviour.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ This repo uses one shared search experience across the global shell, dashboard r
6. Header and footer chrome that share the same scroll signal should hide/reveal symmetrically: when hidden, underlying content must be visible to the viewport edge. Header hide/reveal is cross-breakpoint; the bottom search dock is phone-only. Read "Scroll hide/reveal" below before changing either.
7. Do not add page-local dock-sized `pb-[calc(...safe-area...)]` under a shell-owned dock. Put clearance in the shared reserve or the page-owned composer, never both.
8. `GlobalSearchShell` uses an inner `mobile-composer-reserve-pad` so phone padding contributes to scroll height; do not move phone shell clearance back to scrollport padding without a browser proof.
9. Keep collapse-budget policy geometry-aware: an in-flow collapsing header needs enough remaining runway to absorb header + dock clearance, while a fixed overlay that only releases bottom reserve may hide when its post-collapse range retains the top reveal band plus deliberate hide intent _and_ the current offset already fits that post-collapse range (no material near-bottom clamp). Do not use synthetic page padding to make the stricter gate pass.
10. Detect reserve-transition clamps from geometry, not a wider pixel tolerance: if the scroll range shrinks and the previous offset no longer fits inside the new maximum, rebase that frame as layout feedback. Once the range stabilizes, the same upward movement must reveal normally.

## Scroll hide/reveal

Expand Down
37 changes: 21 additions & 16 deletions src/components/ClinicalDashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ import {
import { UniversalSearchAlsoMatches } from "@/components/clinical-dashboard/universal-search-also-matches";
import { FavouritesGuestGate } from "@/components/clinical-dashboard/favourites-guest-gate";
import { useDashboardShellActions } from "@/components/clinical-dashboard/use-dashboard-shell-actions";
import { readChromeCollapseBudget, useScrollHideReporter } from "@/components/clinical-dashboard/use-hide-on-scroll";
import { focusComposerInput as scheduleComposerFocus } from "@/components/clinical-dashboard/focus-composer-input";
import { readChromeCollapseMetrics, useScrollHideReporter } from "@/components/clinical-dashboard/use-hide-on-scroll";
import { SearchCommandProvider } from "@/components/clinical-dashboard/search-command-context";
import {
answerReferencesDocument,
Expand Down Expand Up @@ -354,6 +355,10 @@ export function ClinicalDashboard({
const [modeSearchSubmitted, setModeSearchSubmitted] = useState(() =>
Boolean(autoRunSearch && initialQuery.trim() && initialSearchMode !== "tools"),
);
// focus=1 means "focus on entry", not "keep the dock focused after results".
// Suppress autofocus once a mode search/answer has been submitted so hide-on-
// scroll can reclaim chrome on result views (Answer and other bottom docks).
const shouldAutoFocusComposer = focusSearch && !modeSearchSubmitted;
const [answer, setAnswer] = useState<RagAnswer | null>(null);
const [sources, setSources] = useState<SearchResult[]>([]);
// Answer-mode conversation thread. `priorAnswerTurns` holds completed
Expand Down Expand Up @@ -1495,11 +1500,14 @@ export function ClinicalDashboard({
}, []);

useEffect(() => {
if (!focusSearch) return undefined;
focusComposerInput();
const timeout = window.setTimeout(focusComposerInput, 500);
if (!shouldAutoFocusComposer) {
if (document.activeElement === composerInputRef.current) composerInputRef.current?.blur();
return undefined;
}
focusComposerInput(true);
const timeout = window.setTimeout(() => focusComposerInput(true), 500);
return () => window.clearTimeout(timeout);
}, [focusSearch]);
}, [shouldAutoFocusComposer]);

// Abort any in-flight answer/library search if the dashboard unmounts.
useEffect(() => {
Expand Down Expand Up @@ -1536,7 +1544,7 @@ export function ClinicalDashboard({
setLoading(false);
setError(null);
setAnswerProgress(null);
if (shouldFocusComposer) focusComposerInput();
if (shouldFocusComposer) focusComposerInput(true);
});
return () => window.cancelAnimationFrame(frame);
}, [searchParams, clearDifferentialModeResultState]);
Expand All @@ -1555,8 +1563,9 @@ export function ClinicalDashboard({
setSearchMode(targetMode);
// run=1 URLs name the latest answered question; the composer stays empty
// while an answer thread is active (including after localStorage restore).
// Do not reclaim focus on result deep-links — that pins phone chrome.
if (searchText && params.get("run") !== "1") setQuery(searchText);
if (shouldFocusComposer) focusComposerInput();
if (shouldFocusComposer && params.get("run") !== "1") focusComposerInput(true);
});
return () => window.cancelAnimationFrame(frame);
}, [clearDifferentialModeResultState]);
Expand Down Expand Up @@ -2611,11 +2620,8 @@ export function ClinicalDashboard({
router.push(appModeHomeHref(mode, { queryMode, scopeFilters }));
}

function focusComposerInput() {
window.requestAnimationFrame(() => {
composerInputRef.current?.focus({ preventScroll: true });
window.setTimeout(() => composerInputRef.current?.focus({ preventScroll: true }), 150);
});
function focusComposerInput(retainTarget = false) {
scheduleComposerFocus(composerInputRef, retainTarget);
}

function stageAnswerFollowUpDraft(draft: string) {
Expand Down Expand Up @@ -2804,7 +2810,7 @@ export function ClinicalDashboard({
reportChromeScrollHideRef.current({
offset: main.scrollTop,
maxOffset: Math.max(0, main.scrollHeight - main.clientHeight),
collapseBudget: readChromeCollapseBudget(main),
...readChromeCollapseMetrics(main),
source: main,
});
});
Expand Down Expand Up @@ -3328,7 +3334,7 @@ export function ClinicalDashboard({
}}
queryModeOptions={clinicalQueryModeOptions}
queryInputRef={composerInputRef}
queryInputAutoFocus={focusSearch}
queryInputAutoFocus={shouldAutoFocusComposer}
recentQueries={recentQueries}
commandScopes={commandScopes}
onCommandScopesChange={setCommandScopes}
Expand All @@ -3350,8 +3356,7 @@ export function ClinicalDashboard({
}
desktopHomeComposerSlotId={desktopHomeComposerSlotId}
// Mode homes keep the composer in the centred hero slot at every
// breakpoint so documents, therapy, and the other homes share the
// same phone/tablet structure instead of switching to a bottom dock.
// breakpoint; documents, therapy, and other homes share the phone/tablet structure.
heroComposerBreakpoint={heroComposerBreakpoint}
// Answer view: the header overlays the scrolling <main> at every width
// (main reserves matching top padding) so content frosts under the
Expand Down
16 changes: 16 additions & 0 deletions src/components/clinical-dashboard/focus-composer-input.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { RefObject } from "react";

/** Focus the dashboard composer, optionally pinning the element across remounts. */
export function focusComposerInput(composerInputRef: RefObject<HTMLInputElement | null>, retainTarget = false) {
const requestedInput = retainTarget ? composerInputRef.current : null;
const focusBoundInput = () => {
const input = retainTarget ? requestedInput : composerInputRef.current;
if (input?.isConnected && composerInputRef.current === input) {
input.focus({ preventScroll: true });
}
};
window.requestAnimationFrame(() => {
focusBoundInput();
window.setTimeout(focusBoundInput, 150);
});
}
6 changes: 3 additions & 3 deletions src/components/clinical-dashboard/global-search-shell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import {
resolveShellVisibleMobileComposerReserve,
} from "@/components/clinical-dashboard/mobile-composer-reserve";
import {
readChromeCollapseBudget,
readChromeCollapseMetrics,
useDocumentScrollHideReporter,
useScrollHideReporter,
} from "@/components/clinical-dashboard/use-hide-on-scroll";
Expand Down Expand Up @@ -539,7 +539,7 @@ function GlobalStandaloneSearchShellClient({
chromeScrollHide.reportScroll({
offset: target.scrollTop,
maxOffset: Math.max(0, target.scrollHeight - target.clientHeight),
collapseBudget: readChromeCollapseBudget(target),
...readChromeCollapseMetrics(target),
source: target,
});
}
Expand All @@ -564,7 +564,7 @@ function GlobalStandaloneSearchShellClient({
maxOffset: Math.max(0, target.scrollHeight - target.clientHeight),
// Collapsing chrome releases layout into nested scrollers too (their
// flex height cap grows with the shell), so the same budget applies.
collapseBudget: readChromeCollapseBudget(main),
...readChromeCollapseMetrics(main),
source: target,
});
};
Expand Down
39 changes: 29 additions & 10 deletions src/components/clinical-dashboard/master-search-header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -364,8 +364,6 @@ export function MasterSearchHeader({
disabled: !hideOnScroll || hideOnScroll.scrollHidden !== undefined,
});
const scrollHidden = hideOnScroll?.scrollHidden !== undefined ? hideOnScroll.scrollHidden : internalScrollHidden;
const headerChromeHidden =
scrollHidden && !modeMenuOpen && !actionMenuOpen && !scopeOpen && !scopeSheetOpen && !headerChromeFocused;
// Mode homes portal the composer into the hero slot. With "all" the hero owns
// every width (the answer home keeps its in-flow pill on phones); "sm-up"
// hero hosts hand phones the bottom dock instead.
Expand All @@ -375,17 +373,38 @@ export function MasterSearchHeader({
searchComposerVisible &&
!heroComposerOwnsPhones &&
(isAnswerFooterComposer || mobileSearchPlacement === "bottom");
const hideOnScrollEnabled = Boolean(hideOnScroll);
// Focus-capture pins can survive dock teardown when React skips blur (portal
// swap, hero reclaim, breakpoint change). Ignore latched focus unless that
// surface is still the active hide/reveal owner, then clear the latch async
// (repo pattern — avoids react-hooks/set-state-in-effect).
const composerFocusPinsChrome = composerChromeFocused && phoneBottomSearchDockActive && hideOnScrollEnabled;
const headerFocusPinsChrome = headerChromeFocused && hideOnScrollEnabled;
// Header and composer share one scroll signal, so any active surface or
// focus inside either edge pins both edges. This preserves keyboard focus
// safety without letting the unfocused header disappear above a still-
// focused composer (or vice versa).
const sharedChromePinned =
modeMenuOpen ||
actionMenuOpen ||
commandDropdownOpen ||
scopeOpen ||
scopeSheetOpen ||
headerFocusPinsChrome ||
composerFocusPinsChrome;
const headerChromeHidden = scrollHidden && !sharedChromePinned;
// Compare addon chrome lives inside the phone dock; hide/reveal with it so
// the search pill and Compare selected bar reclaim space together.
const bottomComposerScrollHiddenActive = Boolean(hideOnScroll && phoneBottomSearchDockActive);
const bottomComposerHidden =
bottomComposerScrollHiddenActive &&
scrollHidden &&
!actionMenuOpen &&
!commandDropdownOpen &&
!scopeOpen &&
!scopeSheetOpen &&
!composerChromeFocused;
const bottomComposerHidden = bottomComposerScrollHiddenActive && scrollHidden && !sharedChromePinned;

useEffect(() => {
if (phoneBottomSearchDockActive && hideOnScrollEnabled) return;
queueMicrotask(() => {
if (!phoneBottomSearchDockActive || !hideOnScrollEnabled) setComposerChromeFocused(false);
if (!hideOnScrollEnabled) setHeaderChromeFocused(false);
});
}, [phoneBottomSearchDockActive, hideOnScrollEnabled]);

useEffect(() => {
onBottomComposerHiddenChange?.(bottomComposerHidden);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* zero so content can paint all the way to the viewport edge once the dock is
* invisible. The rem number is exported separately so the scroll-hide
* collapse budget
* (use-hide-on-scroll's readChromeCollapseBudget) measures against the same
* (use-hide-on-scroll's readChromeCollapseMetrics) measures against the same
* value; tests/mobile-composer-reserve.test.ts pins the pair together.
*/
export const mobileComposerHiddenReserveRem = 0;
Expand Down
Loading
Loading