jfs-components 0.1.2 → 0.1.12
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 +45 -0
- package/lib/commonjs/components/Accordion/Accordion.js +2 -1
- package/lib/commonjs/components/AccordionCheckbox/AccordionCheckbox.js +4 -3
- package/lib/commonjs/components/AccountCard/AccountCard.js +4 -3
- package/lib/commonjs/components/AllocationComparisonChart/AllocationComparisonChart.js +9 -6
- package/lib/commonjs/components/AmountInput/AmountInput.js +8 -5
- package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +11 -7
- package/lib/commonjs/components/Badge/Badge.js +47 -8
- package/lib/commonjs/components/BenefitCard/BenefitCard.js +231 -0
- package/lib/commonjs/components/BrandChip/BrandChip.js +3 -3
- package/lib/commonjs/components/Button/Button.js +2 -1
- package/lib/commonjs/components/CardAdvisory/CardAdvisory.js +2 -1
- package/lib/commonjs/components/CardBankAccount/CardBankAccount.js +3 -2
- package/lib/commonjs/components/CardCTA/CardCTA.js +197 -27
- package/lib/commonjs/components/CardInsight/CardInsight.js +5 -1
- package/lib/commonjs/components/CcCard/CcCard.js +470 -0
- package/lib/commonjs/components/Checkbox/Checkbox.js +4 -3
- package/lib/commonjs/components/CheckboxItem/CheckboxItem.js +4 -3
- package/lib/commonjs/components/CircularProgressBar/CircularProgressBar.js +7 -3
- package/lib/commonjs/components/CircularProgressBarDoted/CircularProgressBarDoted.js +3 -2
- package/lib/commonjs/components/CircularRating/CircularRating.js +2 -1
- package/lib/commonjs/components/ClusterBubble/ClusterBubble.js +3 -2
- package/lib/commonjs/components/CompareTable/CompareTable.js +401 -0
- package/lib/commonjs/components/ComparisonBar/ComparisonBar.js +266 -0
- package/lib/commonjs/components/CoverageBarComparison/CoverageBarComparison.js +3 -2
- package/lib/commonjs/components/DonutChart/DonutChart.js +4 -3
- package/lib/commonjs/components/Dropdown/Dropdown.js +3 -2
- package/lib/commonjs/components/DropdownInput/DropdownInput.js +38 -5
- package/lib/commonjs/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
- package/lib/commonjs/components/FormField/FormField.js +45 -4
- package/lib/commonjs/components/Gauge/Gauge.js +1 -1
- package/lib/commonjs/components/HoldingsCard/HoldingsCard.js +3 -2
- package/lib/commonjs/components/InputSearch/InputSearch.js +6 -4
- package/lib/commonjs/components/InstitutionBadge/InstitutionBadge.js +2 -1
- package/lib/commonjs/components/ListGroup/ListGroup.js +2 -1
- package/lib/commonjs/components/ListItem/ListItem.js +3 -2
- package/lib/commonjs/components/MediaCard/MediaCard.js +4 -2
- package/lib/commonjs/components/MetricLegendItem/MetricLegendItem.js +3 -2
- package/lib/commonjs/components/MonthlyStatusGrid/MonthlyStatusGrid.js +6 -3
- package/lib/commonjs/components/NoteInput/NoteInput.js +6 -5
- package/lib/commonjs/components/PdpCcCard/PdpCcCard.js +273 -0
- package/lib/commonjs/components/PoweredByLabel/PoweredByLabel.js +3 -2
- package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +427 -0
- package/lib/commonjs/components/ProductOverview/ProductOverview.js +4 -3
- package/lib/commonjs/components/ProgressBadge/ProgressBadge.js +2 -2
- package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +162 -0
- package/lib/commonjs/components/Radio/Radio.js +5 -5
- package/lib/commonjs/components/Section/Section.js +3 -2
- package/lib/commonjs/components/Slider/Slider.js +474 -0
- package/lib/commonjs/components/Stack/Stack.js +86 -0
- package/lib/commonjs/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
- package/lib/commonjs/components/SummaryTile/SummaryTile.js +3 -2
- package/lib/commonjs/components/Table/Table.js +324 -0
- package/lib/commonjs/components/Text/Text.js +2 -1
- package/lib/commonjs/components/TextInput/TextInput.js +22 -9
- package/lib/commonjs/components/TextSegment/TextSegment.js +119 -0
- package/lib/commonjs/components/ThreadHero/ThreadHero.js +4 -5
- package/lib/commonjs/components/Title/Title.js +2 -1
- package/lib/commonjs/components/Toast/Toast.js +3 -2
- package/lib/commonjs/components/TransactionBubble/TransactionBubble.js +2 -1
- package/lib/commonjs/components/TransactionStatus/TransactionStatus.js +3 -2
- package/lib/commonjs/components/UpiHandle/UpiHandle.js +2 -2
- package/lib/commonjs/components/index.js +107 -0
- package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/commonjs/design-tokens/figma-modes.generated.js +39 -9
- package/lib/commonjs/icons/registry.js +1 -1
- package/lib/commonjs/utils/GlassFill/GlassFill.js +271 -0
- package/lib/commonjs/utils/GlassFill/GlassFill.web.js +120 -0
- package/lib/commonjs/utils/react-utils.js +78 -0
- package/lib/commonjs/utils/web-platform-utils.js +59 -0
- package/lib/module/components/Accordion/Accordion.js +3 -2
- package/lib/module/components/AccordionCheckbox/AccordionCheckbox.js +5 -4
- package/lib/module/components/AccountCard/AccountCard.js +5 -4
- package/lib/module/components/AllocationComparisonChart/AllocationComparisonChart.js +10 -7
- package/lib/module/components/AmountInput/AmountInput.js +6 -4
- package/lib/module/components/AreaLineChart/AreaLineChart.js +12 -8
- package/lib/module/components/Badge/Badge.js +49 -10
- package/lib/module/components/BenefitCard/BenefitCard.js +225 -0
- package/lib/module/components/BrandChip/BrandChip.js +4 -4
- package/lib/module/components/Button/Button.js +3 -2
- package/lib/module/components/CardAdvisory/CardAdvisory.js +3 -2
- package/lib/module/components/CardBankAccount/CardBankAccount.js +4 -3
- package/lib/module/components/CardCTA/CardCTA.js +198 -28
- package/lib/module/components/CardInsight/CardInsight.js +5 -1
- package/lib/module/components/CcCard/CcCard.js +464 -0
- package/lib/module/components/Checkbox/Checkbox.js +5 -4
- package/lib/module/components/CheckboxItem/CheckboxItem.js +5 -4
- package/lib/module/components/CircularProgressBar/CircularProgressBar.js +8 -4
- package/lib/module/components/CircularProgressBarDoted/CircularProgressBarDoted.js +4 -3
- package/lib/module/components/CircularRating/CircularRating.js +3 -2
- package/lib/module/components/ClusterBubble/ClusterBubble.js +4 -3
- package/lib/module/components/CompareTable/CompareTable.js +396 -0
- package/lib/module/components/ComparisonBar/ComparisonBar.js +260 -0
- package/lib/module/components/CoverageBarComparison/CoverageBarComparison.js +4 -3
- package/lib/module/components/DonutChart/DonutChart.js +5 -4
- package/lib/module/components/Dropdown/Dropdown.js +4 -3
- package/lib/module/components/DropdownInput/DropdownInput.js +40 -7
- package/lib/module/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
- package/lib/module/components/FormField/FormField.js +48 -7
- package/lib/module/components/Gauge/Gauge.js +1 -1
- package/lib/module/components/HoldingsCard/HoldingsCard.js +4 -3
- package/lib/module/components/InputSearch/InputSearch.js +6 -4
- package/lib/module/components/InstitutionBadge/InstitutionBadge.js +3 -2
- package/lib/module/components/ListGroup/ListGroup.js +3 -2
- package/lib/module/components/ListItem/ListItem.js +4 -3
- package/lib/module/components/MediaCard/MediaCard.js +4 -2
- package/lib/module/components/MetricLegendItem/MetricLegendItem.js +4 -3
- package/lib/module/components/MonthlyStatusGrid/MonthlyStatusGrid.js +7 -4
- package/lib/module/components/NoteInput/NoteInput.js +7 -6
- package/lib/module/components/PdpCcCard/PdpCcCard.js +267 -0
- package/lib/module/components/PoweredByLabel/PoweredByLabel.js +4 -3
- package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +421 -0
- package/lib/module/components/ProductOverview/ProductOverview.js +5 -4
- package/lib/module/components/ProgressBadge/ProgressBadge.js +3 -3
- package/lib/module/components/ProjectionMarker/ProjectionMarker.js +157 -0
- package/lib/module/components/Radio/Radio.js +5 -4
- package/lib/module/components/Section/Section.js +4 -3
- package/lib/module/components/Slider/Slider.js +469 -0
- package/lib/module/components/Stack/Stack.js +81 -0
- package/lib/module/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
- package/lib/module/components/SummaryTile/SummaryTile.js +4 -3
- package/lib/module/components/Table/Table.js +315 -0
- package/lib/module/components/Text/Text.js +3 -2
- package/lib/module/components/TextInput/TextInput.js +24 -11
- package/lib/module/components/TextSegment/TextSegment.js +114 -0
- package/lib/module/components/ThreadHero/ThreadHero.js +5 -6
- package/lib/module/components/Title/Title.js +3 -2
- package/lib/module/components/Toast/Toast.js +4 -3
- package/lib/module/components/TransactionBubble/TransactionBubble.js +3 -2
- package/lib/module/components/TransactionStatus/TransactionStatus.js +4 -3
- package/lib/module/components/UpiHandle/UpiHandle.js +3 -3
- package/lib/module/components/index.js +11 -0
- package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/module/design-tokens/figma-modes.generated.js +39 -9
- package/lib/module/icons/registry.js +1 -1
- package/lib/module/utils/GlassFill/GlassFill.js +265 -0
- package/lib/module/utils/GlassFill/GlassFill.web.js +115 -0
- package/lib/module/utils/react-utils.js +75 -0
- package/lib/module/utils/web-platform-utils.js +58 -0
- package/lib/typescript/src/components/Accordion/Accordion.d.ts +7 -1
- package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +7 -1
- package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +7 -1
- package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +7 -1
- package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +3 -2
- package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +8 -1
- package/lib/typescript/src/components/Badge/Badge.d.ts +32 -2
- package/lib/typescript/src/components/BenefitCard/BenefitCard.d.ts +93 -0
- package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +7 -1
- package/lib/typescript/src/components/Button/Button.d.ts +7 -1
- package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +7 -1
- package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +7 -1
- package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +27 -5
- package/lib/typescript/src/components/CcCard/CcCard.d.ts +137 -0
- package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +3 -2
- package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -2
- package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +7 -1
- package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +7 -1
- package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +7 -1
- package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +7 -1
- package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +94 -0
- package/lib/typescript/src/components/ComparisonBar/ComparisonBar.d.ts +118 -0
- package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +7 -1
- package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +7 -1
- package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +7 -1
- package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +26 -1
- package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +7 -1
- package/lib/typescript/src/components/FormField/FormField.d.ts +2 -2
- package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +7 -1
- package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +23 -2
- package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +7 -1
- package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +7 -1
- package/lib/typescript/src/components/ListItem/ListItem.d.ts +7 -1
- package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +7 -1
- package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +14 -2
- package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +19 -2
- package/lib/typescript/src/components/PdpCcCard/PdpCcCard.d.ts +84 -0
- package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +7 -1
- package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +87 -0
- package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +7 -1
- package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +7 -1
- package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +88 -0
- package/lib/typescript/src/components/Radio/Radio.d.ts +3 -2
- package/lib/typescript/src/components/RadioButton/RadioButton.d.ts +2 -2
- package/lib/typescript/src/components/Section/Section.d.ts +7 -1
- package/lib/typescript/src/components/Slider/Slider.d.ts +105 -0
- package/lib/typescript/src/components/Stack/Stack.d.ts +81 -0
- package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +7 -1
- package/lib/typescript/src/components/Table/Table.d.ts +139 -0
- package/lib/typescript/src/components/Text/Text.d.ts +7 -1
- package/lib/typescript/src/components/TextInput/TextInput.d.ts +9 -29
- package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +106 -0
- package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +7 -1
- package/lib/typescript/src/components/Title/Title.d.ts +7 -1
- package/lib/typescript/src/components/Toast/Toast.d.ts +7 -1
- package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +7 -1
- package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +7 -1
- package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +7 -1
- package/lib/typescript/src/components/index.d.ts +14 -3
- package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +22 -2
- package/lib/typescript/src/icons/registry.d.ts +1 -1
- package/lib/typescript/src/utils/GlassFill/GlassFill.d.ts +84 -0
- package/lib/typescript/src/utils/GlassFill/GlassFill.web.d.ts +43 -0
- package/lib/typescript/src/utils/react-utils.d.ts +47 -0
- package/lib/typescript/src/utils/web-platform-utils.d.ts +36 -0
- package/package.json +2 -1
- package/src/components/Accordion/Accordion.tsx +9 -2
- package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +10 -3
- package/src/components/AccountCard/AccountCard.tsx +10 -3
- package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +14 -4
- package/src/components/AmountInput/AmountInput.tsx +7 -5
- package/src/components/AreaLineChart/AreaLineChart.tsx +15 -5
- package/src/components/Badge/Badge.tsx +78 -8
- package/src/components/BenefitCard/BenefitCard.tsx +309 -0
- package/src/components/BrandChip/BrandChip.tsx +9 -3
- package/src/components/Button/Button.tsx +9 -2
- package/src/components/CardAdvisory/CardAdvisory.tsx +9 -2
- package/src/components/CardBankAccount/CardBankAccount.tsx +9 -2
- package/src/components/CardCTA/CardCTA.tsx +214 -41
- package/src/components/CardInsight/CardInsight.tsx +7 -1
- package/src/components/CcCard/CcCard.tsx +598 -0
- package/src/components/Checkbox/Checkbox.tsx +5 -4
- package/src/components/CheckboxItem/CheckboxItem.tsx +5 -4
- package/src/components/CircularProgressBar/CircularProgressBar.tsx +14 -4
- package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +10 -3
- package/src/components/CircularRating/CircularRating.tsx +9 -2
- package/src/components/ClusterBubble/ClusterBubble.tsx +9 -2
- package/src/components/CompareTable/CompareTable.tsx +525 -0
- package/src/components/ComparisonBar/ComparisonBar.tsx +356 -0
- package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +9 -2
- package/src/components/DonutChart/DonutChart.tsx +10 -3
- package/src/components/Dropdown/Dropdown.tsx +9 -2
- package/src/components/DropdownInput/DropdownInput.tsx +64 -5
- package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +8 -1
- package/src/components/FormField/FormField.tsx +52 -6
- package/src/components/Gauge/Gauge.tsx +1 -1
- package/src/components/HoldingsCard/HoldingsCard.tsx +9 -2
- package/src/components/InputSearch/InputSearch.tsx +8 -5
- package/src/components/InstitutionBadge/InstitutionBadge.tsx +9 -2
- package/src/components/ListGroup/ListGroup.tsx +9 -2
- package/src/components/ListItem/ListItem.tsx +10 -3
- package/src/components/MediaCard/MediaCard.tsx +2 -2
- package/src/components/MetricLegendItem/MetricLegendItem.tsx +9 -2
- package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +17 -2
- package/src/components/NoteInput/NoteInput.tsx +8 -6
- package/src/components/PdpCcCard/PdpCcCard.tsx +356 -0
- package/src/components/PoweredByLabel/PoweredByLabel.tsx +9 -2
- package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +490 -0
- package/src/components/ProductOverview/ProductOverview.tsx +10 -3
- package/src/components/ProgressBadge/ProgressBadge.tsx +9 -3
- package/src/components/ProjectionMarker/ProjectionMarker.tsx +284 -0
- package/src/components/Radio/Radio.tsx +5 -4
- package/src/components/Section/Section.tsx +10 -3
- package/src/components/Slider/Slider.tsx +635 -0
- package/src/components/Stack/Stack.tsx +131 -0
- package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +10 -1
- package/src/components/SummaryTile/SummaryTile.tsx +9 -2
- package/src/components/Table/Table.tsx +449 -0
- package/src/components/Text/Text.tsx +9 -2
- package/src/components/TextInput/TextInput.tsx +22 -12
- package/src/components/TextSegment/TextSegment.tsx +173 -0
- package/src/components/ThreadHero/ThreadHero.tsx +10 -3
- package/src/components/Title/Title.tsx +9 -2
- package/src/components/Toast/Toast.tsx +9 -2
- package/src/components/TransactionBubble/TransactionBubble.tsx +9 -2
- package/src/components/TransactionStatus/TransactionStatus.tsx +9 -2
- package/src/components/UpiHandle/UpiHandle.tsx +9 -3
- package/src/components/index.ts +33 -3
- package/src/design-tokens/Coin Variables-variables-full.json +1 -1
- package/src/design-tokens/figma-modes.generated.ts +39 -9
- package/src/icons/registry.ts +1 -1
- package/src/utils/GlassFill/GlassFill.tsx +305 -0
- package/src/utils/GlassFill/GlassFill.web.tsx +148 -0
- package/src/utils/react-utils.ts +84 -0
- package/src/utils/web-platform-utils.ts +68 -0
- package/lib/commonjs/components/MediaCard/GlassFill.js +0 -62
- package/lib/commonjs/components/MediaCard/GlassFill.web.js +0 -48
- package/lib/module/components/MediaCard/GlassFill.js +0 -57
- package/lib/module/components/MediaCard/GlassFill.web.js +0 -43
- package/lib/typescript/scripts/extract-component-tokens.d.ts +0 -9
- package/lib/typescript/scripts/generate-component-docs.d.ts +0 -9
- package/lib/typescript/scripts/generate-icon-registry.d.ts +0 -3
- package/lib/typescript/scripts/generate-mode-types.d.ts +0 -2
- package/lib/typescript/scripts/retype-modes.d.cts +0 -2
- package/lib/typescript/src/components/MediaCard/GlassFill.d.ts +0 -47
- package/lib/typescript/src/components/MediaCard/GlassFill.web.d.ts +0 -20
- package/src/components/MediaCard/GlassFill.tsx +0 -89
- package/src/components/MediaCard/GlassFill.web.tsx +0 -53
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import React, { useRef, useState } from 'react'
|
|
1
|
+
import React, { forwardRef, useRef, useState } from 'react'
|
|
2
2
|
import { Platform, Pressable, View, TextInput as RNTextInput, type StyleProp, type ViewStyle, type TextInputProps as RNTextInputProps, type TextStyle } from 'react-native'
|
|
3
3
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
4
4
|
import Icon from '../../icons/Icon'
|
|
5
|
-
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
5
|
+
import { EMPTY_MODES, cloneChildrenWithModes, mergeRefs } from '../../utils/react-utils'
|
|
6
6
|
import type { Modes } from '../../design-tokens'
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -112,7 +112,7 @@ type TextInputProps = {
|
|
|
112
112
|
accessibilityHint?: string;
|
|
113
113
|
} & Omit<RNTextInputProps, 'style' | 'onChangeText' | 'onFocus' | 'onBlur' | 'placeholder' | 'value'>;
|
|
114
114
|
|
|
115
|
-
function TextInput({
|
|
115
|
+
const TextInputBase = forwardRef<RNTextInput, TextInputProps>(function TextInput({
|
|
116
116
|
placeholder = '',
|
|
117
117
|
value = '',
|
|
118
118
|
onChangeText,
|
|
@@ -127,7 +127,7 @@ function TextInput({
|
|
|
127
127
|
accessibilityLabel,
|
|
128
128
|
accessibilityHint,
|
|
129
129
|
...rest
|
|
130
|
-
}: TextInputProps) {
|
|
130
|
+
}: TextInputProps, ref: React.Ref<RNTextInput>) {
|
|
131
131
|
// Track focus state to hide placeholder when focused
|
|
132
132
|
const [isFocused, setIsFocused] = useState(false)
|
|
133
133
|
const [isHovered, setIsHovered] = useState(false)
|
|
@@ -182,7 +182,13 @@ function TextInput({
|
|
|
182
182
|
flex: 1,
|
|
183
183
|
color: textColor,
|
|
184
184
|
fontSize,
|
|
185
|
-
lineHeight
|
|
185
|
+
// iOS-only quirk: a single-line RNTextInput with an explicit `lineHeight`
|
|
186
|
+
// larger than `fontSize` puts all the extra space ABOVE the glyphs, so the
|
|
187
|
+
// text/placeholder sits below center (iOS native font-metrics bug — see
|
|
188
|
+
// facebook/react-native#39145 / #28012). The container centers via
|
|
189
|
+
// `alignItems: 'center'` + `minHeight`, so omit lineHeight on iOS
|
|
190
|
+
// (UITextField centers natively) and keep it on Android/Web where it's fine.
|
|
191
|
+
...(Platform.OS === 'ios' ? null : { lineHeight }),
|
|
186
192
|
fontFamily,
|
|
187
193
|
fontWeight,
|
|
188
194
|
padding: 0,
|
|
@@ -251,7 +257,7 @@ function TextInput({
|
|
|
251
257
|
</View>
|
|
252
258
|
)}
|
|
253
259
|
<RNTextInput
|
|
254
|
-
ref={inputRef}
|
|
260
|
+
ref={mergeRefs(inputRef, ref)}
|
|
255
261
|
accessibilityLabel={undefined}
|
|
256
262
|
accessibilityHint={accessibilityHint}
|
|
257
263
|
placeholder={displayPlaceholder}
|
|
@@ -290,7 +296,7 @@ function TextInput({
|
|
|
290
296
|
}
|
|
291
297
|
|
|
292
298
|
return <View style={containerStyleArray}>{inner}</View>
|
|
293
|
-
}
|
|
299
|
+
})
|
|
294
300
|
|
|
295
301
|
/**
|
|
296
302
|
* TextInput.Search component that mirrors the Figma "textInput.search" component.
|
|
@@ -325,7 +331,7 @@ type TextInputSearchProps = {
|
|
|
325
331
|
onBlur?: (e: any) => void;
|
|
326
332
|
} & Omit<RNTextInputProps, 'style' | 'onChangeText' | 'onFocus' | 'onBlur' | 'placeholder' | 'value'>;
|
|
327
333
|
|
|
328
|
-
function TextInputSearch({
|
|
334
|
+
const TextInputSearch = forwardRef<RNTextInput, TextInputSearchProps>(function TextInputSearch({
|
|
329
335
|
placeholder = 'Search',
|
|
330
336
|
value = '',
|
|
331
337
|
onChangeText,
|
|
@@ -338,7 +344,7 @@ function TextInputSearch({
|
|
|
338
344
|
onFocus,
|
|
339
345
|
onBlur,
|
|
340
346
|
...rest
|
|
341
|
-
}: TextInputSearchProps) {
|
|
347
|
+
}: TextInputSearchProps, ref: React.Ref<RNTextInput>) {
|
|
342
348
|
// Resolve icon tokens for default search icon
|
|
343
349
|
const iconColor = getVariableByName('textInput/icon/color', modes) || '#24262b'
|
|
344
350
|
const iconSize = getVariableByName('textInput/icon/size', modes) || 18
|
|
@@ -379,10 +385,14 @@ function TextInputSearch({
|
|
|
379
385
|
textInputProps.accessibilityHint = accessibilityHint
|
|
380
386
|
}
|
|
381
387
|
|
|
382
|
-
return <TextInput {...(textInputProps as TextInputProps)} />
|
|
383
|
-
}
|
|
388
|
+
return <TextInput ref={ref} {...(textInputProps as TextInputProps)} />
|
|
389
|
+
})
|
|
384
390
|
|
|
385
|
-
// Attach Search as a property of TextInput using namespace pattern
|
|
391
|
+
// Attach Search as a property of TextInput using namespace pattern. The base
|
|
392
|
+
// component is created via forwardRef, so we compose the static onto a typed
|
|
393
|
+
// alias to keep `TextInput.Search` strongly typed.
|
|
394
|
+
type TextInputComponent = typeof TextInputBase & { Search: typeof TextInputSearch }
|
|
395
|
+
const TextInput = TextInputBase as TextInputComponent
|
|
386
396
|
TextInput.Search = TextInputSearch
|
|
387
397
|
|
|
388
398
|
export default TextInput
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import React, { useMemo } from 'react'
|
|
2
|
+
import { Text as RNText, type TextStyle, type StyleProp } from 'react-native'
|
|
3
|
+
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
4
|
+
import { EMPTY_MODES, cloneChildrenWithModes, resolveTruncation } from '../../utils/react-utils'
|
|
5
|
+
import type { Modes } from '../../design-tokens'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A single coloured run inside a {@link TextSegment}. Each run can carry its own
|
|
9
|
+
* `modes`, so individual fragments of the same paragraph can resolve different
|
|
10
|
+
* design tokens (most commonly a different `text/foreground` colour) while still
|
|
11
|
+
* flowing — and wrapping — inline as one continuous line of text.
|
|
12
|
+
*/
|
|
13
|
+
export type TextSegmentRun = {
|
|
14
|
+
/** The text for this run. Include trailing/leading spaces yourself when you want spacing between runs (inline text has no gap concept). */
|
|
15
|
+
text: string
|
|
16
|
+
/**
|
|
17
|
+
* Per-run mode overrides. Merged on top of the parent `TextSegment` modes, so
|
|
18
|
+
* a run only needs to specify what differs (e.g. `{ 'Text Appearance': 'Primary' }`
|
|
19
|
+
* to recolour just that fragment). Everything else is inherited.
|
|
20
|
+
*/
|
|
21
|
+
modes?: Modes
|
|
22
|
+
/** Optional per-run style override applied last, on top of the token-resolved style. */
|
|
23
|
+
style?: StyleProp<TextStyle>
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type TextSegmentProps = {
|
|
27
|
+
/**
|
|
28
|
+
* Declarative, data-driven way to compose a multi-colour string. Each entry
|
|
29
|
+
* becomes an inline run. This is the simplest API when the segments are known
|
|
30
|
+
* up front:
|
|
31
|
+
*
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <TextSegment segments={[
|
|
34
|
+
* { text: 'Upsell message ' },
|
|
35
|
+
* { text: 'JioFinance+', modes: { 'Text Appearance': 'Primary' } },
|
|
36
|
+
* ]} />
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* When both `segments` and `children` are provided, `children` win.
|
|
40
|
+
*/
|
|
41
|
+
segments?: TextSegmentRun[]
|
|
42
|
+
/**
|
|
43
|
+
* Compositional alternative to {@link TextSegmentProps.segments}. Pass library
|
|
44
|
+
* `Text` elements (or plain strings) as children and they are rendered nested
|
|
45
|
+
* inside the same paragraph so they wrap together. The parent `modes` cascade
|
|
46
|
+
* down to every child via `cloneChildrenWithModes`, and each child may still
|
|
47
|
+
* override with its own `modes`:
|
|
48
|
+
*
|
|
49
|
+
* ```tsx
|
|
50
|
+
* <TextSegment>
|
|
51
|
+
* <Text>Upsell message </Text>
|
|
52
|
+
* <Text modes={{ 'Text Appearance': 'Primary' }}>JioFinance+</Text>
|
|
53
|
+
* </TextSegment>
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
children?: React.ReactNode
|
|
57
|
+
/** Horizontal alignment of the whole paragraph. */
|
|
58
|
+
textAlign?: 'Left' | 'Center'
|
|
59
|
+
/** Clamp the paragraph to this many lines (truncates with an ellipsis). Applies to the whole composed line, not per-run. */
|
|
60
|
+
numberOfLines?: number
|
|
61
|
+
/**
|
|
62
|
+
* When `true`, disables truncation entirely: the trailing ellipsis (`…`) is
|
|
63
|
+
* never shown and the `numberOfLines` clamp is ignored, so the paragraph
|
|
64
|
+
* wraps to as many lines as it needs even when horizontal space is tight.
|
|
65
|
+
*/
|
|
66
|
+
disableTruncation?: boolean
|
|
67
|
+
/** Mode configuration used for the base style and cascaded to every run/child. */
|
|
68
|
+
modes?: Modes
|
|
69
|
+
/** Style override applied to the outer paragraph (e.g. width constraints to force wrapping). */
|
|
70
|
+
style?: StyleProp<TextStyle>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const TEXT_ALIGN_MAP: Record<NonNullable<TextSegmentProps['textAlign']>, TextStyle['textAlign']> = {
|
|
74
|
+
Left: 'left',
|
|
75
|
+
Center: 'center',
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Resolves the `text/*` design tokens for a given modes object into an RN
|
|
80
|
+
* `TextStyle`. Shared by the outer paragraph and every inline run so a run that
|
|
81
|
+
* only overrides colour still inherits the family/size/weight/spacing.
|
|
82
|
+
*/
|
|
83
|
+
function resolveTextStyle(modes: Modes): TextStyle {
|
|
84
|
+
return {
|
|
85
|
+
color: (getVariableByName('text/foreground', modes) ?? '#000000') as string,
|
|
86
|
+
fontFamily: (getVariableByName('text/fontFamily', modes) ?? 'JioType') as string,
|
|
87
|
+
fontSize: (getVariableByName('text/fontSize', modes) ?? 14) as number,
|
|
88
|
+
fontWeight: String(getVariableByName('text/fontWeight', modes) ?? '500') as TextStyle['fontWeight'],
|
|
89
|
+
lineHeight: (getVariableByName('text/lineHeight', modes) ?? 20) as number,
|
|
90
|
+
letterSpacing: (getVariableByName('text/letterSpacing', modes) ?? -0.5) as number,
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* TextSegment — composes several differently-styled text runs into a single
|
|
96
|
+
* paragraph that wraps as one continuous line.
|
|
97
|
+
*
|
|
98
|
+
* On the web you would reach for `<span>`s inside a `<p>`; the React Native
|
|
99
|
+
* equivalent is nesting `<Text>` inside a parent `<Text>`. That nesting is the
|
|
100
|
+
* whole trick: sibling `<View>`s would lay out as flex blocks and break onto
|
|
101
|
+
* rigid rows, but nested `<Text>` nodes flow inline and wrap naturally at word
|
|
102
|
+
* boundaries — exactly like a real paragraph — while each nested run keeps its
|
|
103
|
+
* own colour/weight resolved from its own `modes`.
|
|
104
|
+
*
|
|
105
|
+
* Two equivalent ways to author content:
|
|
106
|
+
* - **`segments` prop** — declarative array of `{ text, modes }` runs.
|
|
107
|
+
* - **`children`** — pass library `Text` elements (or strings); the parent
|
|
108
|
+
* `modes` cascade down and each child may override its own.
|
|
109
|
+
*
|
|
110
|
+
* @example Data-driven
|
|
111
|
+
* ```tsx
|
|
112
|
+
* <TextSegment
|
|
113
|
+
* segments={[
|
|
114
|
+
* { text: 'Upsell message ' },
|
|
115
|
+
* { text: 'JioFinance+', modes: { 'Text Appearance': 'Primary' } },
|
|
116
|
+
* ]}
|
|
117
|
+
* />
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
120
|
+
* @example Compositional
|
|
121
|
+
* ```tsx
|
|
122
|
+
* <TextSegment numberOfLines={2}>
|
|
123
|
+
* <Text>Pay with </Text>
|
|
124
|
+
* <Text modes={{ 'Text Appearance': 'Primary' }}>JioFinance+</Text>
|
|
125
|
+
* <Text> and earn rewards on every transaction.</Text>
|
|
126
|
+
* </TextSegment>
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
function TextSegment({
|
|
130
|
+
segments,
|
|
131
|
+
children,
|
|
132
|
+
textAlign = 'Left',
|
|
133
|
+
numberOfLines,
|
|
134
|
+
disableTruncation,
|
|
135
|
+
modes = EMPTY_MODES,
|
|
136
|
+
style,
|
|
137
|
+
}: TextSegmentProps) {
|
|
138
|
+
const baseStyle = useMemo<TextStyle>(
|
|
139
|
+
() => ({ ...resolveTextStyle(modes), textAlign: TEXT_ALIGN_MAP[textAlign] }),
|
|
140
|
+
[modes, textAlign]
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
// children win over `segments` so the compositional API can always override.
|
|
144
|
+
const hasChildren = children !== undefined && children !== null && children !== false
|
|
145
|
+
|
|
146
|
+
const renderedSegments = useMemo(() => {
|
|
147
|
+
if (hasChildren || !segments?.length) return null
|
|
148
|
+
return segments.map((run, index) => {
|
|
149
|
+
// Parent modes first, then the run's own modes override them — mirrors the
|
|
150
|
+
// merge order used by `cloneChildrenWithModes` for the children API.
|
|
151
|
+
const runModes = run.modes ? { ...modes, ...run.modes } : modes
|
|
152
|
+
const runStyle = run.modes ? resolveTextStyle(runModes) : undefined
|
|
153
|
+
return (
|
|
154
|
+
<RNText key={index} style={[runStyle, run.style]}>
|
|
155
|
+
{run.text}
|
|
156
|
+
</RNText>
|
|
157
|
+
)
|
|
158
|
+
})
|
|
159
|
+
}, [segments, hasChildren, modes])
|
|
160
|
+
|
|
161
|
+
// The cascade: every child (and its descendants) receives the parent modes so
|
|
162
|
+
// nested library `Text` runs resolve their tokens against the same baseline,
|
|
163
|
+
// while still honouring any per-child `modes` override.
|
|
164
|
+
const content = hasChildren ? cloneChildrenWithModes(children, modes) : renderedSegments
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<RNText style={[baseStyle, style]} {...resolveTruncation(disableTruncation, numberOfLines)}>
|
|
168
|
+
{content}
|
|
169
|
+
</RNText>
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export default React.memo(TextSegment)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { isValidElement, cloneElement, type ReactNode } from 'react'
|
|
2
2
|
import { View, Text, type ViewStyle, type TextStyle } from 'react-native'
|
|
3
3
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
4
|
-
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
4
|
+
import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils'
|
|
5
5
|
import type { Modes } from '../../design-tokens'
|
|
6
6
|
|
|
7
7
|
export type ThreadHeroProps = {
|
|
@@ -17,6 +17,12 @@ export type ThreadHeroProps = {
|
|
|
17
17
|
modes?: Modes
|
|
18
18
|
/** Optional container style */
|
|
19
19
|
style?: ViewStyle
|
|
20
|
+
/**
|
|
21
|
+
* When `true`, disables text truncation: the trailing ellipsis (`…`) is never
|
|
22
|
+
* shown and any `numberOfLines` clamp is ignored, so the text wraps to as many
|
|
23
|
+
* lines as it needs even when horizontal space is tight.
|
|
24
|
+
*/
|
|
25
|
+
disableTruncation?: boolean
|
|
20
26
|
}
|
|
21
27
|
|
|
22
28
|
/**
|
|
@@ -29,6 +35,7 @@ export default function ThreadHero({
|
|
|
29
35
|
renderAvatar,
|
|
30
36
|
modes = EMPTY_MODES,
|
|
31
37
|
style,
|
|
38
|
+
disableTruncation,
|
|
32
39
|
}: ThreadHeroProps) {
|
|
33
40
|
// Container Gaps
|
|
34
41
|
const containerGap = Number(getVariableByName('threadHero/gap', modes)) || 8
|
|
@@ -111,13 +118,13 @@ export default function ThreadHero({
|
|
|
111
118
|
{avatarContent}
|
|
112
119
|
{title ? <Text style={titleStyle}>{title}</Text> : null}
|
|
113
120
|
{subtitle ? (
|
|
114
|
-
<Text style={subtitleStyle}
|
|
121
|
+
<Text style={subtitleStyle} {...resolveTruncation(disableTruncation, 1, 'tail')}>
|
|
115
122
|
{subtitle}
|
|
116
123
|
</Text>
|
|
117
124
|
) : null}
|
|
118
125
|
</View>
|
|
119
126
|
{caption ? (
|
|
120
|
-
<Text style={captionStyle}
|
|
127
|
+
<Text style={captionStyle} {...resolveTruncation(disableTruncation, 1, 'tail')}>
|
|
121
128
|
{caption}
|
|
122
129
|
</Text>
|
|
123
130
|
) : null}
|
|
@@ -2,7 +2,7 @@ import React from 'react'
|
|
|
2
2
|
import { View, Text, type StyleProp, type ViewStyle, type TextStyle } from 'react-native'
|
|
3
3
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
4
4
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
5
|
-
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
5
|
+
import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils'
|
|
6
6
|
import type { Modes } from '../../design-tokens'
|
|
7
7
|
|
|
8
8
|
export type TitleProps = {
|
|
@@ -17,6 +17,12 @@ export type TitleProps = {
|
|
|
17
17
|
/** Optional style overrides for the subtitle text. */
|
|
18
18
|
subtitleStyle?: StyleProp<TextStyle>;
|
|
19
19
|
numberOfLines?: number;
|
|
20
|
+
/**
|
|
21
|
+
* When `true`, disables truncation for both the title and subtitle: the
|
|
22
|
+
* trailing ellipsis (`…`) is never shown and the `numberOfLines` clamp is
|
|
23
|
+
* ignored, so the text wraps fully even when horizontal space is tight.
|
|
24
|
+
*/
|
|
25
|
+
disableTruncation?: boolean;
|
|
20
26
|
accessibilityLabel?: string;
|
|
21
27
|
accessibilityHint?: string;
|
|
22
28
|
} & React.ComponentProps<typeof View>;
|
|
@@ -35,6 +41,7 @@ function Title({
|
|
|
35
41
|
textStyle,
|
|
36
42
|
subtitleStyle,
|
|
37
43
|
numberOfLines,
|
|
44
|
+
disableTruncation,
|
|
38
45
|
accessibilityLabel,
|
|
39
46
|
accessibilityHint,
|
|
40
47
|
...rest
|
|
@@ -128,7 +135,7 @@ function Title({
|
|
|
128
135
|
>
|
|
129
136
|
<Text
|
|
130
137
|
style={[titleTextStyle, textStyle]}
|
|
131
|
-
|
|
138
|
+
{...resolveTruncation(disableTruncation, numberOfLines !== undefined ? numberOfLines : 1)}
|
|
132
139
|
accessibilityElementsHidden={true}
|
|
133
140
|
importantForAccessibility="no"
|
|
134
141
|
>
|
|
@@ -3,7 +3,7 @@ import { StyleSheet, Text, type StyleProp, type ViewStyle } from 'react-native'
|
|
|
3
3
|
import Animated, { FadeIn, FadeOut, SlideInDown, SlideInUp } from 'react-native-reanimated'
|
|
4
4
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
5
5
|
import { closeToast, type ToastPlacement } from './useToast'
|
|
6
|
-
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
6
|
+
import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils'
|
|
7
7
|
import type { Modes } from '../../design-tokens'
|
|
8
8
|
|
|
9
9
|
export interface ToastProps {
|
|
@@ -14,6 +14,12 @@ export interface ToastProps {
|
|
|
14
14
|
modes?: Modes | undefined
|
|
15
15
|
placement?: ToastPlacement | undefined
|
|
16
16
|
style?: StyleProp<ViewStyle> | undefined
|
|
17
|
+
/**
|
|
18
|
+
* When `true`, disables text truncation: the trailing ellipsis (`…`) is never
|
|
19
|
+
* shown and any `numberOfLines` clamp is ignored, so the text wraps to as many
|
|
20
|
+
* lines as it needs even when horizontal space is tight.
|
|
21
|
+
*/
|
|
22
|
+
disableTruncation?: boolean
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
const ANIMATION_DURATION = 250
|
|
@@ -26,6 +32,7 @@ function Toast({
|
|
|
26
32
|
modes = EMPTY_MODES,
|
|
27
33
|
placement = 'bottom',
|
|
28
34
|
style,
|
|
35
|
+
disableTruncation,
|
|
29
36
|
}: ToastProps) {
|
|
30
37
|
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
|
|
31
38
|
|
|
@@ -88,7 +95,7 @@ function Toast({
|
|
|
88
95
|
accessibilityRole="alert"
|
|
89
96
|
accessibilityLiveRegion="assertive"
|
|
90
97
|
>
|
|
91
|
-
<Text style={textStyle}
|
|
98
|
+
<Text style={textStyle} {...resolveTruncation(disableTruncation, 2)}>
|
|
92
99
|
{title}
|
|
93
100
|
</Text>
|
|
94
101
|
</Animated.View>
|
|
@@ -4,7 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
4
4
|
import MoneyValue from '../MoneyValue/MoneyValue'
|
|
5
5
|
import TransactionStatus from '../TransactionStatus/TransactionStatus'
|
|
6
6
|
import NavArrow from '../NavArrow/NavArrow'
|
|
7
|
-
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
7
|
+
import { EMPTY_MODES, cloneChildrenWithModes, resolveTruncation } from '../../utils/react-utils'
|
|
8
8
|
import { usePressableWebSupport, type WebAccessibilityProps } from '../../utils/web-platform-utils'
|
|
9
9
|
import type { Modes } from '../../design-tokens'
|
|
10
10
|
|
|
@@ -23,6 +23,12 @@ export type TransactionBubbleProps = {
|
|
|
23
23
|
accessibilityLabel?: string
|
|
24
24
|
accessibilityHint?: string
|
|
25
25
|
webAccessibilityProps?: WebAccessibilityProps
|
|
26
|
+
/**
|
|
27
|
+
* When `true`, disables text truncation: the trailing ellipsis (`…`) is never
|
|
28
|
+
* shown and any `numberOfLines` clamp is ignored, so the text wraps to as many
|
|
29
|
+
* lines as it needs even when horizontal space is tight.
|
|
30
|
+
*/
|
|
31
|
+
disableTruncation?: boolean
|
|
26
32
|
} & Omit<PressableProps, 'style' | 'children' | 'onPress'>
|
|
27
33
|
|
|
28
34
|
/**
|
|
@@ -56,6 +62,7 @@ function TransactionBubble({
|
|
|
56
62
|
accessibilityLabel,
|
|
57
63
|
accessibilityHint,
|
|
58
64
|
webAccessibilityProps,
|
|
65
|
+
disableTruncation,
|
|
59
66
|
...rest
|
|
60
67
|
}: TransactionBubbleProps) {
|
|
61
68
|
const resolvedModes = {
|
|
@@ -122,7 +129,7 @@ function TransactionBubble({
|
|
|
122
129
|
const mainContent = (
|
|
123
130
|
<View style={{ gap: bubbleGap }}>
|
|
124
131
|
<View style={{ gap: moneyValueWrapGap }}>
|
|
125
|
-
<Text style={descriptionStyle}
|
|
132
|
+
<Text style={descriptionStyle} {...resolveTruncation(disableTruncation, 1)}>{description}</Text>
|
|
126
133
|
<MoneyValue value={value} currency={currency} modes={resolvedModes} />
|
|
127
134
|
</View>
|
|
128
135
|
{processedChildren}
|
|
@@ -2,7 +2,7 @@ import React from 'react'
|
|
|
2
2
|
import { View, Text, type ViewStyle, type TextStyle } from 'react-native'
|
|
3
3
|
import { Svg, Path } from 'react-native-svg'
|
|
4
4
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
5
|
-
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
5
|
+
import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils'
|
|
6
6
|
import type { Modes } from '../../design-tokens'
|
|
7
7
|
|
|
8
8
|
// --- Internal Icon Component ---
|
|
@@ -48,6 +48,12 @@ export type TransactionStatusProps = {
|
|
|
48
48
|
modes?: Modes
|
|
49
49
|
/** Optional container style */
|
|
50
50
|
style?: ViewStyle
|
|
51
|
+
/**
|
|
52
|
+
* When `true`, disables text truncation: the trailing ellipsis (`…`) is never
|
|
53
|
+
* shown and any `numberOfLines` clamp is ignored, so the text wraps to as many
|
|
54
|
+
* lines as it needs even when horizontal space is tight.
|
|
55
|
+
*/
|
|
56
|
+
disableTruncation?: boolean
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
/**
|
|
@@ -58,6 +64,7 @@ export default function TransactionStatus({
|
|
|
58
64
|
date = '20 Mar 2025',
|
|
59
65
|
modes = EMPTY_MODES,
|
|
60
66
|
style,
|
|
67
|
+
disableTruncation,
|
|
61
68
|
}: TransactionStatusProps) {
|
|
62
69
|
const gap = Number(getVariableByName('transactionBubble/statusWrap/gap', modes)) || 4
|
|
63
70
|
// Using 'transactionStatus' tokens for text
|
|
@@ -88,7 +95,7 @@ export default function TransactionStatus({
|
|
|
88
95
|
return (
|
|
89
96
|
<View style={containerStyle}>
|
|
90
97
|
<StatusIcon width={iconSize} height={iconSize} color={iconColor} modes={modes} />
|
|
91
|
-
<Text style={textStyle}
|
|
98
|
+
<Text style={textStyle} {...resolveTruncation(disableTruncation, 1)}>
|
|
92
99
|
{status} · {date}
|
|
93
100
|
</Text>
|
|
94
101
|
</View>
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from 'react-native'
|
|
14
14
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
15
15
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
16
|
-
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
16
|
+
import { EMPTY_MODES, resolveTruncation } from '../../utils/react-utils'
|
|
17
17
|
import MediaSource, { type UnifiedSource } from '../../utils/MediaSource'
|
|
18
18
|
import Icon from '../../icons/Icon'
|
|
19
19
|
import type { Modes } from '../../design-tokens'
|
|
@@ -52,6 +52,12 @@ type UpiHandleProps = {
|
|
|
52
52
|
onPress?: () => void;
|
|
53
53
|
onClick?: () => void;
|
|
54
54
|
disabled?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* When `true`, disables text truncation: the trailing ellipsis (`…`) is never
|
|
57
|
+
* shown and any `numberOfLines` clamp is ignored, so the text wraps to as many
|
|
58
|
+
* lines as it needs even when horizontal space is tight.
|
|
59
|
+
*/
|
|
60
|
+
disableTruncation?: boolean;
|
|
55
61
|
} & Omit<React.ComponentProps<typeof View>, 'style' | 'accessibilityRole' | 'accessibilityLabel' | 'accessibilityHint'>;
|
|
56
62
|
|
|
57
63
|
interface UpiHandleTokens {
|
|
@@ -152,6 +158,7 @@ function UpiHandle({
|
|
|
152
158
|
onPress,
|
|
153
159
|
onClick,
|
|
154
160
|
disabled,
|
|
161
|
+
disableTruncation,
|
|
155
162
|
// accessibilityLabel is accepted on the type for API back-compat; the
|
|
156
163
|
// wrapper renders `accessibilityLabel={undefined}` because the inner Text
|
|
157
164
|
// already carries the label.
|
|
@@ -240,8 +247,7 @@ function UpiHandle({
|
|
|
240
247
|
</View>
|
|
241
248
|
<Text
|
|
242
249
|
style={tokens.labelStyle}
|
|
243
|
-
|
|
244
|
-
ellipsizeMode="tail"
|
|
250
|
+
{...resolveTruncation(disableTruncation, 1, 'tail')}
|
|
245
251
|
accessibilityElementsHidden={true}
|
|
246
252
|
importantForAccessibility="no"
|
|
247
253
|
>
|
package/src/components/index.ts
CHANGED
|
@@ -4,7 +4,8 @@ export { default as Attached, type AttachedProps, type AttachedPosition } from '
|
|
|
4
4
|
export { default as AppBar } from './AppBar/AppBar';
|
|
5
5
|
export { default as Avatar, type AvatarProps } from './Avatar/Avatar';
|
|
6
6
|
export { default as AvatarGroup } from './AvatarGroup/AvatarGroup';
|
|
7
|
-
export { default as Badge } from './Badge/Badge';
|
|
7
|
+
export { default as Badge, type BadgeProps, type BadgeType } from './Badge/Badge';
|
|
8
|
+
export { default as BenefitCard, type BenefitCardProps, type BenefitCardItem } from './BenefitCard/BenefitCard';
|
|
8
9
|
export { default as BottomNav } from './BottomNav/BottomNav';
|
|
9
10
|
export { default as BottomNavItem } from './BottomNavItem/BottomNavItem';
|
|
10
11
|
export { default as BrandChip, type BrandChipProps } from './BrandChip/BrandChip';
|
|
@@ -20,13 +21,14 @@ export { default as CheckboxGroup, type CheckboxGroupProps } from './CheckboxGro
|
|
|
20
21
|
export { default as CardFeedback, type CardFeedbackProps } from './CardFeedback/CardFeedback';
|
|
21
22
|
export { default as CardFinancialCondition, type CardFinancialConditionProps } from './CardFinancialCondition/CardFinancialCondition';
|
|
22
23
|
export { default as CardInsight, type CardInsightProps } from './CardInsight/CardInsight';
|
|
24
|
+
export { default as CcCard, type CcCardProps, type CcCardBadge, type CcCardListItem } from './CcCard/CcCard';
|
|
23
25
|
export { default as Disclaimer } from './Disclaimer/Disclaimer';
|
|
24
26
|
export { default as Divider, type DividerProps, type DividerDirection } from './Divider/Divider';
|
|
25
27
|
export { default as Drawer, type DrawerProps, type DrawerHandle } from './Drawer/Drawer';
|
|
26
28
|
export { default as Dropdown, DropdownItem, type DropdownProps, type DropdownItemProps } from './Dropdown/Dropdown';
|
|
27
|
-
export { default as DropdownInput, type DropdownInputProps, type DropdownInputOption, type DropdownInputOptionValue } from './DropdownInput/DropdownInput';
|
|
29
|
+
export { default as DropdownInput, type DropdownInputProps, type DropdownInputHandle, type DropdownInputOption, type DropdownInputOptionValue } from './DropdownInput/DropdownInput';
|
|
28
30
|
export { default as SuggestiveSearch, type SuggestiveSearchProps, type SuggestiveSearchOption, type SuggestiveSearchOptionValue, type SuggestiveSearchItem } from './SuggestiveSearch/SuggestiveSearch';
|
|
29
|
-
export { default as CardCTA, type CardCTAProps, type CardCTAType } from './CardCTA/CardCTA'
|
|
31
|
+
export { default as CardCTA, type CardCTAProps, type CardCTAType, type CardCTATypeInput } from './CardCTA/CardCTA'
|
|
30
32
|
export { default as DebitCard, type DebitCardProps } from './DebitCard/DebitCard';
|
|
31
33
|
export { default as FilterBar } from './FilterBar/FilterBar';
|
|
32
34
|
export { default as FullscreenModal, type FullscreenModalProps } from './FullscreenModal/FullscreenModal';
|
|
@@ -38,6 +40,7 @@ export { default as CircularProgressBarDoted, type CircularProgressBarDotedProps
|
|
|
38
40
|
export { default as CircularRating, type CircularRatingProps } from './CircularRating/CircularRating'
|
|
39
41
|
export { default as CoverageRing, type CoverageRingProps } from './CoverageRing/CoverageRing'
|
|
40
42
|
export { default as CoverageBarComparison, type CoverageBarComparisonProps, type CoverageBarComparisonItem } from './CoverageBarComparison/CoverageBarComparison'
|
|
43
|
+
export { default as ComparisonBar, type ComparisonBarProps, type ComparisonBarItem } from './ComparisonBar/ComparisonBar'
|
|
41
44
|
export { default as AllocationComparisonChart, type AllocationComparisonChartProps, type AllocationSegment } from './AllocationComparisonChart/AllocationComparisonChart'
|
|
42
45
|
export { default as MonthlyStatusGrid, CalendarGlyph, type MonthlyStatusGridProps, type MonthlyStatusGridMonth, type MonthlyStatus, type CalendarGlyphProps } from './MonthlyStatusGrid/MonthlyStatusGrid'
|
|
43
46
|
export { default as Gauge, type GaugeProps } from './Gauge/Gauge';
|
|
@@ -67,7 +70,13 @@ export { default as Overlay, type OverlayProps } from './Overlay/Overlay';
|
|
|
67
70
|
export { default as Title, type TitleProps } from './Title/Title';
|
|
68
71
|
export { default as Screen, type ScreenProps } from './Screen/Screen';
|
|
69
72
|
export { default as Section } from './Section/Section';
|
|
73
|
+
export { default as Slider, type SliderProps, type SliderHandle } from './Slider/Slider';
|
|
70
74
|
export { default as Slot, type SlotProps, type SlotLayoutDirection } from './Slot/Slot';
|
|
75
|
+
export {
|
|
76
|
+
default as Stack,
|
|
77
|
+
type StackProps,
|
|
78
|
+
type StackLayoutDirection,
|
|
79
|
+
} from './Stack/Stack';
|
|
71
80
|
export { default as Spinner, type SpinnerProps, type SpinnerColors } from './Spinner/Spinner';
|
|
72
81
|
export { default as Stepper, type StepperProps } from './Stepper/Stepper';
|
|
73
82
|
export { Step, type StepProps, type StepStatus } from './Stepper/Step';
|
|
@@ -126,12 +135,32 @@ export { default as ToastProvider, type ToastProviderProps } from './Toast/Toast
|
|
|
126
135
|
export { useToast, addToast, closeToast, closeAll, type ToastOptions, type ToastEntry, type ToastPlacement } from './Toast/useToast';
|
|
127
136
|
export { default as AmountInput, type AmountInputProps } from './AmountInput/AmountInput';
|
|
128
137
|
export { default as PageHero, type PageHeroProps } from './PageHero/PageHero';
|
|
138
|
+
export { default as PdpCcCard, type PdpCcCardProps, type PdpCcCardMetric } from './PdpCcCard/PdpCcCard';
|
|
129
139
|
export { default as Popup, type PopupProps, type PopupRef } from './Popup/Popup';
|
|
130
140
|
export { default as PortfolioHero, type PortfolioHeroProps } from './PortfolioHero/PortfolioHero';
|
|
131
141
|
export { default as PlanComparisonCard, type PlanComparisonCardProps, type PlanComparisonColumn, type PlanComparisonRow, type PlanComparisonCellValue } from './PlanComparisonCard/PlanComparisonCard';
|
|
142
|
+
export { default as CompareTable, type CompareTableProps, type CompareTableColumn, type CompareTableRow, type CompareTableCellValue, type CompareTableSection } from './CompareTable/CompareTable';
|
|
143
|
+
export {
|
|
144
|
+
default as Table,
|
|
145
|
+
TableHeader,
|
|
146
|
+
TableHeaderCell,
|
|
147
|
+
TableBody,
|
|
148
|
+
TableRow,
|
|
149
|
+
TableCell,
|
|
150
|
+
type TableProps,
|
|
151
|
+
type TableColumn,
|
|
152
|
+
type TableCellAlign,
|
|
153
|
+
type TableHeaderProps,
|
|
154
|
+
type TableHeaderCellProps,
|
|
155
|
+
type TableBodyProps,
|
|
156
|
+
type TableRowProps,
|
|
157
|
+
type TableCellProps,
|
|
158
|
+
} from './Table/Table';
|
|
132
159
|
export { default as PoweredByLabel, type PoweredByLabelProps } from './PoweredByLabel/PoweredByLabel';
|
|
133
160
|
export { default as ProductLabel, type ProductLabelProps } from './ProductLabel/ProductLabel';
|
|
161
|
+
export { default as ProductMerchandisingCard, type ProductMerchandisingCardProps } from './ProductMerchandisingCard/ProductMerchandisingCard';
|
|
134
162
|
export { default as ProductOverview, type ProductOverviewProps, type ProductOverviewStat } from './ProductOverview/ProductOverview';
|
|
163
|
+
export { default as ProjectionMarker, type ProjectionMarkerProps } from './ProjectionMarker/ProjectionMarker';
|
|
135
164
|
export { default as ProgressBadge, type ProgressBadgeProps } from './ProgressBadge/ProgressBadge';
|
|
136
165
|
export { default as SwappableAmount, type SwappableAmountProps } from './SwappableAmount/SwappableAmount';
|
|
137
166
|
export {
|
|
@@ -152,5 +181,6 @@ export { default as StrengthIndicator, type StrengthIndicatorProps, type Strengt
|
|
|
152
181
|
export { default as SummaryTile, type SummaryTileProps } from './SummaryTile/SummaryTile';
|
|
153
182
|
export { default as TestimonialsCard, type TestimonialsCardProps } from './TestimonialsCard/TestimonialsCard';
|
|
154
183
|
export { default as Text, type TextProps } from './Text/Text';
|
|
184
|
+
export { default as TextSegment, type TextSegmentProps, type TextSegmentRun } from './TextSegment/TextSegment';
|
|
155
185
|
export { default as SegmentedControl, type SegmentedControlProps, type SegmentedControlItem } from './SegmentedControl/SegmentedControl';
|
|
156
186
|
export { default as Toggle, type ToggleProps } from './Toggle/Toggle';
|