From 7acc03bb92c2726ad6cb5c9104b71bfff1b059e9 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Tue, 6 May 2025 19:42:28 -0700 Subject: [PATCH 1/2] feat(TextField): support css white-space and text-overflow --- packages/core/ui/text-field/index.ios.ts | 37 +++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/core/ui/text-field/index.ios.ts b/packages/core/ui/text-field/index.ios.ts index 4239f56379..ffb5e42dd4 100644 --- a/packages/core/ui/text-field/index.ios.ts +++ b/packages/core/ui/text-field/index.ios.ts @@ -1,5 +1,5 @@ import { TextFieldBase, secureProperty } from './text-field-common'; -import { textProperty } from '../text-base'; +import { textOverflowProperty, textProperty, whiteSpaceProperty } from '../text-base'; import { hintProperty, placeholderColorProperty, _updateCharactersInRangeReplacementString } from '../editable-text-base'; import { CoreTypes } from '../../core-types'; import { Color } from '../../color'; @@ -317,4 +317,39 @@ export class TextField extends TextFieldBase { [paddingLeftProperty.setNative](value: CoreTypes.LengthType) { // Padding is realized via UITextFieldImpl.textRectForBounds method } + + [whiteSpaceProperty.setNative](value: CoreTypes.WhiteSpaceType) { + this.adjustLineBreak(); + } + + [textOverflowProperty.setNative](value: CoreTypes.TextOverflowType) { + this.adjustLineBreak(); + } + + private adjustLineBreak() { + let paragraphStyle: NSMutableParagraphStyle; + + switch (this.whiteSpace) { + case 'nowrap': + switch (this.textOverflow) { + case 'clip': + paragraphStyle = NSMutableParagraphStyle.new(); + paragraphStyle.lineBreakMode = NSLineBreakMode.ByClipping; + break; + default: + // ellipsis + paragraphStyle = NSMutableParagraphStyle.new(); + paragraphStyle.lineBreakMode = NSLineBreakMode.ByTruncatingTail; + break; + } + break; + } + + if (paragraphStyle) { + let attributedString = NSMutableAttributedString.alloc().initWithString(this.nativeViewProtected.text); + attributedString.addAttributeValueRange(NSParagraphStyleAttributeName, paragraphStyle, NSRangeFromString(`{0,${attributedString.length}}`)); + + this.nativeViewProtected.attributedText = attributedString; + } + } } From e0e26829ac823ea921057bbef6d88925b9a84238 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 7 May 2025 11:37:55 -0700 Subject: [PATCH 2/2] chore: cleanup and add example to toolbox --- apps/toolbox/src/app.css | 6 ++++++ apps/toolbox/src/pages/forms.xml | 4 ++++ packages/core/core-types/index.ts | 2 +- packages/core/ui/text-base/text-base-common.ts | 2 +- packages/core/ui/text-field/index.android.ts | 9 --------- packages/core/ui/text-field/index.ios.ts | 4 ++++ 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/apps/toolbox/src/app.css b/apps/toolbox/src/app.css index 56535dbbb1..348e6261cc 100644 --- a/apps/toolbox/src/app.css +++ b/apps/toolbox/src/app.css @@ -260,4 +260,10 @@ Button { .no-shadow { box-shadow: none; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } \ No newline at end of file diff --git a/apps/toolbox/src/pages/forms.xml b/apps/toolbox/src/pages/forms.xml index d451a16dc1..cca44dafab 100644 --- a/apps/toolbox/src/pages/forms.xml +++ b/apps/toolbox/src/pages/forms.xml @@ -24,6 +24,10 @@ +