fix(frontend): readable links and file chips on own bubbles

This commit is contained in:
hh
2026-08-13 04:06:44 +02:00
parent 6ae28cb321
commit 995322b17a
6 changed files with 55 additions and 8 deletions
+20 -1
View File
@@ -69,13 +69,14 @@
{:else if type === "url" || type === "text_link" || type === "email" || type === "phone_number"} {:else if type === "url" || type === "text_link" || type === "email" || type === "phone_number"}
<a <a
class="link" class="link"
class:own
href={linkHref(node)} href={linkHref(node)}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
>{@render tree(node.children)}</a >{@render tree(node.children)}</a
> >
{:else if type === "mention" || type === "text_mention" || type === "hashtag" || type === "cashtag" || type === "bot_command"} {:else if type === "mention" || type === "text_mention" || type === "hashtag" || type === "cashtag" || type === "bot_command"}
<span class="link">{@render tree(node.children)}</span> <span class="link" class:own>{@render tree(node.children)}</span>
{:else} {:else}
{@render tree(node.children)} {@render tree(node.children)}
{/if} {/if}
@@ -108,6 +109,24 @@
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
} }
&.own {
color: var(--color-own-links);
}
}
a.link.own {
text-decoration: underline;
text-decoration-color: color-mix(
in srgb,
var(--color-own-links) 45%,
transparent
);
text-underline-offset: 0.15em;
&:hover {
text-decoration-color: currentcolor;
}
} }
.code, .code,
@@ -8,9 +8,10 @@
chatId: number; chatId: number;
media: MediaRef[]; media: MediaRef[];
onopen: (index: number) => void; onopen: (index: number) => void;
own?: boolean;
} }
let { media, chatId, onopen }: Props = $props(); let { media, chatId, onopen, own = false }: Props = $props();
const asFiles = $derived( const asFiles = $derived(
media.every((item) => !isPreviewable(item.kind, item.mime)) media.every((item) => !isPreviewable(item.kind, item.mime))
@@ -31,7 +32,7 @@
{#if asFiles} {#if asFiles}
<div class="AlbumFiles"> <div class="AlbumFiles">
{#each media as item, index (item.id ?? index)} {#each media as item, index (item.id ?? index)}
<FileChip media={item} /> <FileChip media={item} {own} />
{/each} {/each}
</div> </div>
{:else} {:else}
@@ -188,6 +188,7 @@
media={message.media} media={message.media}
chatId={message.chat_id} chatId={message.chat_id}
onopen={onmedia} onopen={onmedia}
{own}
/> />
{:else if message.has_media} {:else if message.has_media}
<MessageMedia {message} {own} onopen={() => onmedia(0)} /> <MessageMedia {message} {own} onopen={() => onmedia(0)} />
@@ -144,7 +144,7 @@
<span>Самоуничтожающееся медиа</span> <span>Самоуничтожающееся медиа</span>
</button> </button>
{:else if asFile && ref} {:else if asFile && ref}
<FileChip media={ref} /> <FileChip media={ref} {own} />
{:else if !loaded} {:else if !loaded}
<div class="media-skeleton"><Spinner /></div> <div class="media-skeleton"><Spinner /></div>
{:else if ready && kind === "voice"} {:else if ready && kind === "voice"}
@@ -8,9 +8,10 @@
interface Props { interface Props {
media: MediaRef; media: MediaRef;
own?: boolean;
} }
const { media }: Props = $props(); const { media, own = false }: Props = $props();
let saving = $state(false); let saving = $state(false);
@@ -40,9 +41,9 @@
} }
</script> </script>
<div class="FileChip"> <div class="FileChip" class:own>
<button class="file-main" type="button" title={name} onclick={save}> <button class="file-main" type="button" title={name} onclick={save}>
<span class="file-glyph"> <span class="file-glyph" class:own>
<Icon name={saving ? "timer" : "document"} size="1.25rem" /> <Icon name={saving ? "timer" : "document"} size="1.25rem" />
</span> </span>
<span class="file-text"> <span class="file-text">
@@ -72,6 +73,10 @@
border-radius: var(--border-radius-default-small); border-radius: var(--border-radius-default-small);
background-color: var(--color-primary-tint); background-color: var(--color-primary-tint);
&.own {
background-color: var(--color-code-own-bg);
}
} }
.file-main { .file-main {
@@ -104,6 +109,15 @@
color: var(--color-white); color: var(--color-white);
background-color: var(--color-primary); background-color: var(--color-primary);
&.own {
color: var(--color-own-links);
background-color: color-mix(
in srgb,
var(--color-own-links) 20%,
transparent
);
}
} }
.file-text { .file-text {
@@ -126,6 +140,10 @@
color: var(--color-text-secondary); color: var(--color-text-secondary);
} }
.own .file-sub {
color: var(--color-message-meta-own);
}
.file-share { .file-share {
cursor: pointer; cursor: pointer;
@@ -146,4 +164,12 @@
background-color: var(--color-primary-opacity); background-color: var(--color-primary-opacity);
} }
} }
.own .file-share {
color: var(--color-own-links);
&:hover {
background-color: color-mix(in srgb, currentcolor 18%, transparent);
}
}
</style> </style>
+1 -1
View File
@@ -140,7 +140,7 @@
--color-links: #{$color-links}; --color-links: #{$color-links};
--color-own-links: #{$color-white}; --color-own-links: #{$color-links};
--color-placeholders: #{$color-placeholders}; --color-placeholders: #{$color-placeholders};