Merge nucleic/bold-thistle-marten-19eu into dev

This commit is contained in:
2026-08-02 01:21:08 -07:00
parent c4985f1271
commit 4a11255e66
+21 -3
View File
@@ -271,7 +271,9 @@ struct SessionDetailView: View {
.padding(.vertical, 10)
.chatColumn(maxWidth: contentMaxWidth, inset: transcriptInset, resizeWidth: columnWidth, settling: transcriptSettling)
}
Divider().chatColumn(maxWidth: contentMaxWidth, inset: transcriptInset, resizeWidth: columnWidth, settling: transcriptSettling)
// No divider above the composer: it's a self-contained Liquid Glass card now, and a
// full-width rule flush against its top edge reads as a stray second border (the
// same reason the approval cards above go without one). The gap does the separating.
composer
}
// Mirror the column's live width so the composer/divider/approval column (which live
@@ -2915,11 +2917,27 @@ struct SessionDetailView: View {
// archived chat only Unarchive stays live.
.disabled(isArchived)
}
.padding(.top, 22)
.padding(.bottom, 12)
// Card padding the chrome inside the glass, in place of the bare top/bottom insets the
// divider-ruled strip used to carry.
.padding(.horizontal, 14)
.padding(.vertical, 12)
// Backed by the system Liquid Glass material, exactly like the floating new-chat
// composer: the input area reads as one card sitting over the pane, sampling and
// refracting what's behind it instead of being a flat slab ruled off by a divider.
.glassEffect(.regular, in: .rect(cornerRadius: 16))
// The glass renders but doesn't hit-test, so give the card a solid hit shape clicks
// in the empty space between its controls belong to the composer, not to whatever sits
// underneath (and the shape also focuses the field-adjacent gaps predictably).
.contentShape(.rect(cornerRadius: 16))
// A soft drop shadow lifts the card off the transcript, matching the floating panel's
// treatment at a calmer weight this one is always on screen.
.shadow(color: .black.opacity(0.18), radius: 10, x: 0, y: 3)
// Match the transcript's centered column so the input area and its
// accessories never extend wider than the chat text above them.
.chatColumn(maxWidth: contentMaxWidth, inset: transcriptInset, resizeWidth: columnWidth, settling: transcriptSettling)
// Float the card off the transcript above and the pane's bottom edge below.
.padding(.top, 10)
.padding(.bottom, 12)
// Stream this composer's draft to the mesh (throttled in the store) so every other
// device viewing this chat sees it live and locks its own composer; an emptied field
// including the clear in `send()` ends the typing and unlocks them.