-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Design updates: hidden-sidebar chrome, chat-everywhere title bars, panel design pass #4932
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
andresdjasso
wants to merge
90
commits into
main
Choose a base branch
from
design-updates
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
90 commits
Select commit
Hold shift + click to select a range
f2e0844
feat(mothership): home chat UX — grey tray, inline chat open, title b…
andresdjasso 65bac26
feat(emcn/toast): redesign toast — intent variants, Sonner-style stac…
andresdjasso e5aae91
feat(emcn/icons): add MessageCircle icon + icon audit worklist and ga…
andresdjasso a247900
feat(mothership): activity view, chat resource persistence, embedded …
andresdjasso f9b34f4
feat(workspace): hidden-sidebar chrome, chat-everywhere title bars, p…
andresdjasso 79ed4ae
chore(next): pin turbopack root to the monorepo, skip optimizeCss in dev
andresdjasso 6d848b7
fix(resource-header): match the chat title bar chrome rhythm
andresdjasso ae0464c
fix(resource-header): lift chrome controls out of the clipping breadc…
andresdjasso b6ffcc0
fix(chat-switcher): never show another chat's name on the new-chat em…
andresdjasso de8e732
chore(chat-switcher): drop the "Chats /" prefix — icon + title only
andresdjasso 2f6f6ea
fix(mothership): persist failed turns so errors stay visible in the chat
andresdjasso ea6ed75
feat(mothership): workspace-owned tab strip — chats add and highlight…
andresdjasso 23bccb3
fix(resource-tabs): follow the dominant wheel axis so trackpad swipes…
andresdjasso 9dda667
feat(mothership): spotlight tab layout — active resource as title, co…
andresdjasso 8b9fd6f
feat(resource-tabs): width-aware tab overflow — fit what fits, +N onl…
andresdjasso fea96b5
refactor(resource-tabs): one home per tab — title chip drops its drop…
andresdjasso fa017e3
fix(resource-tabs): never truncate inline tabs — fit whole tabs by me…
andresdjasso 830827b
chore(resource-tabs): drop the green update dots and their tracking p…
andresdjasso 3f214c9
fix(chrome): pin the toggle+chat-switcher cluster so it never shifts …
andresdjasso ba98a76
fix(resource-tabs): activate tabs in place — selection never repositi…
andresdjasso d853d95
style(resource-tabs): align the +N dropdown to the workspace dropdown…
andresdjasso ff51b01
feat(chat-switcher): opening a chat keeps the current page as the foc…
andresdjasso 09a4066
style(resource-tabs): overlay the close control on a gradient fade — …
andresdjasso 75760de
fix(mothership): agent-touched resources focus their tab — chat can d…
andresdjasso 5c42aa8
style(mothership-chat): messages fade into the input instead of hard-…
andresdjasso d3b291b
feat(icons): vendor Hugeicons stroke-rounded set, remove lucide-react
andresdjasso b981a06
style(chat-history): scrollbar hugs the dropdown edge with a slim ins…
andresdjasso 1bc72e6
feat(icons): vendor Hugeicons stroke-rounded set, remove lucide-react
andresdjasso c8fba0a
style(chat-history): tighten row right inset toward the scrollbar
andresdjasso 9007ee8
fix(mothership): chat titles generate again — fallback to local provi…
andresdjasso 6bedb57
refactor(resource-actions): retire open-in-page buttons — collapsing …
andresdjasso 14fa20d
style(chat): unify on the bubble-clock icon and rename "All Chats" to…
andresdjasso 4519b6c
Merge origin/main into design-updates — sync 136 upstream commits
andresdjasso 34ba9e7
feat(emcn): ThinkingLoader — the Recents icon spins while the chat ge…
andresdjasso 8bf590c
style(integrations): sidebar toggle in the tabs header — no chat swit…
andresdjasso 1bf9125
style(sidebar): workflow rows lead with the Workflow glyph
andresdjasso 5305670
refactor(panel): retire the workflow editor's Copilot tab
andresdjasso 65ee6ad
feat(workflow): docked chat — chat is the constant, the editor owns t…
andresdjasso db0fd90
feat(workflow): draggable divider between the docked chat and the editor
andresdjasso d3e777b
feat(chat-switcher): split the icon-only chip — icon opens the latest…
andresdjasso e5e8295
style(workflow): canvas title + split-chip hover wash + pinned icon p…
andresdjasso ef31105
style(workflow): top fade between the canvas and the chrome row
andresdjasso 9974073
fix(thinking-loader): phase-lock all instances to a shared wall-clock…
andresdjasso 9f593d1
style(workflow): pin the canvas title to the 30px chrome midline
andresdjasso b1d3536
feat(workflow): stage stack — resources card over the editor, never i…
andresdjasso 062867c
style(chat-switcher): titled chip splits too when the chat pane is cl…
andresdjasso d37d02a
style(workflow): stage stack as detached cards — back card is identit…
andresdjasso 1950049
feat(workflow): stage stack flips both ways — slimmer, page-bg identi…
andresdjasso 3df0261
style(workflow): stacked mode floats everything on the chrome backdrop
andresdjasso 44f7229
style(chrome): drop the content card frame in floating-stage mode
andresdjasso 8f2cf16
fix(workflow): no frame flash or empty stack card during load
andresdjasso f6c5799
fix(chrome): frame-free from the first paint on floating-stage deep l…
andresdjasso b9cedfa
style(workflow): the flip keeps the stack — editor wears card chrome …
andresdjasso 8851047
style(workflow): symmetric stack peeks — resources bar behind the edi…
andresdjasso a6cd70b
style(workflow): peek bars share the card family's 12px radius
andresdjasso a06ebec
style(resize): hover grab pill + tooltip on the pane dividers
andresdjasso ac8a357
style(workflow): stack-mode resize lives in the gap between modules
andresdjasso 449d424
fix(workflow): chrome cluster survives the stack when the chat is closed
andresdjasso cb7dd67
fix(chrome): sidebar flyout drops with the toggle in floating-stage mode
andresdjasso 12d51fc
refactor(mothership): one resource at a time — the panel follows the …
andresdjasso 91e2add
fix(dev): disable Turbopack's persistent dev cache — unbounded disk g…
andresdjasso 7ad64b2
feat(sidebar): chat-aware navigation — an open chat never closes
andresdjasso 2ff8024
fix(panel): one header per staged view — pages absorb the panel chrome
andresdjasso 7cd0218
feat(files): the Files page joins the panel — embedded mode + chat-aw…
andresdjasso f13320d
feat(panel): quick-open empty state — search, recents, and browse
andresdjasso 540f5c0
feat(panel): Sim logotype crowns the quick-open empty state
andresdjasso 811ade0
fix(panel): lighten the empty-state logotype to watermark weight
andresdjasso f26105a
fix(panel): pin panel-mode Resource.Header to the chat bar's exact 44px
andresdjasso 2ff39c5
feat(panel): the split remembers — resize state persists across views
andresdjasso d749cfd
fix(knowledge): document detail stays in the panel — chat never closes
andresdjasso 027859b
feat(workflow): the staged workflow is the full editor — never a preview
andresdjasso ce60818
fix(panel): closing a resource lands on the quick-open empty state
andresdjasso 9351040
fix(panel): the chat can narrow to 280px on every surface
andresdjasso a69f0b6
fix(chat-switcher): one chip design everywhere, tighter chevron
andresdjasso 09e3331
fix(panel): the chat is closable on the empty state too
andresdjasso 6ce9ec8
fix(sidebar): hard 400px ceiling on sidebar width
andresdjasso 03b5328
fix(chrome): one 44px header rhythm everywhere + centered recents icon
andresdjasso c5696ea
fix(workflow): the standalone route joins the 44px header family
andresdjasso bca4aae
fix(chat-switcher): retire the icon-only variant — always show the name
andresdjasso 1a12761
fix(panel): close + collapse are host overlays — present on every view
andresdjasso ae7db65
fix(logs): page header uses the canonical Logs icon
andresdjasso de89599
fix(panel): no ghost border when the chat pane closes
andresdjasso 99db8fa
fix(panel): close glyph matches the chat close at 14px
andresdjasso cfa9f66
fix(panel): add the mothership-panel store missing from the resize co…
andresdjasso c245784
fix(panel): wire up the logotype shimmer keyframe
andresdjasso d0ceb84
feat(loader): gooey thinking loader gets the Figma gradient + inner glow
andresdjasso c1485de
fix(loader): correct theme mapping + per-shape gradient (Figma exact)
andresdjasso 4eadb18
fix(loader): orbit shows both squares again
andresdjasso c13f4f7
revert(icons): undo Hugeicons migration, restore lucide-react + origi…
andresdjasso b2bb47c
fix(home,chat-switcher): align new-chat view + chat-switcher chrome w…
andresdjasso File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -45,4 +45,4 @@ next-env.d.ts | |
| # Uploads | ||
| /uploads | ||
|
|
||
| .trigger | ||
| .trigger.env.local.bak* | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,195 @@ | ||
| 'use client' | ||
|
|
||
| /** | ||
| * TEMPORARY preview harness (delete before merge). Designs the in-chat working | ||
| * indicator: ONE shimmering status line by default, escalating to a per-agent | ||
| * breakout ONLY while ≥2 agents run concurrently, then collapsing back to a | ||
| * single line and the reply. | ||
| */ | ||
| import { useEffect, useState } from 'react' | ||
| import { | ||
| ParallelAgents, | ||
| ShimmerStatus, | ||
| } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/activity-view' | ||
|
|
||
| type Frame = | ||
| | { kind: 'line'; text: string } | ||
| | { kind: 'parallel'; header: string; agents: { label: string; phrase: string }[] } | ||
|
|
||
| interface Scene { | ||
| key: string | ||
| label: string | ||
| prompt: string | ||
| frames: Frame[] | ||
| reply: string | ||
| } | ||
|
|
||
| const line = (text: string): Frame => ({ kind: 'line', text }) | ||
|
|
||
| const SCENES: Scene[] = [ | ||
| { | ||
| key: 'crm', | ||
| label: 'Build CRM', | ||
| prompt: 'build a simple crm page', | ||
| frames: [ | ||
| line('Reviewing UX requirements and data model'), | ||
| line('Exploring CRM page structure and data flow'), | ||
| line('Drafting a clean CRM page layout'), | ||
| line('Wiring up the contacts table'), | ||
| ], | ||
| reply: 'Done — your CRM page is ready. Open it on the right.', | ||
| }, | ||
| { | ||
| key: 'parallel', | ||
| label: 'Parallel agents', | ||
| prompt: 'Polish my profile — refresh my skills and bio', | ||
| frames: [ | ||
| line('Reviewing your profile'), | ||
| { | ||
| kind: 'parallel', | ||
| header: 'Profile scan · 2 agents', | ||
| agents: [ | ||
| { label: 'Skills', phrase: 'Scanning your experience' }, | ||
| { label: 'Biography', phrase: 'Reading your current bio' }, | ||
| ], | ||
| }, | ||
| { | ||
| kind: 'parallel', | ||
| header: 'Profile scan · 2 agents', | ||
| agents: [ | ||
| { label: 'Skills', phrase: 'Determining relevant changes' }, | ||
| { label: 'Biography', phrase: 'Crafting a proposal' }, | ||
| ], | ||
| }, | ||
| { | ||
| kind: 'parallel', | ||
| header: 'Profile scan · 2 agents', | ||
| agents: [ | ||
| { label: 'Skills', phrase: 'Finalizing skill updates' }, | ||
| { label: 'Biography', phrase: 'Polishing the wording' }, | ||
| ], | ||
| }, | ||
| line('Wrapping up'), | ||
| ], | ||
| reply: 'Updated your skills and bio — review the changes on the right.', | ||
| }, | ||
| { | ||
| key: 'edit', | ||
| label: 'Edit dialog', | ||
| prompt: 'Add an edit dialog to update contact details without deleting them', | ||
| frames: [ | ||
| line('Reviewing edit dialog integration plans'), | ||
| line('Adding the edit form'), | ||
| line('Saving changes in place'), | ||
| ], | ||
| reply: 'Added an edit dialog — contacts now update in place.', | ||
| }, | ||
| ] | ||
|
|
||
| const FRAME_MS = 1900 | ||
|
|
||
| export default function ActivityPreviewPage() { | ||
| const [sceneKey, setSceneKey] = useState(SCENES[0].key) | ||
| const [idx, setIdx] = useState(0) | ||
| const [playing, setPlaying] = useState(true) | ||
|
|
||
| const scene = SCENES.find((s) => s.key === sceneKey) ?? SCENES[0] | ||
| const total = scene.frames.length | ||
| const done = idx >= total | ||
| const frame = done ? null : scene.frames[idx] | ||
|
|
||
| useEffect(() => { | ||
| setIdx(0) | ||
| setPlaying(true) | ||
| }, [sceneKey]) | ||
|
|
||
| useEffect(() => { | ||
| if (!playing) return | ||
| if (idx >= total) { | ||
| setPlaying(false) | ||
| return | ||
| } | ||
| const t = setTimeout(() => setIdx((i) => Math.min(i + 1, total)), FRAME_MS) | ||
| return () => clearTimeout(t) | ||
| }, [playing, idx, total]) | ||
|
|
||
| return ( | ||
| <div className='flex h-screen flex-col bg-[var(--bg)] p-[24px]'> | ||
| <div className='mb-[16px] flex flex-wrap items-center gap-[8px]'> | ||
| {SCENES.map((s) => ( | ||
| <button | ||
| key={s.key} | ||
| type='button' | ||
| onClick={() => setSceneKey(s.key)} | ||
| className={`rounded-[6px] px-[10px] py-[5px] text-[13px] ${ | ||
| s.key === sceneKey | ||
| ? 'bg-[var(--surface-6)] text-[var(--text-primary)]' | ||
| : 'bg-[var(--surface-4)] text-[var(--text-secondary)]' | ||
| }`} | ||
| > | ||
| {s.label} | ||
| </button> | ||
| ))} | ||
| <div className='ml-auto flex items-center gap-[6px]'> | ||
| <button | ||
| type='button' | ||
| onClick={() => { | ||
| setPlaying(false) | ||
| setIdx((i) => Math.max(0, i - 1)) | ||
| }} | ||
| className='rounded-[6px] bg-[var(--surface-4)] px-[10px] py-[5px] text-[13px] text-[var(--text-secondary)]' | ||
| > | ||
| ‹ Prev | ||
| </button> | ||
| <button | ||
| type='button' | ||
| onClick={() => { | ||
| if (done) { | ||
| setIdx(0) | ||
| setPlaying(true) | ||
| } else { | ||
| setPlaying((p) => !p) | ||
| } | ||
| }} | ||
| className='rounded-[6px] bg-[var(--surface-6)] px-[12px] py-[5px] text-[13px] text-[var(--text-primary)]' | ||
| > | ||
| {done ? '↻ Replay' : playing ? 'Pause' : 'Play'} | ||
| </button> | ||
| <button | ||
| type='button' | ||
| onClick={() => { | ||
| setPlaying(false) | ||
| setIdx((i) => Math.min(total, i + 1)) | ||
| }} | ||
| className='rounded-[6px] bg-[var(--surface-4)] px-[10px] py-[5px] text-[13px] text-[var(--text-secondary)]' | ||
| > | ||
| Next › | ||
| </button> | ||
| <span className='ml-[4px] w-[44px] text-right text-[12px] text-[var(--text-muted)]'> | ||
| {Math.min(idx, total)}/{total} | ||
| </span> | ||
| </div> | ||
| </div> | ||
|
|
||
| <div className='flex min-h-0 flex-1 justify-center overflow-y-auto'> | ||
| <div className='flex w-full max-w-[640px] flex-col gap-[20px] py-[24px]'> | ||
| <div className='flex justify-end'> | ||
| <div className='max-w-[80%] rounded-[14px] bg-[var(--surface-5)] px-[14px] py-[10px] text-[14px] text-[var(--text-primary)]'> | ||
| {scene.prompt} | ||
| </div> | ||
| </div> | ||
|
|
||
| {done ? ( | ||
| <p className='animate-stream-fade-in text-[15px] text-[var(--text-primary)] leading-[24px]'> | ||
| {scene.reply} | ||
| </p> | ||
| ) : frame?.kind === 'parallel' ? ( | ||
| <ParallelAgents header={frame.header} agents={frame.agents} active={playing} /> | ||
| ) : ( | ||
| <ShimmerStatus text={frame?.text ?? ''} active={playing} /> | ||
| )} | ||
| </div> | ||
| </div> | ||
| </div> | ||
| ) | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.