jfs-components 0.1.0 → 0.1.8
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 +37 -0
- package/lib/commonjs/components/AmountInput/AmountInput.js +8 -5
- package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +1 -1
- package/lib/commonjs/components/Balance/Balance.js +17 -12
- package/lib/commonjs/components/BenefitCard/BenefitCard.js +231 -0
- package/lib/commonjs/components/Card/Card.js +2 -1
- package/lib/commonjs/components/CardFeedback/CardFeedback.js +2 -1
- package/lib/commonjs/components/CcCard/CcCard.js +470 -0
- package/lib/commonjs/components/Checkbox/Checkbox.js +6 -4
- package/lib/commonjs/components/CheckboxItem/CheckboxItem.js +4 -3
- package/lib/commonjs/components/CompareTable/CompareTable.js +372 -0
- package/lib/commonjs/components/ComparisonBar/ComparisonBar.js +266 -0
- package/lib/commonjs/components/Drawer/Drawer.js +13 -4
- package/lib/commonjs/components/DropdownInput/DropdownInput.js +36 -4
- package/lib/commonjs/components/FormField/FormField.js +4 -3
- package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +62 -2
- package/lib/commonjs/components/Image/Image.js +11 -5
- package/lib/commonjs/components/InputSearch/InputSearch.js +6 -4
- package/lib/commonjs/components/LottiePlayer/loadNativeLottieView.js +8 -13
- package/lib/commonjs/components/NoteInput/NoteInput.js +6 -5
- package/lib/commonjs/components/Overlay/Overlay.js +92 -0
- package/lib/commonjs/components/PdpCcCard/PdpCcCard.js +273 -0
- package/lib/commonjs/components/PlanComparisonCard/PlanComparisonCard.js +2 -1
- package/lib/commonjs/components/ProductMerchandisingCard/GlassFill.js +263 -0
- package/lib/commonjs/components/ProductMerchandisingCard/GlassFill.web.js +116 -0
- package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +353 -0
- package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +161 -0
- package/lib/commonjs/components/Radio/Radio.js +5 -5
- package/lib/commonjs/components/Slider/Slider.js +473 -0
- package/lib/commonjs/components/TextInput/TextInput.js +15 -9
- package/lib/commonjs/components/TextSegment/TextSegment.js +118 -0
- package/lib/commonjs/components/docs/modeControls.js +116 -0
- package/lib/commonjs/components/index.js +70 -0
- package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/commonjs/design-tokens/JFSThemeProvider.js +1 -1
- package/lib/commonjs/design-tokens/figma-modes.generated.js +420 -0
- package/lib/commonjs/design-tokens/index.js +11 -0
- package/lib/commonjs/icons/registry.js +1 -1
- package/lib/commonjs/utils/react-utils.js +22 -0
- package/lib/module/components/Accordion/Accordion.js +1 -2
- package/lib/module/components/AmountInput/AmountInput.js +6 -4
- package/lib/module/components/AreaLineChart/AreaLineChart.js +1 -1
- package/lib/module/components/Balance/Balance.js +18 -13
- package/lib/module/components/BenefitCard/BenefitCard.js +225 -0
- package/lib/module/components/Card/Card.js +1 -2
- package/lib/module/components/CardFeedback/CardFeedback.js +1 -2
- package/lib/module/components/CcCard/CcCard.js +464 -0
- package/lib/module/components/Checkbox/Checkbox.js +6 -6
- package/lib/module/components/CheckboxItem/CheckboxItem.js +5 -4
- package/lib/module/components/CompareTable/CompareTable.js +367 -0
- package/lib/module/components/ComparisonBar/ComparisonBar.js +260 -0
- package/lib/module/components/Drawer/Drawer.js +12 -4
- package/lib/module/components/DropdownInput/DropdownInput.js +37 -5
- package/lib/module/components/FormField/FormField.js +5 -4
- package/lib/module/components/FullscreenModal/FullscreenModal.js +64 -5
- package/lib/module/components/Image/Image.js +11 -5
- package/lib/module/components/InputSearch/InputSearch.js +6 -4
- package/lib/module/components/InstitutionBadge/InstitutionBadge.js +1 -2
- package/lib/module/components/LottiePlayer/loadNativeLottieView.js +8 -13
- package/lib/module/components/MoneyValue/MoneyValue.js +1 -2
- package/lib/module/components/NoteInput/NoteInput.js +7 -6
- package/lib/module/components/OTP/OTP.js +1 -2
- package/lib/module/components/Overlay/Overlay.js +87 -0
- package/lib/module/components/PdpCcCard/PdpCcCard.js +267 -0
- package/lib/module/components/PlanComparisonCard/PlanComparisonCard.js +1 -2
- package/lib/module/components/PoweredByLabel/PoweredByLabel.js +1 -2
- package/lib/module/components/ProductMerchandisingCard/GlassFill.js +257 -0
- package/lib/module/components/ProductMerchandisingCard/GlassFill.web.js +111 -0
- package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +347 -0
- package/lib/module/components/ProjectionMarker/ProjectionMarker.js +156 -0
- package/lib/module/components/Radio/Radio.js +5 -4
- package/lib/module/components/RechargeCard/RechargeCard.js +1 -2
- package/lib/module/components/Section/Section.js +1 -2
- package/lib/module/components/Slider/Slider.js +468 -0
- package/lib/module/components/TextInput/TextInput.js +16 -12
- package/lib/module/components/TextSegment/TextSegment.js +113 -0
- package/lib/module/components/UpiHandle/UpiHandle.js +1 -2
- package/lib/module/components/docs/modeControls.js +111 -0
- package/lib/module/components/index.js +10 -0
- package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/module/design-tokens/JFSThemeProvider.js +1 -1
- package/lib/module/design-tokens/figma-modes.generated.js +416 -0
- package/lib/module/design-tokens/index.js +2 -1
- package/lib/module/icons/registry.js +1 -1
- package/lib/module/utils/react-utils.js +21 -1
- package/lib/typescript/src/components/Accordion/Accordion.d.ts +2 -1
- package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +2 -1
- package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +2 -1
- package/lib/typescript/src/components/ActionFooter/ActionFooter.d.ts +2 -1
- package/lib/typescript/src/components/ActionTile/ActionTile.d.ts +2 -1
- package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +2 -1
- package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +5 -3
- package/lib/typescript/src/components/AppBar/AppBar.d.ts +2 -1
- package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +3 -2
- package/lib/typescript/src/components/Attached/Attached.d.ts +2 -1
- package/lib/typescript/src/components/Avatar/Avatar.d.ts +2 -1
- package/lib/typescript/src/components/AvatarGroup/AvatarGroup.d.ts +2 -1
- package/lib/typescript/src/components/Badge/Badge.d.ts +2 -1
- package/lib/typescript/src/components/Balance/Balance.d.ts +2 -1
- package/lib/typescript/src/components/BenefitCard/BenefitCard.d.ts +93 -0
- package/lib/typescript/src/components/BottomNav/BottomNav.d.ts +2 -1
- package/lib/typescript/src/components/BottomNavItem/BottomNavItem.d.ts +2 -1
- package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +2 -1
- package/lib/typescript/src/components/BubbleChart/BubbleChart.d.ts +2 -1
- package/lib/typescript/src/components/Button/Button.d.ts +2 -1
- package/lib/typescript/src/components/ButtonGroup/ButtonGroup.d.ts +2 -1
- package/lib/typescript/src/components/Card/Card.d.ts +3 -2
- package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +2 -1
- package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +2 -1
- package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +2 -1
- package/lib/typescript/src/components/CardFeedback/CardFeedback.d.ts +7 -6
- package/lib/typescript/src/components/CardFinancialCondition/CardFinancialCondition.d.ts +2 -1
- package/lib/typescript/src/components/CardInsight/CardInsight.d.ts +2 -1
- package/lib/typescript/src/components/CardProviderInfo/CardProviderInfo.d.ts +2 -1
- package/lib/typescript/src/components/Carousel/Carousel.d.ts +4 -3
- package/lib/typescript/src/components/CcCard/CcCard.d.ts +137 -0
- package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +5 -3
- package/lib/typescript/src/components/CheckboxGroup/CheckboxGroup.d.ts +2 -1
- package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +4 -3
- package/lib/typescript/src/components/ChipGroup/ChipGroup.d.ts +2 -1
- package/lib/typescript/src/components/ChipSelect/ChipSelect.d.ts +2 -1
- package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +2 -1
- package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +2 -1
- package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +2 -1
- package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +2 -1
- package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +88 -0
- package/lib/typescript/src/components/ComparisonBar/ComparisonBar.d.ts +118 -0
- package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +3 -2
- package/lib/typescript/src/components/CoverageRing/CoverageRing.d.ts +2 -1
- package/lib/typescript/src/components/DebitCard/DebitCard.d.ts +2 -1
- package/lib/typescript/src/components/Disclaimer/Disclaimer.d.ts +2 -1
- package/lib/typescript/src/components/Divider/Divider.d.ts +2 -1
- package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +4 -3
- package/lib/typescript/src/components/DonutChartSummary/DonutChartSummary.d.ts +3 -2
- package/lib/typescript/src/components/Drawer/Drawer.d.ts +15 -1
- package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +3 -2
- package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +22 -2
- package/lib/typescript/src/components/EmptyState/EmptyState.d.ts +2 -1
- package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +2 -1
- package/lib/typescript/src/components/FilterBar/FilterBar.d.ts +3 -2
- package/lib/typescript/src/components/Form/Form.d.ts +2 -1
- package/lib/typescript/src/components/FormField/FormField.d.ts +4 -3
- package/lib/typescript/src/components/FullscreenModal/FullscreenModal.d.ts +2 -1
- package/lib/typescript/src/components/Gauge/Gauge.d.ts +2 -1
- package/lib/typescript/src/components/HStack/HStack.d.ts +2 -1
- package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +2 -1
- package/lib/typescript/src/components/Icon/Icon.d.ts +2 -1
- package/lib/typescript/src/components/IconButton/IconButton.d.ts +2 -1
- package/lib/typescript/src/components/IconCapsule/IconCapsule.d.ts +2 -1
- package/lib/typescript/src/components/Image/Image.d.ts +17 -1
- package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +25 -3
- package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +2 -1
- package/lib/typescript/src/components/LazyList/LazyList.d.ts +2 -1
- package/lib/typescript/src/components/LinearMeter/LinearMeter.d.ts +3 -2
- package/lib/typescript/src/components/LinearProgress/LinearProgress.d.ts +2 -1
- package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +2 -1
- package/lib/typescript/src/components/ListItem/ListItem.d.ts +2 -1
- package/lib/typescript/src/components/LottieIntroBlock/LottieIntroBlock.d.ts +2 -1
- package/lib/typescript/src/components/LottiePlayer/LottiePlayer.d.ts +2 -1
- package/lib/typescript/src/components/LottiePlayer/LottiePlayer.web.d.ts +2 -1
- package/lib/typescript/src/components/MediaCard/MediaCard.d.ts +6 -5
- package/lib/typescript/src/components/MerchantProfile/MerchantProfile.d.ts +2 -1
- package/lib/typescript/src/components/MessageField/MessageField.d.ts +2 -1
- package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +2 -1
- package/lib/typescript/src/components/MoneyValue/MoneyValue.d.ts +2 -1
- package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +4 -3
- package/lib/typescript/src/components/NavArrow/NavArrow.d.ts +2 -1
- package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +21 -3
- package/lib/typescript/src/components/Nudge/Nudge.d.ts +2 -1
- package/lib/typescript/src/components/Numpad/Numpad.d.ts +2 -1
- package/lib/typescript/src/components/OTP/OTP.d.ts +3 -2
- package/lib/typescript/src/components/Overlay/Overlay.d.ts +52 -0
- package/lib/typescript/src/components/PageHero/PageHero.d.ts +2 -1
- package/lib/typescript/src/components/PaymentFeedback/PaymentFeedback.d.ts +2 -1
- package/lib/typescript/src/components/PdpCcCard/PdpCcCard.d.ts +84 -0
- package/lib/typescript/src/components/PlanComparisonCard/PlanComparisonCard.d.ts +2 -1
- package/lib/typescript/src/components/Popup/Popup.d.ts +2 -1
- package/lib/typescript/src/components/PortfolioHero/PortfolioHero.d.ts +2 -1
- package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +2 -1
- package/lib/typescript/src/components/ProductLabel/ProductLabel.d.ts +2 -1
- package/lib/typescript/src/components/ProductMerchandisingCard/GlassFill.d.ts +56 -0
- package/lib/typescript/src/components/ProductMerchandisingCard/GlassFill.web.d.ts +27 -0
- package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +81 -0
- package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +2 -1
- package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +2 -1
- package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +82 -0
- package/lib/typescript/src/components/Radio/Radio.d.ts +5 -3
- package/lib/typescript/src/components/RadioButton/RadioButton.d.ts +2 -2
- package/lib/typescript/src/components/RangeTrack/RangeTrack.d.ts +3 -2
- package/lib/typescript/src/components/RechargeCard/RechargeCard.d.ts +2 -1
- package/lib/typescript/src/components/SavingsGoalSummary/SavingsGoalSummary.d.ts +2 -1
- package/lib/typescript/src/components/Screen/Screen.d.ts +2 -1
- package/lib/typescript/src/components/Section/Section.d.ts +3 -2
- package/lib/typescript/src/components/SegmentedControl/SegmentedControl.d.ts +2 -1
- package/lib/typescript/src/components/SegmentedTrack/SegmentedTrack.d.ts +4 -3
- package/lib/typescript/src/components/Slider/Slider.d.ts +99 -0
- package/lib/typescript/src/components/Slot/Slot.d.ts +2 -1
- package/lib/typescript/src/components/Spinner/Spinner.d.ts +2 -1
- package/lib/typescript/src/components/StatGroup/StatGroup.d.ts +2 -1
- package/lib/typescript/src/components/StatItem/StatItem.d.ts +2 -1
- package/lib/typescript/src/components/StatusHero/StatusHero.d.ts +2 -1
- package/lib/typescript/src/components/Stepper/Step.d.ts +2 -1
- package/lib/typescript/src/components/Stepper/StepLabel.d.ts +2 -1
- package/lib/typescript/src/components/Stepper/Stepper.d.ts +2 -1
- package/lib/typescript/src/components/StrengthIndicator/StrengthIndicator.d.ts +2 -1
- package/lib/typescript/src/components/SuggestiveSearch/SuggestiveSearch.d.ts +2 -1
- package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +2 -1
- package/lib/typescript/src/components/SupportText/SupportText.d.ts +2 -1
- package/lib/typescript/src/components/SupportText/SupportTextIcon.d.ts +2 -1
- package/lib/typescript/src/components/SwappableAmount/SwappableAmount.d.ts +2 -1
- package/lib/typescript/src/components/Tabs/TabItem.d.ts +2 -1
- package/lib/typescript/src/components/Tabs/Tabs.d.ts +2 -1
- package/lib/typescript/src/components/TestimonialsCard/TestimonialsCard.d.ts +2 -1
- package/lib/typescript/src/components/Text/Text.d.ts +2 -1
- package/lib/typescript/src/components/TextInput/TextInput.d.ts +12 -31
- package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +100 -0
- package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +2 -1
- package/lib/typescript/src/components/Title/Title.d.ts +2 -1
- package/lib/typescript/src/components/Toast/Toast.d.ts +2 -1
- package/lib/typescript/src/components/Toast/ToastProvider.d.ts +2 -1
- package/lib/typescript/src/components/Toast/useToast.d.ts +3 -2
- package/lib/typescript/src/components/Toggle/Toggle.d.ts +2 -1
- package/lib/typescript/src/components/Tooltip/Tooltip.d.ts +2 -1
- package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +2 -1
- package/lib/typescript/src/components/TransactionDetails/TransactionDetails.d.ts +3 -2
- package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +2 -1
- package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +2 -1
- package/lib/typescript/src/components/VStack/VStack.d.ts +2 -1
- package/lib/typescript/src/components/docs/modeControls.d.ts +28 -0
- package/lib/typescript/src/components/index.d.ts +11 -1
- package/lib/typescript/src/design-tokens/JFSThemeProvider.d.ts +4 -3
- package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +284 -0
- package/lib/typescript/src/design-tokens/index.d.ts +1 -0
- package/lib/typescript/src/icons/registry.d.ts +1 -1
- package/lib/typescript/src/skeleton/Skeleton.d.ts +2 -1
- package/lib/typescript/src/utils/react-utils.d.ts +12 -1
- package/package.json +4 -2
- package/src/components/Accordion/Accordion.tsx +2 -1
- package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +2 -1
- package/src/components/AccountCard/AccountCard.tsx +2 -1
- package/src/components/ActionFooter/ActionFooter.tsx +2 -1
- package/src/components/ActionTile/ActionTile.tsx +2 -1
- package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +2 -1
- package/src/components/AmountInput/AmountInput.tsx +9 -6
- package/src/components/AppBar/AppBar.tsx +2 -1
- package/src/components/AreaLineChart/AreaLineChart.tsx +8 -7
- package/src/components/Attached/Attached.tsx +2 -1
- package/src/components/Avatar/Avatar.tsx +3 -2
- package/src/components/AvatarGroup/AvatarGroup.tsx +2 -1
- package/src/components/Badge/Badge.tsx +2 -1
- package/src/components/Balance/Balance.tsx +18 -12
- package/src/components/BenefitCard/BenefitCard.tsx +309 -0
- package/src/components/BottomNav/BottomNav.tsx +2 -1
- package/src/components/BottomNavItem/BottomNavItem.tsx +3 -2
- package/src/components/BrandChip/BrandChip.tsx +3 -2
- package/src/components/BubbleChart/BubbleChart.tsx +2 -1
- package/src/components/Button/Button.tsx +3 -2
- package/src/components/ButtonGroup/ButtonGroup.tsx +2 -1
- package/src/components/Card/Card.tsx +4 -3
- package/src/components/CardAdvisory/CardAdvisory.tsx +3 -2
- package/src/components/CardBankAccount/CardBankAccount.tsx +2 -1
- package/src/components/CardCTA/CardCTA.tsx +3 -2
- package/src/components/CardFeedback/CardFeedback.tsx +11 -10
- package/src/components/CardFinancialCondition/CardFinancialCondition.tsx +3 -2
- package/src/components/CardInsight/CardInsight.tsx +2 -1
- package/src/components/CardProviderInfo/CardProviderInfo.tsx +2 -1
- package/src/components/Carousel/Carousel.tsx +5 -4
- package/src/components/CcCard/CcCard.tsx +598 -0
- package/src/components/Checkbox/Checkbox.tsx +7 -5
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -1
- package/src/components/CheckboxItem/CheckboxItem.tsx +7 -5
- package/src/components/ChipGroup/ChipGroup.tsx +2 -1
- package/src/components/ChipSelect/ChipSelect.tsx +2 -1
- package/src/components/CircularProgressBar/CircularProgressBar.tsx +2 -1
- package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +2 -1
- package/src/components/CircularRating/CircularRating.tsx +3 -2
- package/src/components/ClusterBubble/ClusterBubble.tsx +2 -1
- package/src/components/CompareTable/CompareTable.tsx +477 -0
- package/src/components/ComparisonBar/ComparisonBar.tsx +356 -0
- package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +3 -2
- package/src/components/CoverageRing/CoverageRing.tsx +2 -1
- package/src/components/DebitCard/DebitCard.tsx +2 -1
- package/src/components/Disclaimer/Disclaimer.tsx +2 -1
- package/src/components/Divider/Divider.tsx +2 -1
- package/src/components/DonutChart/DonutChart.tsx +6 -5
- package/src/components/DonutChartSummary/DonutChartSummary.tsx +3 -2
- package/src/components/Drawer/Drawer.tsx +21 -1
- package/src/components/Dropdown/Dropdown.tsx +4 -3
- package/src/components/DropdownInput/DropdownInput.tsx +60 -7
- package/src/components/EmptyState/EmptyState.tsx +2 -1
- package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +2 -1
- package/src/components/FilterBar/FilterBar.tsx +3 -2
- package/src/components/Form/Form.tsx +2 -1
- package/src/components/FormField/FormField.tsx +8 -6
- package/src/components/FullscreenModal/FullscreenModal.tsx +68 -10
- package/src/components/Gauge/Gauge.tsx +2 -1
- package/src/components/HStack/HStack.tsx +2 -1
- package/src/components/HoldingsCard/HoldingsCard.tsx +2 -1
- package/src/components/Icon/Icon.tsx +3 -2
- package/src/components/IconButton/IconButton.tsx +3 -2
- package/src/components/IconCapsule/IconCapsule.tsx +3 -2
- package/src/components/Image/Image.tsx +29 -5
- package/src/components/InputSearch/InputSearch.tsx +11 -7
- package/src/components/InstitutionBadge/InstitutionBadge.tsx +3 -2
- package/src/components/LazyList/LazyList.tsx +2 -1
- package/src/components/LinearMeter/LinearMeter.tsx +3 -2
- package/src/components/LinearProgress/LinearProgress.tsx +2 -1
- package/src/components/ListGroup/ListGroup.tsx +2 -1
- package/src/components/ListItem/ListItem.tsx +3 -2
- package/src/components/LottieIntroBlock/LottieIntroBlock.tsx +2 -1
- package/src/components/LottiePlayer/LottiePlayer.tsx +3 -2
- package/src/components/LottiePlayer/LottiePlayer.web.tsx +3 -2
- package/src/components/LottiePlayer/loadNativeLottieView.tsx +9 -13
- package/src/components/MediaCard/MediaCard.tsx +7 -6
- package/src/components/MerchantProfile/MerchantProfile.tsx +2 -1
- package/src/components/MessageField/MessageField.tsx +3 -2
- package/src/components/MetricLegendItem/MetricLegendItem.tsx +2 -1
- package/src/components/MoneyValue/MoneyValue.tsx +2 -1
- package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +5 -4
- package/src/components/NavArrow/NavArrow.tsx +3 -2
- package/src/components/NoteInput/NoteInput.tsx +10 -7
- package/src/components/Nudge/Nudge.tsx +3 -2
- package/src/components/Numpad/Numpad.tsx +2 -1
- package/src/components/OTP/OTP.tsx +3 -2
- package/src/components/Overlay/Overlay.tsx +114 -0
- package/src/components/PageHero/PageHero.tsx +2 -1
- package/src/components/PaymentFeedback/PaymentFeedback.tsx +2 -1
- package/src/components/PdpCcCard/PdpCcCard.tsx +356 -0
- package/src/components/PlanComparisonCard/PlanComparisonCard.tsx +2 -1
- package/src/components/Popup/Popup.tsx +2 -1
- package/src/components/PortfolioHero/PortfolioHero.tsx +2 -1
- package/src/components/PoweredByLabel/PoweredByLabel.tsx +2 -1
- package/src/components/ProductLabel/ProductLabel.tsx +2 -1
- package/src/components/ProductMerchandisingCard/GlassFill.tsx +276 -0
- package/src/components/ProductMerchandisingCard/GlassFill.web.tsx +127 -0
- package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +423 -0
- package/src/components/ProductOverview/ProductOverview.tsx +2 -1
- package/src/components/ProgressBadge/ProgressBadge.tsx +2 -1
- package/src/components/ProjectionMarker/ProjectionMarker.tsx +277 -0
- package/src/components/Radio/Radio.tsx +7 -5
- package/src/components/RangeTrack/RangeTrack.tsx +3 -2
- package/src/components/RechargeCard/RechargeCard.tsx +2 -1
- package/src/components/SavingsGoalSummary/SavingsGoalSummary.tsx +2 -1
- package/src/components/Screen/Screen.tsx +2 -1
- package/src/components/Section/Section.tsx +6 -5
- package/src/components/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/components/SegmentedTrack/SegmentedTrack.tsx +5 -4
- package/src/components/Slider/Slider.tsx +628 -0
- package/src/components/Slot/Slot.tsx +2 -1
- package/src/components/Spinner/Spinner.tsx +2 -1
- package/src/components/StatGroup/StatGroup.tsx +3 -2
- package/src/components/StatItem/StatItem.tsx +2 -1
- package/src/components/StatusHero/StatusHero.tsx +2 -1
- package/src/components/Stepper/Step.tsx +2 -1
- package/src/components/Stepper/StepLabel.tsx +2 -1
- package/src/components/Stepper/Stepper.tsx +2 -1
- package/src/components/StrengthIndicator/StrengthIndicator.tsx +2 -1
- package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +4 -3
- package/src/components/SummaryTile/SummaryTile.tsx +2 -1
- package/src/components/SupportText/SupportText.tsx +2 -1
- package/src/components/SupportText/SupportTextIcon.tsx +2 -1
- package/src/components/SwappableAmount/SwappableAmount.tsx +2 -1
- package/src/components/Tabs/TabItem.tsx +2 -1
- package/src/components/Tabs/Tabs.tsx +2 -1
- package/src/components/TestimonialsCard/TestimonialsCard.tsx +2 -1
- package/src/components/Text/Text.tsx +2 -1
- package/src/components/TextInput/TextInput.tsx +18 -13
- package/src/components/TextSegment/TextSegment.tsx +166 -0
- package/src/components/ThreadHero/ThreadHero.tsx +2 -1
- package/src/components/Title/Title.tsx +2 -1
- package/src/components/Toast/Toast.tsx +2 -1
- package/src/components/Toast/ToastProvider.tsx +2 -1
- package/src/components/Toast/useToast.ts +3 -2
- package/src/components/Toggle/Toggle.tsx +2 -1
- package/src/components/Tooltip/Tooltip.tsx +3 -2
- package/src/components/TransactionBubble/TransactionBubble.tsx +2 -1
- package/src/components/TransactionDetails/TransactionDetails.tsx +3 -2
- package/src/components/TransactionStatus/TransactionStatus.tsx +3 -2
- package/src/components/UpiHandle/UpiHandle.tsx +3 -2
- package/src/components/VStack/VStack.tsx +2 -1
- package/src/components/docs/modeControls.tsx +122 -0
- package/src/components/index.ts +11 -1
- package/src/design-tokens/Coin Variables-variables-full.json +1 -1
- package/src/design-tokens/JFSThemeProvider.tsx +4 -3
- package/src/design-tokens/figma-modes.generated.ts +425 -0
- package/src/design-tokens/index.ts +1 -0
- package/src/icons/registry.ts +1 -1
- package/src/skeleton/Skeleton.tsx +2 -1
- package/src/utils/react-utils.ts +26 -2
- 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
|
@@ -16,6 +16,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
16
16
|
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
17
17
|
import Skeleton from '../../skeleton/Skeleton'
|
|
18
18
|
import { useSkeleton } from '../../skeleton/SkeletonGroup'
|
|
19
|
+
import type { Modes } from '../../design-tokens'
|
|
19
20
|
|
|
20
21
|
const avatarImage = require('./31595e70c4181263f9971590224b12934b280c9b.png')
|
|
21
22
|
|
|
@@ -63,7 +64,7 @@ interface AvatarTokens {
|
|
|
63
64
|
monogramTextStyle: TextStyle;
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
function resolveAvatarTokens(modes:
|
|
67
|
+
function resolveAvatarTokens(modes: Modes, isMonogram: boolean): AvatarTokens {
|
|
67
68
|
const size = (getVariableByName('avatar/size', modes) || 29) as number
|
|
68
69
|
const radiusRaw = (getVariableByName('avatar/radius', modes) || 9999) as number
|
|
69
70
|
const backgroundColor = getVariableByName('avatar/background', modes) || '#dbcfff'
|
|
@@ -131,7 +132,7 @@ function resolveAvatarTokens(modes: Record<string, any>, isMonogram: boolean): A
|
|
|
131
132
|
export type AvatarProps = {
|
|
132
133
|
monogram?: string;
|
|
133
134
|
style?: 'Image' | 'Monogram';
|
|
134
|
-
modes?:
|
|
135
|
+
modes?: Modes;
|
|
135
136
|
imageSource?: ImageSourcePropType | string;
|
|
136
137
|
accessibilityLabel?: string;
|
|
137
138
|
onPress?: () => void;
|
|
@@ -4,9 +4,10 @@ import MaskedView from '@react-native-masked-view/masked-view';
|
|
|
4
4
|
import Svg, { Path } from 'react-native-svg';
|
|
5
5
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
6
6
|
import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils';
|
|
7
|
+
import type { Modes } from '../../design-tokens'
|
|
7
8
|
|
|
8
9
|
type AvatarGroupProps = {
|
|
9
|
-
modes?:
|
|
10
|
+
modes?: Modes;
|
|
10
11
|
children?: React.ReactNode;
|
|
11
12
|
style?: ViewStyle;
|
|
12
13
|
} & React.ComponentProps<typeof View>;
|
|
@@ -10,12 +10,13 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
10
10
|
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
11
11
|
import Skeleton from '../../skeleton/Skeleton'
|
|
12
12
|
import { useSkeleton } from '../../skeleton/SkeletonGroup'
|
|
13
|
+
import type { Modes } from '../../design-tokens'
|
|
13
14
|
|
|
14
15
|
type BadgeProps = {
|
|
15
16
|
/** Visible label text shown inside the badge */
|
|
16
17
|
label?: string
|
|
17
18
|
/** Modes used to resolve design tokens (e.g. Appearance, Size) */
|
|
18
|
-
modes?:
|
|
19
|
+
modes?: Modes
|
|
19
20
|
/** Optional press handler to make the badge interactive */
|
|
20
21
|
onPress?: () => void
|
|
21
22
|
accessibilityLabel?: string
|
|
@@ -2,7 +2,16 @@ 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 MoneyValue from '../MoneyValue/MoneyValue'
|
|
5
|
-
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
5
|
+
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
6
|
+
import type { Modes } from '../../design-tokens'
|
|
7
|
+
|
|
8
|
+
// The Balance design renders its money value at the 36 px / 900-weight scale.
|
|
9
|
+
// The `moneyValue/*` tokens alias into the `Context3` collection, where the
|
|
10
|
+
// `Balance & Cards` mode supplies those larger values. Applied *before* the
|
|
11
|
+
// caller's `modes` so any consumer can still override individual keys.
|
|
12
|
+
const DEFAULT_MONEY_VALUE_MODES: Record<string, string> = {
|
|
13
|
+
Context3: 'Balance & Cards',
|
|
14
|
+
}
|
|
6
15
|
|
|
7
16
|
export type BalanceProps = {
|
|
8
17
|
/**
|
|
@@ -23,7 +32,7 @@ export type BalanceProps = {
|
|
|
23
32
|
/**
|
|
24
33
|
* Mode configuration for design tokens.
|
|
25
34
|
*/
|
|
26
|
-
modes?:
|
|
35
|
+
modes?: Modes;
|
|
27
36
|
/**
|
|
28
37
|
* Optional style overrides for the container.
|
|
29
38
|
*/
|
|
@@ -58,7 +67,7 @@ function Balance({
|
|
|
58
67
|
// Title styles
|
|
59
68
|
const titleColor = getVariableByName('balance/title/foreground', modes) ?? '#0c0d10'
|
|
60
69
|
const titleFontSize = getVariableByName('balance/title/fontSize', modes) ?? 14
|
|
61
|
-
const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? '
|
|
70
|
+
const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? 'JioType Var'
|
|
62
71
|
const titleLineHeight = getVariableByName('balance/title/lineHeight', modes) ?? 18
|
|
63
72
|
const titleFontWeightValue = getVariableByName('balance/title/fontWeight', modes) ?? 500
|
|
64
73
|
const titleFontWeight = typeof titleFontWeightValue === 'number'
|
|
@@ -79,13 +88,10 @@ function Balance({
|
|
|
79
88
|
fontWeight: titleFontWeight as any,
|
|
80
89
|
}
|
|
81
90
|
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
return child
|
|
88
|
-
})
|
|
91
|
+
// The money value renders at the Balance & Cards scale. Merge the default
|
|
92
|
+
// context mode first so the caller's `modes` can still override it, and
|
|
93
|
+
// force that context onto any slotted children so custom money values match.
|
|
94
|
+
const moneyValueModes: Modes = { ...DEFAULT_MONEY_VALUE_MODES, ...modes }
|
|
89
95
|
|
|
90
96
|
return (
|
|
91
97
|
<View style={[containerStyle, style]} data-node-id="1986:6203">
|
|
@@ -93,12 +99,12 @@ function Balance({
|
|
|
93
99
|
{title}
|
|
94
100
|
</Text>
|
|
95
101
|
{children ? (
|
|
96
|
-
|
|
102
|
+
cloneChildrenWithModes(children, modes, DEFAULT_MONEY_VALUE_MODES)
|
|
97
103
|
) : (
|
|
98
104
|
<MoneyValue
|
|
99
105
|
value={amount}
|
|
100
106
|
currency={currency}
|
|
101
|
-
modes={
|
|
107
|
+
modes={moneyValueModes}
|
|
102
108
|
/>
|
|
103
109
|
)}
|
|
104
110
|
</View>
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import React, { useMemo } from 'react'
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
Text as RNText,
|
|
5
|
+
Pressable,
|
|
6
|
+
StyleSheet,
|
|
7
|
+
type ViewStyle,
|
|
8
|
+
type TextStyle,
|
|
9
|
+
type StyleProp,
|
|
10
|
+
} from 'react-native'
|
|
11
|
+
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
12
|
+
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
13
|
+
import Icon from '../Icon/Icon'
|
|
14
|
+
import Text from '../Text/Text'
|
|
15
|
+
import ListItem from '../ListItem/ListItem'
|
|
16
|
+
import Divider from '../Divider/Divider'
|
|
17
|
+
import Button from '../Button/Button'
|
|
18
|
+
import type { Modes } from '../../design-tokens'
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A single benefit row rendered with the shared `ListItem` primitive: a
|
|
22
|
+
* leading icon, a title and an optional right-aligned trailing value.
|
|
23
|
+
*/
|
|
24
|
+
export interface BenefitCardItem {
|
|
25
|
+
/** Registry icon name for the leading glyph (e.g. `'ic_jewellery_diamond'`). */
|
|
26
|
+
icon?: string
|
|
27
|
+
/** Per-item override for the leading icon color. Defaults to the brand token. */
|
|
28
|
+
iconColor?: string
|
|
29
|
+
/** Full override for the leading node. Takes precedence over `icon`. */
|
|
30
|
+
leading?: React.ReactNode
|
|
31
|
+
/** Row title (e.g. `"JioPoints"`). */
|
|
32
|
+
title: string
|
|
33
|
+
/** Optional right-aligned trailing value (e.g. `"Up to 2000 pts"`). */
|
|
34
|
+
trailingText?: string
|
|
35
|
+
/** Full override for the trailing node. Takes precedence over `trailingText`. */
|
|
36
|
+
trailing?: React.ReactNode
|
|
37
|
+
/** Makes the row pressable. */
|
|
38
|
+
onPress?: () => void
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface BenefitCardProps {
|
|
42
|
+
/** Header section title (e.g. `"You will earn"`). */
|
|
43
|
+
headerTitle?: string
|
|
44
|
+
/**
|
|
45
|
+
* Highlighted item shown directly under the header title (icon + title +
|
|
46
|
+
* optional trailing value). Rendered above the divider.
|
|
47
|
+
*/
|
|
48
|
+
headerItem?: BenefitCardItem
|
|
49
|
+
/**
|
|
50
|
+
* Toggles the whole header section (title + item + divider). Mirrors the
|
|
51
|
+
* Figma `showHeader` property. Defaults to `true`.
|
|
52
|
+
*/
|
|
53
|
+
showHeader?: boolean
|
|
54
|
+
/** Body section title (e.g. `"Upgrade to JioFinance+ and earn more"`). */
|
|
55
|
+
bodyTitle?: string
|
|
56
|
+
/**
|
|
57
|
+
* Body benefit rows. Ignored when `children` is provided (the slot wins).
|
|
58
|
+
*/
|
|
59
|
+
items?: BenefitCardItem[]
|
|
60
|
+
/**
|
|
61
|
+
* Real slot for the body "list wrap". When provided, these children render
|
|
62
|
+
* instead of `items`; `modes` (plus the `List Item Style: Minimal` style)
|
|
63
|
+
* cascade into every child automatically.
|
|
64
|
+
*/
|
|
65
|
+
children?: React.ReactNode
|
|
66
|
+
/** CTA button label. Defaults to `"Upgrade"`. */
|
|
67
|
+
buttonLabel?: string
|
|
68
|
+
/** CTA press handler. */
|
|
69
|
+
onButtonPress?: () => void
|
|
70
|
+
/** Full override for the CTA. Takes precedence over `buttonLabel`. */
|
|
71
|
+
button?: React.ReactNode
|
|
72
|
+
/**
|
|
73
|
+
* Toggles the CTA button. Mirrors the Figma `showButton` property.
|
|
74
|
+
* Defaults to `true`.
|
|
75
|
+
*/
|
|
76
|
+
showButton?: boolean
|
|
77
|
+
/** Press handler for the whole card. When set, the card becomes pressable. */
|
|
78
|
+
onPress?: () => void
|
|
79
|
+
/** Card width. Defaults to the Figma spec (`344`). Pass `'100%'` to fill the parent. */
|
|
80
|
+
width?: number | `${number}%`
|
|
81
|
+
/** Modes object for design-token resolution. Cascaded to all children. */
|
|
82
|
+
modes?: Modes
|
|
83
|
+
/** Style overrides for the card container. */
|
|
84
|
+
style?: StyleProp<ViewStyle>
|
|
85
|
+
/** Accessibility label for the card. */
|
|
86
|
+
accessibilityLabel?: string
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* BenefitCard — Figma node 5352:1077 ("Benefit Card").
|
|
91
|
+
*
|
|
92
|
+
* A white, rounded card that summarises the rewards a user will earn. It is
|
|
93
|
+
* composed entirely from the shared design-system primitives so it stays in
|
|
94
|
+
* sync with the rest of the library:
|
|
95
|
+
*
|
|
96
|
+
* - **Header** — a section title + a single highlighted {@link ListItem}
|
|
97
|
+
* (leading `Icon`, title, right-aligned trailing value) followed by a
|
|
98
|
+
* `Divider`.
|
|
99
|
+
* - **Body** — a section title + a column of benefit {@link ListItem}s. The
|
|
100
|
+
* list is a real slot: pass `children` to fully control it, or `items` for
|
|
101
|
+
* the declarative path.
|
|
102
|
+
* - **CTA** — a small {@link Button} (Figma `Button / Size = S`).
|
|
103
|
+
*
|
|
104
|
+
* The list rows resolve through the `List Item Style: Minimal` mode (12px /
|
|
105
|
+
* regular title, 4px gap, no padding) and the leading icons use the
|
|
106
|
+
* `AppearanceBrand: Secondary` brand color, exactly matching the design. All
|
|
107
|
+
* three defaults can be overridden via `modes`.
|
|
108
|
+
*/
|
|
109
|
+
function BenefitCard({
|
|
110
|
+
headerTitle = 'You will earn',
|
|
111
|
+
headerItem,
|
|
112
|
+
showHeader = true,
|
|
113
|
+
bodyTitle = 'Upgrade to JioFinance+ and earn more',
|
|
114
|
+
items,
|
|
115
|
+
children,
|
|
116
|
+
buttonLabel = 'Upgrade',
|
|
117
|
+
onButtonPress,
|
|
118
|
+
button,
|
|
119
|
+
showButton = true,
|
|
120
|
+
onPress,
|
|
121
|
+
width = 344,
|
|
122
|
+
modes = EMPTY_MODES,
|
|
123
|
+
style,
|
|
124
|
+
accessibilityLabel,
|
|
125
|
+
}: BenefitCardProps) {
|
|
126
|
+
const tokens = useMemo(() => resolveTokens(modes), [modes])
|
|
127
|
+
|
|
128
|
+
// Sub-component modes. Consumer-supplied `modes` always win via spread order.
|
|
129
|
+
const listItemModes = useMemo<Modes>(() => ({ 'List Item Style': 'Minimal', ...modes }), [modes])
|
|
130
|
+
const iconModes = useMemo<Modes>(() => ({ AppearanceBrand: 'Secondary', ...modes }), [modes])
|
|
131
|
+
const trailingTextModes = useMemo<Modes>(
|
|
132
|
+
() => ({ 'Text Sizes': 'Small', Weight: 'Regular', ...modes }),
|
|
133
|
+
[modes]
|
|
134
|
+
)
|
|
135
|
+
const ctaModes = useMemo<Modes>(() => ({ 'Button / Size': 'S', ...modes }), [modes])
|
|
136
|
+
|
|
137
|
+
const renderItem = (item: BenefitCardItem, key: React.Key) => {
|
|
138
|
+
const leading =
|
|
139
|
+
item.leading ??
|
|
140
|
+
(item.icon != null ? (
|
|
141
|
+
<Icon iconName={item.icon} color={item.iconColor} modes={iconModes} />
|
|
142
|
+
) : null)
|
|
143
|
+
|
|
144
|
+
const trailing =
|
|
145
|
+
item.trailing ??
|
|
146
|
+
(item.trailingText != null ? (
|
|
147
|
+
<Text modes={trailingTextModes}>{item.trailingText}</Text>
|
|
148
|
+
) : undefined)
|
|
149
|
+
|
|
150
|
+
return (
|
|
151
|
+
<ListItem
|
|
152
|
+
key={key}
|
|
153
|
+
layout="Horizontal"
|
|
154
|
+
navArrow={false}
|
|
155
|
+
showSupportText={false}
|
|
156
|
+
title={item.title}
|
|
157
|
+
leading={leading}
|
|
158
|
+
trailing={trailing}
|
|
159
|
+
onPress={item.onPress}
|
|
160
|
+
modes={listItemModes}
|
|
161
|
+
/>
|
|
162
|
+
)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const headerNode =
|
|
166
|
+
showHeader && (headerTitle != null || headerItem != null) ? (
|
|
167
|
+
<View style={styles.section}>
|
|
168
|
+
<View style={styles.cardHeader}>
|
|
169
|
+
{headerTitle != null ? <RNText style={tokens.title}>{headerTitle}</RNText> : null}
|
|
170
|
+
{headerItem != null ? renderItem(headerItem, 'header-item') : null}
|
|
171
|
+
</View>
|
|
172
|
+
<Divider modes={modes} />
|
|
173
|
+
</View>
|
|
174
|
+
) : null
|
|
175
|
+
|
|
176
|
+
const bodyList = children
|
|
177
|
+
? cloneChildrenWithModes(children, listItemModes)
|
|
178
|
+
: (items ?? DEFAULT_ITEMS).map((item, index) => renderItem(item, index))
|
|
179
|
+
|
|
180
|
+
const ctaNode = button ?? (
|
|
181
|
+
<Button label={buttonLabel} modes={ctaModes} onPress={onButtonPress} />
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
const containerStyle = useMemo<ViewStyle>(
|
|
185
|
+
() => ({ ...tokens.container, width }),
|
|
186
|
+
[tokens.container, width]
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
const content = (
|
|
190
|
+
<>
|
|
191
|
+
{headerNode}
|
|
192
|
+
<View style={tokens.body}>
|
|
193
|
+
{bodyTitle != null ? <RNText style={tokens.title}>{bodyTitle}</RNText> : null}
|
|
194
|
+
<View style={tokens.listWrap}>{bodyList}</View>
|
|
195
|
+
</View>
|
|
196
|
+
{showButton ? ctaNode : null}
|
|
197
|
+
</>
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
if (onPress) {
|
|
201
|
+
return (
|
|
202
|
+
<Pressable
|
|
203
|
+
style={({ pressed }) => [containerStyle, pressed ? styles.pressed : null, style]}
|
|
204
|
+
accessibilityRole="button"
|
|
205
|
+
accessibilityLabel={accessibilityLabel ?? headerTitle ?? bodyTitle}
|
|
206
|
+
onPress={onPress}
|
|
207
|
+
>
|
|
208
|
+
{content}
|
|
209
|
+
</Pressable>
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return (
|
|
214
|
+
<View style={[containerStyle, style]} accessibilityLabel={accessibilityLabel}>
|
|
215
|
+
{content}
|
|
216
|
+
</View>
|
|
217
|
+
)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
// Tokens / static styles
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
|
|
224
|
+
// The "card header" inner gap (title -> highlighted item) is a fixed 4px in
|
|
225
|
+
// the Figma node and has no dedicated token.
|
|
226
|
+
const CARD_HEADER_GAP = 4
|
|
227
|
+
|
|
228
|
+
interface ResolvedTokens {
|
|
229
|
+
container: ViewStyle
|
|
230
|
+
body: ViewStyle
|
|
231
|
+
listWrap: ViewStyle
|
|
232
|
+
title: TextStyle
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function asNum(raw: unknown, fallback: number): number {
|
|
236
|
+
const n = typeof raw === 'number' ? raw : parseFloat(raw as string)
|
|
237
|
+
return Number.isFinite(n) ? n : fallback
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function asStr(raw: unknown, fallback: string): string {
|
|
241
|
+
return raw != null ? String(raw) : fallback
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function resolveTokens(modes: Modes): ResolvedTokens {
|
|
245
|
+
// NOTE: token names are passed as string literals DIRECTLY to
|
|
246
|
+
// getVariableByName so the `extract-component-tokens` script can statically
|
|
247
|
+
// collect them for the generated docs. Do not refactor these into a helper
|
|
248
|
+
// that receives the name as a variable.
|
|
249
|
+
const background = asStr(getVariableByName('benefitCard/background', modes), '#ffffff')
|
|
250
|
+
const paddingHorizontal = asNum(getVariableByName('benefitCard/padding/horizontal', modes), 12)
|
|
251
|
+
const paddingVertical = asNum(getVariableByName('benefitCard/padding/vertical', modes), 12)
|
|
252
|
+
const radius = asNum(getVariableByName('benefitCard/radius', modes), 12)
|
|
253
|
+
const gap = asNum(getVariableByName('benefitCard/gap', modes), 8)
|
|
254
|
+
|
|
255
|
+
const titleColor = asStr(getVariableByName('benefitCard/title/foreground', modes), '#000000')
|
|
256
|
+
const titleSize = asNum(getVariableByName('benefitCard/title/fontsize', modes), 14)
|
|
257
|
+
const titleFamily = asStr(getVariableByName('benefitCard/title/fontFamily', modes), 'JioType Var')
|
|
258
|
+
const titleWeight = asStr(getVariableByName('benefitCard/title/fontWeight', modes), '500')
|
|
259
|
+
|
|
260
|
+
return {
|
|
261
|
+
container: {
|
|
262
|
+
backgroundColor: background,
|
|
263
|
+
paddingHorizontal,
|
|
264
|
+
paddingVertical,
|
|
265
|
+
borderRadius: radius,
|
|
266
|
+
gap,
|
|
267
|
+
flexDirection: 'column',
|
|
268
|
+
alignItems: 'flex-start',
|
|
269
|
+
},
|
|
270
|
+
body: {
|
|
271
|
+
alignSelf: 'stretch',
|
|
272
|
+
gap,
|
|
273
|
+
},
|
|
274
|
+
listWrap: {
|
|
275
|
+
alignSelf: 'stretch',
|
|
276
|
+
gap,
|
|
277
|
+
},
|
|
278
|
+
title: {
|
|
279
|
+
color: titleColor,
|
|
280
|
+
fontSize: titleSize,
|
|
281
|
+
fontFamily: titleFamily,
|
|
282
|
+
fontWeight: titleWeight as TextStyle['fontWeight'],
|
|
283
|
+
lineHeight: 20,
|
|
284
|
+
letterSpacing: -0.5,
|
|
285
|
+
includeFontPadding: false as any,
|
|
286
|
+
},
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const DEFAULT_ITEMS: BenefitCardItem[] = [
|
|
291
|
+
{ icon: 'ic_card', title: 'Up to ₹5000 cashback' },
|
|
292
|
+
{ icon: 'ic_card', title: '25% extra JioPoints' },
|
|
293
|
+
]
|
|
294
|
+
|
|
295
|
+
const styles = StyleSheet.create({
|
|
296
|
+
section: {
|
|
297
|
+
alignSelf: 'stretch',
|
|
298
|
+
gap: 8,
|
|
299
|
+
},
|
|
300
|
+
cardHeader: {
|
|
301
|
+
alignSelf: 'stretch',
|
|
302
|
+
gap: CARD_HEADER_GAP,
|
|
303
|
+
},
|
|
304
|
+
pressed: {
|
|
305
|
+
opacity: 0.92,
|
|
306
|
+
},
|
|
307
|
+
})
|
|
308
|
+
|
|
309
|
+
export default BenefitCard
|
|
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
4
4
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
5
5
|
import BottomNavItem from '../BottomNavItem/BottomNavItem'
|
|
6
6
|
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
7
|
+
import type { Modes } from '../../design-tokens'
|
|
7
8
|
|
|
8
9
|
type BottomNavProps = {
|
|
9
10
|
/**
|
|
@@ -20,7 +21,7 @@ type BottomNavProps = {
|
|
|
20
21
|
*/
|
|
21
22
|
children?: React.ReactNode;
|
|
22
23
|
|
|
23
|
-
modes?:
|
|
24
|
+
modes?: Modes;
|
|
24
25
|
style?: StyleProp<ViewStyle>;
|
|
25
26
|
accessibilityLabel?: string;
|
|
26
27
|
accessibilityHint?: string;
|
|
@@ -15,11 +15,12 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
|
15
15
|
import Icon from '../../icons/Icon'
|
|
16
16
|
import { usePressableWebSupport, type SafePressableProps, type WebAccessibilityProps } from '../../utils/web-platform-utils'
|
|
17
17
|
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
18
|
+
import type { Modes } from '../../design-tokens'
|
|
18
19
|
|
|
19
20
|
type BottomNavItemProps = SafePressableProps & {
|
|
20
21
|
iconName?: string;
|
|
21
22
|
label?: string;
|
|
22
|
-
modes?:
|
|
23
|
+
modes?: Modes;
|
|
23
24
|
onPress?: () => void;
|
|
24
25
|
disabled?: boolean;
|
|
25
26
|
style?: StyleProp<ViewStyle>;
|
|
@@ -51,7 +52,7 @@ interface BottomNavItemTokens {
|
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
function resolveBottomNavItemTokens(
|
|
54
|
-
modes:
|
|
55
|
+
modes: Modes,
|
|
55
56
|
disabled: boolean,
|
|
56
57
|
iconColorOverride?: string,
|
|
57
58
|
iconSizeOverride?: number,
|
|
@@ -12,6 +12,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
12
12
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
13
13
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
14
14
|
import Avatar from '../Avatar/Avatar'
|
|
15
|
+
import type { Modes } from '../../design-tokens'
|
|
15
16
|
|
|
16
17
|
export type BrandChipProps = {
|
|
17
18
|
/** Visible label (e.g. `"Axis Bank • 0245"`). */
|
|
@@ -30,7 +31,7 @@ export type BrandChipProps = {
|
|
|
30
31
|
/** Optional press handler — when provided, the chip becomes a `Pressable`. */
|
|
31
32
|
onPress?: () => void
|
|
32
33
|
/** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
|
|
33
|
-
modes?:
|
|
34
|
+
modes?: Modes
|
|
34
35
|
/** Container style override. */
|
|
35
36
|
style?: StyleProp<ViewStyle>
|
|
36
37
|
/** Label style override. */
|
|
@@ -64,7 +65,7 @@ const toFontWeight = (
|
|
|
64
65
|
return fallback
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
function resolveBrandChipTokens(modes:
|
|
68
|
+
function resolveBrandChipTokens(modes: Modes): BrandChipTokens {
|
|
68
69
|
const background =
|
|
69
70
|
(getVariableByName('brandChip/background', modes) as string | null) ??
|
|
70
71
|
'#ffffff'
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
type ViewStyle,
|
|
8
8
|
} from 'react-native'
|
|
9
9
|
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
10
|
+
import type { Modes } from '../../design-tokens'
|
|
10
11
|
import ClusterBubble, {
|
|
11
12
|
type ClusterBubbleLabelDirection,
|
|
12
13
|
type ClusterBubbleLabelPlacement,
|
|
@@ -78,7 +79,7 @@ export type BubbleChartProps = {
|
|
|
78
79
|
/** Notified when a bubble is pressed. Makes every bubble pressable. */
|
|
79
80
|
onBubblePress?: (datum: BubbleDatum, index: number) => void
|
|
80
81
|
/** Design token modes for theming (e.g. `{ 'Color Mode': 'Light' }`). */
|
|
81
|
-
modes?:
|
|
82
|
+
modes?: Modes
|
|
82
83
|
/** Container style override. */
|
|
83
84
|
style?: StyleProp<ViewStyle>
|
|
84
85
|
/** Accessibility label for the whole chart. */
|
|
@@ -16,6 +16,7 @@ import { EMPTY_MODES } from '../../utils/react-utils'
|
|
|
16
16
|
import Icon from '../../icons/Icon'
|
|
17
17
|
import Skeleton from '../../skeleton/Skeleton'
|
|
18
18
|
import { useSkeleton } from '../../skeleton/SkeletonGroup'
|
|
19
|
+
import type { Modes } from '../../design-tokens'
|
|
19
20
|
|
|
20
21
|
export type ButtonProps = SafePressableProps & {
|
|
21
22
|
label?: string;
|
|
@@ -44,7 +45,7 @@ export type ButtonProps = SafePressableProps & {
|
|
|
44
45
|
* Takes precedence over `trailing` if both are provided.
|
|
45
46
|
*/
|
|
46
47
|
icon?: string;
|
|
47
|
-
modes?:
|
|
48
|
+
modes?: Modes;
|
|
48
49
|
onPress?: () => void;
|
|
49
50
|
disabled?: boolean;
|
|
50
51
|
style?: StyleProp<ViewStyle>;
|
|
@@ -112,7 +113,7 @@ interface ButtonTokens {
|
|
|
112
113
|
accessoryOffset: number;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
|
-
function resolveButtonTokens(modes:
|
|
116
|
+
function resolveButtonTokens(modes: Modes, disabled: boolean): ButtonTokens {
|
|
116
117
|
const backgroundColor = getVariableByName('button/background', modes) || '#cfa159'
|
|
117
118
|
const borderColor = getVariableByName('button/border/color', modes) || 'rgba(255,255,255,0)'
|
|
118
119
|
const borderWidth = getVariableByName('button/border/size', modes)
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
8
8
|
import { EMPTY_MODES, flattenChildren } from '../../utils/react-utils'
|
|
9
9
|
import IconButton from '../IconButton/IconButton'
|
|
10
|
+
import type { Modes } from '../../design-tokens'
|
|
10
11
|
|
|
11
12
|
export type ButtonGroupProps = {
|
|
12
13
|
/**
|
|
@@ -18,7 +19,7 @@ export type ButtonGroupProps = {
|
|
|
18
19
|
* Mode configuration for design tokens (e.g., {"Button / Size": "M", "Appearance": "high"})
|
|
19
20
|
* These modes are passed down to all child components.
|
|
20
21
|
*/
|
|
21
|
-
modes?:
|
|
22
|
+
modes?: Modes;
|
|
22
23
|
/**
|
|
23
24
|
* Additional styles for the container
|
|
24
25
|
*/
|
|
@@ -2,13 +2,14 @@ import React, { createContext, useContext, isValidElement, cloneElement, useMemo
|
|
|
2
2
|
import { View, Text, StyleSheet, type ViewStyle, type TextStyle, type StyleProp } from 'react-native';
|
|
3
3
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
4
4
|
import { EMPTY_MODES } from '../../utils/react-utils';
|
|
5
|
+
import type { Modes } from '../../design-tokens'
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Context to share 'modes' with child components like Card.Title and Card.SupportText.
|
|
8
9
|
* This ensures that nested components can resolve their tokens correctly without
|
|
9
10
|
* needing explicit mode prop passing for every child.
|
|
10
11
|
*/
|
|
11
|
-
const CardContext = createContext<{ modes?:
|
|
12
|
+
const CardContext = createContext<{ modes?: Modes }>({});
|
|
12
13
|
|
|
13
14
|
export interface CardProps {
|
|
14
15
|
/**
|
|
@@ -28,7 +29,7 @@ export interface CardProps {
|
|
|
28
29
|
/**
|
|
29
30
|
* Modes object for token resolution (e.g. { "Mode": "Dark" }).
|
|
30
31
|
*/
|
|
31
|
-
modes?:
|
|
32
|
+
modes?: Modes;
|
|
32
33
|
/**
|
|
33
34
|
* Aspect ratio for the media slot container.
|
|
34
35
|
* Default is based on Figma design 154/116 (~1.328).
|
|
@@ -151,7 +152,7 @@ export function Card({
|
|
|
151
152
|
export interface CardTextProps {
|
|
152
153
|
children?: React.ReactNode;
|
|
153
154
|
style?: StyleProp<TextStyle>;
|
|
154
|
-
modes?:
|
|
155
|
+
modes?: Modes;
|
|
155
156
|
}
|
|
156
157
|
|
|
157
158
|
/**
|
|
@@ -12,6 +12,7 @@ import Icon from '../../icons/Icon'
|
|
|
12
12
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
13
13
|
import CircularProgressBar from '../CircularProgressBar/CircularProgressBar'
|
|
14
14
|
import Nudge from '../Nudge/Nudge'
|
|
15
|
+
import type { Modes } from '../../design-tokens'
|
|
15
16
|
|
|
16
17
|
type CardAdvisoryBaseProps = Omit<React.ComponentProps<typeof View>, 'children' | 'style'>
|
|
17
18
|
|
|
@@ -41,7 +42,7 @@ export type CardAdvisoryProps = CardAdvisoryBaseProps & {
|
|
|
41
42
|
/** Optional slot replacing the bottom nudge. Receives `modes` recursively. */
|
|
42
43
|
nudgeSlot?: React.ReactNode
|
|
43
44
|
/** Design token modes forwarded to token lookups and child components. */
|
|
44
|
-
modes?:
|
|
45
|
+
modes?: Modes
|
|
45
46
|
/** Optional container style override. */
|
|
46
47
|
style?: StyleProp<ViewStyle>
|
|
47
48
|
/** Optional main content row style override. */
|
|
@@ -94,7 +95,7 @@ const toFontWeight = (value: unknown, fallback: TextStyle['fontWeight']) => {
|
|
|
94
95
|
return fallback
|
|
95
96
|
}
|
|
96
97
|
|
|
97
|
-
function resolveCardAdvisoryTokens(modes:
|
|
98
|
+
function resolveCardAdvisoryTokens(modes: Modes): CardAdvisoryTokens {
|
|
98
99
|
const width = toNumber(getVariableByName('cardAdvisory/width', modes), 360)
|
|
99
100
|
const gap = toNumber(getVariableByName('cardAdvisory/gap', modes), 16)
|
|
100
101
|
const paddingHorizontal = toNumber(getVariableByName('cardAdvisory/padding/horizontal', modes), 0)
|
|
@@ -12,6 +12,7 @@ import Badge from '../Badge/Badge'
|
|
|
12
12
|
import Button from '../Button/Button'
|
|
13
13
|
import InstitutionBadge from '../InstitutionBadge/InstitutionBadge'
|
|
14
14
|
import type { UnifiedSource } from '../../utils/MediaSource'
|
|
15
|
+
import type { Modes } from '../../design-tokens'
|
|
15
16
|
|
|
16
17
|
export type CardBankAccountItem = {
|
|
17
18
|
/** Left-aligned label text (e.g. "Account type"). */
|
|
@@ -74,7 +75,7 @@ export type CardBankAccountProps = {
|
|
|
74
75
|
* out of the box. Caller-supplied modes are merged on top and can
|
|
75
76
|
* override any of the default keys.
|
|
76
77
|
*/
|
|
77
|
-
modes?:
|
|
78
|
+
modes?: Modes
|
|
78
79
|
/** Container style override. */
|
|
79
80
|
style?: StyleProp<ViewStyle>
|
|
80
81
|
/** Accessibility label for the card region. */
|
|
@@ -8,12 +8,13 @@ import Button from '../Button/Button'
|
|
|
8
8
|
import Badge from '../Badge/Badge'
|
|
9
9
|
import ButtonGroup from '../ButtonGroup/ButtonGroup'
|
|
10
10
|
import IconButton from '../IconButton/IconButton'
|
|
11
|
+
import type { Modes } from '../../design-tokens'
|
|
11
12
|
|
|
12
13
|
export type CardCTAType = 'cta' | 'rating'
|
|
13
14
|
|
|
14
15
|
const optionalTokenAvailability = new Map<string, boolean>()
|
|
15
16
|
|
|
16
|
-
function getOptionalVariableByName<T>(name: string, modes:
|
|
17
|
+
function getOptionalVariableByName<T>(name: string, modes: Modes, fallback: T): T {
|
|
17
18
|
let isAvailable = optionalTokenAvailability.get(name)
|
|
18
19
|
|
|
19
20
|
if (isAvailable === undefined) {
|
|
@@ -50,7 +51,7 @@ export type CardCTAProps = {
|
|
|
50
51
|
/** Callback for the default dislike action */
|
|
51
52
|
onPressDislike?: () => void;
|
|
52
53
|
/** Mode configuration for design token resolution */
|
|
53
|
-
modes?:
|
|
54
|
+
modes?: Modes;
|
|
54
55
|
/** Slot: replaces the default icon area (right side) */
|
|
55
56
|
iconSlot?: React.ReactNode;
|
|
56
57
|
/** Slot: replaces the default Button */
|