Skip to content

Commit 28098db

Browse files
aaditagrawaladambuchweitzjuliusmarmingecodexMarve10s
authored
sync: restore upstream ancestry after squash-merge of #99 — MERGE-COMMIT ONLY, DO NOT SQUASH (#100)
* fix: maintain reasoning selections for multiple providers (pingdotgg#2760) * [codex] Bump Effect to beta.73 and migrate compatibility APIs (pingdotgg#2840) Co-authored-by: codex <codex@users.noreply.github.com> * Add Claude Opus 4.8 support (pingdotgg#2849) * Migrate TypeScript checks to Effect TSGo (pingdotgg#2851) * Extract collection performance refactors from mobile stack (pingdotgg#2854) Co-authored-by: codex <codex@users.noreply.github.com> * Extract independent web cleanup from mobile stack (pingdotgg#2855) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com> * Ensure Electron runtime is installed in release workflow (pingdotgg#2861) * T3 Code Mobile [WIP] (pingdotgg#2013) Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Julius Marminge <julius@macmini.local> Co-authored-by: Yash Singh <saiansh2525@gmail.com> * chore: add vendored reference repo subtree sync tooling (pingdotgg#2902) Co-authored-by: codex <codex@users.noreply.github.com> * Use HttpApi for Environment APIs & standardize authn/authz (pingdotgg#2858) Co-authored-by: codex <codex@users.noreply.github.com> * chore: add Alchemy reference repo subtree (pingdotgg#2918) Co-authored-by: codex <codex@users.noreply.github.com> * fix(desktop): Include standard Linux AppImage icons for Niri/Noctalia (pingdotgg#2915) * Probe Cursor models via list_available_models (pingdotgg#2428) Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Julius Marminge <julius@mac.lan> * Migrate workspace to Vite+ and pnpm (pingdotgg#2899) Co-authored-by: Julius Marminge <julius@mac.lan> Co-authored-by: Cursor Agent <cursoragent@cursor.com> * test(web): CI stability - prebundle react-dom client for browser tests (pingdotgg#2928) * fix(ssh): Surface redacted stdout for failed commands (pingdotgg#2920) * fix(desktop): Preserve SSH HTTP auth status (pingdotgg#2923) Co-authored-by: Julius Marminge <jmarminge@gmail.com> * fix: build web before desktop release packaging (pingdotgg#2934) Co-authored-by: Julius Marminge <julius@mac.lan> * ci: let setup-vp install dependencies (pingdotgg#2936) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(release): surface desktop packaging subprocess output (pingdotgg#2937) Co-authored-by: Julius Marminge <julius@mac.lan> * chore: setup eas ci (pingdotgg#2911) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(release): use workspace electron-builder for desktop packaging (pingdotgg#2938) Co-authored-by: Julius Marminge <julius@mac.lan> * [codex] remove duplicated pnpm root config (pingdotgg#2939) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(release): install dependency closures in partial jobs (pingdotgg#2941) Co-authored-by: Julius Marminge <julius@mac.lan> * [codex] split ci workflow jobs (pingdotgg#2940) Co-authored-by: Julius Marminge <julius@mac.lan> * [codex] fix mobile native static analysis source discovery (pingdotgg#2942) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(release): preserve desktop artifact arch (pingdotgg#2943) Co-authored-by: Julius Marminge <julius@mac.lan> * [codex] Fix desktop packaging patched dependencies (pingdotgg#2944) Co-authored-by: codex <codex@users.noreply.github.com> * [codex] Filter staged desktop patched dependencies (pingdotgg#2945) Co-authored-by: codex <codex@users.noreply.github.com> * fix(release): install hosted web workspace closure (pingdotgg#2949) * fix(cli): bundle patched diff parser dependency (pingdotgg#2957) Co-authored-by: Julius Marminge <julius@mac.lan> * Prevent settings layout shifts with scrollbar gutters (pingdotgg#2960) * [codex] fix release finalize install (pingdotgg#2961) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(source-control): handle self-hosted GitLab, multi-account GitHub auth & azure devops web url (pingdotgg#2480) Co-authored-by: Julius Marminge <julius@mac.lan> * [codex] Avoid shell for Node executable spawns (pingdotgg#2952) Co-authored-by: Julius Marminge <julius@mac.lan> * [codex] Avoid shell for Windows environment probe (pingdotgg#2951) Co-authored-by: Julius Marminge <julius@mac.lan> * fix(composer): support spaces in file mentions (pingdotgg#2625) * [codex] Avoid shell for system executables (pingdotgg#2950) Co-authored-by: Julius Marminge <julius@mac.lan> * feat(relay): Add managed relay tunnels and APN service (pingdotgg#2837) Co-authored-by: codex <codex@users.noreply.github.com> * Restructure documentation into topical folders (pingdotgg#2963) * move * dont fail if env-file is unspecified * fallback to None when RELAY_DOMAIN is unset * implicit install from vp * forward args directly * bump alchemy to fix absolute drizzle schema out * bump alchemy to fix drizzle schema out attempt 2 * Migrate tests to vite-plus test APIs (pingdotgg#2964) * remove `vp staged` * publish deploy status on relay deploy workflow * Use pnpm for server publish workflow (pingdotgg#2966) * Rename function for publishing arguments to vp pm (pingdotgg#2967) * Remove duplicate 'publish' argument in CLI script * Refactor recoverable Effect fallbacks to orElseSucceed (pingdotgg#2968) * document vp instead of mise * link * cleanup * tip * we support cursor, duhhh * include @latest * fix(cloud): use Electron fetch for proxying Clerk IPC requests (pingdotgg#2973) * fix: handle Claude Agent SDK 0.3.x system messages to stop runtime-warning flood (pingdotgg#2872) Co-authored-by: Julius Marminge <julius0216@outlook.com> * "claude system message" instead of "runtime warning" when using 4.8 from claude code (pingdotgg#2972) * fix(desktop): stop looping macOS TCC permission prompts (pingdotgg#2745) Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Julius Marminge <jmarminge@gmail.com> * Annotate relay error spans with schema fields (pingdotgg#2976) * [codex] Enrich relay authorization diagnostics (pingdotgg#2977) Co-authored-by: codex <codex@users.noreply.github.com> * [codex] Extract infrastructure, telemetry, and test tooling (pingdotgg#2994) Co-authored-by: codex <codex@users.noreply.github.com> * feat(grok): add Grok CLI provider via ACP (pingdotgg#2809) Co-authored-by: Julius Marminge <julius0216@outlook.com> * [codex] Fix main CI Effect test runtimes (pingdotgg#3008) Co-authored-by: codex <codex@users.noreply.github.com> * Add Claude Fable 5 model (pingdotgg#3009) Co-authored-by: codex <codex@users.noreply.github.com> * chore(release): prepare v0.0.26 * [codex] Rebrand T3 Cloud as T3 Connect (pingdotgg#3011) Co-authored-by: codex <codex@users.noreply.github.com> * Fix Clerk browser test mock (pingdotgg#3013) Co-authored-by: codex <codex@users.noreply.github.com> * chore(release): prepare v0.0.27 * Bundle DM Sans and JetBrains Mono fonts instead of Google Fonts (pingdotgg#3014) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * Mute icons in labeled controls and suppress popup focus rings (pingdotgg#3015) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * Polish dialog/alert surfaces and unauthenticated provider banner (pingdotgg#3016) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * fix(marketing) : marketing showing wrong icons on linux (pingdotgg#2696) Co-authored-by: Julius Marminge <julius0216@outlook.com> * Misc markdown styling improvements (pingdotgg#3017) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com> * Model picker UI Improvements, Virtualize Model List (pingdotgg#3021) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * Provider env vars table and reworked accent color picker (pingdotgg#3026) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * Polish branch picker trigger, scroll fade, and list layout (pingdotgg#3024) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> * Polish web context menu fallback and sidebar icon actions (pingdotgg#3025) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> * Composer polish: focus ring, send/stop buttons, command menu, context meter, answer panel (pingdotgg#3018) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: codex <codex@users.noreply.github.com> * Extract changed files card with compact aligned diff stats (pingdotgg#3023) Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: codex <codex@users.noreply.github.com> * ci: fix vp test invocation (-r and --filter are mutually exclusive) --------- Co-authored-by: Adam Buchweitz <312235+adambuchweitz@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: codex <codex@users.noreply.github.com> Co-authored-by: Ibrahim Elkamali <126423069+Marve10s@users.noreply.github.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Julius Marminge <julius@macmini.local> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Mike Olson <mwolson@member.fsf.org> Co-authored-by: Julius Marminge <julius@mac.lan> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Julius Marminge <jmarminge@gmail.com> Co-authored-by: Guilherme Vieira <46866023+GuilhermeVieiraDev@users.noreply.github.com> Co-authored-by: Abdul Azeez <abdulazeez44@gmail.com> Co-authored-by: Peter Hozák <peter.hozak@gmail.com> Co-authored-by: Ishan <ishansachu1@gmail.com> Co-authored-by: Milosz Jankiewicz <25470423+Jaaneek@users.noreply.github.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: ss <ss@barekey.dev> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Ruzbyte <104939854+ruzbyte@users.noreply.github.com> Co-authored-by: cursor[bot] <206951365+cursor[bot]@users.noreply.github.com> Co-authored-by: aaditagrawal <tech@aaditagrawal.com>
1 parent d20402c commit 28098db

38 files changed

Lines changed: 2189 additions & 915 deletions

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ jobs:
8787
run: vp run --filter @t3tools/desktop ensure:electron
8888

8989
- name: Test
90-
run: vp run -r --filter '!@t3tools/desktop' test
90+
run: vp run --filter './apps/*' --filter './packages/*' --filter '!@t3tools/desktop' test
9191

9292
# Non-blocking: Electron's binary cannot currently be installed reliably
9393
# on GitHub-hosted runners (see the best-effort step above), so these

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ jobs:
154154
run: vp run typecheck
155155

156156
- name: Test
157-
run: vp run -r --filter '!@t3tools/desktop' test
157+
run: vp run --filter './apps/*' --filter './packages/*' --filter '!@t3tools/desktop' test
158158

159159
build:
160160
name: Build ${{ matrix.label }}

apps/desktop/src/electron/ElectronMenu.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ function normalizeContextMenuItems(source: readonly ContextMenuItem[]): ContextM
4444
continue;
4545
}
4646

47+
// Header items are decorative section labels for the web fallback only —
48+
// Electron's native menu has no equivalent affordance, so we skip them.
49+
if (sourceItem.header === true) {
50+
continue;
51+
}
52+
4753
const normalizedItem: ContextMenuItem = {
4854
id: sourceItem.id,
4955
label: sourceItem.label,

apps/web/components.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"hooks": "~/hooks"
2323
},
2424
"registries": {
25-
"@coss": "https://coss.com/ui/r/{name}.json"
25+
"@coss": "https://coss.com/ui/r/{name}.json",
26+
"@spell": "https://spell.sh/r/{name}.json"
2627
}
2728
}

apps/web/src/components/BranchToolbarBranchSelector.tsx

Lines changed: 105 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { scopeProjectRef, scopeThreadRef } from "@t3tools/client-runtime";
22
import type { EnvironmentId, VcsRef, ThreadId } from "@t3tools/contracts";
33
import { LegendList, type LegendListRef } from "@legendapp/list/react";
4-
import { ChevronDownIcon } from "lucide-react";
4+
import { ChevronDownIcon, GitBranchIcon, SearchIcon } from "lucide-react";
55
import {
66
useCallback,
77
useDeferredValue,
88
useEffect,
9+
useLayoutEffect,
910
useMemo,
1011
useOptimistic,
1112
useRef,
@@ -37,7 +38,6 @@ import {
3738
ComboboxEmpty,
3839
ComboboxInput,
3940
ComboboxItem,
40-
ComboboxList,
4141
ComboboxListVirtualized,
4242
ComboboxPopup,
4343
ComboboxStatus,
@@ -281,7 +281,6 @@ export function BranchToolbarBranchSelector({
281281
(_currentBranch: string | null, optimisticBranch: string | null) => optimisticBranch,
282282
);
283283
const [isBranchActionPending, startBranchActionTransition] = useTransition();
284-
const shouldVirtualizeBranchList = filteredBranchPickerItems.length > 40;
285284
const totalBranchCount = branchRefState.data?.totalCount ?? 0;
286285
const branchStatusText = isInitialBranchesLoadPending
287286
? "Loading refs..."
@@ -421,7 +420,9 @@ export function BranchToolbarBranchSelector({
421420
[branchRefTarget],
422421
);
423422

424-
const branchListScrollElementRef = useRef<HTMLDivElement | null>(null);
423+
const branchListScrollElementRef = useRef<HTMLElement | null>(null);
424+
const [showTopBranchScrollFade, setShowTopBranchScrollFade] = useState(false);
425+
const [showBottomBranchScrollFade, setShowBottomBranchScrollFade] = useState(false);
425426
const fetchNextBranchPage = useCallback(() => {
426427
if (!hasNextPage || isFetchingNextPage) {
427428
return;
@@ -451,44 +452,61 @@ export function BranchToolbarBranchSelector({
451452

452453
fetchNextBranchPage();
453454
}, [fetchNextBranchPage, hasNextPage, isBranchMenuOpen, isFetchingNextPage]);
455+
454456
const branchListRef = useRef<LegendListRef | null>(null);
455-
const setBranchListRef = useCallback((element: HTMLDivElement | null) => {
456-
branchListScrollElementRef.current = (element?.parentElement as HTMLDivElement | null) ?? null;
457+
const updateBranchListScrollFades = useCallback(() => {
458+
const scrollElement = branchListRef.current?.getScrollableNode?.();
459+
if (!(scrollElement instanceof HTMLElement)) {
460+
return;
461+
}
462+
branchListScrollElementRef.current = scrollElement;
463+
const maxScrollOffset = Math.max(0, scrollElement.scrollHeight - scrollElement.clientHeight);
464+
setShowTopBranchScrollFade(scrollElement.scrollTop > 1);
465+
setShowBottomBranchScrollFade(maxScrollOffset - scrollElement.scrollTop > 1);
457466
}, []);
458467

459468
useEffect(() => {
460-
if (!isBranchMenuOpen) {
469+
if (isBranchMenuOpen) {
461470
return;
462471
}
472+
setShowTopBranchScrollFade(false);
473+
setShowBottomBranchScrollFade(false);
474+
}, [isBranchMenuOpen]);
463475

464-
if (shouldVirtualizeBranchList) {
465-
branchListRef.current?.scrollToOffset?.({ offset: 0, animated: false });
466-
} else {
467-
branchListScrollElementRef.current?.scrollTo({ top: 0 });
476+
useLayoutEffect(() => {
477+
if (!isBranchMenuOpen) {
478+
return;
468479
}
469-
}, [deferredTrimmedBranchQuery, isBranchMenuOpen, shouldVirtualizeBranchList]);
480+
481+
setShowTopBranchScrollFade(false);
482+
setShowBottomBranchScrollFade(filteredBranchPickerItems.length > 8);
483+
let nestedFrame = 0;
484+
const frame = requestAnimationFrame(() => {
485+
updateBranchListScrollFades();
486+
nestedFrame = requestAnimationFrame(updateBranchListScrollFades);
487+
});
488+
return () => {
489+
cancelAnimationFrame(frame);
490+
cancelAnimationFrame(nestedFrame);
491+
};
492+
}, [
493+
deferredTrimmedBranchQuery,
494+
filteredBranchPickerItems.length,
495+
isBranchMenuOpen,
496+
updateBranchListScrollFades,
497+
]);
470498

471499
useEffect(() => {
472-
const scrollElement = branchListScrollElementRef.current;
473-
if (!scrollElement || !isBranchMenuOpen) {
500+
if (!isBranchMenuOpen) {
474501
return;
475502
}
476503

477-
const handleScroll = () => {
478-
maybeFetchNextBranchPage();
479-
};
480-
481-
scrollElement.addEventListener("scroll", handleScroll, { passive: true });
482-
handleScroll();
483-
return () => {
484-
scrollElement.removeEventListener("scroll", handleScroll);
485-
};
486-
}, [isBranchMenuOpen, maybeFetchNextBranchPage]);
504+
branchListRef.current?.scrollToOffset?.({ offset: 0, animated: false });
505+
}, [deferredTrimmedBranchQuery, isBranchMenuOpen]);
487506

488507
useEffect(() => {
489-
if (shouldVirtualizeBranchList) return;
490508
maybeFetchNextBranchPage();
491-
}, [refs.length, maybeFetchNextBranchPage, shouldVirtualizeBranchList]);
509+
}, [refs.length, maybeFetchNextBranchPage]);
492510

493511
const triggerLabel = getBranchTriggerLabel({
494512
activeWorktreePath,
@@ -504,6 +522,7 @@ export function BranchToolbarBranchSelector({
504522
key={itemValue}
505523
index={index}
506524
value={itemValue}
525+
className="pe-2"
507526
onClick={() => {
508527
if (!prReference || !onCheckoutPullRequestRequest) {
509528
return;
@@ -533,6 +552,7 @@ export function BranchToolbarBranchSelector({
533552
key={itemValue}
534553
index={index}
535554
value={itemValue}
555+
className="pe-1.5"
536556
onClick={() => createRef(trimmedBranchQuery)}
537557
>
538558
<span className="truncate">Create new ref &quot;{trimmedBranchQuery}&quot;</span>
@@ -560,10 +580,11 @@ export function BranchToolbarBranchSelector({
560580
key={itemValue}
561581
index={index}
562582
value={itemValue}
583+
className="pe-1.5"
563584
onClick={() => selectBranch(refName)}
564585
>
565-
<div className="flex w-full items-center justify-between gap-2">
566-
<span className="truncate">{itemValue}</span>
586+
<div className="flex w-full min-w-0 items-center justify-between gap-2">
587+
<span className="min-w-0 flex-1 truncate">{itemValue}</span>
567588
{badge && <span className="shrink-0 text-[10px] text-muted-foreground/45">{badge}</span>}
568589
</div>
569590
</ComboboxItem>
@@ -575,7 +596,7 @@ export function BranchToolbarBranchSelector({
575596
items={branchPickerItems}
576597
filteredItems={filteredBranchPickerItems}
577598
autoHighlight
578-
virtualized={shouldVirtualizeBranchList}
599+
virtualized
579600
onItemHighlighted={(_value, eventDetails) => {
580601
if (!isBranchMenuOpen || eventDetails.index < 0 || eventDetails.reason !== "keyboard") {
581602
return;
@@ -594,48 +615,64 @@ export function BranchToolbarBranchSelector({
594615
className={cn("min-w-0 text-muted-foreground/70 hover:text-foreground/80", className)}
595616
disabled={isInitialBranchesLoadPending || isBranchActionPending}
596617
>
618+
<GitBranchIcon className="size-3 shrink-0 opacity-70" />
597619
<span className="min-w-0 max-w-[240px] truncate">{triggerLabel}</span>
598-
<ChevronDownIcon className="shrink-0" />
620+
<ChevronDownIcon className="size-3 shrink-0 opacity-50" />
599621
</ComboboxTrigger>
600-
<ComboboxPopup align="end" side="top" className="w-80">
601-
<div className="border-b p-1">
602-
<ComboboxInput
603-
className="[&_input]:font-sans rounded-md"
604-
inputClassName="ring-0"
605-
placeholder="Search refs..."
606-
showTrigger={false}
607-
size="sm"
608-
value={branchQuery}
609-
onChange={(event) => setBranchQuery(event.target.value)}
610-
/>
611-
</div>
612-
<ComboboxEmpty>No refs found.</ComboboxEmpty>
613-
614-
{shouldVirtualizeBranchList ? (
615-
<ComboboxListVirtualized>
616-
<LegendList<string>
617-
ref={branchListRef}
618-
data={filteredBranchPickerItems}
619-
keyExtractor={(item) => item}
620-
renderItem={({ item, index }) => renderPickerItem(item, index)}
621-
estimatedItemSize={28}
622-
drawDistance={336}
623-
onEndReached={() => {
624-
if (hasNextPage && !isFetchingNextPage) {
625-
fetchNextBranchPage();
626-
}
627-
}}
628-
style={{ maxHeight: "14rem" }}
622+
<ComboboxPopup align="end" side="top" className="flex w-80 flex-col">
623+
<div className="shrink-0 px-3 pt-2.5">
624+
<div className="relative -translate-y-px border-b border-border/70 pb-1.5 transition-colors focus-within:border-ring">
625+
<SearchIcon
626+
aria-hidden="true"
627+
className="pointer-events-none absolute top-1.5 left-0 size-4 shrink-0 text-muted-foreground/55"
629628
/>
630-
</ComboboxListVirtualized>
631-
) : (
632-
<ComboboxList ref={setBranchListRef} className="max-h-56">
633-
{filteredBranchPickerItems.map((itemValue, index) =>
634-
renderPickerItem(itemValue, index),
635-
)}
636-
</ComboboxList>
637-
)}
638-
{branchStatusText ? <ComboboxStatus>{branchStatusText}</ComboboxStatus> : null}
629+
<ComboboxInput
630+
className="[&_input]:h-6.5 [&_input]:ps-5 [&_input]:font-sans [&_input]:leading-6.5"
631+
inputClassName="rounded-none bg-transparent text-sm"
632+
placeholder="Search refs..."
633+
showTrigger={false}
634+
size="sm"
635+
unstyled
636+
value={branchQuery}
637+
onChange={(event) => setBranchQuery(event.target.value)}
638+
/>
639+
</div>
640+
</div>
641+
<div className="flex min-h-0 flex-1 flex-col overflow-hidden">
642+
<ComboboxEmpty>No refs found.</ComboboxEmpty>
643+
<div className="relative min-h-0 w-full max-h-56 flex-1 overflow-hidden">
644+
<ComboboxListVirtualized className="size-full min-w-0 p-0">
645+
<LegendList<string>
646+
ref={branchListRef}
647+
data={filteredBranchPickerItems}
648+
keyExtractor={(item) => item}
649+
renderItem={({ item, index }) => renderPickerItem(item, index)}
650+
estimatedItemSize={28}
651+
drawDistance={336}
652+
onEndReached={() => {
653+
if (hasNextPage && !isFetchingNextPage) {
654+
fetchNextBranchPage();
655+
}
656+
}}
657+
onLayout={() => {
658+
updateBranchListScrollFades();
659+
maybeFetchNextBranchPage();
660+
}}
661+
onScroll={() => {
662+
updateBranchListScrollFades();
663+
maybeFetchNextBranchPage();
664+
}}
665+
className={cn(
666+
"scrollbar-gutter-stable overflow-x-hidden overscroll-y-contain ps-1 pe-0 pt-2 pb-1 [--fade-size:1.5rem]",
667+
showTopBranchScrollFade && "mask-t-from-[calc(100%-var(--fade-size))]",
668+
showBottomBranchScrollFade && "mask-b-from-[calc(100%-var(--fade-size))]",
669+
)}
670+
style={{ maxHeight: "14rem" }}
671+
/>
672+
</ComboboxListVirtualized>
673+
</div>
674+
{branchStatusText ? <ComboboxStatus>{branchStatusText}</ComboboxStatus> : null}
675+
</div>
639676
</ComboboxPopup>
640677
</Combobox>
641678
);

0 commit comments

Comments
 (0)