authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-09-14 14:07:54-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-14 14:07:54-07:00
log9d4bb550a6588a462852a7802bc37a3fd62d0a76
treecd072931eb828d0e85a11c600dcee29e4c1aa227
parent549d182aaadbf0e1e195d1a8cdc1805200e6751e
signature Signed by PGP key B5690EEEBB952194

fix(mobile): scale inline pills with Dynamic Type (#11792)


2 files changed, 10 insertions(+), 2 deletions(-)

apps/mobile/modules/t3-markdown-text/ios/T3ContextChip.h+1
...@@ -102,6 +102,7 @@ static inline NSAttributedString *T3MarkdownTextAttachmentString(...@@ -102,6 +102,7 @@ static inline NSAttributedString *T3MarkdownTextAttachmentString(
102static UIFont *T3ContextChipFont(NSDictionary *payload)102static UIFont *T3ContextChipFont(NSDictionary *payload)
103{103{
104 CGFloat size = MAX(10, MIN(40, [payload[@"fontSize"] doubleValue]));104 CGFloat size = MAX(10, MIN(40, [payload[@"fontSize"] doubleValue]));
105 size *= payload[@"fontSizeMultiplier"] != nil ? [payload[@"fontSizeMultiplier"] doubleValue] : 1;
105 return [UIFont fontWithName:@"DMSans-Medium" size:size]106 return [UIFont fontWithName:@"DMSans-Medium" size:size]
106 ?: [UIFont systemFontOfSize:size weight:UIFontWeightMedium];107 ?: [UIFont systemFontOfSize:size weight:UIFontWeightMedium];
107}108}
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownTextShadowNode.mm+9-2
...@@ -197,12 +197,19 @@ Size T3MarkdownTextShadowNode::measureContent(...@@ -197,12 +197,19 @@ Size T3MarkdownTextShadowNode::measureContent(
197 }197 }
198 if (props.nativeId.rfind("t3-chip:", 0) == 0 && fragmentLength > 0) {198 if (props.nativeId.rfind("t3-chip:", 0) == 0 && fragmentLength > 0) {
199 const std::string uri = props.nativeId.substr(3);199 const std::string uri = props.nativeId.substr(3);
200 NSDictionary *payload = T3ContextChipPayload([NSString stringWithUTF8String:uri.c_str()]);200 NSMutableDictionary *payload =
201 [T3ContextChipPayload([NSString stringWithUTF8String:uri.c_str()]) mutableCopy];
202 // Chips must scale with the paragraph or smaller Dynamic Type sizes clip them.
203 // Store the scaled payload so measurement and the rendered bitmap use the same font.
204 payload[@"fontSizeMultiplier"] = @(fontSizeMultiplier);
205 NSData *data = [NSJSONSerialization dataWithJSONObject:payload options:0 error:nil];
206 NSString *scaledUri = [@"chip:" stringByAppendingString:
207 [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]];
201 const CGFloat maxWidth = std::isfinite(layoutConstraints.maximumSize.width)208 const CGFloat maxWidth = std::isfinite(layoutConstraints.maximumSize.width)
202 ? layoutConstraints.maximumSize.width : 320;209 ? layoutConstraints.maximumSize.width : 320;
203 const CGSize size = T3ContextChipSize(payload, maxWidth);210 const CGSize size = T3ContextChipSize(payload, maxWidth);
204 attachmentRanges.push_back(T3MarkdownTextAttachmentRange{211 attachmentRanges.push_back(T3MarkdownTextAttachmentRange{
205 utf16Offset, 1, uri, false,212 utf16Offset, 1, std::string(scaledUri.UTF8String), false,
206 static_cast<Float>(size.width), static_cast<Float>(size.height),213 static_cast<Float>(size.width), static_cast<Float>(size.height),
207 });214 });
208 } else if (props.nativeId.rfind(FileAttachmentNativeIdPrefix, 0) == 0 && fragmentLength > 0) {215 } else if (props.nativeId.rfind(FileAttachmentNativeIdPrefix, 0) == 0 && fragmentLength > 0) {