Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
23d6e76
feat(web-shell): add mobile welcome composer slots
yuanyuanAli Jul 9, 2026
6718aae
refactor(web-shell): deduplicate MessageList JSX and remove dead CSS …
yuanyuanAli Jul 9, 2026
9440bf8
merge: resolve conflicts with origin/main for mobile welcome composer…
qwen-code-dev-bot Jul 10, 2026
5e63fea
fix(web-shell): stabilize MessageList tree position and conditional c…
yuanyuanAli Jul 10, 2026
203ebdf
Merge remote-tracking branch 'upstream/main' into feat/welcome-layout…
yuanyuanAli Jul 10, 2026
633da7f
Merge branch 'main' into feat/welcome-layout-composer-slot
wenshao Jul 10, 2026
044d451
Merge branch 'main' into feat/welcome-layout-composer-slot
wenshao Jul 10, 2026
c1f03fa
fix(release): raise package size budget to 85 MiB (#6688)
qqqys Jul 10, 2026
aa52da8
fix(interactive): configure Docker sandbox networking for protocol ta…
qwen-code-dev-bot Jul 10, 2026
3b823ae
fix(core): keep YOLO mode when the model calls enter_plan_mode (#6630)
Nas01010101 Jul 10, 2026
e21a816
feat(cli): forward ask_user_question answers from SDK can_use_tool (#…
TianYuan1024 Jul 10, 2026
5ac6446
fix(cli): localize approval mode UI labels (#6592)
han-dreamer Jul 11, 2026
f325d42
feat(dingtalk): mention response senders (#6679)
qqqys Jul 11, 2026
ea60fc1
feat(web-shell): add artifact right panel (#6591)
ytahdn Jul 11, 2026
543b37d
feat(cli): workspace-qualified ACP transport (daemon multi-workspace …
doudouOUC Jul 11, 2026
5b0e37b
Merge remote-tracking branch 'upstream/main' into feat/welcome-layout…
yuanyuanAli Jul 11, 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
78 changes: 78 additions & 0 deletions packages/web-shell/client/App.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -701,6 +701,14 @@
padding: 0;
}

.composerHeader {
margin-bottom: 8px;
}

.customFooter {
flex-shrink: 0;
}

/* Esc-clear hint, shown in the composer's top status slot (where the streaming
loader sits) — the two never coexist, so it stays clear of the queue. */
.escClearStatus {
Expand All @@ -714,6 +722,76 @@
padding: 12px 0 0;
}

.mobileWelcomeFooterMiddle {
display: none;
}

.mobileWelcomeGroup {
display: contents;
}

@media (max-width: 760px) {
.appChatEmpty .chatPaneWithMobileComposerBottom {
position: relative;
overflow: hidden;
}

.appChatEmpty .chatViewWithMobileComposerBottom .footer {
position: absolute;
right: 0;
bottom: 0;
left: 0;
margin-top: 0;
}

.appChatEmpty .mobileWelcomeGroup {
display: flex;
flex-direction: column;
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Critical] The footer div receives both position: absolute (from .chatViewWithMobileComposerBottom .footer at line ~708) and display: contents (from .chatViewWithWelcomeMiddle .footerWithCustomFooter here) on the same code path when both hasMobileComposerBottom and hasWelcomeMiddle are true.

Per CSS Display Level 3 spec: display: contents on an absolutely positioned element computes to none — the footer and all its children (composer, customFooter, scroll-to-bottom button, queued prompts) are removed from the render tree on mobile (≤760px).

Suggested fix: Don't combine position: absolute and display: contents on the same element. Remove the position: absolute rule for .footer when .footerWithCustomFooter is present, and rely solely on display: contents + flex order for positioning.

— qwen3.7-max via Qwen Code /review


.appChatEmpty .chatViewWithWelcomeMiddle .footerWithCustomFooter {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Critical] The mobile welcome-middle layout CSS rules (.chatViewWithWelcomeMiddle .footerWithCustomFooter .composer { order: 2 } and display: contents) depend on the .footerWithCustomFooter class, which is only applied to the footer element when CustomFooter (i.e. renderFooter) is truthy. When mobileWelcomeFooterMiddle={true} but no renderFooter is provided, these CSS rules silently fail to match and the composer repositioning breaks.

This creates an undocumented coupling between mobileWelcomeFooterMiddle and renderFooter — two props that appear independent in WebShellProps.

Suggested change
.appChatEmpty .chatViewWithWelcomeMiddle .footerWithCustomFooter {
.appChatEmpty .chatViewWithWelcomeMiddle .footer {
display: contents;
}
.appChatEmpty .chatViewWithWelcomeMiddle .footer .composer {

Or document the dependency in the mobileWelcomeFooterMiddle prop's JSDoc so consumers know both props are required.

— qwen3.7-max via Qwen Code /review

display: contents;
}

.appChatEmpty .chatViewWithWelcomeMiddle .footerWithCustomFooter .composer {
order: 2;
width: min(100%, var(--chat-shell-width));
margin: 0 auto;
padding-right: 20px;
padding-left: 20px;
}

.appChatEmpty .chatViewWithWelcomeMiddle .mobileWelcomeFooterMiddle {
display: flex;
flex: 0 0 auto;
align-items: flex-start;
justify-content: center;
width: min(100%, var(--chat-shell-width));
margin: 0 auto;
padding-right: 20px;
padding-left: 20px;
}

.appChatEmpty .chatViewWithWelcomeMiddle .customFooter {
order: 1;
display: flex;
flex: 0 0 auto;
align-items: flex-start;
justify-content: center;
width: min(100%, var(--chat-shell-width));
margin: 0 auto;
padding-right: 20px;
padding-left: 20px;
}
.desktopWelcomeFooter {
display: none;
}

.emptyWelcomeFooter {
text-align: center;
}
}

.queuedPrompts {
display: flex;
flex-direction: column;
Expand Down
Loading
Loading