From e20a649b8c80fb92c5253e67f9f2c3eafca277cb Mon Sep 17 00:00:00 2001 From: Peter Abbondanzo Date: Fri, 4 Sep 2026 14:34:08 -0700 Subject: [PATCH] Add longest-line sizing for wrapped Text Summary: Add `textWidthMode="longest-line"` to size wrapped `Text` to its widest rendered line on Android and iOS. This keeps content-proportional spacing in horizontal layouts without an `onTextLayout` round trip; the default measurement behavior is unchanged. Changelog: [General][Added] - Add `textWidthMode="longest-line"` for sizing wrapped `Text` to its widest rendered line. Differential Revision: D118718410 --- .../Libraries/Text/TextNativeComponent.js | 1 + .../react-native/Libraries/Text/TextProps.js | 9 ++ .../react/views/text/TextLayoutManager.kt | 70 ++++++++++++---- .../TextLayoutManagerLongestLineWidthTest.kt | 47 +++++++++++ .../attributedstring/ParagraphAttributes.cpp | 4 + .../attributedstring/ParagraphAttributes.h | 3 + .../renderer/attributedstring/conversions.h | 44 ++++++++++ .../renderer/attributedstring/primitives.h | 5 ++ .../tests/ParagraphAttributesTest.cpp | 8 ++ .../components/text/BaseParagraphProps.cpp | 2 + .../textlayoutmanager/RCTTextLayoutManager.mm | 2 +- packages/react-native/ReactNativeApi.d.ts | 9 +- .../types_DEPRECATED/Libraries/Text/Text.d.ts | 5 ++ .../screenshots/text-width-mode-android.png | Bin 0 -> 29680 bytes .../screenshots/text-width-mode-ios.png | Bin 0 -> 33737 bytes .../rn-tester/.maestro/text-width-mode.yml | 27 ++++++ .../js/examples/Text/TextExample.android.js | 8 ++ .../js/examples/Text/TextExample.ios.js | 8 ++ .../js/examples/Text/TextWidthModeExample.js | 79 ++++++++++++++++++ .../api-snapshots/ReactAndroidDebugCxx.api | 9 ++ .../api-snapshots/ReactAndroidNewarchCxx.api | 9 ++ .../api-snapshots/ReactAndroidReleaseCxx.api | 9 ++ .../api-snapshots/ReactAppleDebugCxx.api | 8 ++ .../api-snapshots/ReactAppleNewarchCxx.api | 8 ++ .../api-snapshots/ReactAppleReleaseCxx.api | 8 ++ .../api-snapshots/ReactCommonDebugCxx.api | 8 ++ .../api-snapshots/ReactCommonNewarchCxx.api | 8 ++ .../api-snapshots/ReactCommonReleaseCxx.api | 8 ++ 28 files changed, 387 insertions(+), 19 deletions(-) create mode 100644 packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/TextLayoutManagerLongestLineWidthTest.kt create mode 100644 packages/rn-tester/.maestro/screenshots/text-width-mode-android.png create mode 100644 packages/rn-tester/.maestro/screenshots/text-width-mode-ios.png create mode 100644 packages/rn-tester/.maestro/text-width-mode.yml create mode 100644 packages/rn-tester/js/examples/Text/TextWidthModeExample.js diff --git a/packages/react-native/Libraries/Text/TextNativeComponent.js b/packages/react-native/Libraries/Text/TextNativeComponent.js index 11c869113337..774de082ea52 100644 --- a/packages/react-native/Libraries/Text/TextNativeComponent.js +++ b/packages/react-native/Libraries/Text/TextNativeComponent.js @@ -44,6 +44,7 @@ const textViewConfig = { adjustsFontSizeToFit: true, minimumFontScale: true, textBreakStrategy: true, + textWidthMode: true, onTextLayout: true, dataDetectorType: true, android_hyphenationFrequency: true, diff --git a/packages/react-native/Libraries/Text/TextProps.js b/packages/react-native/Libraries/Text/TextProps.js index 38e9899f2dfc..59364310fe6f 100644 --- a/packages/react-native/Libraries/Text/TextProps.js +++ b/packages/react-native/Libraries/Text/TextProps.js @@ -181,6 +181,15 @@ type TextBaseProps = Readonly<{ */ numberOfLines?: ?number, + /** + * Controls how wrapped text contributes its width to layout. `longest-line` + * uses the width of the longest rendered line instead of the wrapping + * constraint. + * + * @default `'default'` + */ + textWidthMode?: ?('default' | 'longest-line'), + onLayout?: ?(event: LayoutChangeEvent) => unknown, /** Called on long press. */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt index 66e6f24fbb0a..1a1a0371d278 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt @@ -96,6 +96,7 @@ internal object TextLayoutManager { const val PA_KEY_MINIMUM_FONT_SIZE: Int = 6 const val PA_KEY_MAXIMUM_FONT_SIZE: Int = 7 const val PA_KEY_TEXT_ALIGN_VERTICAL: Int = 8 + const val PA_KEY_TEXT_WIDTH_MODE: Int = 9 private val TAG: String = TextLayoutManager::class.java.simpleName @@ -110,6 +111,8 @@ internal object TextLayoutManager { private const val DEFAULT_ADJUST_FONT_SIZE_TO_FIT = false + private const val TEXT_WIDTH_MODE_LONGEST_LINE = "longest-line" + private val tagToSpannableCache = ConcurrentHashMap() // Lazily cached Method for StaticLayout.Builder.setUseBoundsForWidth (API 35+). @@ -1065,21 +1068,48 @@ internal object TextLayoutManager { ) } + var layout = createLayout( + text, + boring, + width, + widthYogaMeasureMode, + includeFontPadding, + textBreakStrategy, + hyphenationFrequency, + alignment, + justificationMode, + ellipsizeMode, + maximumNumberOfLines, + paint, + ) + + if ( + widthYogaMeasureMode == YogaMeasureMode.AT_MOST && + paragraphAttributes.contains(PA_KEY_TEXT_WIDTH_MODE) && + paragraphAttributes.getString(PA_KEY_TEXT_WIDTH_MODE) == TEXT_WIDTH_MODE_LONGEST_LINE + ) { + val lineCount = calculateLineCount(layout, maximumNumberOfLines) + val longestLineWidth = longestLineWidth(layout, lineCount) + val tightenedWidth = max(1, ceil(longestLineWidth).toInt()) + if (tightenedWidth < layout.width) { + layout = + buildLayout( + text, + tightenedWidth, + includeFontPadding, + textBreakStrategy, + hyphenationFrequency, + alignment, + justificationMode, + ellipsizeMode, + maximumNumberOfLines, + paint, + ) + } + } + return CreateLayoutResult( - createLayout( - text, - boring, - width, - widthYogaMeasureMode, - includeFontPadding, - textBreakStrategy, - hyphenationFrequency, - alignment, - justificationMode, - ellipsizeMode, - maximumNumberOfLines, - paint, - ), + layout, textBreakStrategy, justificationMode, ) @@ -1471,6 +1501,18 @@ internal object TextLayoutManager { layout.lineCount else min(maximumNumberOfLines, layout.lineCount) + @VisibleForTesting + internal fun longestLineWidth(layout: Layout, lineCount: Int): Float { + var longestLineWidth = 0f + for (line in 0 until lineCount) { + val lineEnd = layout.getLineEnd(line) + val endsWithNewLine = lineEnd > 0 && layout.text[lineEnd - 1] == '\n' + val lineWidth = if (endsWithNewLine) layout.getLineMax(line) else layout.getLineWidth(line) + longestLineWidth = max(longestLineWidth, lineWidth) + } + return longestLineWidth + } + private fun calculateWidth( layout: Layout, text: Spanned, diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/TextLayoutManagerLongestLineWidthTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/TextLayoutManagerLongestLineWidthTest.kt new file mode 100644 index 000000000000..49ce97ec717a --- /dev/null +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/views/text/TextLayoutManagerLongestLineWidthTest.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.views.text + +import android.text.Layout +import android.text.SpannableString +import android.text.StaticLayout +import android.text.TextPaint +import kotlin.math.ceil +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config + +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [34]) +class TextLayoutManagerLongestLineWidthTest { + + @Test + fun `longest line width tightens a wrapped layout without adding a line`() { + val text = SpannableString("Sitting, Standing,\nRoomscale") + val paint = TextPaint(TextPaint.ANTI_ALIAS_FLAG).apply { textSize = 16f } + val layout = createLayout(text, paint, 20) + + assertThat(layout.lineCount).isGreaterThan(1) + + val tightenedWidth = ceil(TextLayoutManager.longestLineWidth(layout, layout.lineCount)).toInt() + val tightenedLayout = createLayout(text, paint, tightenedWidth) + + assertThat(tightenedWidth).isLessThan(layout.width) + assertThat(tightenedLayout.lineCount).isEqualTo(layout.lineCount) + assertThat(TextLayoutManager.longestLineWidth(tightenedLayout, tightenedLayout.lineCount)) + .isLessThanOrEqualTo(tightenedWidth.toFloat()) + } + + private fun createLayout(text: SpannableString, paint: TextPaint, width: Int): Layout = + StaticLayout.Builder.obtain(text, 0, text.length, paint, width) + .setBreakStrategy(Layout.BREAK_STRATEGY_HIGH_QUALITY) + .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE) + .build() +} diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.cpp b/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.cpp index 4eac922716fb..98992aa2287a 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.cpp +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.cpp @@ -19,6 +19,7 @@ bool ParagraphAttributes::operator==(const ParagraphAttributes& rhs) const { maximumNumberOfLines, ellipsizeMode, textBreakStrategy, + textWidthMode, adjustsFontSizeToFit, includeFontPadding, android_hyphenationFrequency, @@ -27,6 +28,7 @@ bool ParagraphAttributes::operator==(const ParagraphAttributes& rhs) const { rhs.maximumNumberOfLines, rhs.ellipsizeMode, rhs.textBreakStrategy, + rhs.textWidthMode, rhs.adjustsFontSizeToFit, rhs.includeFontPadding, rhs.android_hyphenationFrequency, @@ -52,6 +54,8 @@ SharedDebugStringConvertibleList ParagraphAttributes::getDebugProps() const { "textBreakStrategy", textBreakStrategy, paragraphAttributes.textBreakStrategy), + debugStringConvertibleItem( + "textWidthMode", textWidthMode, paragraphAttributes.textWidthMode), debugStringConvertibleItem( "adjustsFontSizeToFit", adjustsFontSizeToFit, diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h b/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h index 367ec8c3e0d7..84bda3ade630 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h @@ -46,6 +46,8 @@ class ParagraphAttributes : public DebugStringConvertible { */ TextBreakStrategy textBreakStrategy{TextBreakStrategy::HighQuality}; + TextWidthMode textWidthMode{TextWidthMode::Default}; + /* * Enables font size adjustment to fit constrained boundaries. */ @@ -103,6 +105,7 @@ struct hash { attributes.maximumNumberOfLines, attributes.ellipsizeMode, attributes.textBreakStrategy, + attributes.textWidthMode, attributes.adjustsFontSizeToFit, attributes.minimumFontSize, attributes.maximumFontSize, diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h index beed96737801..6cb7ac77d2a1 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h @@ -202,6 +202,42 @@ inline void fromRawValue(const PropsParserContext &context, const RawValue &valu result = TextBreakStrategy::HighQuality; } +inline std::string toString(const TextWidthMode &textWidthMode) +{ + switch (textWidthMode) { + case TextWidthMode::Default: + return "default"; + case TextWidthMode::LongestLine: + return "longest-line"; + } + + LOG(ERROR) << "Unsupported TextWidthMode value"; + react_native_expect(false); + return "default"; +} + +inline void fromRawValue(const PropsParserContext & /*context*/, const RawValue &value, TextWidthMode &result) +{ + react_native_expect(value.hasType()); + if (value.hasType()) { + auto string = (std::string)value; + if (string == "default") { + result = TextWidthMode::Default; + } else if (string == "longest-line") { + result = TextWidthMode::LongestLine; + } else { + LOG(ERROR) << "Unsupported TextWidthMode value: " << string; + react_native_expect(false); + result = TextWidthMode::Default; + } + return; + } + + LOG(ERROR) << "Unsupported TextWidthMode type"; + react_native_expect(false); + result = TextWidthMode::Default; +} + inline void fromRawValue(const PropsParserContext &context, const RawValue &value, FontWeight &result) { react_native_expect(value.hasType() || value.hasType()); @@ -1029,6 +1065,12 @@ inline ParagraphAttributes convertRawProp( "textBreakStrategy", sourceParagraphAttributes.textBreakStrategy, defaultParagraphAttributes.textBreakStrategy); + paragraphAttributes.textWidthMode = convertRawProp( + context, + rawProps, + "textWidthMode", + sourceParagraphAttributes.textWidthMode, + defaultParagraphAttributes.textWidthMode); paragraphAttributes.adjustsFontSizeToFit = convertRawProp( context, rawProps, @@ -1158,6 +1200,7 @@ constexpr static MapBuffer::Key PA_KEY_HYPHENATION_FREQUENCY = 5; constexpr static MapBuffer::Key PA_KEY_MINIMUM_FONT_SIZE = 6; constexpr static MapBuffer::Key PA_KEY_MAXIMUM_FONT_SIZE = 7; constexpr static MapBuffer::Key PA_KEY_TEXT_ALIGN_VERTICAL = 8; +constexpr static MapBuffer::Key PA_KEY_TEXT_WIDTH_MODE = 9; inline MapBuffer toMapBuffer(const ParagraphAttributes ¶graphAttributes) { @@ -1165,6 +1208,7 @@ inline MapBuffer toMapBuffer(const ParagraphAttributes ¶graphAttributes) builder.putInt(PA_KEY_MAX_NUMBER_OF_LINES, paragraphAttributes.maximumNumberOfLines); builder.putString(PA_KEY_ELLIPSIZE_MODE, toString(paragraphAttributes.ellipsizeMode)); builder.putString(PA_KEY_TEXT_BREAK_STRATEGY, toString(paragraphAttributes.textBreakStrategy)); + builder.putString(PA_KEY_TEXT_WIDTH_MODE, toString(paragraphAttributes.textWidthMode)); builder.putBool(PA_KEY_ADJUST_FONT_SIZE_TO_FIT, paragraphAttributes.adjustsFontSizeToFit); builder.putBool(PA_KEY_INCLUDE_FONT_PADDING, paragraphAttributes.includeFontPadding); builder.putString(PA_KEY_HYPHENATION_FREQUENCY, toString(paragraphAttributes.android_hyphenationFrequency)); diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/primitives.h b/packages/react-native/ReactCommon/react/renderer/attributedstring/primitives.h index 37ad9265edc6..d88bd6c5049b 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/primitives.h @@ -92,6 +92,11 @@ enum class TextBreakStrategy { Balanced // Balances line lengths. }; +enum class TextWidthMode { + Default, + LongestLine, +}; + enum class TextAlignment { Natural, // Indicates the default alignment for script. Left, // Visually left aligned. diff --git a/packages/react-native/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp b/packages/react-native/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp index b5d4a47ed1fc..16d267644df7 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp @@ -70,4 +70,12 @@ TEST( EXPECT_FALSE(unset == set); } +TEST(ParagraphAttributesTest, testOperatorEqualsIncludesTextWidthMode) { + ParagraphAttributes defaultWidth{}; + ParagraphAttributes longestLineWidth{}; + longestLineWidth.textWidthMode = TextWidthMode::LongestLine; + + EXPECT_FALSE(defaultWidth == longestLineWidth); +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.cpp b/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.cpp index 9cd9fdbfbc61..db3f632e3a05 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/text/BaseParagraphProps.cpp @@ -80,6 +80,8 @@ void BaseParagraphProps::setProp( paragraphAttributes, textBreakStrategy, "textBreakStrategy"); + REBUILD_FIELD_SWITCH_CASE( + paDefaults, value, paragraphAttributes, textWidthMode, "textWidthMode"); REBUILD_FIELD_SWITCH_CASE( paDefaults, value, diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm index 5f9847a398fa..adadeee91fe5 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm @@ -568,7 +568,7 @@ - (TextMeasurement)_measureTextStorage:(NSTextStorage *)textStorage CGRect usedBounds = [layoutManager usedRectForTextContainer:textContainer]; CGSize size = usedBounds.size; - if (textDidWrap) { + if (textDidWrap && paragraphAttributes.textWidthMode == TextWidthMode::Default) { size.width = textContainer.size.width; } diff --git a/packages/react-native/ReactNativeApi.d.ts b/packages/react-native/ReactNativeApi.d.ts index e1654b681c24..2f1a12b7474e 100644 --- a/packages/react-native/ReactNativeApi.d.ts +++ b/packages/react-native/ReactNativeApi.d.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * * This file was generated by scripts/js-api/build-types/index.js. */ @@ -4872,6 +4872,7 @@ declare type TextBaseProps = { readonly selectable?: boolean readonly style?: TextStyleProp readonly testID?: string + readonly textWidthMode?: "default" | "longest-line" } declare type TextContentType = | "addressCity" @@ -5756,7 +5757,7 @@ export { AlertOptions, // 8a116d2a AlertType, // 5ab91217 AndroidKeyboardEvent, // e03becc8 - Animated, // b73ca27a + Animated, // 57868d99 AppConfig, // 35c0ca70 AppRegistry, // eb82174d AppState, // 12012be5 @@ -5989,7 +5990,7 @@ export { TVViewPropsIOS, // 330ce7b5 TargetedEvent, // 16e98910 TaskProvider, // 266dedf2 - Text, // 3ccd8020 + Text, // ea238168 TextContentType, // 239b3ecc TextInput, // 89af456b TextInputAndroidProps, // 9ebbc103 @@ -6006,7 +6007,7 @@ export { TextInputSubmitEditingEvent, // 6bcb2aa5 TextInstance, // 05463a96 TextLayoutEvent, // 3f54186f - TextProps, // 2e3336ca + TextProps, // f8e8ca49 TextStyle, // d7678842 ToastAndroid, // 88a8969a TouchableHighlight, // edab1b07 diff --git a/packages/react-native/types_DEPRECATED/Libraries/Text/Text.d.ts b/packages/react-native/types_DEPRECATED/Libraries/Text/Text.d.ts index 25d8d8abe1ef..0fa34d1ae135 100644 --- a/packages/react-native/types_DEPRECATED/Libraries/Text/Text.d.ts +++ b/packages/react-native/types_DEPRECATED/Libraries/Text/Text.d.ts @@ -140,6 +140,11 @@ export interface TextProps */ numberOfLines?: number | undefined; + /** + * Controls how wrapped text contributes its width to layout. + */ + textWidthMode?: 'default' | 'longest-line' | undefined; + /** * Invoked on mount and layout changes with * diff --git a/packages/rn-tester/.maestro/screenshots/text-width-mode-android.png b/packages/rn-tester/.maestro/screenshots/text-width-mode-android.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb7bdeaf087bc3b51473c5f2814b04131160392 GIT binary patch literal 29680 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 b{Kb`y{Q#n7v1B(ua*8D{qaqEHdKvIPMBDjT literal 0 HcmV?d00001 diff --git a/packages/rn-tester/.maestro/screenshots/text-width-mode-ios.png b/packages/rn-tester/.maestro/screenshots/text-width-mode-ios.png new file mode 100644 index 0000000000000000000000000000000000000000..293a2a35985cac86e8410a8bdbac061644545b31 GIT binary patch literal 33737 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 QwL?j~k$qkCO2_B_1BHPf3jhEB literal 0 HcmV?d00001 diff --git a/packages/rn-tester/.maestro/text-width-mode.yml b/packages/rn-tester/.maestro/text-width-mode.yml new file mode 100644 index 000000000000..304f636736bc --- /dev/null +++ b/packages/rn-tester/.maestro/text-width-mode.yml @@ -0,0 +1,27 @@ +appId: ${APP_ID} +tags: + - local-screenshot-baseline +--- +- runFlow: ./helpers/launch-app-and-search.yml +- inputText: 'Text' +- assertVisible: + id: 'Text' +- tapOn: + id: 'Text' +- assertVisible: + id: 'example_search' +- tapOn: + id: 'example_search' +- inputText: 'Wrapped text width mode' +- hideKeyboard +- scrollUntilVisible: + element: + id: 'text-width-mode-example' + direction: DOWN + speed: 40 + timeout: 10000 +- assertScreenshot: + path: screenshots/text-width-mode-${maestro.platform} + cropOn: + id: 'text-width-mode-example' + thresholdPercentage: 95 diff --git a/packages/rn-tester/js/examples/Text/TextExample.android.js b/packages/rn-tester/js/examples/Text/TextExample.android.js index a88bef0bac79..feb7d877deb3 100644 --- a/packages/rn-tester/js/examples/Text/TextExample.android.js +++ b/packages/rn-tester/js/examples/Text/TextExample.android.js @@ -17,6 +17,7 @@ import RNTesterText from '../../components/RNTesterText'; import TextLegend from '../../components/TextLegend'; import TextAdjustsDynamicLayoutExample from './TextAdjustsDynamicLayoutExample'; import TextSharedExamples from './TextSharedExamples'; +import TextWidthModeExample from './TextWidthModeExample'; const TextInlineView = require('../../components/TextInlineView'); const React = require('react'); @@ -1336,6 +1337,13 @@ function TextBaseLineLayoutExample(props: {}): React.Node { } const examples = [ + { + title: 'Wrapped text width mode', + name: 'textWidthMode', + description: + 'Compares default constrained text width with text sized to its longest rendered line.', + render: TextWidthModeExample, + }, { title: 'Background Color and Border Width', name: 'background-border-width', diff --git a/packages/rn-tester/js/examples/Text/TextExample.ios.js b/packages/rn-tester/js/examples/Text/TextExample.ios.js index b607c5094c01..603c739cc1c8 100644 --- a/packages/rn-tester/js/examples/Text/TextExample.ios.js +++ b/packages/rn-tester/js/examples/Text/TextExample.ios.js @@ -16,6 +16,7 @@ import hotdog from '../../assets/hotdog.jpg'; import RNTesterText from '../../components/RNTesterText'; import TextLegend from '../../components/TextLegend'; import TextSharedExamples from './TextSharedExamples'; +import TextWidthModeExample from './TextWidthModeExample'; const TextInlineView = require('../../components/TextInlineView'); const React = require('react'); @@ -571,6 +572,13 @@ class TextWithCapBaseBox extends React.Component< } const examples = [ + { + title: 'Wrapped text width mode', + name: 'textWidthMode', + description: + 'Compares default constrained text width with text sized to its longest rendered line.', + render: TextWidthModeExample, + }, { title: 'iOS System Font Families (iOS only)', name: 'iOSSystemFontFamilies', diff --git a/packages/rn-tester/js/examples/Text/TextWidthModeExample.js b/packages/rn-tester/js/examples/Text/TextWidthModeExample.js new file mode 100644 index 000000000000..682051c393a0 --- /dev/null +++ b/packages/rn-tester/js/examples/Text/TextWidthModeExample.js @@ -0,0 +1,79 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +'use strict'; + +import RNTesterText from '../../components/RNTesterText'; +import * as React from 'react'; +import {ScrollView, StyleSheet, Text, View} from 'react-native'; + +const LABELS = [ + 'Comfort: Moderate', + 'Sitting, Standing, Roomscale', + 'Touch Controllers', +]; + +component TextWidthModeRow(testID: string, textWidthMode?: 'longest-line') { + return ( + + {LABELS.map(label => ( + + + {label} + + + ))} + + ); +} + +export default component TextWidthModeExample() { + return ( + + Default width + + Longest rendered line + + + ); +} + +const styles = StyleSheet.create({ + example: { + gap: 24, + }, + item: { + alignItems: 'flex-start', + flexDirection: 'row', + flexShrink: 1, + maxWidth: 120, + }, + row: { + alignItems: 'flex-start', + flexDirection: 'row', + gap: 16, + }, + text: { + backgroundColor: '#ff8a80', + color: '#111111', + flexShrink: 1, + fontSize: 12, + }, +}); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index dbc39b765f3d..eab43b8b6106 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -512,6 +512,7 @@ static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_MAX_NUM static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_MINIMUM_FONT_SIZE; static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_ALIGN_VERTICAL; static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_BREAK_STRATEGY; +static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_WIDTH_MODE; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ACCESSIBILITY_ROLE; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ALIGNMENT; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ALIGNMENT_VERTICAL; @@ -992,6 +993,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -1139,6 +1141,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -4022,6 +4025,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::Float minimumFontSize; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -6689,6 +6693,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index 2e0f57b22350..cab9928cdbbc 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -512,6 +512,7 @@ static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_MAX_NUM static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_MINIMUM_FONT_SIZE; static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_ALIGN_VERTICAL; static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_BREAK_STRATEGY; +static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_WIDTH_MODE; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ACCESSIBILITY_ROLE; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ALIGNMENT; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ALIGNMENT_VERTICAL; @@ -990,6 +991,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -1135,6 +1137,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -3876,6 +3879,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::Float minimumFontSize; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -6499,6 +6503,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index c057c28b79b9..0c0ae1ea8f1a 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -512,6 +512,7 @@ static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_MAX_NUM static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_MINIMUM_FONT_SIZE; static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_ALIGN_VERTICAL; static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_BREAK_STRATEGY; +static constexpr facebook::react::MapBuffer::Key facebook::react::PA_KEY_TEXT_WIDTH_MODE; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ACCESSIBILITY_ROLE; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ALIGNMENT; static constexpr facebook::react::MapBuffer::Key facebook::react::TA_KEY_ALIGNMENT_VERTICAL; @@ -992,6 +993,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -1139,6 +1141,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -4019,6 +4022,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::Float minimumFontSize; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -6680,6 +6684,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index c23703c476a3..d7681157deba 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -3838,6 +3838,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -3986,6 +3987,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -6221,6 +6223,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::Float minimumFontSize; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -8872,6 +8875,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index 95f5e8b375fc..fcb694cd5fed 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -3828,6 +3828,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -3975,6 +3976,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -6107,6 +6109,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::Float minimumFontSize; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -8714,6 +8717,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 9e9d12b2d5f0..5e82b53248cb 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -3838,6 +3838,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -3986,6 +3987,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -6218,6 +6220,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::Float minimumFontSize; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -8863,6 +8866,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index 97903e19cc4c..418fd46b085a 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -563,6 +563,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -698,6 +699,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -2636,6 +2638,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::EllipsizeMode ellipsizeMode; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -5010,6 +5013,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api index 48a176dc7040..f9ea5eae0771 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api @@ -561,6 +561,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -695,6 +696,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -2530,6 +2532,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::EllipsizeMode ellipsizeMode; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -4860,6 +4863,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index 3eef4b97c942..1081546cfe27 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -563,6 +563,7 @@ std::string facebook::react::toString(const facebook::react::TextBreakStrategy& std::string facebook::react::toString(const facebook::react::TextDecorationLineType& textDecorationLineType); std::string facebook::react::toString(const facebook::react::TextDecorationStyle& textDecorationStyle); std::string facebook::react::toString(const facebook::react::TextTransform& textTransform); +std::string facebook::react::toString(const facebook::react::TextWidthMode& textWidthMode); std::string facebook::react::toString(const facebook::react::WritingDirection& writingDirection); std::string facebook::react::toString(double doubleValue, char suffix); std::string facebook::react::toString(facebook::react::AccessibilityLiveRegion accessibilityLiveRegion); @@ -698,6 +699,7 @@ void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, c void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Size& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::SubmitBehavior& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextAlignmentVertical& result); +void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TextWidthMode& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::ValueUnit& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::BoxSizing& result); void facebook::react::fromRawValue(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::yoga::Style::SizeLength& result); @@ -2633,6 +2635,7 @@ class facebook::react::ParagraphAttributes : public facebook::react::DebugString public facebook::react::EllipsizeMode ellipsizeMode; public facebook::react::HyphenationFrequency android_hyphenationFrequency; public facebook::react::TextBreakStrategy textBreakStrategy; + public facebook::react::TextWidthMode textWidthMode; public int maximumNumberOfLines; public std::optional textAlignVertical; } @@ -5001,6 +5004,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Default, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval,