Simplify chat compose layout

This commit is contained in:
Jon Staab
2026-04-04 09:02:52 -07:00
parent 9311cab3b2
commit fd6cc84be6
5 changed files with 13 additions and 67 deletions
+2 -6
View File
@@ -403,14 +403,10 @@ body.keyboard-open .hide-on-keyboard {
/* chat view */ /* chat view */
.chat__compose { .chat__compose {
@apply left-content bottom-sai right-sai fixed z-compose; @apply relative z-compose mb-14 flex-grow md:mb-0;
} }
.chat__compose-zone { .chat__compose .chat__compose-inner {
@apply left-content bottom-sai right-sai fixed z-compose;
}
.chat__compose-zone .chat__compose-inner {
@apply min-w-0; @apply min-w-0;
} }
+2 -18
View File
@@ -196,8 +196,6 @@
let compose: ChatCompose | undefined = $state() let compose: ChatCompose | undefined = $state()
let parent: TrustedEvent | undefined = $state() let parent: TrustedEvent | undefined = $state()
let eventToEdit: TrustedEvent | undefined = $state() let eventToEdit: TrustedEvent | undefined = $state()
let chatCompose: HTMLElement | undefined = $state()
let dynamicPadding: HTMLElement | undefined = $state()
const elements = $derived.by(() => { const elements = $derived.by(() => {
const elements = [] const elements = []
@@ -233,20 +231,6 @@
for (const pubkey of others) { for (const pubkey of others) {
loadMessagingRelayList(pubkey) loadMessagingRelayList(pubkey)
} }
const observer = new ResizeObserver(() => {
if (dynamicPadding && chatCompose) {
dynamicPadding.style.minHeight = `${chatCompose.offsetHeight}px`
}
})
observer.observe(chatCompose!)
observer.observe(dynamicPadding!)
return () => {
observer.unobserve(chatCompose!)
observer.unobserve(dynamicPadding!)
}
}) })
setTimeout(() => { setTimeout(() => {
@@ -294,7 +278,6 @@
</PageBar> </PageBar>
<PageContent class="flex flex-col-reverse gap-2 pt-4"> <PageContent class="flex flex-col-reverse gap-2 pt-4">
<div bind:this={dynamicPadding}></div>
{#if missingRelayLists.length > 0} {#if missingRelayLists.length > 0}
<div class="py-12"> <div class="py-12">
<div class="card2 col-2 m-auto max-w-md items-center text-center"> <div class="card2 col-2 m-auto max-w-md items-center text-center">
@@ -335,9 +318,10 @@
</Spinner> </Spinner>
{@render info?.()} {@render info?.()}
</p> </p>
<div class="h-screen"></div>
</PageContent> </PageContent>
<div class="chat__compose bg-base-200" bind:this={chatCompose}> <div class="chat__compose bg-base-200">
<div> <div>
{#if parent} {#if parent}
<ChatComposeParent event={parent} clear={clearParent} verb="Replying to" /> <ChatComposeParent event={parent} clear={clearParent} verb="Replying to" />
+2 -2
View File
@@ -68,10 +68,10 @@
<!-- a little extra something for ios --> <!-- a little extra something for ios -->
<div <div
class="bottom-nav hide-on-keyboard fixed bottom-0 left-0 right-0 z-nav h-[var(--saib)] bg-base-100 md:hidden"> class="hide-on-keyboard fixed bottom-0 left-0 right-0 z-nav h-[var(--saib)] bg-base-100 md:hidden">
</div> </div>
<div <div
class="bottom-nav hide-on-keyboard border-top bottom-sai fixed left-0 right-0 z-nav h-14 border border-base-200 bg-base-100 md:hidden"> class="hide-on-keyboard border-top bottom-sai fixed left-0 right-0 z-nav h-14 border border-base-200 bg-base-100 md:hidden">
<div class="content-padding-x content-sizing flex justify-between px-2"> <div class="content-padding-x content-sizing flex justify-between px-2">
<div class="flex gap-2 sm:gap-6"> <div class="flex gap-2 sm:gap-6">
<PrimaryNavItem title="Search" href="/people"> <PrimaryNavItem title="Search" href="/people">
+3 -20
View File
@@ -232,8 +232,6 @@
let share = $state(popKey<TrustedEvent | undefined>("share")) let share = $state(popKey<TrustedEvent | undefined>("share"))
let parent: TrustedEvent | undefined = $state() let parent: TrustedEvent | undefined = $state()
let element: HTMLElement | undefined = $state() let element: HTMLElement | undefined = $state()
let chatCompose: HTMLElement | undefined = $state()
let dynamicPadding: HTMLElement | undefined = $state()
let newMessagesSeen = false let newMessagesSeen = false
let showFixedNewMessages = $state(false) let showFixedNewMessages = $state(false)
let showScrollButton = $state(false) let showScrollButton = $state(false)
@@ -344,22 +342,9 @@
const onEditPrevious = () => ifLet($events.toReversed().find(canEditEvent), onEditEvent) const onEditPrevious = () => ifLet($events.toReversed().find(canEditEvent), onEditEvent)
onMount(() => { onMount(() => {
const observer = new ResizeObserver(() => {
if (dynamicPadding && chatCompose) {
dynamicPadding!.style.minHeight = `${chatCompose!.offsetHeight}px`
}
})
observer.observe(chatCompose!)
observer.observe(dynamicPadding!)
start() start()
return () => { return cleanup
cleanup()
observer.unobserve(chatCompose!)
observer.unobserve(dynamicPadding!)
}
}) })
</script> </script>
@@ -377,7 +362,6 @@
</SpaceBar> </SpaceBar>
<PageContent bind:element onscroll={onScroll} class="flex flex-col-reverse pt-4"> <PageContent bind:element onscroll={onScroll} class="flex flex-col-reverse pt-4">
<div bind:this={dynamicPadding}></div>
{#if $room.isPrivate && $membershipStatus !== MembershipStatus.Granted} {#if $room.isPrivate && $membershipStatus !== MembershipStatus.Granted}
<div class="py-20"> <div class="py-20">
<div class="card2 col-8 m-auto max-w-md items-center text-center"> <div class="card2 col-8 m-auto max-w-md items-center text-center">
@@ -444,11 +428,10 @@
{/if} {/if}
</p> </p>
{/if} {/if}
<div class="h-screen"></div>
</PageContent> </PageContent>
<div <div class="chat__compose flex flex-col gap-1 bg-base-200 md:flex-row md:gap-0">
class="chat__compose-zone flex flex-col gap-1 bg-base-200 md:flex-row md:gap-0"
bind:this={chatCompose}>
<div class="chat__compose-inner min-w-0 flex-1"> <div class="chat__compose-inner min-w-0 flex-1">
{#if $room.isPrivate && $membershipStatus !== MembershipStatus.Granted} {#if $room.isPrivate && $membershipStatus !== MembershipStatus.Granted}
<!-- pass --> <!-- pass -->
+4 -21
View File
@@ -163,8 +163,6 @@
let share = $state(popKey<TrustedEvent | undefined>("share")) let share = $state(popKey<TrustedEvent | undefined>("share"))
let parent: TrustedEvent | undefined = $state() let parent: TrustedEvent | undefined = $state()
let element: HTMLElement | undefined = $state() let element: HTMLElement | undefined = $state()
let chatCompose: HTMLElement | undefined = $state()
let dynamicPadding: HTMLElement | undefined = $state()
let newMessagesSeen = false let newMessagesSeen = false
let showFixedNewMessages = $state(false) let showFixedNewMessages = $state(false)
let showScrollButton = $state(false) let showScrollButton = $state(false)
@@ -275,24 +273,9 @@
const onEditPrevious = () => ifLet($events.toReversed().find(canEditEvent), onEditEvent) const onEditPrevious = () => ifLet($events.toReversed().find(canEditEvent), onEditEvent)
onMount(() => { onMount(() => {
const controller = new AbortController()
const observer = new ResizeObserver(() => {
if (dynamicPadding && chatCompose) {
dynamicPadding!.style.minHeight = `${chatCompose!.offsetHeight}px`
}
})
observer.observe(chatCompose!)
observer.observe(dynamicPadding!)
start() start()
return () => { return cleanup
cleanup()
controller.abort()
observer.unobserve(chatCompose!)
observer.unobserve(dynamicPadding!)
}
}) })
</script> </script>
@@ -306,8 +289,7 @@
{/snippet} {/snippet}
</SpaceBar> </SpaceBar>
<PageContent bind:element onscroll={onScroll} class="flex flex-col-reverse pt-4"> <PageContent bind:element onscroll={onScroll} class="flex flex-col-reverse pt-4 mb-14 md:mb-0">
<div bind:this={dynamicPadding}></div>
{#if loadingForward} {#if loadingForward}
<p class="py-20 flex justify-center"> <p class="py-20 flex justify-center">
<Spinner loading={loadingForward}>Looking for messages...</Spinner> <Spinner loading={loadingForward}>Looking for messages...</Spinner>
@@ -351,9 +333,10 @@
<Spinner>End of message history</Spinner> <Spinner>End of message history</Spinner>
{/if} {/if}
</p> </p>
<div class="h-screen"></div>
</PageContent> </PageContent>
<div class="chat__compose bg-base-200" bind:this={chatCompose}> <div class="chat__compose bg-base-200">
<div> <div>
{#if parent} {#if parent}
<RoomComposeParent event={parent} clear={clearParent} verb="Replying to" /> <RoomComposeParent event={parent} clear={clearParent} verb="Replying to" />