diff options
| author | Adam <[email protected]> | 2026-02-12 20:05:45 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-02-12 20:05:58 -0600 |
| commit | dec304a2737b7accb3bf8b199fb58e81d65026e9 (patch) | |
| tree | df476bcdcbfc6f1242bd054e08fe1a5de8b8f8dc /packages | |
| parent | c9719dff7223aa1fc19540f3cd627c7f40e4bf36 (diff) | |
| download | opencode-dec304a2737b7accb3bf8b199fb58e81d65026e9.tar.gz opencode-dec304a2737b7accb3bf8b199fb58e81d65026e9.zip | |
fix(app): emoji as avatar
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/ui/src/components/avatar.tsx | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/packages/ui/src/components/avatar.tsx b/packages/ui/src/components/avatar.tsx index 76bde1e15..c1617b265 100644 --- a/packages/ui/src/components/avatar.tsx +++ b/packages/ui/src/components/avatar.tsx @@ -1,5 +1,16 @@ import { type ComponentProps, splitProps, Show } from "solid-js" +const segmenter = + typeof Intl !== "undefined" && "Segmenter" in Intl + ? new Intl.Segmenter(undefined, { granularity: "grapheme" }) + : undefined + +function first(value: string) { + if (!value) return "" + if (!segmenter) return Array.from(value)[0] ?? "" + return segmenter.segment(value)[Symbol.iterator]().next().value?.segment ?? Array.from(value)[0] ?? "" +} + export interface AvatarProps extends ComponentProps<"div"> { fallback: string src?: string @@ -36,7 +47,7 @@ export function Avatar(props: AvatarProps) { ...(!src && split.foreground ? { "--avatar-fg": split.foreground } : {}), }} > - <Show when={src} fallback={split.fallback?.[0]}> + <Show when={src} fallback={first(split.fallback)}> {(src) => <img src={src()} draggable={false} data-slot="avatar-image" />} </Show> </div> |
