From 3426124e7739a5160d583e0f5d5c1a96cf777cf6 Mon Sep 17 00:00:00 2001 From: chrisnojima Date: Wed, 11 Feb 2026 12:46:58 -0500 Subject: [PATCH 1/8] WIP --- shared/chat/conversation/messages/react-button.tsx | 8 +++++--- shared/common-adapters/emoji/index.tsx | 1 + shared/common-adapters/emoji/native-emoji.native.tsx | 4 +++- shared/common-adapters/markdown/service-decoration.tsx | 1 + 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/shared/chat/conversation/messages/react-button.tsx b/shared/chat/conversation/messages/react-button.tsx index 4d9e009c7c5f..1d2825b1755a 100644 --- a/shared/chat/conversation/messages/react-button.tsx +++ b/shared/chat/conversation/messages/react-button.tsx @@ -48,6 +48,8 @@ const ReactButtonContainer = React.memo(function ReactButtonContainer(p: OwnProp }, [navigateAppend, ordinal]) const text = decorated.length ? decorated : emoji + + console.log('aaaa readctr button2', emoji) return emoji ? ( { } else { emoji = props.emoji } + console.log('aaaa2', emoji) if (emoji.renderUrl) { return ( diff --git a/shared/common-adapters/emoji/native-emoji.native.tsx b/shared/common-adapters/emoji/native-emoji.native.tsx index 0f57e6e46ca3..e6d64c8f82ef 100644 --- a/shared/common-adapters/emoji/native-emoji.native.tsx +++ b/shared/common-adapters/emoji/native-emoji.native.tsx @@ -6,7 +6,7 @@ import Text from '../text' import type {Props} from './native-emoji' -const familyOverride = isAndroid ? {fontFamily: ''} : {} +const familyOverride = {} // isAndroid ? {fontFamily: ''} : {} const sizes = [16, 18, 22, 24, 26, 28, 32, 36] as const const sizeStyle = new Map<(typeof sizes)[number], Styles.StylesCrossPlatform>( @@ -16,6 +16,8 @@ const sizeStyle = new Map<(typeof sizes)[number], Styles.StylesCrossPlatform>( const EmojiWrapper = React.memo(function EmojiWrapper(props: Props) { const {emojiName, size} = props const emojiVariantSuffix = '\ufe0f' // see http://mts.io/2015/04/21/unicode-symbol-render-text-emoji/ + + console.log('aaaa', [sizeStyle.get(size), props.style]) return ( { + console.log('aaaa ServiceDecoration ', p) const {json, allowFontScaling, styles, styleOverride} = p const {disableBigEmojis, disableEmojiAnimation, messageType} = p // Parse JSON to get the type of the decoration From 5ce3495ececd5811c09cd3395fa5d613daa231a5 Mon Sep 17 00:00:00 2001 From: Chris Nojima Date: Wed, 11 Feb 2026 12:49:44 -0500 Subject: [PATCH 2/8] WIP --- shared/chat/conversation/messages/react-button.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/chat/conversation/messages/react-button.tsx b/shared/chat/conversation/messages/react-button.tsx index 1d2825b1755a..a4ce3752fd2e 100644 --- a/shared/chat/conversation/messages/react-button.tsx +++ b/shared/chat/conversation/messages/react-button.tsx @@ -119,6 +119,7 @@ const markdownOverride: StyleOverride = Kb.Styles.isMobile fontSize: 15, }, emojiSize: {size: 24}, + paragraph: {lineHeight: C.isAndroid ? 26 : 28.5}, } : { customEmoji: {height: 18, width: 18}, From ec111918cf9052491da0dcf5281618bbae1d351b Mon Sep 17 00:00:00 2001 From: chrisnojima Date: Thu, 12 Feb 2026 08:48:26 -0500 Subject: [PATCH 3/8] WIP --- shared/chat/conversation/messages/react-button.tsx | 2 +- shared/common-adapters/emoji/index.tsx | 2 +- shared/common-adapters/emoji/native-emoji.native.tsx | 10 ++++++---- shared/common-adapters/markdown/service-decoration.tsx | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/shared/chat/conversation/messages/react-button.tsx b/shared/chat/conversation/messages/react-button.tsx index a4ce3752fd2e..f962d4cad869 100644 --- a/shared/chat/conversation/messages/react-button.tsx +++ b/shared/chat/conversation/messages/react-button.tsx @@ -49,7 +49,7 @@ const ReactButtonContainer = React.memo(function ReactButtonContainer(p: OwnProp const text = decorated.length ? decorated : emoji - console.log('aaaa readctr button2', emoji) + return emoji ? ( { } else { emoji = props.emoji } - console.log('aaaa2', emoji) + if (emoji.renderUrl) { return ( diff --git a/shared/common-adapters/emoji/native-emoji.native.tsx b/shared/common-adapters/emoji/native-emoji.native.tsx index e6d64c8f82ef..702595fe05b1 100644 --- a/shared/common-adapters/emoji/native-emoji.native.tsx +++ b/shared/common-adapters/emoji/native-emoji.native.tsx @@ -13,15 +13,17 @@ const sizeStyle = new Map<(typeof sizes)[number], Styles.StylesCrossPlatform>( sizes.map(size => [size, {fontSize: size - 2, lineHeight: undefined, ...familyOverride}]) ) +// Android fails to paint emoji glyphs in mixed-content Text nodes when the +// variant selector (VS16 / U+FE0F) is appended to codepoints that already +// have Emoji_Presentation. iOS and desktop handle it fine. +const emojiVariantSuffix = isAndroid ? '' : '\ufe0f' + const EmojiWrapper = React.memo(function EmojiWrapper(props: Props) { const {emojiName, size} = props - const emojiVariantSuffix = '\ufe0f' // see http://mts.io/2015/04/21/unicode-symbol-render-text-emoji/ - - console.log('aaaa', [sizeStyle.get(size), props.style]) return ( {emojiIndexByName[emojiName] ? emojiIndexByName[emojiName] + emojiVariantSuffix : emojiName} diff --git a/shared/common-adapters/markdown/service-decoration.tsx b/shared/common-adapters/markdown/service-decoration.tsx index 7169dfb58bba..a87374b00500 100644 --- a/shared/common-adapters/markdown/service-decoration.tsx +++ b/shared/common-adapters/markdown/service-decoration.tsx @@ -105,7 +105,7 @@ export type Props = { } const ServiceDecoration = (p: Props) => { - console.log('aaaa ServiceDecoration ', p) + const {json, allowFontScaling, styles, styleOverride} = p const {disableBigEmojis, disableEmojiAnimation, messageType} = p // Parse JSON to get the type of the decoration From 7701e3e5211187ab86c19ae60910ff517897075b Mon Sep 17 00:00:00 2001 From: chrisnojima Date: Thu, 12 Feb 2026 09:50:15 -0500 Subject: [PATCH 4/8] WIP --- .gitignore | 2 ++ shared/chat/conversation/messages/react-button.tsx | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c19c467dfabb..112595c0c457 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,5 @@ go/keybase_netbsd go/keybase_openbsd .cursor +.claude +CLAUDE.md diff --git a/shared/chat/conversation/messages/react-button.tsx b/shared/chat/conversation/messages/react-button.tsx index f962d4cad869..f9edb91d2482 100644 --- a/shared/chat/conversation/messages/react-button.tsx +++ b/shared/chat/conversation/messages/react-button.tsx @@ -112,14 +112,14 @@ const markdownOverride: StyleOverride = Kb.Styles.isMobile ? { customEmoji: { height: 20, - transform: [{translateY: C.isAndroid ? 0 : 3.5}], + transform: [{translateY: 4}], width: 20, }, emoji: { fontSize: 15, }, emojiSize: {size: 24}, - paragraph: {lineHeight: C.isAndroid ? 26 : 28.5}, + paragraph: C.isAndroid ? {height: 28, textAlignVertical: 'center'} : {}, } : { customEmoji: {height: 18, width: 18}, From 822b221f4fb5ced182e4b89d6a1d56441768e790 Mon Sep 17 00:00:00 2001 From: chrisnojima Date: Thu, 12 Feb 2026 10:00:07 -0500 Subject: [PATCH 5/8] WIP --- shared/chat/conversation/messages/react-button.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shared/chat/conversation/messages/react-button.tsx b/shared/chat/conversation/messages/react-button.tsx index f9edb91d2482..51772125e1ff 100644 --- a/shared/chat/conversation/messages/react-button.tsx +++ b/shared/chat/conversation/messages/react-button.tsx @@ -119,7 +119,9 @@ const markdownOverride: StyleOverride = Kb.Styles.isMobile fontSize: 15, }, emojiSize: {size: 24}, - paragraph: C.isAndroid ? {height: 28, textAlignVertical: 'center'} : {}, + paragraph: C.isAndroid + ? ({height: 28, textAlignVertical: 'center'} as StyleOverride['paragraph']) + : {}, } : { customEmoji: {height: 18, width: 18}, From bb8a645632f495f4c2b5a7750fade0a03a03886e Mon Sep 17 00:00:00 2001 From: chrisnojima Date: Thu, 12 Feb 2026 10:02:04 -0500 Subject: [PATCH 6/8] WIP --- shared/chat/conversation/messages/react-button.tsx | 5 +---- shared/common-adapters/emoji/index.tsx | 1 - shared/common-adapters/markdown/service-decoration.tsx | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/shared/chat/conversation/messages/react-button.tsx b/shared/chat/conversation/messages/react-button.tsx index 51772125e1ff..097e7d62bf5e 100644 --- a/shared/chat/conversation/messages/react-button.tsx +++ b/shared/chat/conversation/messages/react-button.tsx @@ -49,7 +49,6 @@ const ReactButtonContainer = React.memo(function ReactButtonContainer(p: OwnProp const text = decorated.length ? decorated : emoji - return emoji ? ( { emoji = props.emoji } - if (emoji.renderUrl) { return ( { - const {json, allowFontScaling, styles, styleOverride} = p const {disableBigEmojis, disableEmojiAnimation, messageType} = p // Parse JSON to get the type of the decoration From 877985c9ebe010f4049eeb7f58a70935745b191f Mon Sep 17 00:00:00 2001 From: chrisnojima Date: Thu, 12 Feb 2026 10:02:16 -0500 Subject: [PATCH 7/8] WIP --- shared/chat/conversation/messages/react-button.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/shared/chat/conversation/messages/react-button.tsx b/shared/chat/conversation/messages/react-button.tsx index 097e7d62bf5e..2486bd7a1129 100644 --- a/shared/chat/conversation/messages/react-button.tsx +++ b/shared/chat/conversation/messages/react-button.tsx @@ -48,7 +48,6 @@ const ReactButtonContainer = React.memo(function ReactButtonContainer(p: OwnProp }, [navigateAppend, ordinal]) const text = decorated.length ? decorated : emoji - return emoji ? ( Date: Thu, 12 Feb 2026 10:02:59 -0500 Subject: [PATCH 8/8] WIP --- shared/common-adapters/emoji/native-emoji.native.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/shared/common-adapters/emoji/native-emoji.native.tsx b/shared/common-adapters/emoji/native-emoji.native.tsx index 702595fe05b1..2e8f6ded907f 100644 --- a/shared/common-adapters/emoji/native-emoji.native.tsx +++ b/shared/common-adapters/emoji/native-emoji.native.tsx @@ -6,11 +6,9 @@ import Text from '../text' import type {Props} from './native-emoji' -const familyOverride = {} // isAndroid ? {fontFamily: ''} : {} - const sizes = [16, 18, 22, 24, 26, 28, 32, 36] as const const sizeStyle = new Map<(typeof sizes)[number], Styles.StylesCrossPlatform>( - sizes.map(size => [size, {fontSize: size - 2, lineHeight: undefined, ...familyOverride}]) + sizes.map(size => [size, {fontSize: size - 2, lineHeight: undefined}]) ) // Android fails to paint emoji glyphs in mixed-content Text nodes when the