authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-04-09 17:40:27-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-04-10 00:40:27+00:00
log66d76b5d02308dc7a8e3ff218bb0301bc20c0c2a
treef777a023fb1ef95e2a0131e5a39216c475b49225
parent528bb2a1fa318962437281e68723bf0bb5a589d7
signature Signed by PGP key B5690EEEBB952194

Fix composer footer focus ring overflow (#1865)

Co-authored-by: Julius Marminge <julius@macmini.local> Co-authored-by: codex <codex@users.noreply.github.com>

2 files changed, 17 insertions(+), 16 deletions(-)

apps/web/src/components/chat/ChatComposer.tsx+2-1
...@@ -199,6 +199,7 @@ const ComposerFooterModeControls = memo(function ComposerFooterModeControls(prop...@@ -199,6 +199,7 @@ const ComposerFooterModeControls = memo(function ComposerFooterModeControls(prop
199 <SelectTrigger199 <SelectTrigger
200 variant="ghost"200 variant="ghost"
201 size="sm"201 size="sm"
202 className="font-medium"
202 aria-label="Runtime mode"203 aria-label="Runtime mode"
203 title={runtimeModeOption.description}204 title={runtimeModeOption.description}
204 >205 >
...@@ -1798,7 +1799,7 @@ export const ChatComposer = memo(...@@ -1798,7 +1799,7 @@ export const ChatComposer = memo(
1798 data-chat-composer-footer="true"1799 data-chat-composer-footer="true"
1799 data-chat-composer-footer-compact={isComposerFooterCompact ? "true" : "false"}1800 data-chat-composer-footer-compact={isComposerFooterCompact ? "true" : "false"}
1800 className={cn(1801 className={cn(
1801 "flex min-w-0 flex-nowrap items-center justify-between gap-2 overflow-hidden px-2.5 pb-2.5 sm:px-3 sm:pb-3",1802 "flex min-w-0 flex-nowrap items-center justify-between gap-2 overflow-visible px-2.5 pb-2.5 sm:px-3 sm:pb-3",
1802 isComposerFooterCompact ? "gap-1.5" : "gap-2 sm:gap-0",1803 isComposerFooterCompact ? "gap-1.5" : "gap-2 sm:gap-0",
1803 )}1804 )}
1804 >1805 >
apps/web/src/components/settings/SettingsPanels.browser.tsx+15-15
...@@ -361,8 +361,8 @@ describe("GeneralSettingsPanel observability", () => {...@@ -361,8 +361,8 @@ describe("GeneralSettingsPanel observability", () => {
361 browser: "Chrome",361 browser: "Chrome",
362 ipAddress: "127.0.0.1",362 ipAddress: "127.0.0.1",
363 },363 },
364 issuedAt: "2026-04-07T00:00:00.000Z",364 issuedAt: "2036-04-07T00:00:00.000Z",
365 expiresAt: "2026-05-07T00:00:00.000Z",365 expiresAt: "2036-05-07T00:00:00.000Z",
366 connected: true,366 connected: true,
367 current: true,367 current: true,
368 }),368 }),
...@@ -377,7 +377,7 @@ describe("GeneralSettingsPanel observability", () => {...@@ -377,7 +377,7 @@ describe("GeneralSettingsPanel observability", () => {
377 auth: createBaseServerConfig().auth,377 auth: createBaseServerConfig().auth,
378 role: "owner",378 role: "owner",
379 sessionMethod: "browser-session-cookie",379 sessionMethod: "browser-session-cookie",
380 expiresAt: "2026-05-07T00:00:00.000Z",380 expiresAt: "2036-05-07T00:00:00.000Z",
381 }),381 }),
382 {382 {
383 status: 200,383 status: 200,
...@@ -458,8 +458,8 @@ describe("GeneralSettingsPanel observability", () => {...@@ -458,8 +458,8 @@ describe("GeneralSettingsPanel observability", () => {
458 browser: "Electron",458 browser: "Electron",
459 ipAddress: "127.0.0.1",459 ipAddress: "127.0.0.1",
460 },460 },
461 issuedAt: "2026-04-07T00:00:00.000Z",461 issuedAt: "2036-04-07T00:00:00.000Z",
462 expiresAt: "2026-05-07T00:00:00.000Z",462 expiresAt: "2036-05-07T00:00:00.000Z",
463 connected: true,463 connected: true,
464 current: true,464 current: true,
465 }),465 }),
...@@ -481,8 +481,8 @@ describe("GeneralSettingsPanel observability", () => {...@@ -481,8 +481,8 @@ describe("GeneralSettingsPanel observability", () => {
481 role: "client",481 role: "client",
482 subject: "one-time-token",482 subject: "one-time-token",
483 label: "Julius iPhone",483 label: "Julius iPhone",
484 createdAt: "2026-04-07T00:00:00.000Z",484 createdAt: "2036-04-07T00:00:00.000Z",
485 expiresAt: "2026-04-10T00:05:00.000Z",485 expiresAt: "2036-04-10T00:05:00.000Z",
486 }),486 }),
487 ];487 ];
488 clientSessions = [488 clientSessions = [
...@@ -499,8 +499,8 @@ describe("GeneralSettingsPanel observability", () => {...@@ -499,8 +499,8 @@ describe("GeneralSettingsPanel observability", () => {
499 browser: "Safari",499 browser: "Safari",
500 ipAddress: "192.168.1.88",500 ipAddress: "192.168.1.88",
501 },501 },
502 issuedAt: "2026-04-07T00:01:00.000Z",502 issuedAt: "2036-04-07T00:01:00.000Z",
503 expiresAt: "2026-05-07T00:01:00.000Z",503 expiresAt: "2036-05-07T00:01:00.000Z",
504 connected: false,504 connected: false,
505 current: false,505 current: false,
506 }),506 }),
...@@ -514,7 +514,7 @@ describe("GeneralSettingsPanel observability", () => {...@@ -514,7 +514,7 @@ describe("GeneralSettingsPanel observability", () => {
514 id: "pairing-link-1",514 id: "pairing-link-1",
515 credential: "pairing-token",515 credential: "pairing-token",
516 label: "Julius iPhone",516 label: "Julius iPhone",
517 expiresAt: "2026-04-10T00:05:00.000Z",517 expiresAt: "2036-04-10T00:05:00.000Z",
518 }),518 }),
519 {519 {
520 status: 200,520 status: 200,
...@@ -547,7 +547,7 @@ describe("GeneralSettingsPanel observability", () => {...@@ -547,7 +547,7 @@ describe("GeneralSettingsPanel observability", () => {
547 .element(page.getByText("Client · Mobile · iOS · Safari · 192.168.1.88"))547 .element(page.getByText("Client · Mobile · iOS · Safari · 192.168.1.88"))
548 .toBeInTheDocument();548 .toBeInTheDocument();
549 await expect549 await expect
550 .element(page.getByRole("button", { name: "Copy", exact: true }))550 .element(page.getByRole("button", { name: /^(Copy|Show link)$/ }))
551 .toBeInTheDocument();551 .toBeInTheDocument();
552 await expect.element(page.getByText("Revoke others")).toBeInTheDocument();552 await expect.element(page.getByText("Revoke others")).toBeInTheDocument();
553 });553 });
...@@ -572,8 +572,8 @@ describe("GeneralSettingsPanel observability", () => {...@@ -572,8 +572,8 @@ describe("GeneralSettingsPanel observability", () => {
572 os: "macOS",572 os: "macOS",
573 browser: "Electron",573 browser: "Electron",
574 },574 },
575 issuedAt: "2026-04-05T00:00:00.000Z",575 issuedAt: "2036-04-05T00:00:00.000Z",
576 expiresAt: "2026-05-05T00:00:00.000Z",576 expiresAt: "2036-05-05T00:00:00.000Z",
577 connected: true,577 connected: true,
578 current: true,578 current: true,
579 }),579 }),
...@@ -589,8 +589,8 @@ describe("GeneralSettingsPanel observability", () => {...@@ -589,8 +589,8 @@ describe("GeneralSettingsPanel observability", () => {
589 browser: "Safari",589 browser: "Safari",
590 ipAddress: "192.168.1.88",590 ipAddress: "192.168.1.88",
591 },591 },
592 issuedAt: "2026-04-05T00:01:00.000Z",592 issuedAt: "2036-04-05T00:01:00.000Z",
593 expiresAt: "2026-05-05T00:01:00.000Z",593 expiresAt: "2036-05-05T00:01:00.000Z",
594 connected: false,594 connected: false,
595 current: false,595 current: false,
596 }),596 }),