@hero-design/rn 8.136.3 → 8.137.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @hero-design/rn
2
2
 
3
+ ## 8.137.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#5516](https://github.com/Thinkei/hero-design/pull/5516) [`22172f6`](https://github.com/Thinkei/hero-design/commit/22172f65028e66509964b69c431b4660d0e66e45) Thanks [@ttkien](https://github.com/ttkien)! - [Select] Add `assistiveInfoConfig` prop to render an optional info trigger below the field
8
+
9
+ - [#5516](https://github.com/Thinkei/hero-design/pull/5516) [`22172f6`](https://github.com/Thinkei/hero-design/commit/22172f65028e66509964b69c431b4660d0e66e45) Thanks [@ttkien](https://github.com/ttkien)! - [TextInput] Add `assistiveInfoConfig` prop to render an optional info trigger below the field
10
+
3
11
  ## 8.136.3
4
12
 
5
13
  ### Patch Changes
package/es/index.js CHANGED
@@ -7322,6 +7322,8 @@ var getTextInputTheme = function getTextInputTheme(theme) {
7322
7322
  containerMarginTop: theme.space.small,
7323
7323
  labelInsideTextInputMarginTop: 0,
7324
7324
  errorAndHelpTextContainerPaddingTop: theme.space.xxsmall,
7325
+ assistiveInfoTriggerPadding: theme.space.xsmall,
7326
+ assistiveInfoTriggerGap: theme.space.xsmall,
7325
7327
  inputAndLabelContainerPaddingTop: theme.lineHeights.medium,
7326
7328
  labelFocusedTranslateY: theme.space.xsmall * 2,
7327
7329
  textareaLabelIdleTranslateY: theme.space.large
@@ -21387,7 +21389,43 @@ var StyledErrorAndMaxLengthContainer = index$c(View)(function (_ref14) {
21387
21389
  };
21388
21390
  });
21389
21391
 
21390
- var _excluded$t = ["label", "prefix", "suffix", "style", "textStyle", "testID", "accessibilityLabelledBy", "error", "required", "editable", "disabled", "loading", "maxLength", "hideCharacterCount", "helpText", "value", "defaultValue", "renderInputValue", "allowFontScaling", "variant"];
21392
+ var StyledTouchable = index$c(TouchableOpacity)(function () {
21393
+ return {
21394
+ alignSelf: 'flex-start'
21395
+ };
21396
+ });
21397
+ var StyledRow$1 = index$c(View)(function (_ref) {
21398
+ var theme = _ref.theme;
21399
+ return {
21400
+ flexDirection: 'row',
21401
+ alignItems: 'center',
21402
+ padding: theme.__hd__.textInput.space.assistiveInfoTriggerPadding,
21403
+ gap: theme.__hd__.textInput.space.assistiveInfoTriggerGap
21404
+ };
21405
+ });
21406
+
21407
+ var AssistiveInfoTrigger = function AssistiveInfoTrigger(_ref) {
21408
+ var accessibilityLabel = _ref.accessibilityLabel,
21409
+ disabled = _ref.disabled,
21410
+ label = _ref.label,
21411
+ onPress = _ref.onPress,
21412
+ testID = _ref.testID;
21413
+ return /*#__PURE__*/React__default.createElement(StyledTouchable, {
21414
+ onPress: onPress,
21415
+ disabled: disabled,
21416
+ accessibilityLabel: accessibilityLabel !== null && accessibilityLabel !== void 0 ? accessibilityLabel : 'More information',
21417
+ accessibilityRole: "button",
21418
+ testID: testID
21419
+ }, /*#__PURE__*/React__default.createElement(StyledRow$1, null, /*#__PURE__*/React__default.createElement(Icon, {
21420
+ icon: "circle-info-outlined",
21421
+ size: "xsmall",
21422
+ intent: disabled ? 'disabled-text' : 'muted'
21423
+ }), !!label && /*#__PURE__*/React__default.createElement(Typography.Caption, {
21424
+ intent: disabled ? 'disabled' : 'muted'
21425
+ }, label)));
21426
+ };
21427
+
21428
+ var _excluded$t = ["label", "prefix", "suffix", "style", "textStyle", "testID", "accessibilityLabelledBy", "error", "required", "editable", "disabled", "loading", "maxLength", "hideCharacterCount", "helpText", "assistiveInfoConfig", "value", "defaultValue", "renderInputValue", "allowFontScaling", "variant", "pointerEvents"];
21391
21429
  var getState$3 = function getState(_ref) {
21392
21430
  var disabled = _ref.disabled,
21393
21431
  error = _ref.error,
@@ -21496,6 +21534,7 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref8, ref) {
21496
21534
  _ref8$hideCharacterCo = _ref8.hideCharacterCount,
21497
21535
  hideCharacterCount = _ref8$hideCharacterCo === void 0 ? false : _ref8$hideCharacterCo,
21498
21536
  helpText = _ref8.helpText,
21537
+ assistiveInfoConfig = _ref8.assistiveInfoConfig,
21499
21538
  value = _ref8.value,
21500
21539
  defaultValue = _ref8.defaultValue,
21501
21540
  renderInputValue = _ref8.renderInputValue,
@@ -21503,6 +21542,7 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref8, ref) {
21503
21542
  allowFontScaling = _ref8$allowFontScalin === void 0 ? false : _ref8$allowFontScalin,
21504
21543
  _ref8$variant = _ref8.variant,
21505
21544
  variant = _ref8$variant === void 0 ? 'text' : _ref8$variant,
21545
+ pointerEvents = _ref8.pointerEvents,
21506
21546
  nativeProps = _objectWithoutProperties(_ref8, _excluded$t);
21507
21547
  var displayText = getDisplayText(value, defaultValue);
21508
21548
  var isEmptyValue = displayText.length === 0;
@@ -21634,17 +21674,20 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref8, ref) {
21634
21674
  defaultValue: defaultValue,
21635
21675
  placeholder: isFocused || label === undefined ? nativeProps.placeholder : EMPTY_PLACEHOLDER_VALUE
21636
21676
  });
21677
+ var isPressable = state !== 'disabled' && state !== 'readonly' && !loading;
21637
21678
  return /*#__PURE__*/React__default.createElement(StyledContainer$7, {
21638
21679
  style: styleWithoutBackgroundColor,
21639
- pointerEvents: state === 'disabled' || state === 'readonly' || loading ? 'none' : 'auto',
21640
21680
  testID: testID
21641
21681
  }, /*#__PURE__*/React__default.createElement(Pressable, {
21642
- onPress: focusInnerTextInput,
21682
+ onPress: isPressable ? focusInnerTextInput : undefined,
21643
21683
  accessible: false,
21644
- importantForAccessibility: "no"
21684
+ importantForAccessibility: "no",
21685
+ disabled: !isPressable,
21686
+ pointerEvents: pointerEvents
21645
21687
  }, /*#__PURE__*/React__default.createElement(StyledTextInputContainer, {
21646
21688
  themeVariant: variant,
21647
- themeState: state
21689
+ themeState: state,
21690
+ pointerEvents: isPressable ? 'auto' : 'none'
21648
21691
  }, /*#__PURE__*/React__default.createElement(StyledBorderBackDrop, {
21649
21692
  themeFocused: isFocused,
21650
21693
  themeState: state,
@@ -21709,7 +21752,12 @@ var TextInput = /*#__PURE__*/forwardRef(function (_ref8, ref) {
21709
21752
  state: state,
21710
21753
  loading: loading,
21711
21754
  suffix: suffix
21712
- }))), /*#__PURE__*/React__default.createElement(StyledErrorAndHelpTextContainer, null, /*#__PURE__*/React__default.createElement(StyledErrorAndMaxLengthContainer, null, renderErrorOrHelpText({
21755
+ }))), !!assistiveInfoConfig && /*#__PURE__*/React__default.createElement(AssistiveInfoTrigger, {
21756
+ onPress: assistiveInfoConfig.onPress,
21757
+ label: assistiveInfoConfig.label,
21758
+ testID: assistiveInfoConfig.testID,
21759
+ disabled: !isPressable
21760
+ }), /*#__PURE__*/React__default.createElement(StyledErrorAndHelpTextContainer, null, /*#__PURE__*/React__default.createElement(StyledErrorAndMaxLengthContainer, null, renderErrorOrHelpText({
21713
21761
  error: error,
21714
21762
  helpText: helpText
21715
21763
  }), renderMaxLengthMessage({
@@ -27845,7 +27893,8 @@ function MultiSelect(_ref) {
27845
27893
  _ref$supportedOrienta = _ref.supportedOrientations,
27846
27894
  supportedOrientations = _ref$supportedOrienta === void 0 ? ['portrait'] : _ref$supportedOrienta,
27847
27895
  _ref$bottomSheetConfi = _ref.bottomSheetConfig,
27848
- bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi;
27896
+ bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi,
27897
+ assistiveInfoConfig = _ref.assistiveInfoConfig;
27849
27898
  var _useKeyboard = useKeyboard(),
27850
27899
  isKeyboardVisible = _useKeyboard.isKeyboardVisible,
27851
27900
  keyboardHeight = _useKeyboard.keyboardHeight;
@@ -27883,9 +27932,7 @@ function MultiSelect(_ref) {
27883
27932
  }, /*#__PURE__*/React__default.createElement(TouchableOpacity, {
27884
27933
  onPress: onPress,
27885
27934
  testID: "multi-select-touchable-opacity"
27886
- }, /*#__PURE__*/React__default.createElement(View, {
27887
- pointerEvents: "none"
27888
- }, /*#__PURE__*/React__default.createElement(TextInput, _extends$1({}, inputProps, {
27935
+ }, /*#__PURE__*/React__default.createElement(View, null, /*#__PURE__*/React__default.createElement(TextInput, _extends$1({}, inputProps, {
27889
27936
  label: label,
27890
27937
  value: renderSelectedValue ? rawValue : displayedValue,
27891
27938
  suffix: selectSuffix,
@@ -27897,6 +27944,7 @@ function MultiSelect(_ref) {
27897
27944
  pointerEvents: "none",
27898
27945
  style: style,
27899
27946
  testID: testID,
27947
+ assistiveInfoConfig: assistiveInfoConfig,
27900
27948
  renderInputValue: renderSelectedValue !== undefined && (rawValue === null || rawValue === void 0 ? void 0 : rawValue.length) > 0 ? function (nativeInputProps) {
27901
27949
  return renderSelectedValue(value, nativeInputProps);
27902
27950
  } : undefined
@@ -28059,7 +28107,8 @@ var SingleSelect = function SingleSelect(_ref) {
28059
28107
  _ref$supportedOrienta = _ref.supportedOrientations,
28060
28108
  supportedOrientations = _ref$supportedOrienta === void 0 ? ['portrait'] : _ref$supportedOrienta,
28061
28109
  _ref$bottomSheetConfi = _ref.bottomSheetConfig,
28062
- bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi;
28110
+ bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi,
28111
+ assistiveInfoConfig = _ref.assistiveInfoConfig;
28063
28112
  var _useKeyboard = useKeyboard(),
28064
28113
  isKeyboardVisible = _useKeyboard.isKeyboardVisible,
28065
28114
  keyboardHeight = _useKeyboard.keyboardHeight;
@@ -28090,9 +28139,7 @@ var SingleSelect = function SingleSelect(_ref) {
28090
28139
  }, /*#__PURE__*/React__default.createElement(TouchableOpacity, {
28091
28140
  onPress: onPress,
28092
28141
  testID: "single-select-touchable-opacity"
28093
- }, /*#__PURE__*/React__default.createElement(View, {
28094
- pointerEvents: "none"
28095
- }, /*#__PURE__*/React__default.createElement(TextInput, _extends$1({}, inputProps, {
28142
+ }, /*#__PURE__*/React__default.createElement(View, null, /*#__PURE__*/React__default.createElement(TextInput, _extends$1({}, inputProps, {
28096
28143
  label: label,
28097
28144
  value: renderSelectedValue ? rawValue : displayedValue,
28098
28145
  suffix: selectSuffix,
@@ -28101,9 +28148,10 @@ var SingleSelect = function SingleSelect(_ref) {
28101
28148
  editable: editable,
28102
28149
  disabled: disabled,
28103
28150
  required: required,
28104
- pointerEvents: "none",
28105
28151
  style: style,
28106
28152
  testID: testID,
28153
+ pointerEvents: "none",
28154
+ assistiveInfoConfig: assistiveInfoConfig,
28107
28155
  renderInputValue: renderSelectedValue !== undefined && !!rawValue ? function (nativeInputProps) {
28108
28156
  return renderSelectedValue(value, nativeInputProps);
28109
28157
  } : undefined
package/lib/index.js CHANGED
@@ -7351,6 +7351,8 @@ var getTextInputTheme = function getTextInputTheme(theme) {
7351
7351
  containerMarginTop: theme.space.small,
7352
7352
  labelInsideTextInputMarginTop: 0,
7353
7353
  errorAndHelpTextContainerPaddingTop: theme.space.xxsmall,
7354
+ assistiveInfoTriggerPadding: theme.space.xsmall,
7355
+ assistiveInfoTriggerGap: theme.space.xsmall,
7354
7356
  inputAndLabelContainerPaddingTop: theme.lineHeights.medium,
7355
7357
  labelFocusedTranslateY: theme.space.xsmall * 2,
7356
7358
  textareaLabelIdleTranslateY: theme.space.large
@@ -21416,7 +21418,43 @@ var StyledErrorAndMaxLengthContainer = index$c(reactNative.View)(function (_ref1
21416
21418
  };
21417
21419
  });
21418
21420
 
21419
- var _excluded$t = ["label", "prefix", "suffix", "style", "textStyle", "testID", "accessibilityLabelledBy", "error", "required", "editable", "disabled", "loading", "maxLength", "hideCharacterCount", "helpText", "value", "defaultValue", "renderInputValue", "allowFontScaling", "variant"];
21421
+ var StyledTouchable = index$c(reactNative.TouchableOpacity)(function () {
21422
+ return {
21423
+ alignSelf: 'flex-start'
21424
+ };
21425
+ });
21426
+ var StyledRow$1 = index$c(reactNative.View)(function (_ref) {
21427
+ var theme = _ref.theme;
21428
+ return {
21429
+ flexDirection: 'row',
21430
+ alignItems: 'center',
21431
+ padding: theme.__hd__.textInput.space.assistiveInfoTriggerPadding,
21432
+ gap: theme.__hd__.textInput.space.assistiveInfoTriggerGap
21433
+ };
21434
+ });
21435
+
21436
+ var AssistiveInfoTrigger = function AssistiveInfoTrigger(_ref) {
21437
+ var accessibilityLabel = _ref.accessibilityLabel,
21438
+ disabled = _ref.disabled,
21439
+ label = _ref.label,
21440
+ onPress = _ref.onPress,
21441
+ testID = _ref.testID;
21442
+ return /*#__PURE__*/React__namespace.default.createElement(StyledTouchable, {
21443
+ onPress: onPress,
21444
+ disabled: disabled,
21445
+ accessibilityLabel: accessibilityLabel !== null && accessibilityLabel !== void 0 ? accessibilityLabel : 'More information',
21446
+ accessibilityRole: "button",
21447
+ testID: testID
21448
+ }, /*#__PURE__*/React__namespace.default.createElement(StyledRow$1, null, /*#__PURE__*/React__namespace.default.createElement(Icon, {
21449
+ icon: "circle-info-outlined",
21450
+ size: "xsmall",
21451
+ intent: disabled ? 'disabled-text' : 'muted'
21452
+ }), !!label && /*#__PURE__*/React__namespace.default.createElement(Typography.Caption, {
21453
+ intent: disabled ? 'disabled' : 'muted'
21454
+ }, label)));
21455
+ };
21456
+
21457
+ var _excluded$t = ["label", "prefix", "suffix", "style", "textStyle", "testID", "accessibilityLabelledBy", "error", "required", "editable", "disabled", "loading", "maxLength", "hideCharacterCount", "helpText", "assistiveInfoConfig", "value", "defaultValue", "renderInputValue", "allowFontScaling", "variant", "pointerEvents"];
21420
21458
  var getState$3 = function getState(_ref) {
21421
21459
  var disabled = _ref.disabled,
21422
21460
  error = _ref.error,
@@ -21525,6 +21563,7 @@ var TextInput = /*#__PURE__*/React.forwardRef(function (_ref8, ref) {
21525
21563
  _ref8$hideCharacterCo = _ref8.hideCharacterCount,
21526
21564
  hideCharacterCount = _ref8$hideCharacterCo === void 0 ? false : _ref8$hideCharacterCo,
21527
21565
  helpText = _ref8.helpText,
21566
+ assistiveInfoConfig = _ref8.assistiveInfoConfig,
21528
21567
  value = _ref8.value,
21529
21568
  defaultValue = _ref8.defaultValue,
21530
21569
  renderInputValue = _ref8.renderInputValue,
@@ -21532,6 +21571,7 @@ var TextInput = /*#__PURE__*/React.forwardRef(function (_ref8, ref) {
21532
21571
  allowFontScaling = _ref8$allowFontScalin === void 0 ? false : _ref8$allowFontScalin,
21533
21572
  _ref8$variant = _ref8.variant,
21534
21573
  variant = _ref8$variant === void 0 ? 'text' : _ref8$variant,
21574
+ pointerEvents = _ref8.pointerEvents,
21535
21575
  nativeProps = _objectWithoutProperties(_ref8, _excluded$t);
21536
21576
  var displayText = getDisplayText(value, defaultValue);
21537
21577
  var isEmptyValue = displayText.length === 0;
@@ -21663,17 +21703,20 @@ var TextInput = /*#__PURE__*/React.forwardRef(function (_ref8, ref) {
21663
21703
  defaultValue: defaultValue,
21664
21704
  placeholder: isFocused || label === undefined ? nativeProps.placeholder : EMPTY_PLACEHOLDER_VALUE
21665
21705
  });
21706
+ var isPressable = state !== 'disabled' && state !== 'readonly' && !loading;
21666
21707
  return /*#__PURE__*/React__namespace.default.createElement(StyledContainer$7, {
21667
21708
  style: styleWithoutBackgroundColor,
21668
- pointerEvents: state === 'disabled' || state === 'readonly' || loading ? 'none' : 'auto',
21669
21709
  testID: testID
21670
21710
  }, /*#__PURE__*/React__namespace.default.createElement(reactNative.Pressable, {
21671
- onPress: focusInnerTextInput,
21711
+ onPress: isPressable ? focusInnerTextInput : undefined,
21672
21712
  accessible: false,
21673
- importantForAccessibility: "no"
21713
+ importantForAccessibility: "no",
21714
+ disabled: !isPressable,
21715
+ pointerEvents: pointerEvents
21674
21716
  }, /*#__PURE__*/React__namespace.default.createElement(StyledTextInputContainer, {
21675
21717
  themeVariant: variant,
21676
- themeState: state
21718
+ themeState: state,
21719
+ pointerEvents: isPressable ? 'auto' : 'none'
21677
21720
  }, /*#__PURE__*/React__namespace.default.createElement(StyledBorderBackDrop, {
21678
21721
  themeFocused: isFocused,
21679
21722
  themeState: state,
@@ -21738,7 +21781,12 @@ var TextInput = /*#__PURE__*/React.forwardRef(function (_ref8, ref) {
21738
21781
  state: state,
21739
21782
  loading: loading,
21740
21783
  suffix: suffix
21741
- }))), /*#__PURE__*/React__namespace.default.createElement(StyledErrorAndHelpTextContainer, null, /*#__PURE__*/React__namespace.default.createElement(StyledErrorAndMaxLengthContainer, null, renderErrorOrHelpText({
21784
+ }))), !!assistiveInfoConfig && /*#__PURE__*/React__namespace.default.createElement(AssistiveInfoTrigger, {
21785
+ onPress: assistiveInfoConfig.onPress,
21786
+ label: assistiveInfoConfig.label,
21787
+ testID: assistiveInfoConfig.testID,
21788
+ disabled: !isPressable
21789
+ }), /*#__PURE__*/React__namespace.default.createElement(StyledErrorAndHelpTextContainer, null, /*#__PURE__*/React__namespace.default.createElement(StyledErrorAndMaxLengthContainer, null, renderErrorOrHelpText({
21742
21790
  error: error,
21743
21791
  helpText: helpText
21744
21792
  }), renderMaxLengthMessage({
@@ -27874,7 +27922,8 @@ function MultiSelect(_ref) {
27874
27922
  _ref$supportedOrienta = _ref.supportedOrientations,
27875
27923
  supportedOrientations = _ref$supportedOrienta === void 0 ? ['portrait'] : _ref$supportedOrienta,
27876
27924
  _ref$bottomSheetConfi = _ref.bottomSheetConfig,
27877
- bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi;
27925
+ bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi,
27926
+ assistiveInfoConfig = _ref.assistiveInfoConfig;
27878
27927
  var _useKeyboard = useKeyboard(),
27879
27928
  isKeyboardVisible = _useKeyboard.isKeyboardVisible,
27880
27929
  keyboardHeight = _useKeyboard.keyboardHeight;
@@ -27912,9 +27961,7 @@ function MultiSelect(_ref) {
27912
27961
  }, /*#__PURE__*/React__namespace.default.createElement(reactNative.TouchableOpacity, {
27913
27962
  onPress: onPress,
27914
27963
  testID: "multi-select-touchable-opacity"
27915
- }, /*#__PURE__*/React__namespace.default.createElement(reactNative.View, {
27916
- pointerEvents: "none"
27917
- }, /*#__PURE__*/React__namespace.default.createElement(TextInput, _extends$1({}, inputProps, {
27964
+ }, /*#__PURE__*/React__namespace.default.createElement(reactNative.View, null, /*#__PURE__*/React__namespace.default.createElement(TextInput, _extends$1({}, inputProps, {
27918
27965
  label: label,
27919
27966
  value: renderSelectedValue ? rawValue : displayedValue,
27920
27967
  suffix: selectSuffix,
@@ -27926,6 +27973,7 @@ function MultiSelect(_ref) {
27926
27973
  pointerEvents: "none",
27927
27974
  style: style,
27928
27975
  testID: testID,
27976
+ assistiveInfoConfig: assistiveInfoConfig,
27929
27977
  renderInputValue: renderSelectedValue !== undefined && (rawValue === null || rawValue === void 0 ? void 0 : rawValue.length) > 0 ? function (nativeInputProps) {
27930
27978
  return renderSelectedValue(value, nativeInputProps);
27931
27979
  } : undefined
@@ -28088,7 +28136,8 @@ var SingleSelect = function SingleSelect(_ref) {
28088
28136
  _ref$supportedOrienta = _ref.supportedOrientations,
28089
28137
  supportedOrientations = _ref$supportedOrienta === void 0 ? ['portrait'] : _ref$supportedOrienta,
28090
28138
  _ref$bottomSheetConfi = _ref.bottomSheetConfig,
28091
- bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi;
28139
+ bottomSheetConfig = _ref$bottomSheetConfi === void 0 ? {} : _ref$bottomSheetConfi,
28140
+ assistiveInfoConfig = _ref.assistiveInfoConfig;
28092
28141
  var _useKeyboard = useKeyboard(),
28093
28142
  isKeyboardVisible = _useKeyboard.isKeyboardVisible,
28094
28143
  keyboardHeight = _useKeyboard.keyboardHeight;
@@ -28119,9 +28168,7 @@ var SingleSelect = function SingleSelect(_ref) {
28119
28168
  }, /*#__PURE__*/React__namespace.default.createElement(reactNative.TouchableOpacity, {
28120
28169
  onPress: onPress,
28121
28170
  testID: "single-select-touchable-opacity"
28122
- }, /*#__PURE__*/React__namespace.default.createElement(reactNative.View, {
28123
- pointerEvents: "none"
28124
- }, /*#__PURE__*/React__namespace.default.createElement(TextInput, _extends$1({}, inputProps, {
28171
+ }, /*#__PURE__*/React__namespace.default.createElement(reactNative.View, null, /*#__PURE__*/React__namespace.default.createElement(TextInput, _extends$1({}, inputProps, {
28125
28172
  label: label,
28126
28173
  value: renderSelectedValue ? rawValue : displayedValue,
28127
28174
  suffix: selectSuffix,
@@ -28130,9 +28177,10 @@ var SingleSelect = function SingleSelect(_ref) {
28130
28177
  editable: editable,
28131
28178
  disabled: disabled,
28132
28179
  required: required,
28133
- pointerEvents: "none",
28134
28180
  style: style,
28135
28181
  testID: testID,
28182
+ pointerEvents: "none",
28183
+ assistiveInfoConfig: assistiveInfoConfig,
28136
28184
  renderInputValue: renderSelectedValue !== undefined && !!rawValue ? function (nativeInputProps) {
28137
28185
  return renderSelectedValue(value, nativeInputProps);
28138
28186
  } : undefined
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hero-design/rn",
3
- "version": "8.136.3",
3
+ "version": "8.137.0",
4
4
  "license": "MIT",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -75,6 +75,7 @@ function MultiSelect<V, T extends SelectOptionType<V>>({
75
75
  value,
76
76
  supportedOrientations = ['portrait'],
77
77
  bottomSheetConfig = {},
78
+ assistiveInfoConfig,
78
79
  }: MultiSelectProps<V, T>) {
79
80
  const { isKeyboardVisible, keyboardHeight } = useKeyboard();
80
81
  const [open, setOpen] = useState(false);
@@ -116,7 +117,7 @@ function MultiSelect<V, T extends SelectOptionType<V>>({
116
117
  {
117
118
  // prevent users from focusing TextInput
118
119
  }
119
- <View pointerEvents="none">
120
+ <View>
120
121
  <TextInput
121
122
  {...inputProps}
122
123
  label={label}
@@ -130,6 +131,7 @@ function MultiSelect<V, T extends SelectOptionType<V>>({
130
131
  pointerEvents="none"
131
132
  style={style}
132
133
  testID={testID}
134
+ assistiveInfoConfig={assistiveInfoConfig}
133
135
  renderInputValue={
134
136
  renderSelectedValue !== undefined && rawValue?.length > 0
135
137
  ? (nativeInputProps) =>
@@ -59,6 +59,7 @@ const SingleSelect = <V, T extends SelectOptionType<V>>({
59
59
  value,
60
60
  supportedOrientations = ['portrait'],
61
61
  bottomSheetConfig = {},
62
+ assistiveInfoConfig,
62
63
  }: SingleSelectProps<V, T>) => {
63
64
  const { isKeyboardVisible, keyboardHeight } = useKeyboard();
64
65
  const [open, setOpen] = useState(false);
@@ -99,7 +100,7 @@ const SingleSelect = <V, T extends SelectOptionType<V>>({
99
100
  {
100
101
  // prevent users from focusing TextInput
101
102
  }
102
- <View pointerEvents="none">
103
+ <View>
103
104
  <TextInput
104
105
  {...inputProps}
105
106
  label={label}
@@ -110,9 +111,10 @@ const SingleSelect = <V, T extends SelectOptionType<V>>({
110
111
  editable={editable}
111
112
  disabled={disabled}
112
113
  required={required}
113
- pointerEvents="none"
114
114
  style={style}
115
115
  testID={testID}
116
+ pointerEvents="none"
117
+ assistiveInfoConfig={assistiveInfoConfig}
116
118
  renderInputValue={
117
119
  renderSelectedValue !== undefined && !!rawValue
118
120
  ? (nativeInputProps) =>
@@ -102,4 +102,13 @@ export interface SelectProps<V, T extends SelectOptionType<V>>
102
102
  variant?: BottomSheetProps['variant'];
103
103
  header?: BottomSheetProps['header'];
104
104
  };
105
+ /**
106
+ * Optional assistive info trigger config. When provided, an info icon is rendered
107
+ * below the field. `onPress` is called when the trigger is tapped.
108
+ */
109
+ assistiveInfoConfig?: {
110
+ onPress: () => void;
111
+ label?: string;
112
+ testID?: string;
113
+ };
105
114
  }
@@ -0,0 +1,13 @@
1
+ import { TouchableOpacity, View } from 'react-native';
2
+ import styled from '@emotion/native';
3
+
4
+ export const StyledTouchable = styled(TouchableOpacity)(() => ({
5
+ alignSelf: 'flex-start',
6
+ }));
7
+
8
+ export const StyledRow = styled(View)(({ theme }) => ({
9
+ flexDirection: 'row',
10
+ alignItems: 'center',
11
+ padding: theme.__hd__.textInput.space.assistiveInfoTriggerPadding,
12
+ gap: theme.__hd__.textInput.space.assistiveInfoTriggerGap,
13
+ }));
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import Icon from '../../Icon';
3
+ import Typography from '../../Typography';
4
+ import { StyledTouchable, StyledRow } from './StyledAssistiveInfoTrigger';
5
+
6
+ export interface AssistiveInfoTriggerProps {
7
+ onPress: () => void;
8
+ label?: string;
9
+ disabled?: boolean;
10
+ testID?: string;
11
+ accessibilityLabel?: string;
12
+ }
13
+
14
+ const AssistiveInfoTrigger = ({
15
+ accessibilityLabel,
16
+ disabled,
17
+ label,
18
+ onPress,
19
+ testID,
20
+ }: AssistiveInfoTriggerProps) => {
21
+ return (
22
+ <StyledTouchable
23
+ onPress={onPress}
24
+ disabled={disabled}
25
+ accessibilityLabel={accessibilityLabel ?? 'More information'}
26
+ accessibilityRole="button"
27
+ testID={testID}
28
+ >
29
+ <StyledRow>
30
+ <Icon
31
+ icon="circle-info-outlined"
32
+ size="xsmall"
33
+ intent={disabled ? 'disabled-text' : 'muted'}
34
+ />
35
+ {!!label && (
36
+ <Typography.Caption intent={disabled ? 'disabled' : 'muted'}>
37
+ {label}
38
+ </Typography.Caption>
39
+ )}
40
+ </StyledRow>
41
+ </StyledTouchable>
42
+ );
43
+ };
44
+
45
+ export default AssistiveInfoTrigger;
@@ -34,6 +34,7 @@ import {
34
34
  StyledHelperText,
35
35
  } from './StyledTextInput';
36
36
  import Icon from '../Icon';
37
+ import AssistiveInfoTrigger from './AssistiveInfoTrigger';
37
38
  import type { Theme } from '../../theme';
38
39
  import { useTheme } from '../../theme';
39
40
  import type { State } from './StyledTextInput';
@@ -141,6 +142,15 @@ export interface TextInputProps extends NativeTextInputProps {
141
142
  * Component variant.
142
143
  */
143
144
  variant?: TextInputVariant;
145
+ /**
146
+ * Optional assistive info trigger config. When provided, an info icon is rendered
147
+ * below the field. `onPress` is called when the trigger is tapped.
148
+ */
149
+ assistiveInfoConfig?: {
150
+ onPress: () => void;
151
+ label?: string;
152
+ testID?: string;
153
+ };
144
154
  }
145
155
 
146
156
  export const getState = ({
@@ -318,11 +328,13 @@ const TextInput = forwardRef<TextInputHandles, TextInputProps>(
318
328
  maxLength,
319
329
  hideCharacterCount = false,
320
330
  helpText,
331
+ assistiveInfoConfig,
321
332
  value,
322
333
  defaultValue,
323
334
  renderInputValue,
324
335
  allowFontScaling = false,
325
336
  variant = 'text',
337
+ pointerEvents,
326
338
  ...nativeProps
327
339
  }: TextInputProps,
328
340
  ref?: React.Ref<TextInputHandles>
@@ -464,22 +476,23 @@ const TextInput = forwardRef<TextInputHandles, TextInputProps>(
464
476
  : EMPTY_PLACEHOLDER_VALUE,
465
477
  };
466
478
 
479
+ const isPressable =
480
+ state !== 'disabled' && state !== 'readonly' && !loading;
481
+
467
482
  return (
468
- <StyledContainer
469
- style={styleWithoutBackgroundColor}
470
- pointerEvents={
471
- state === 'disabled' || state === 'readonly' || loading
472
- ? 'none'
473
- : 'auto'
474
- }
475
- testID={testID}
476
- >
483
+ <StyledContainer style={styleWithoutBackgroundColor} testID={testID}>
477
484
  <Pressable
478
- onPress={focusInnerTextInput}
485
+ onPress={isPressable ? focusInnerTextInput : undefined}
479
486
  accessible={false}
480
487
  importantForAccessibility="no"
488
+ disabled={!isPressable}
489
+ pointerEvents={pointerEvents}
481
490
  >
482
- <StyledTextInputContainer themeVariant={variant} themeState={state}>
491
+ <StyledTextInputContainer
492
+ themeVariant={variant}
493
+ themeState={state}
494
+ pointerEvents={isPressable ? 'auto' : 'none'}
495
+ >
483
496
  <StyledBorderBackDrop
484
497
  themeFocused={isFocused}
485
498
  themeState={state}
@@ -574,6 +587,14 @@ const TextInput = forwardRef<TextInputHandles, TextInputProps>(
574
587
  {renderSuffix({ state, loading, suffix })}
575
588
  </StyledTextInputContainer>
576
589
  </Pressable>
590
+ {!!assistiveInfoConfig && (
591
+ <AssistiveInfoTrigger
592
+ onPress={assistiveInfoConfig.onPress}
593
+ label={assistiveInfoConfig.label}
594
+ testID={assistiveInfoConfig.testID}
595
+ disabled={!isPressable}
596
+ />
597
+ )}
577
598
  <StyledErrorAndHelpTextContainer>
578
599
  <StyledErrorAndMaxLengthContainer>
579
600
  {renderErrorOrHelpText({ error, helpText })}
@@ -72,6 +72,8 @@ const getTextInputTheme = (theme: GlobalTheme) => {
72
72
  containerMarginTop: theme.space.small,
73
73
  labelInsideTextInputMarginTop: 0,
74
74
  errorAndHelpTextContainerPaddingTop: theme.space.xxsmall,
75
+ assistiveInfoTriggerPadding: theme.space.xsmall,
76
+ assistiveInfoTriggerGap: theme.space.xsmall,
75
77
  inputAndLabelContainerPaddingTop: theme.lineHeights.medium,
76
78
  labelFocusedTranslateY: theme.space.xsmall * 2,
77
79
  textareaLabelIdleTranslateY: theme.space.large,
@@ -26,5 +26,5 @@ export interface MultiSelectProps<V, T extends SelectOptionType<V> = SelectOptio
26
26
  */
27
27
  supportedOrientations?: ('portrait' | 'landscape')[];
28
28
  }
29
- declare function MultiSelect<V, T extends SelectOptionType<V>>({ footerLabel, label, loading, inputProps, onConfirm, onDismiss, onEndReached, onQueryChange, options, renderOption, renderSelectedValue, query, error, editable, disabled, required, style, testID, value, supportedOrientations, bottomSheetConfig, }: MultiSelectProps<V, T>): React.JSX.Element;
29
+ declare function MultiSelect<V, T extends SelectOptionType<V>>({ footerLabel, label, loading, inputProps, onConfirm, onDismiss, onEndReached, onQueryChange, options, renderOption, renderSelectedValue, query, error, editable, disabled, required, style, testID, value, supportedOrientations, bottomSheetConfig, assistiveInfoConfig, }: MultiSelectProps<V, T>): React.JSX.Element;
30
30
  export default MultiSelect;
@@ -19,5 +19,5 @@ export interface SingleSelectProps<V, T extends SelectOptionType<V> = SelectOpti
19
19
  */
20
20
  supportedOrientations?: ('portrait' | 'landscape')[];
21
21
  }
22
- declare const SingleSelect: <V, T extends SelectOptionType<V>>({ label, loading, inputProps, onConfirm, onDismiss, onEndReached, onQueryChange, options, renderOption, renderSelectedValue, query, error, editable, disabled, required, style, testID, value, supportedOrientations, bottomSheetConfig, }: SingleSelectProps<V, T>) => React.JSX.Element;
22
+ declare const SingleSelect: <V, T extends SelectOptionType<V>>({ label, loading, inputProps, onConfirm, onDismiss, onEndReached, onQueryChange, options, renderOption, renderSelectedValue, query, error, editable, disabled, required, style, testID, value, supportedOrientations, bottomSheetConfig, assistiveInfoConfig, }: SingleSelectProps<V, T>) => React.JSX.Element;
23
23
  export default SingleSelect;
@@ -81,4 +81,13 @@ export interface SelectProps<V, T extends SelectOptionType<V>> extends Pick<Text
81
81
  variant?: BottomSheetProps['variant'];
82
82
  header?: BottomSheetProps['header'];
83
83
  };
84
+ /**
85
+ * Optional assistive info trigger config. When provided, an info icon is rendered
86
+ * below the field. `onPress` is called when the trigger is tapped.
87
+ */
88
+ assistiveInfoConfig?: {
89
+ onPress: () => void;
90
+ label?: string;
91
+ testID?: string;
92
+ };
84
93
  }
@@ -0,0 +1,11 @@
1
+ import { View } from 'react-native';
2
+ export declare const StyledTouchable: import("@emotion/native").StyledComponent<import("react-native").TouchableOpacityProps & import("react").RefAttributes<View> & {
3
+ theme?: import("@emotion/react").Theme;
4
+ as?: React.ElementType;
5
+ }, {}, {}>;
6
+ export declare const StyledRow: import("@emotion/native").StyledComponent<import("react-native").ViewProps & {
7
+ theme?: import("@emotion/react").Theme;
8
+ as?: React.ElementType;
9
+ }, {}, {
10
+ ref?: import("react").Ref<View> | undefined;
11
+ }>;
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export interface AssistiveInfoTriggerProps {
3
+ onPress: () => void;
4
+ label?: string;
5
+ disabled?: boolean;
6
+ testID?: string;
7
+ accessibilityLabel?: string;
8
+ }
9
+ declare const AssistiveInfoTrigger: ({ accessibilityLabel, disabled, label, onPress, testID, }: AssistiveInfoTriggerProps) => React.JSX.Element;
10
+ export default AssistiveInfoTrigger;
@@ -94,6 +94,15 @@ export interface TextInputProps extends NativeTextInputProps {
94
94
  * Component variant.
95
95
  */
96
96
  variant?: TextInputVariant;
97
+ /**
98
+ * Optional assistive info trigger config. When provided, an info icon is rendered
99
+ * below the field. `onPress` is called when the trigger is tapped.
100
+ */
101
+ assistiveInfoConfig?: {
102
+ onPress: () => void;
103
+ label?: string;
104
+ testID?: string;
105
+ };
97
106
  }
98
107
  export declare const getState: ({ disabled, error, editable, loading, isEmptyValue, }: {
99
108
  disabled?: boolean;
@@ -69,6 +69,8 @@ declare const getTextInputTheme: (theme: GlobalTheme) => {
69
69
  containerMarginTop: number;
70
70
  labelInsideTextInputMarginTop: number;
71
71
  errorAndHelpTextContainerPaddingTop: number;
72
+ assistiveInfoTriggerPadding: number;
73
+ assistiveInfoTriggerGap: number;
72
74
  inputAndLabelContainerPaddingTop: number;
73
75
  labelFocusedTranslateY: number;
74
76
  textareaLabelIdleTranslateY: number;