Put the compose bar chrome in one component
This commit is contained in:
parent
68a4eee8ba
commit
1485e290e9
9 changed files with 42 additions and 85 deletions
|
|
@ -37,8 +37,8 @@
|
||||||
import ChatMembers from "@app/components/ChatMembers.svelte"
|
import ChatMembers from "@app/components/ChatMembers.svelte"
|
||||||
import ChatMessage from "@app/components/ChatMessage.svelte"
|
import ChatMessage from "@app/components/ChatMessage.svelte"
|
||||||
import ChatCompose from "@app/components/ChatCompose.svelte"
|
import ChatCompose from "@app/components/ChatCompose.svelte"
|
||||||
import ChatComposeEdit from "@app/components/ChatComposeEdit.svelte"
|
import ComposeEdit from "@app/components/ComposeEdit.svelte"
|
||||||
import ChatComposeParent from "@app/components/ChatComposeParent.svelte"
|
import ComposeParent from "@app/components/ComposeParent.svelte"
|
||||||
import ThunkToast from "@app/components/ThunkToast.svelte"
|
import ThunkToast from "@app/components/ThunkToast.svelte"
|
||||||
import {app, deletes, router, user, wraps} from "@app/core"
|
import {app, deletes, router, user, wraps} from "@app/core"
|
||||||
import {userSettingsValues} from "@app/settings"
|
import {userSettingsValues} from "@app/settings"
|
||||||
|
|
@ -338,12 +338,12 @@
|
||||||
</PageContent>
|
</PageContent>
|
||||||
|
|
||||||
<div class="room__compose bg-surface">
|
<div class="room__compose bg-surface">
|
||||||
<div>
|
<div class="flex flex-col gap-px">
|
||||||
{#if parent}
|
{#if parent}
|
||||||
<ChatComposeParent event={parent} clear={clearParent} verb="Replying to" />
|
<ComposeParent event={parent} clear={clearParent} verb="Replying to" />
|
||||||
{/if}
|
{/if}
|
||||||
{#if eventToEdit}
|
{#if eventToEdit}
|
||||||
<ChatComposeEdit clear={clearEventToEdit} />
|
<ComposeEdit clear={clearEventToEdit} />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{#key initialValues}
|
{#key initialValues}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
import cx from "classnames"
|
import cx from "classnames"
|
||||||
import {Pubkey} from "@welshman/util"
|
import {Pubkey} from "@welshman/util"
|
||||||
import type {CommandArg, CommandScopeTarget} from "@welshman/util"
|
import type {CommandArg, CommandScopeTarget} from "@welshman/util"
|
||||||
import {slide} from "@lib/transition"
|
|
||||||
import Button from "@lib/components/Button.svelte"
|
import Button from "@lib/components/Button.svelte"
|
||||||
|
import ComposeBar from "@app/components/ComposeBar.svelte"
|
||||||
import ProfileName from "@app/components/ProfileName.svelte"
|
import ProfileName from "@app/components/ProfileName.svelte"
|
||||||
import {deriveValidCommands, describeCommandDraft} from "@app/commands"
|
import {deriveValidCommands, describeCommandDraft} from "@app/commands"
|
||||||
|
|
||||||
|
|
@ -44,9 +44,7 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if draft}
|
{#if draft}
|
||||||
<div
|
<ComposeBar class="border-t-line-less flex flex-col gap-1 border-t text-xs">
|
||||||
class="bg-surface-more border-t-line-less border-l-primary flex flex-col gap-1 border-t border-l-2 border-solid px-2 py-1 text-xs"
|
|
||||||
transition:slide>
|
|
||||||
<div class="flex flex-wrap items-baseline gap-x-2 gap-y-1">
|
<div class="flex flex-wrap items-baseline gap-x-2 gap-y-1">
|
||||||
<span class="font-mono">
|
<span class="font-mono">
|
||||||
<span class="text-primary">/{draft.command.command()}</span>
|
<span class="text-primary">/{draft.command.command()}</span>
|
||||||
|
|
@ -85,5 +83,5 @@
|
||||||
{/each}
|
{/each}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</ComposeBar>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
||||||
20
src/app/components/ComposeBar.svelte
Normal file
20
src/app/components/ComposeBar.svelte
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import cx from "classnames"
|
||||||
|
import type {Snippet} from "svelte"
|
||||||
|
import type {HTMLAttributes} from "svelte/elements"
|
||||||
|
import {slide} from "@lib/transition"
|
||||||
|
|
||||||
|
type Props = HTMLAttributes<HTMLDivElement> & {
|
||||||
|
children: Snippet
|
||||||
|
}
|
||||||
|
|
||||||
|
const {children, ...restProps}: Props = $props()
|
||||||
|
|
||||||
|
const className = $derived(
|
||||||
|
cx("border-l-primary bg-surface-more border-l-2 border-solid px-2 py-1", restProps.class),
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div {...restProps} class={className} transition:slide>
|
||||||
|
{@render children()}
|
||||||
|
</div>
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {slide} from "@lib/transition"
|
|
||||||
import CloseCircle from "@assets/icons/close-circle.svg?dataurl"
|
import CloseCircle from "@assets/icons/close-circle.svg?dataurl"
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
import Button from "@lib/components/Button.svelte"
|
import Button from "@lib/components/Button.svelte"
|
||||||
|
import ComposeBar from "@app/components/ComposeBar.svelte"
|
||||||
|
|
||||||
const {
|
const {
|
||||||
clear,
|
clear,
|
||||||
|
|
@ -11,12 +11,9 @@
|
||||||
} = $props()
|
} = $props()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<ComposeBar class="flex h-8 items-center justify-between pr-7 text-xs">
|
||||||
class="bg-surface-more relative flex h-8 items-center justify-between border-l-2 border-solid px-2 pr-7 text-xs"
|
|
||||||
style="border-color: var(--primary)"
|
|
||||||
transition:slide>
|
|
||||||
<p class="text-primary">Editing message</p>
|
<p class="text-primary">Editing message</p>
|
||||||
<Button onclick={clear} class="flex items-center">
|
<Button onclick={clear} class="flex items-center">
|
||||||
<Icon icon={CloseCircle} />
|
<Icon icon={CloseCircle} />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</ComposeBar>
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {removeUndefined} from "@welshman/lib"
|
import {removeUndefined} from "@welshman/lib"
|
||||||
import type {TrustedEvent} from "@welshman/util"
|
import type {TrustedEvent} from "@welshman/util"
|
||||||
import {slide} from "@lib/transition"
|
|
||||||
import CloseCircle from "@assets/icons/close-circle.svg?dataurl"
|
import CloseCircle from "@assets/icons/close-circle.svg?dataurl"
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
import Icon from "@lib/components/Icon.svelte"
|
||||||
import Button from "@lib/components/Button.svelte"
|
import Button from "@lib/components/Button.svelte"
|
||||||
|
import ComposeBar from "@app/components/ComposeBar.svelte"
|
||||||
import NoteContentMinimal from "@app/components/NoteContentMinimal.svelte"
|
import NoteContentMinimal from "@app/components/NoteContentMinimal.svelte"
|
||||||
import {profiles} from "@app/core"
|
import {profiles} from "@app/core"
|
||||||
|
|
||||||
|
|
@ -20,10 +20,7 @@
|
||||||
const display = $profiles.display(event.pubkey, removeUndefined([url])).$
|
const display = $profiles.display(event.pubkey, removeUndefined([url])).$
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<ComposeBar class="relative pr-8">
|
||||||
class="bg-surface-more relative border-l-2 border-solid px-2 py-1 pr-8"
|
|
||||||
style="border-color: var(--primary)"
|
|
||||||
transition:slide>
|
|
||||||
<p class="text-primary text-xs">{verb} @{$display}</p>
|
<p class="text-primary text-xs">{verb} @{$display}</p>
|
||||||
{#key event.id}
|
{#key event.id}
|
||||||
<NoteContentMinimal trimParent {event} />
|
<NoteContentMinimal trimParent {event} />
|
||||||
|
|
@ -31,4 +28,4 @@
|
||||||
<Button class="absolute right-2 top-2 cursor-pointer" onclick={clear}>
|
<Button class="absolute right-2 top-2 cursor-pointer" onclick={clear}>
|
||||||
<Icon icon={CloseCircle} />
|
<Icon icon={CloseCircle} />
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</ComposeBar>
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
import Button from "@lib/components/Button.svelte"
|
import Button from "@lib/components/Button.svelte"
|
||||||
import Spinner from "@lib/components/Spinner.svelte"
|
import Spinner from "@lib/components/Spinner.svelte"
|
||||||
import EditorContent from "@app/editor/EditorContent.svelte"
|
import EditorContent from "@app/editor/EditorContent.svelte"
|
||||||
import ChatComposeParent from "@app/components/ChatComposeParent.svelte"
|
import ComposeParent from "@app/components/ComposeParent.svelte"
|
||||||
import {prependParent} from "@app/rooms"
|
import {prependParent} from "@app/rooms"
|
||||||
import {makeEditor} from "@app/editor"
|
import {makeEditor} from "@app/editor"
|
||||||
import {DraftKey} from "@app/drafts"
|
import {DraftKey} from "@app/drafts"
|
||||||
|
|
@ -115,7 +115,7 @@
|
||||||
class="left-content bottom-sai right-sai fixed z-feature mb-14 md:mb-0 w-full md:w-auto pr-2">
|
class="left-content bottom-sai right-sai fixed z-feature mb-14 md:mb-0 w-full md:w-auto pr-2">
|
||||||
<div class="card mx-2 my-2 shadow-md">
|
<div class="card mx-2 my-2 shadow-md">
|
||||||
{#if parent}
|
{#if parent}
|
||||||
<ChatComposeParent {url} event={parent} clear={() => onClearParent?.()} verb="Replying to" />
|
<ComposeParent {url} event={parent} clear={() => onClearParent?.()} verb="Replying to" />
|
||||||
{/if}
|
{/if}
|
||||||
<div class="relative">
|
<div class="relative">
|
||||||
<div class="note-editor grow overflow-hidden">
|
<div class="note-editor grow overflow-hidden">
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@
|
||||||
import VirtualList from "@lib/components/VirtualList.svelte"
|
import VirtualList from "@lib/components/VirtualList.svelte"
|
||||||
import type {VirtualListController} from "@lib/components/VirtualList.svelte"
|
import type {VirtualListController} from "@lib/components/VirtualList.svelte"
|
||||||
import RoomCompose from "@app/components/RoomCompose.svelte"
|
import RoomCompose from "@app/components/RoomCompose.svelte"
|
||||||
import RoomComposeEdit from "@app/components/RoomComposeEdit.svelte"
|
import ComposeEdit from "@app/components/ComposeEdit.svelte"
|
||||||
import RoomComposeParent from "@app/components/RoomComposeParent.svelte"
|
import ComposeParent from "@app/components/ComposeParent.svelte"
|
||||||
import RoomItem from "@app/components/RoomItem.svelte"
|
import RoomItem from "@app/components/RoomItem.svelte"
|
||||||
import RoomItemAddMember from "@app/components/RoomItemAddMember.svelte"
|
import RoomItemAddMember from "@app/components/RoomItemAddMember.svelte"
|
||||||
import RoomPinnedMessages from "@app/components/RoomPinnedMessages.svelte"
|
import RoomPinnedMessages from "@app/components/RoomPinnedMessages.svelte"
|
||||||
|
|
@ -696,15 +696,15 @@
|
||||||
{@render membershipButton("Ask to Join")}
|
{@render membershipButton("Ask to Join")}
|
||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
<div>
|
<div class="flex flex-col gap-px">
|
||||||
{#if parent}
|
{#if parent}
|
||||||
<RoomComposeParent {url} event={parent} clear={clearParent} verb="Replying to" />
|
<ComposeParent {url} event={parent} clear={clearParent} verb="Replying to" />
|
||||||
{/if}
|
{/if}
|
||||||
{#if sharedEvent}
|
{#if sharedEvent}
|
||||||
<RoomComposeParent {url} event={sharedEvent} clear={clearShare} verb="Sharing" />
|
<ComposeParent {url} event={sharedEvent} clear={clearShare} verb="Sharing" />
|
||||||
{/if}
|
{/if}
|
||||||
{#if eventToEdit}
|
{#if eventToEdit}
|
||||||
<RoomComposeEdit clear={clearEventToEdit} />
|
<ComposeEdit clear={clearEventToEdit} />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{#key initialValues}
|
{#key initialValues}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import {slide} from "@lib/transition"
|
|
||||||
import CloseCircle from "@assets/icons/close-circle.svg?dataurl"
|
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
|
||||||
import Button from "@lib/components/Button.svelte"
|
|
||||||
|
|
||||||
const {
|
|
||||||
clear,
|
|
||||||
}: {
|
|
||||||
clear: () => void
|
|
||||||
} = $props()
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="relative flex h-8 items-center justify-between border-l-2 border-solid bg-surface-more px-2 pr-7 text-xs"
|
|
||||||
style="border-color: var(--primary)"
|
|
||||||
transition:slide>
|
|
||||||
<p class="text-primary">Editing message</p>
|
|
||||||
<Button onclick={clear} class="flex items-center">
|
|
||||||
<Icon icon={CloseCircle} />
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
import type {TrustedEvent} from "@welshman/util"
|
|
||||||
import {slide} from "@lib/transition"
|
|
||||||
import CloseCircle from "@assets/icons/close-circle.svg?dataurl"
|
|
||||||
import Icon from "@lib/components/Icon.svelte"
|
|
||||||
import Button from "@lib/components/Button.svelte"
|
|
||||||
import NoteContentMinimal from "@app/components/NoteContentMinimal.svelte"
|
|
||||||
import {profiles} from "@app/core"
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
url: string
|
|
||||||
verb: string
|
|
||||||
event: TrustedEvent
|
|
||||||
clear: () => void
|
|
||||||
}
|
|
||||||
|
|
||||||
const {url, verb, event, clear}: Props = $props()
|
|
||||||
|
|
||||||
const display = $profiles.display(event.pubkey, [url]).$
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="relative border-l-2 border-solid bg-surface-more px-2 py-1 pr-8"
|
|
||||||
style="border-color: var(--primary)"
|
|
||||||
transition:slide>
|
|
||||||
<p class="text-xs text-primary">{verb} @{$display}</p>
|
|
||||||
{#key event.id}
|
|
||||||
<NoteContentMinimal trimParent {event} />
|
|
||||||
{/key}
|
|
||||||
<Button class="absolute right-2 top-2 cursor-pointer" onclick={clear}>
|
|
||||||
<Icon icon={CloseCircle} />
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
Loading…
Reference in a new issue