From 75ca17713db49d314e859df3e3a028fbece7c124 Mon Sep 17 00:00:00 2001 From: Peter Abbondanzo Date: Wed, 9 Sep 2026 14:49:05 -0700 Subject: [PATCH] Add experimental longest-line sizing for wrapped Text (#58351) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58351 Add `experimental_textWidthMode` as a Text style for sizing wrapped text to its widest rendered line on Android and iOS. The `auto` value preserves the existing constrained measurement behavior, while `longest-line` removes unused horizontal space without changing the line count. Changelog: [General][Added] - Add experimental longest-line width sizing for wrapped `Text` Reviewed By: javache Differential Revision: D118718410 --- .../View/ReactNativeStyleAttributes.js | 1 + .../Libraries/StyleSheet/StyleSheetTypes.js | 8 ++ .../react/views/text/TextLayoutManager.kt | 56 +++++++++-- .../TextLayoutManagerLongestLineWidthTest.kt | 47 +++++++++ .../attributedstring/ParagraphAttributes.cpp | 4 + .../attributedstring/ParagraphAttributes.h | 3 + .../renderer/attributedstring/conversions.h | 44 +++++++++ .../renderer/attributedstring/primitives.h | 5 + .../tests/ParagraphAttributesTest.cpp | 13 +++ .../components/text/BaseParagraphProps.cpp | 6 ++ .../textlayoutmanager/RCTTextLayoutManager.mm | 2 +- .../Libraries/StyleSheet/StyleSheetTypes.d.ts | 4 + .../screenshots/text-width-mode-android.png | Bin 0 -> 10474 bytes .../screenshots/text-width-mode-ios.png | Bin 0 -> 49730 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 | 89 ++++++++++++++++++ .../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 ++ 27 files changed, 393 insertions(+), 7 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/Components/View/ReactNativeStyleAttributes.js b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js index db39c72950ef..e869e9fa41d5 100644 --- a/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js +++ b/packages/react-native/Libraries/Components/View/ReactNativeStyleAttributes.js @@ -265,6 +265,7 @@ const ReactNativeStyleAttributes: {[string]: AnyAttributeType, ...} = { * Text */ color: colorAttribute, + experimental_textWidthMode: true, fontFamily: true, fontSize: true, fontStyle: true, diff --git a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js index 5a1951a1e2c6..c46d61527332 100644 --- a/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js +++ b/packages/react-native/Libraries/StyleSheet/StyleSheetTypes.js @@ -1007,6 +1007,14 @@ export type ____FontVariationSettings_Internal = type ____TextStyle_InternalBase = Readonly<{ color?: ____ColorValue_Internal, + /** + * 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 `'auto'` + */ + experimental_textWidthMode?: 'auto' | 'longest-line', fontFamily?: string, fontSize?: number, fontStyle?: 'normal' | 'italic', 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 c2679fa12265..5ea878dcef05 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,12 +1068,33 @@ internal object TextLayoutManager { ) } - return CreateLayoutResult( - createLayout( + 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) { + val tightenedLayout = buildLayout( text, - boring, - width, - widthYogaMeasureMode, + tightenedWidth, includeFontPadding, textBreakStrategy, hyphenationFrequency, @@ -1079,7 +1103,15 @@ internal object TextLayoutManager { ellipsizeMode, maximumNumberOfLines, paint, - ), + ) + if (calculateLineCount(tightenedLayout, maximumNumberOfLines) == lineCount) { + layout = tightenedLayout + } + } + } + + return CreateLayoutResult( + layout, textBreakStrategy, justificationMode, ) @@ -1471,6 +1503,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 b61457dbcf1c..6207386a640c 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h @@ -48,6 +48,8 @@ class ParagraphAttributes : public DebugStringConvertible { */ TextBreakStrategy textBreakStrategy{TextBreakStrategy::HighQuality}; + TextWidthMode textWidthMode{TextWidthMode::Auto}; + /* * Enables font size adjustment to fit constrained boundaries. */ @@ -105,6 +107,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 f2c1eeed4b3b..4c03d715c35d 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/conversions.h @@ -204,6 +204,42 @@ inline void fromRawValue(const PropsParserContext &context, const RawValue &valu result = TextBreakStrategy::HighQuality; } +inline std::string toString(const TextWidthMode &textWidthMode) +{ + switch (textWidthMode) { + case TextWidthMode::Auto: + return "auto"; + case TextWidthMode::LongestLine: + return "longest-line"; + } + + LOG(ERROR) << "Unsupported TextWidthMode value"; + react_native_expect(false); + return "auto"; +} + +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 == "auto") { + result = TextWidthMode::Auto; + } else if (string == "longest-line") { + result = TextWidthMode::LongestLine; + } else { + LOG(ERROR) << "Unsupported TextWidthMode value: " << string; + react_native_expect(false); + result = TextWidthMode::Auto; + } + return; + } + + LOG(ERROR) << "Unsupported TextWidthMode type"; + react_native_expect(false); + result = TextWidthMode::Auto; +} + inline void fromRawValue(const PropsParserContext &context, const RawValue &value, FontWeight &result) { react_native_expect(value.hasType() || value.hasType()); @@ -1031,6 +1067,12 @@ inline ParagraphAttributes convertRawProp( "textBreakStrategy", sourceParagraphAttributes.textBreakStrategy, defaultParagraphAttributes.textBreakStrategy); + paragraphAttributes.textWidthMode = convertRawProp( + context, + rawProps, + "experimental_textWidthMode", + sourceParagraphAttributes.textWidthMode, + defaultParagraphAttributes.textWidthMode); paragraphAttributes.adjustsFontSizeToFit = convertRawProp( context, rawProps, @@ -1160,6 +1202,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) { @@ -1167,6 +1210,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 d9edc8de45a9..515b2b43ba9d 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/primitives.h +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/primitives.h @@ -94,6 +94,11 @@ enum class TextBreakStrategy { Balanced // Balances line lengths. }; +enum class TextWidthMode { + Auto, + 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..3b395a1d9065 100644 --- a/packages/react-native/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp @@ -7,6 +7,7 @@ #include #include +#include namespace facebook::react { @@ -70,4 +71,16 @@ TEST( EXPECT_FALSE(unset == set); } +TEST(ParagraphAttributesTest, testOperatorEqualsIncludesTextWidthMode) { + ParagraphAttributes autoWidth{}; + ParagraphAttributes longestLineWidth{}; + longestLineWidth.textWidthMode = TextWidthMode::LongestLine; + + EXPECT_FALSE(autoWidth == longestLineWidth); +} + +TEST(ParagraphAttributesTest, testAutoTextWidthModeSerializesAsAuto) { + EXPECT_EQ(toString(TextWidthMode::Auto), "auto"); +} + } // 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..e0fcc551392e 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,12 @@ void BaseParagraphProps::setProp( paragraphAttributes, textBreakStrategy, "textBreakStrategy"); + REBUILD_FIELD_SWITCH_CASE( + paDefaults, + value, + paragraphAttributes, + textWidthMode, + "experimental_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..171f5f67b618 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::Auto) { size.width = textContainer.size.width; } diff --git a/packages/react-native/types_DEPRECATED/Libraries/StyleSheet/StyleSheetTypes.d.ts b/packages/react-native/types_DEPRECATED/Libraries/StyleSheet/StyleSheetTypes.d.ts index 95a4acd756f7..4aa9f68b437d 100644 --- a/packages/react-native/types_DEPRECATED/Libraries/StyleSheet/StyleSheetTypes.d.ts +++ b/packages/react-native/types_DEPRECATED/Libraries/StyleSheet/StyleSheetTypes.d.ts @@ -567,6 +567,10 @@ export type FontVariationSettings = string | Readonly>; export interface TextStyle extends TextStyleIOS, TextStyleAndroid, ViewStyle { color?: ColorValue | undefined; + /** + * Controls how wrapped text contributes its width to layout. + */ + experimental_textWidthMode?: 'auto' | 'longest-line' | undefined; fontFamily?: string | undefined; fontSize?: number | undefined; fontStyle?: 'normal' | 'italic' | undefined; 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..d58802dae2b5009b3d98877c5132f1ff0df09691 GIT binary patch literal 10474 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 OfSi=FWR-+T(Ek9Xms_p? 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..dd359a37b629c79d6b43f1190437da5d7297055d GIT binary patch literal 49730 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 SLGc;^_)(NoldYDv2>(C#d$@}L 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..d8cde91ddf14 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 automatic 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..5de344e2aed7 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 automatic 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..383dc2a8a387 --- /dev/null +++ b/packages/rn-tester/js/examples/Text/TextWidthModeExample.js @@ -0,0 +1,89 @@ +/** + * 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, + experimentalTextWidthMode: 'auto' | 'longest-line', +) { + return ( + + {LABELS.map(label => ( + + + {label} + + + ))} + + ); +} + +export default component TextWidthModeExample() { + return ( + + Auto 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 3cb2ffc8ae38..3e66d6fa896d 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); @@ -4017,6 +4020,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; } @@ -6684,6 +6688,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 41dd003f6161..1a3e77795946 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); @@ -3871,6 +3874,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; } @@ -6494,6 +6498,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 44978f7d9e94..46bed8798cdb 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); @@ -4014,6 +4017,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; } @@ -6675,6 +6679,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 6b70a2c65905..29a12a04d1d7 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); @@ -6216,6 +6218,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; } @@ -8867,6 +8870,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 fa5ec8f945b9..c7108e0046a2 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); @@ -6102,6 +6104,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; } @@ -8709,6 +8712,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 1e409cb4ebcc..799d86650b9e 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); @@ -6213,6 +6215,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; } @@ -8858,6 +8861,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 003175c4dfba..cc81464d50d4 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); @@ -2631,6 +2633,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; } @@ -5005,6 +5008,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 7e3f78408158..1460ec90ef54 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); @@ -2525,6 +2527,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; } @@ -4855,6 +4858,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + 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 a7c085821a13..f7bd3a5b09c9 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); @@ -2628,6 +2630,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; } @@ -4996,6 +4999,11 @@ enum facebook::react::TextTransform { Uppercase, } +enum facebook::react::TextWidthMode { + Auto, + LongestLine, +} + enum facebook::react::TimerSource { RequestAnimationFrame, SetInterval,