Skip to content

Commit c32fdb2

Browse files
authored
Merge pull request #134 from Waishnav/codex/workspace-card-ui
fix(ui): simplify workspace context cards
2 parents 7ef6b92 + b477db6 commit c32fdb2

11 files changed

Lines changed: 246 additions & 314 deletions

File tree

Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading

src/ui/card-types.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ test("a workspace card expands when it contains provider metadata", () => {
7878
);
7979
});
8080

81+
test("a workspace card with details opens immediately", () => {
82+
assert.equal(
83+
isInitiallyExpandedCard({
84+
tool: "open_workspace",
85+
skills: [{ name: "research" }],
86+
}),
87+
true,
88+
);
89+
});
90+
8191
test("a workspace card expands when it contains agent metadata", () => {
8292
assert.equal(
8393
isExpandableCard({

src/ui/card-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ export function isExpandableCard(card: ToolResultCard): boolean {
187187
}
188188

189189
export function isInitiallyExpandedCard(card: ToolResultCard): boolean {
190+
if (card.tool === "open_workspace") return isExpandableCard(card);
190191
if (isReviewTool(card.tool)) return isExpandableCard(card);
191192
if (isPatchTool(card.tool)) {
192193
return card.files?.length === 1 && isExpandableCard(card);

src/ui/icons.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
2-
Blocks,
32
Bot,
3+
Blocks,
44
ChevronDown,
55
CircleAlert,
66
Cpu,
@@ -52,6 +52,20 @@ export const toolIcons = {
5252

5353
export type ToolIcon = IconNode;
5454

55+
const providerLogos = {
56+
claude: new URL("./assets/provider-logos/claude.svg", import.meta.url).href,
57+
codex: new URL("./assets/provider-logos/openai-dark.svg", import.meta.url).href,
58+
copilot: new URL("./assets/provider-logos/copilot-dark.svg", import.meta.url).href,
59+
cursor: new URL("./assets/provider-logos/cursor-dark.svg", import.meta.url).href,
60+
opencode: new URL("./assets/provider-logos/opencode-dark.svg", import.meta.url).href,
61+
pi: new URL("./assets/provider-logos/pi-on-dark.svg", import.meta.url).href,
62+
} as const;
63+
64+
export function getProviderLogo(name: string): string | undefined {
65+
const normalizedName = name.trim().toLowerCase() as keyof typeof providerLogos;
66+
return providerLogos[normalizedName];
67+
}
68+
5569
export function renderIcon(icon: ToolIcon, className = "icon-svg"): SVGElement {
5670
return createElement(icon, {
5771
class: className,

src/ui/workspace-app.css

Lines changed: 99 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,9 @@ body {
313313
}
314314

315315
.workspace-key {
316+
display: flex;
317+
min-height: 22px;
318+
align-items: center;
316319
color: var(--color-text-tertiary, #a3a3aa);
317320
font-size: var(--font-text-sm-size, 12px);
318321
font-weight: 500;
@@ -374,6 +377,7 @@ body {
374377
max-width: 100%;
375378
min-height: 24px;
376379
align-items: center;
380+
gap: 5px;
377381
overflow: hidden;
378382
padding: 3px 8px;
379383
border: 1px solid color-mix(in srgb, var(--tool-accent) 16%, var(--tool-card-divider));
@@ -386,127 +390,98 @@ body {
386390
white-space: nowrap;
387391
}
388392

389-
.workspace-chip.muted {
390-
border-style: dashed;
391-
color: var(--color-text-tertiary, #a3a3aa);
392-
opacity: 0.72;
393-
}
394-
395-
.workspace-row-disclosure {
396-
align-items: start;
393+
.workspace-chip-logo {
394+
display: block;
395+
width: 13px;
396+
height: 13px;
397+
flex: 0 0 auto;
398+
object-fit: contain;
397399
}
398400

399-
.workspace-disclosure {
400-
display: grid;
401+
.workspace-chip-label {
401402
min-width: 0;
402-
grid-template-columns: minmax(0, 1fr) auto;
403-
gap: 8px;
404-
align-items: start;
405-
}
406-
407-
.workspace-skills-list {
408-
max-height: 24px;
409-
}
410-
411-
.workspace-disclosure.expanded {
412-
grid-template-columns: minmax(0, 1fr);
413-
}
414-
415-
.workspace-skills-disclosure.expanded .workspace-skills-list {
416-
max-height: none;
417-
flex-wrap: wrap;
418-
overflow: visible;
403+
overflow: hidden;
404+
text-overflow: ellipsis;
405+
white-space: nowrap;
419406
}
420407

421-
.workspace-disclosure-toggle {
408+
.workspace-agent-profile {
409+
display: inline-flex;
410+
max-width: 100%;
422411
min-height: 24px;
423-
padding: 3px 9px;
424-
border: 1px solid color-mix(in srgb, var(--tool-accent) 28%, var(--tool-card-divider));
425-
border-radius: 9999px;
412+
align-items: center;
413+
gap: 5px;
414+
overflow: hidden;
415+
padding: 3px 2px 4px;
416+
border: 0;
417+
border-bottom: 1px solid color-mix(in srgb, var(--tool-accent) 34%, var(--tool-card-divider));
418+
border-radius: 0;
426419
background: transparent;
427-
color: var(--tool-accent);
428-
cursor: pointer;
429-
font: inherit;
430-
font-size: var(--font-text-sm-size, 11px);
420+
color: var(--color-text-secondary, #c7c7ce);
421+
font-size: 11px;
431422
line-height: 1.25;
432423
white-space: nowrap;
433424
}
434425

435-
.workspace-disclosure-toggle:hover {
436-
background: color-mix(in srgb, var(--tool-accent) 10%, transparent);
437-
}
438-
439-
.workspace-disclosure-toggle:focus-visible {
440-
outline: 2px solid color-mix(in srgb, var(--tool-accent) 72%, transparent);
441-
outline-offset: 2px;
426+
.workspace-agent-profile-logo {
427+
display: block;
428+
width: 14px;
429+
height: 14px;
430+
flex: 0 0 auto;
431+
object-fit: contain;
442432
}
443433

444-
.workspace-disclosure.expanded .workspace-disclosure-toggle {
445-
justify-self: start;
434+
.workspace-agent-profile:hover {
435+
border-bottom-color: var(--tool-accent);
436+
color: var(--color-text-primary, #f5f5f6);
446437
}
447438

448-
.workspace-value-list {
449-
display: grid;
450-
min-width: 0;
451-
max-height: calc(1.45em);
452-
overflow: hidden;
453-
color: var(--color-text-secondary, #c7c7ce);
454-
font-size: var(--font-text-sm-size, 12px);
455-
line-height: 1.45;
439+
.workspace-agent-profile.muted {
440+
border-bottom-style: dashed;
441+
color: var(--color-text-tertiary, #a3a3aa);
442+
opacity: 0.72;
456443
}
457444

458-
.workspace-value-list.mono {
459-
font-family: var(--font-mono, ui-monospace, SFMono-Regular, monospace);
445+
.workspace-provider-logo {
446+
display: inline-grid;
447+
width: 20px;
448+
height: 24px;
449+
flex: 0 0 auto;
450+
place-items: center;
451+
cursor: help;
460452
}
461453

462-
.workspace-value-item {
463-
min-width: 0;
464-
overflow: hidden;
465-
text-overflow: ellipsis;
466-
white-space: nowrap;
454+
.workspace-provider-logo-image {
455+
display: block;
456+
width: 16px;
457+
height: 16px;
458+
object-fit: contain;
467459
}
468460

469-
.workspace-disclosure.expanded .workspace-value-list {
470-
max-height: none;
471-
gap: 5px;
472-
overflow: visible;
461+
.workspace-provider-logo.muted {
462+
opacity: 0.62;
473463
}
474464

475-
.workspace-instruction-summary {
476-
display: flex;
477-
min-width: 0;
478-
height: 24px;
479-
align-items: center;
480-
gap: 6px;
481-
overflow: hidden;
465+
.workspace-chip.muted {
466+
border-style: dashed;
467+
color: var(--color-text-tertiary, #a3a3aa);
468+
opacity: 0.72;
482469
}
483470

484-
.workspace-instruction-summary-item {
485-
display: inline-flex;
486-
min-width: 0;
487-
flex: 0 1 auto;
488-
align-items: center;
489-
gap: 5px;
490-
overflow: hidden;
491-
padding: 2px 7px 2px 5px;
492-
border: 1px solid color-mix(in srgb, var(--tool-accent) 14%, var(--tool-card-divider));
493-
border-radius: 9999px;
494-
background: color-mix(in srgb, var(--tool-accent) 6%, transparent);
495-
color: var(--color-text-secondary, #c7c7ce);
496-
font-size: var(--font-text-sm-size, 11px);
497-
line-height: 1.25;
471+
.workspace-skills-row,
472+
.workspace-instructions-row,
473+
.workspace-agents-row {
474+
align-items: start;
498475
}
499476

500-
.workspace-instruction-summary-item.available {
501-
border-style: dashed;
502-
color: var(--color-text-tertiary, #a3a3aa);
477+
.workspace-skills-list {
478+
flex-wrap: wrap;
479+
overflow: visible;
503480
}
504481

505-
.workspace-instruction-summary-name {
506-
min-width: 0;
507-
overflow: hidden;
508-
text-overflow: ellipsis;
509-
white-space: nowrap;
482+
.workspace-agents-list {
483+
flex-wrap: wrap;
484+
overflow: visible;
510485
}
511486

512487
.workspace-instruction-status {
@@ -535,20 +510,46 @@ body {
535510
}
536511

537512
.workspace-instruction-list {
538-
display: none;
513+
display: grid;
539514
min-width: 0;
540515
overflow: hidden;
541516
border: 1px solid var(--tool-card-divider);
542517
border-radius: 9px;
543518
background: color-mix(in srgb, var(--tool-card-body-bg) 88%, transparent);
544519
}
545520

546-
.workspace-instructions-disclosure.expanded .workspace-instruction-summary {
547-
display: none;
521+
.workspace-instructions-content {
522+
display: block;
523+
min-width: 0;
548524
}
549525

550-
.workspace-instructions-disclosure.expanded .workspace-instruction-list {
551-
display: grid;
526+
.workspace-instructions-toggle {
527+
display: flex;
528+
width: 100%;
529+
min-height: 32px;
530+
align-items: center;
531+
justify-content: center;
532+
padding: 6px 10px;
533+
border: 0;
534+
border-top: 1px solid var(--tool-card-divider);
535+
border-radius: 0 0 9px 9px;
536+
background: color-mix(in srgb, var(--tool-card-body-bg) 72%, transparent);
537+
color: var(--tool-accent);
538+
cursor: pointer;
539+
font: inherit;
540+
font-size: var(--font-text-sm-size, 11px);
541+
font-weight: 550;
542+
line-height: 1.25;
543+
white-space: nowrap;
544+
}
545+
546+
.workspace-instructions-toggle:hover {
547+
background: var(--tool-card-hover-bg);
548+
}
549+
550+
.workspace-instructions-toggle:focus-visible {
551+
outline: 2px solid color-mix(in srgb, var(--tool-accent) 72%, transparent);
552+
outline-offset: 2px;
552553
}
553554

554555
.workspace-instruction-item + .workspace-instruction-item {
@@ -906,7 +907,7 @@ body {
906907
.workspace-row > .workspace-key,
907908
.workspace-row > .workspace-value,
908909
.workspace-row > .workspace-chip-list,
909-
.workspace-row > .workspace-disclosure {
910+
.workspace-row > .workspace-instructions-content {
910911
grid-column: 2;
911912
}
912913
}

0 commit comments

Comments
 (0)