diff --git a/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js index 0a73eb53c847..530fcd82b9b0 100644 --- a/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js +++ b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js @@ -162,6 +162,7 @@ const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = { fontSize: true, fontStyle: true, fontVariant: {process: processFontVariant}, + fontVariationSettings: true, fontWeight: true, includeFontPadding: true, letterSpacing: true, diff --git a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js index de54f8235f5e..dfe4c0d9ee82 100644 --- a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js +++ b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js @@ -838,6 +838,7 @@ export type ____TextStyle_InternalCore = $ReadOnly<{ fontStyle?: 'normal' | 'italic', fontWeight?: ____FontWeight_Internal, fontVariant?: ____FontVariantArray_Internal | string, + fontVariationSettings?: string, textShadowOffset?: $ReadOnly<{ width: number, height: number, diff --git a/packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.mm b/packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.mm index ece68768c402..7ccd8f930ca7 100644 --- a/packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.mm +++ b/packages/react-native/Libraries/Text/BaseText/RCTBaseTextViewManager.mm @@ -35,6 +35,7 @@ - (RCTShadowView *)shadowView RCT_REMAP_SHADOW_PROPERTY(fontWeight, textAttributes.fontWeight, NSString) RCT_REMAP_SHADOW_PROPERTY(fontStyle, textAttributes.fontStyle, NSString) RCT_REMAP_SHADOW_PROPERTY(fontVariant, textAttributes.fontVariant, NSArray) +RCT_REMAP_SHADOW_PROPERTY(fontVariationSettings, textAttributes.fontVariationSettings, NSString) RCT_REMAP_SHADOW_PROPERTY(allowFontScaling, textAttributes.allowFontScaling, BOOL) RCT_REMAP_SHADOW_PROPERTY(dynamicTypeRamp, textAttributes.dynamicTypeRamp, RCTDynamicTypeRamp) RCT_REMAP_SHADOW_PROPERTY(maxFontSizeMultiplier, textAttributes.maxFontSizeMultiplier, CGFloat) diff --git a/packages/react-native/Libraries/Text/RCTTextAttributes.h b/packages/react-native/Libraries/Text/RCTTextAttributes.h index 22fb646d4349..e49e7b82cc1b 100644 --- a/packages/react-native/Libraries/Text/RCTTextAttributes.h +++ b/packages/react-native/Libraries/Text/RCTTextAttributes.h @@ -36,6 +36,7 @@ extern NSString *const RCTTextAttributesTagAttributeName; @property (nonatomic, copy, nullable) NSString *fontWeight; @property (nonatomic, copy, nullable) NSString *fontStyle; @property (nonatomic, copy, nullable) NSArray *fontVariant; +@property (nonatomic, copy, nullable) NSString *fontVariationSettings; @property (nonatomic, assign) BOOL allowFontScaling; @property (nonatomic, assign) RCTDynamicTypeRamp dynamicTypeRamp; @property (nonatomic, assign) CGFloat letterSpacing; diff --git a/packages/react-native/Libraries/Text/RCTTextAttributes.mm b/packages/react-native/Libraries/Text/RCTTextAttributes.mm index c8323388ce68..5aebe6deb5e6 100644 --- a/packages/react-native/Libraries/Text/RCTTextAttributes.mm +++ b/packages/react-native/Libraries/Text/RCTTextAttributes.mm @@ -58,6 +58,7 @@ - (void)applyTextAttributes:(RCTTextAttributes *)textAttributes _fontWeight = textAttributes->_fontWeight ?: _fontWeight; _fontStyle = textAttributes->_fontStyle ?: _fontStyle; _fontVariant = textAttributes->_fontVariant ?: _fontVariant; + _fontVariationSettings = textAttributes->_fontVariationSettings ?: _fontVariationSettings; _allowFontScaling = textAttributes->_allowFontScaling || _allowFontScaling; // * _dynamicTypeRamp = textAttributes->_dynamicTypeRamp != RCTDynamicTypeRampUndefined ? textAttributes->_dynamicTypeRamp : _dynamicTypeRamp; @@ -223,6 +224,7 @@ - (UIFont *)effectiveFont weight:_fontWeight style:_fontStyle variant:_fontVariant + fontVariationSettings:_fontVariationSettings scaleMultiplier:self.effectiveFontSizeMultiplier]; } diff --git a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap index 86f5dac239ce..b83fa4c6c3d8 100644 --- a/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap +++ b/packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap @@ -7773,6 +7773,7 @@ export type ____TextStyle_InternalCore = $ReadOnly<{ fontStyle?: \\"normal\\" | \\"italic\\", fontWeight?: ____FontWeight_Internal, fontVariant?: ____FontVariantArray_Internal | string, + fontVariationSettings?: string, textShadowOffset?: $ReadOnly<{ width: number, height: number, diff --git a/packages/react-native/React/Views/RCTFont.h b/packages/react-native/React/Views/RCTFont.h index 5ddc34da35f1..22163fbfcd39 100644 --- a/packages/react-native/React/Views/RCTFont.h +++ b/packages/react-native/React/Views/RCTFont.h @@ -33,6 +33,7 @@ RCT_EXTERN BOOL RCTHasFontHandlerSet(void); weight:(NSString *)weight style:(NSString *)style variant:(NSArray *)variant + fontVariationSettings:(NSString *)fontVariationSettings scaleMultiplier:(CGFloat)scaleMultiplier; + (UIFont *)updateFont:(UIFont *)font withFamily:(NSString *)family; diff --git a/packages/react-native/React/Views/RCTFont.mm b/packages/react-native/React/Views/RCTFont.mm index a5a84bb2cb32..af367e764e9e 100644 --- a/packages/react-native/React/Views/RCTFont.mm +++ b/packages/react-native/React/Views/RCTFont.mm @@ -189,6 +189,7 @@ + (UIFont *)UIFont:(id)json weight:[RCTConvert NSString:json[@"fontWeight"]] style:[RCTConvert NSString:json[@"fontStyle"]] variant:[RCTConvert NSStringArray:json[@"fontVariant"]] + fontVariationSettings:[RCTConvert NSString:json[@"fontVariationSettings"]] scaleMultiplier:1]; } @@ -378,12 +379,27 @@ + (RCTFontVariantDescriptor *)RCTFontVariantDescriptor:(id)json @implementation RCTFont ++ (NSNumber *)openTypeTagToNumber:(NSString *)tag { + if (tag.length != 4) { + return nil; + } + + NSData *data = [tag dataUsingEncoding:NSUTF8StringEncoding]; + const char *bytes = (const char *)[data bytes]; + + uint32_t value = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]; + + return @(value); +} + + + (UIFont *)updateFont:(UIFont *)font withFamily:(NSString *)family size:(NSNumber *)size weight:(NSString *)weight style:(NSString *)style variant:(NSArray *)variant + fontVariationSettings:(NSString *)fontVariationSettings scaleMultiplier:(CGFloat)scaleMultiplier { // Defaults @@ -499,27 +515,82 @@ + (UIFont *)updateFont:(UIFont *)font font = [UIFont fontWithDescriptor:fontDescriptor size:fontSize]; } + if (fontVariationSettings) { + NSArray *variationSettings = [fontVariationSettings componentsSeparatedByString:@","]; + for (NSString *variationSetting in variationSettings) { + NSString *trimmedSetting = [variationSetting stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + NSArray *setting = [trimmedSetting componentsSeparatedByString:@" "]; + + if (setting.count != 2) { + NSLog(@"Error: Setting does not contain exactly 2 components. Setting: %@", setting); + continue; + } + + NSString *attribute = [[[setting[0] + stringByReplacingOccurrencesOfString:@"\"" withString:@""] + stringByReplacingOccurrencesOfString:@"\'" withString:@""] + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + NSString *value = [setting[1] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + if (attribute.length == 0 || value.length == 0) { + NSLog(@"Error: Invalid attribute or value. Attribute: %@, Value: %@", attribute, value); + continue; + } + + NSNumber *tag = [RCTFont openTypeTagToNumber:attribute]; + if (!tag) { + NSLog(@"Error: Invalid attribute in fontVariationSettings: %@", attribute); + continue; + } + + NSNumber *valueNumber = @([value intValue]); + NSDictionary *variations = @{tag: valueNumber}; + + UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:@{ + UIFontDescriptorNameAttribute: familyName, + (NSString *)kCTFontVariationAttribute: variations + }]; + + if (!fontDescriptor) { + NSLog(@"Error: Could not create font descriptor with variations. Variations: %@", variations); + continue; + } + + UIFontDescriptor *existingFontDescriptors = font.fontDescriptor; + UIFontDescriptor *mergedFontDescriptor = [existingFontDescriptors fontDescriptorByAddingAttributes:fontDescriptor.fontAttributes]; + font = [UIFont fontWithDescriptor:mergedFontDescriptor size:fontSize]; + } + } + return font; } + (UIFont *)updateFont:(UIFont *)font withFamily:(NSString *)family { - return [self updateFont:font withFamily:family size:nil weight:nil style:nil variant:nil scaleMultiplier:1]; + return [self updateFont:font withFamily:family size:nil weight:nil style:nil variant:nil fontVariationSettings:nil scaleMultiplier:1]; } + (UIFont *)updateFont:(UIFont *)font withSize:(NSNumber *)size { - return [self updateFont:font withFamily:nil size:size weight:nil style:nil variant:nil scaleMultiplier:1]; + return [self updateFont:font withFamily:nil size:size weight:nil style:nil variant:nil fontVariationSettings:nil scaleMultiplier:1]; } + (UIFont *)updateFont:(UIFont *)font withWeight:(NSString *)weight { - return [self updateFont:font withFamily:nil size:nil weight:weight style:nil variant:nil scaleMultiplier:1]; + return [self updateFont:font withFamily:nil size:nil weight:weight style:nil variant:nil fontVariationSettings:nil scaleMultiplier:1]; } + (UIFont *)updateFont:(UIFont *)font withStyle:(NSString *)style { - return [self updateFont:font withFamily:nil size:nil weight:nil style:style variant:nil scaleMultiplier:1]; + return [self updateFont:font withFamily:nil size:nil weight:nil style:style variant:nil fontVariationSettings:nil scaleMultiplier:1]; } ++ (UIFont *)updateFont:(UIFont *)font withFontVariationSettings:(NSString *)fontVariationSettings +{ + return [self updateFont:font withFamily:nil size:nil weight:nil style:nil variant:nil fontVariationSettings:fontVariationSettings scaleMultiplier:1]; +} + + + @end diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp b/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp index cd32048480f5..dfc595a3b8e8 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp @@ -43,6 +43,8 @@ void TextAttributes::apply(TextAttributes textAttributes) { fontVariant = textAttributes.fontVariant.has_value() ? textAttributes.fontVariant : fontVariant; + fontVariationSettings = !textAttributes.fontVariationSettings.empty() + ? textAttributes.fontVariationSettings : fontVariationSettings; allowFontScaling = textAttributes.allowFontScaling.has_value() ? textAttributes.allowFontScaling : allowFontScaling; @@ -124,6 +126,7 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { fontWeight, fontStyle, fontVariant, + fontVariationSettings, allowFontScaling, dynamicTypeRamp, alignment, @@ -148,6 +151,7 @@ bool TextAttributes::operator==(const TextAttributes& rhs) const { rhs.fontWeight, rhs.fontStyle, rhs.fontVariant, + rhs.fontVariationSettings, rhs.allowFontScaling, rhs.dynamicTypeRamp, rhs.alignment, @@ -207,6 +211,7 @@ SharedDebugStringConvertibleList TextAttributes::getDebugProps() const { debugStringConvertibleItem("fontWeight", fontWeight), debugStringConvertibleItem("fontStyle", fontStyle), debugStringConvertibleItem("fontVariant", fontVariant), + debugStringConvertibleItem("fontVariationSettings", fontVariationSettings), debugStringConvertibleItem("allowFontScaling", allowFontScaling), debugStringConvertibleItem("dynamicTypeRamp", dynamicTypeRamp), debugStringConvertibleItem("letterSpacing", letterSpacing), diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h b/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h index c8ff0cbd40a4..dc75f24ee744 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/TextAttributes.h @@ -50,6 +50,7 @@ class TextAttributes : public DebugStringConvertible { std::optional fontWeight{}; std::optional fontStyle{}; std::optional fontVariant{}; + std::string fontVariationSettings{""}; std::optional allowFontScaling{}; std::optional dynamicTypeRamp{}; Float letterSpacing{std::numeric_limits::quiet_NaN()}; @@ -120,6 +121,7 @@ struct hash { textAttributes.fontWeight, textAttributes.fontStyle, textAttributes.fontVariant, + textAttributes.fontVariationSettings, textAttributes.allowFontScaling, textAttributes.letterSpacing, textAttributes.textTransform, diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp index 2dfe49020d2e..ba7dbe6b5115 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/text/BaseTextProps.cpp @@ -67,6 +67,13 @@ static TextAttributes convertRawProp( "fontVariant", sourceTextAttributes.fontVariant, defaultTextAttributes.fontVariant); + textAttributes.fontVariationSettings = convertRawProp( + context, + rawProps, + "fontVariationSettings", + sourceTextAttributes.fontVariationSettings, + defaultTextAttributes.fontVariationSettings); + textAttributes.allowFontScaling = convertRawProp( context, rawProps, @@ -258,6 +265,8 @@ void BaseTextProps::setProp( defaults, value, textAttributes, fontStyle, "fontStyle"); REBUILD_FIELD_SWITCH_CASE( defaults, value, textAttributes, fontVariant, "fontVariant"); + REBUILD_FIELD_SWITCH_CASE( + defaults, value, textAttributes, fontVariationSettings, "fontVariationSettings"); REBUILD_FIELD_SWITCH_CASE( defaults, value, textAttributes, allowFontScaling, "allowFontScaling"); REBUILD_FIELD_SWITCH_CASE( diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/TextMeasureCache.h b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/TextMeasureCache.h index 01a981ba0c37..c229388a12aa 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/TextMeasureCache.h +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/TextMeasureCache.h @@ -93,6 +93,7 @@ inline bool areTextAttributesEquivalentLayoutWise( lhs.fontWeight, lhs.fontStyle, lhs.fontVariant, + lhs.fontVariationSettings, lhs.allowFontScaling, lhs.dynamicTypeRamp, lhs.alignment) == @@ -101,6 +102,7 @@ inline bool areTextAttributesEquivalentLayoutWise( rhs.fontWeight, rhs.fontStyle, rhs.fontVariant, + rhs.fontVariationSettings, rhs.allowFontScaling, rhs.dynamicTypeRamp, rhs.alignment) && @@ -121,6 +123,7 @@ inline size_t textAttributesHashLayoutWise( textAttributes.fontWeight, textAttributes.fontStyle, textAttributes.fontVariant, + textAttributes.fontVariationSettings, textAttributes.allowFontScaling, textAttributes.dynamicTypeRamp, textAttributes.letterSpacing, diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm index 74f5b65df133..03f1c2b05041 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm @@ -136,6 +136,7 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex inline static UIFont *RCTEffectiveFontFromTextAttributes(const TextAttributes &textAttributes) { NSString *fontFamily = [NSString stringWithUTF8String:textAttributes.fontFamily.c_str()]; + NSString *fontVariationSettings = [NSString stringWithUTF8String:textAttributes.fontVariationSettings.c_str()]; RCTFontProperties fontProperties; fontProperties.family = fontFamily; @@ -146,6 +147,8 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex fontProperties.variant = textAttributes.fontVariant.has_value() ? RCTFontVariantFromFontVariant(textAttributes.fontVariant.value()) : RCTFontVariantUndefined; + fontProperties.fontVariationSettings = fontVariationSettings; + fontProperties.weight = textAttributes.fontWeight.has_value() ? RCTUIFontWeightFromInteger((NSInteger)textAttributes.fontWeight.value()) : NAN; diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontProperties.h b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontProperties.h index eca30e504683..ed32645847c8 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontProperties.h +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontProperties.h @@ -32,6 +32,7 @@ struct RCTFontProperties { UIFontWeight weight = NAN; RCTFontStyle style = RCTFontStyleUndefined; RCTFontVariant variant = RCTFontVariantUndefined; + NSString *fontVariationSettings = nil; CGFloat sizeMultiplier = NAN; }; diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm index 1ff8c1f231a5..663a02e67ea4 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTFontUtils.mm @@ -31,6 +31,19 @@ static RCTFontProperties RCTDefaultFontProperties() return defaultFontProperties; } +static NSNumber *openTypeTagToNumber(NSString *tag) { + if (tag.length != 4) { + NSLog(@"Error: Tag must be exactly 4 characters long"); + return nil; + } + + const unsigned char* bytes = (const unsigned char*)[tag cStringUsingEncoding:NSUTF8StringEncoding]; + + uint32_t value = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]; + + return @(value); +} + static RCTFontProperties RCTResolveFontProperties( RCTFontProperties fontProperties, RCTFontProperties baseFontProperties) @@ -207,6 +220,53 @@ static RCTFontStyle RCTGetFontStyle(UIFont *font) fontDescriptorByAddingAttributes:@{UIFontDescriptorFeatureSettingsAttribute : fontFeatures}]; font = [UIFont fontWithDescriptor:fontDescriptor size:effectiveFontSize]; } - + + if (fontProperties.fontVariationSettings) { + NSArray *variationSettings = [fontProperties.fontVariationSettings componentsSeparatedByString:@","]; + for (NSString *variationSetting in variationSettings) { + NSString *trimmedSetting = [variationSetting stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + NSArray *setting = [trimmedSetting componentsSeparatedByString:@" "]; + + if (setting.count != 2) { + NSLog(@"Error: Setting does not contain exactly 2 components. Setting: %@", setting); + continue; + } + + NSString *attribute = [[[setting[0] + stringByReplacingOccurrencesOfString:@"\"" withString:@""] + stringByReplacingOccurrencesOfString:@"\'" withString:@""] + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + NSString *value = [setting[1] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + if (attribute.length == 0 || value.length == 0) { + NSLog(@"Error: Invalid attribute or value. Attribute: %@, Value: %@", attribute, value); + continue; + } + + NSNumber *tag = openTypeTagToNumber(attribute); + if (!tag) { + NSLog(@"Error: Invalid attribute in fontVariationSettings: %@", attribute); + continue; + } + + NSNumber *valueNumber = @([value intValue]); + NSDictionary *variations = @{tag: valueNumber}; + + UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:@{ + UIFontDescriptorNameAttribute: fontProperties.family, + (NSString *)kCTFontVariationAttribute: variations + }]; + + if (!fontDescriptor) { + NSLog(@"Error: Could not create font descriptor with variations. Variations: %@", variations); + continue; + } + + UIFontDescriptor *existingFontDescriptors = font.fontDescriptor; + UIFontDescriptor *mergedFontDescriptor = [existingFontDescriptors fontDescriptorByAddingAttributes:fontDescriptor.fontAttributes]; + font = [UIFont fontWithDescriptor:mergedFontDescriptor size:effectiveFontSize]; + } + } return font; } diff --git a/packages/rn-tester/MaterialSymbolsSharp.ttf b/packages/rn-tester/MaterialSymbolsSharp.ttf new file mode 100644 index 000000000000..a0ab3cfc537e Binary files /dev/null and b/packages/rn-tester/MaterialSymbolsSharp.ttf differ diff --git a/packages/rn-tester/RNTester/Info.plist b/packages/rn-tester/RNTester/Info.plist index 50c8a4c0f3dd..dc23574a1b8a 100644 --- a/packages/rn-tester/RNTester/Info.plist +++ b/packages/rn-tester/RNTester/Info.plist @@ -46,6 +46,11 @@ You need to add NSLocationWhenInUseUsageDescription key in Info.plist to enable geolocation, otherwise it is going to *fail silently*! NSPhotoLibraryUsageDescription You need to add NSPhotoLibraryUsageDescription key in Info.plist to enable photo library usage, otherwise it is going to *fail silently*! + UIAppFonts + + Inter.ttf + MaterialSymbolsSharp.ttf + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/packages/rn-tester/RNTester/Inter.ttf b/packages/rn-tester/RNTester/Inter.ttf new file mode 100644 index 000000000000..e72470871b8f Binary files /dev/null and b/packages/rn-tester/RNTester/Inter.ttf differ diff --git a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj index bbb6acb82c0f..fcf550046286 100644 --- a/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj +++ b/packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ 5C60EB1C226440DB0018C04F /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C60EB1B226440DB0018C04F /* AppDelegate.mm */; }; 8145AE06241172D900A3F8DA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8145AE05241172D900A3F8DA /* LaunchScreen.storyboard */; }; 832F45BB2A8A6E1F0097B4E6 /* SwiftTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 832F45BA2A8A6E1F0097B4E6 /* SwiftTest.swift */; }; + A0C2918F2C00907C0002C486 /* MaterialSymbolsSharp.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A0C2918E2C00907C0002C486 /* MaterialSymbolsSharp.ttf */; }; + A0D0A7092BFF5337006363FD /* Inter.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A0D0A7082BFF5337006363FD /* Inter.ttf */; }; BEB82277FE76227A15DED9EF /* libPods-RNTesterIntegrationTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77E101C7D8E22A8E70EE76DF /* libPods-RNTesterIntegrationTests.a */; }; CD10C7A5290BD4EB0033E1ED /* RCTEventEmitterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CD10C7A4290BD4EB0033E1ED /* RCTEventEmitterTests.m */; }; D626973C1F0D4ABDE2F9028A /* libPods-RNTesterUnitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D8DE57E3292D41E28251988A /* libPods-RNTesterUnitTests.a */; }; @@ -98,6 +100,8 @@ 832F45BA2A8A6E1F0097B4E6 /* SwiftTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SwiftTest.swift; path = RNTester/SwiftTest.swift; sourceTree = ""; }; 8BFB9C61D7BDE894E24BF24F /* Pods-RNTesterUnitTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterUnitTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterUnitTests/Pods-RNTesterUnitTests.release.xcconfig"; sourceTree = ""; }; 9B8542B8C590B51BD0588751 /* Pods-RNTester.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTester.release.xcconfig"; path = "Target Support Files/Pods-RNTester/Pods-RNTester.release.xcconfig"; sourceTree = ""; }; + A0C2918E2C00907C0002C486 /* MaterialSymbolsSharp.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = MaterialSymbolsSharp.ttf; sourceTree = ""; }; + A0D0A7082BFF5337006363FD /* Inter.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = Inter.ttf; path = RNTester/Inter.ttf; sourceTree = ""; }; AC474BFB29BBD4A1002BDAED /* RNTester.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = RNTester.xctestplan; path = RNTester/RNTester.xctestplan; sourceTree = ""; }; CD10C7A4290BD4EB0033E1ED /* RCTEventEmitterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTEventEmitterTests.m; sourceTree = ""; }; D74056A5352F0925816E50E0 /* libPods-RNTester.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RNTester.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -209,6 +213,8 @@ 13B07FAE1A68108700A75B9A /* RNTester */ = { isa = PBXGroup; children = ( + A0C2918E2C00907C0002C486 /* MaterialSymbolsSharp.ttf */, + A0D0A7082BFF5337006363FD /* Inter.ttf */, F0D621C22BBB9E38005960AC /* PrivacyInfo.xcprivacy */, AC474BFB29BBD4A1002BDAED /* RNTester.xctestplan */, E771AEEA22B44E3100EA1189 /* Info.plist */, @@ -479,6 +485,8 @@ buildActionMask = 2147483647; files = ( 2DDEF0101F84BF7B00DBDF73 /* Images.xcassets in Resources */, + A0C2918F2C00907C0002C486 /* MaterialSymbolsSharp.ttf in Resources */, + A0D0A7092BFF5337006363FD /* Inter.ttf in Resources */, 8145AE06241172D900A3F8DA /* LaunchScreen.storyboard in Resources */, F0D621C32BBB9E38005960AC /* PrivacyInfo.xcprivacy in Resources */, 3D2AFAF51D646CF80089D1A3 /* legacy_image@2x.png in Resources */, diff --git a/packages/rn-tester/js/examples/Text/TextExample.ios.js b/packages/rn-tester/js/examples/Text/TextExample.ios.js index d1608ad8ca0c..5ccda4492c32 100644 --- a/packages/rn-tester/js/examples/Text/TextExample.ios.js +++ b/packages/rn-tester/js/examples/Text/TextExample.ios.js @@ -719,6 +719,99 @@ const examples = [ ); }, }, + { + title: 'Variable Font Settings', + render: function (): React.Node { + return ( + <> + + Inter wght 100 + + + Inter wght 150 + + + Inter wght 200 + + + Inter wght 250 + + + Inter wght 300 + + + Inter wght 350 + + + Inter wght 400 + + + Inter wght 450 + + + Inter wght 500 + + + Inter wght 550 + + + Inter wght 600 + + + Inter wght 650 + + + Inter wght 700 + + + Inter wght 750 + + + Inter wght 800 + + + Inter wght 1000 w/ tabular-nums + + + {String.fromCodePoint(59576)} + + + {String.fromCodePoint(59576)} + + + ); + }, + }, { title: 'Text Decoration', render: function (): React.Node {