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
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React, { useMemo } from 'react'
|
|
2
|
+
import {
|
|
3
|
+
Pressable,
|
|
4
|
+
StyleSheet,
|
|
5
|
+
View,
|
|
6
|
+
type StyleProp,
|
|
7
|
+
type ViewProps,
|
|
8
|
+
type ViewStyle,
|
|
9
|
+
} from 'react-native'
|
|
10
|
+
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
11
|
+
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
12
|
+
import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils'
|
|
13
|
+
import type { Modes } from '../../design-tokens'
|
|
14
|
+
|
|
15
|
+
export type OverlayProps = Omit<ViewProps, 'children' | 'style'> & {
|
|
16
|
+
/**
|
|
17
|
+
* Content rendered on top of the scrim. `modes` are cascaded to every child
|
|
18
|
+
* via {@link cloneChildrenWithModes}. When omitted the overlay renders as a
|
|
19
|
+
* bare backdrop.
|
|
20
|
+
*/
|
|
21
|
+
children?: React.ReactNode
|
|
22
|
+
/**
|
|
23
|
+
* How `children` are positioned within the overlay.
|
|
24
|
+
* - `center` (default): centers content both axes
|
|
25
|
+
* - `top` / `bottom`: pins content to the top/bottom edge
|
|
26
|
+
* - `stretch`: stretches content to fill the overlay
|
|
27
|
+
*/
|
|
28
|
+
contentPlacement?: 'center' | 'top' | 'bottom' | 'stretch'
|
|
29
|
+
/**
|
|
30
|
+
* Called when the scrim (the area outside `children`) is pressed. Typically
|
|
31
|
+
* used to dismiss the overlaid surface. When omitted the backdrop is inert.
|
|
32
|
+
*/
|
|
33
|
+
onPress?: () => void
|
|
34
|
+
/**
|
|
35
|
+
* When `true` (default) the overlay covers its parent via `StyleSheet.absoluteFill`.
|
|
36
|
+
* Set to `false` to lay it out in normal flow (driven by `style`).
|
|
37
|
+
*/
|
|
38
|
+
fill?: boolean
|
|
39
|
+
/**
|
|
40
|
+
* Mode configuration passed to the token resolver and cascaded to children.
|
|
41
|
+
*/
|
|
42
|
+
modes?: Modes
|
|
43
|
+
style?: StyleProp<ViewStyle>
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const PLACEMENT_STYLE: Record<NonNullable<OverlayProps['contentPlacement']>, ViewStyle> = {
|
|
47
|
+
center: { justifyContent: 'center', alignItems: 'center' },
|
|
48
|
+
top: { justifyContent: 'flex-start', alignItems: 'stretch' },
|
|
49
|
+
bottom: { justifyContent: 'flex-end', alignItems: 'stretch' },
|
|
50
|
+
stretch: { justifyContent: 'center', alignItems: 'stretch' },
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Overlay — a token-driven scrim that dims content behind an overlaid surface.
|
|
55
|
+
*
|
|
56
|
+
* Renders a semi-transparent backdrop using the `overlay/background` design
|
|
57
|
+
* token and optionally hosts content (e.g. a modal, sheet or dialog) on top.
|
|
58
|
+
* Pair it with a `Modal` for true full-screen overlays, or drop it inside any
|
|
59
|
+
* relatively-positioned container to dim just that region.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```tsx
|
|
63
|
+
* <Overlay modes={modes} onPress={close}>
|
|
64
|
+
* <Card>Dialog content</Card>
|
|
65
|
+
* </Overlay>
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
function Overlay({
|
|
69
|
+
children,
|
|
70
|
+
contentPlacement = 'center',
|
|
71
|
+
onPress,
|
|
72
|
+
fill = true,
|
|
73
|
+
modes: propModes = EMPTY_MODES,
|
|
74
|
+
style,
|
|
75
|
+
...rest
|
|
76
|
+
}: OverlayProps) {
|
|
77
|
+
const { modes: globalModes } = useTokens()
|
|
78
|
+
const modes = useMemo(() => ({ ...globalModes, ...propModes }), [globalModes, propModes])
|
|
79
|
+
|
|
80
|
+
const { containerStyle, processedChildren } = useMemo(() => {
|
|
81
|
+
const backgroundColor = (getVariableByName('overlay/background', modes) ??
|
|
82
|
+
'rgba(0, 0, 0, 0.7)') as string
|
|
83
|
+
|
|
84
|
+
const container: ViewStyle = {
|
|
85
|
+
backgroundColor,
|
|
86
|
+
overflow: 'hidden',
|
|
87
|
+
...PLACEMENT_STYLE[contentPlacement],
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const processed = children ? cloneChildrenWithModes(children, modes) : null
|
|
91
|
+
|
|
92
|
+
return { containerStyle: container, processedChildren: processed }
|
|
93
|
+
}, [children, modes, contentPlacement])
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<View
|
|
97
|
+
style={[fill && StyleSheet.absoluteFill, containerStyle, style]}
|
|
98
|
+
accessibilityViewIsModal
|
|
99
|
+
{...rest}
|
|
100
|
+
>
|
|
101
|
+
{onPress ? (
|
|
102
|
+
<Pressable
|
|
103
|
+
style={StyleSheet.absoluteFill}
|
|
104
|
+
onPress={onPress}
|
|
105
|
+
accessibilityRole="button"
|
|
106
|
+
accessibilityLabel="Dismiss overlay"
|
|
107
|
+
/>
|
|
108
|
+
) : null}
|
|
109
|
+
{processedChildren}
|
|
110
|
+
</View>
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export default React.memo(Overlay)
|
|
@@ -10,6 +10,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
10
10
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
11
11
|
import Button from '../Button/Button'
|
|
12
12
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
13
|
+
import type { Modes } from '../../design-tokens'
|
|
13
14
|
|
|
14
15
|
export type PageHeroProps = {
|
|
15
16
|
/** Small eyebrow text shown above the headline. */
|
|
@@ -50,7 +51,7 @@ export type PageHeroProps = {
|
|
|
50
51
|
*/
|
|
51
52
|
media?: React.ReactNode
|
|
52
53
|
/** Mode configuration for design-token theming. */
|
|
53
|
-
modes?:
|
|
54
|
+
modes?: Modes
|
|
54
55
|
/** Style overrides applied to the outer container. */
|
|
55
56
|
style?: StyleProp<ViewStyle>
|
|
56
57
|
testID?: string
|
|
@@ -4,6 +4,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
4
4
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
5
5
|
import IconCapsule from '../IconCapsule/IconCapsule'
|
|
6
6
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
7
|
+
import type { Modes } from '../../design-tokens'
|
|
7
8
|
|
|
8
9
|
export type PaymentFeedbackProps = {
|
|
9
10
|
/** Large heading text, typically a monetary value (e.g. "₹50,000") */
|
|
@@ -25,7 +26,7 @@ export type PaymentFeedbackProps = {
|
|
|
25
26
|
* IconCapsule's color — pass `AppearanceSystem: 'positive' | 'warning' |
|
|
26
27
|
* 'negative'` to render a green/orange/red capsule (defaults to `positive`).
|
|
27
28
|
*/
|
|
28
|
-
modes?:
|
|
29
|
+
modes?: Modes
|
|
29
30
|
style?: ViewStyle
|
|
30
31
|
}
|
|
31
32
|
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import React, { useMemo } from 'react'
|
|
2
|
+
import {
|
|
3
|
+
View,
|
|
4
|
+
Text,
|
|
5
|
+
Pressable,
|
|
6
|
+
StyleSheet,
|
|
7
|
+
type ViewStyle,
|
|
8
|
+
type TextStyle,
|
|
9
|
+
type StyleProp,
|
|
10
|
+
type ImageSourcePropType,
|
|
11
|
+
} from 'react-native'
|
|
12
|
+
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
13
|
+
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
14
|
+
import Title from '../Title/Title'
|
|
15
|
+
import Divider from '../Divider/Divider'
|
|
16
|
+
import Button from '../Button/Button'
|
|
17
|
+
import Image from '../Image/Image'
|
|
18
|
+
import Icon from '../Icon/Icon'
|
|
19
|
+
import type { Modes } from '../../design-tokens'
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A single metric column inside the card's stats row: a small title, a bold
|
|
23
|
+
* value and an optional muted caption.
|
|
24
|
+
*/
|
|
25
|
+
export interface PdpCcCardMetric {
|
|
26
|
+
/** Small label rendered above the value (e.g. `"Weight"`). */
|
|
27
|
+
title?: string
|
|
28
|
+
/** The prominent value (e.g. `"24K"`). */
|
|
29
|
+
value?: string
|
|
30
|
+
/** Optional muted caption rendered below the value. */
|
|
31
|
+
caption?: string
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface PdpCcCardProps {
|
|
35
|
+
/**
|
|
36
|
+
* Image source for the default media slot. Accepts a URL string or any RN
|
|
37
|
+
* `ImageSourcePropType`. Ignored when `media` is provided.
|
|
38
|
+
*/
|
|
39
|
+
imageSource?: ImageSourcePropType | string
|
|
40
|
+
/** Default media image width. Defaults to the Figma spec (`100`). */
|
|
41
|
+
imageWidth?: number
|
|
42
|
+
/** Default media image height. Defaults to the Figma spec (`60`). */
|
|
43
|
+
imageHeight?: number
|
|
44
|
+
/**
|
|
45
|
+
* Full override for the media slot (top of the card). Takes precedence over
|
|
46
|
+
* `imageSource`. `modes` cascade into it automatically.
|
|
47
|
+
*/
|
|
48
|
+
media?: React.ReactNode
|
|
49
|
+
/** Headline title (26px black). */
|
|
50
|
+
title?: string
|
|
51
|
+
/** Subtitle rendered below the title (14px medium). */
|
|
52
|
+
subtitle?: string
|
|
53
|
+
/**
|
|
54
|
+
* The metric columns rendered in the stats row. Vertical dividers are
|
|
55
|
+
* inserted automatically between adjacent metrics. Defaults to two sample
|
|
56
|
+
* metrics.
|
|
57
|
+
*/
|
|
58
|
+
metrics?: PdpCcCardMetric[]
|
|
59
|
+
/** CTA button label. Defaults to `"button"`. */
|
|
60
|
+
buttonLabel?: string
|
|
61
|
+
/**
|
|
62
|
+
* Registry icon name for the button's leading glyph. Defaults to
|
|
63
|
+
* `'ic_add_circle'`. Pass `null` to hide the leading icon.
|
|
64
|
+
*/
|
|
65
|
+
buttonIcon?: string | null
|
|
66
|
+
/** CTA press handler. */
|
|
67
|
+
onButtonPress?: () => void
|
|
68
|
+
/** Full override for the CTA. Takes precedence over `buttonLabel`. */
|
|
69
|
+
button?: React.ReactNode
|
|
70
|
+
/** Toggles the CTA button. Defaults to `true`. */
|
|
71
|
+
showButton?: boolean
|
|
72
|
+
/** Press handler for the whole card. When set, the card becomes pressable. */
|
|
73
|
+
onPress?: () => void
|
|
74
|
+
/** Card width. Defaults to the Figma spec (`344`). Pass `'100%'` to fill the parent. */
|
|
75
|
+
width?: number | `${number}%`
|
|
76
|
+
/** Modes object for design-token resolution. Cascaded to all children. */
|
|
77
|
+
modes?: Modes
|
|
78
|
+
/** Style overrides for the card container. */
|
|
79
|
+
style?: StyleProp<ViewStyle>
|
|
80
|
+
/** Accessibility label for the card. */
|
|
81
|
+
accessibilityLabel?: string
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* PdpCcCard — Figma node 5352:935 ("PDP cc card").
|
|
86
|
+
*
|
|
87
|
+
* A centered white product/PDP card composed from the shared design-system
|
|
88
|
+
* primitives so it stays in sync with the rest of the library:
|
|
89
|
+
*
|
|
90
|
+
* - **Media** — a top image slot (`Image`, rounded via `image/radius`). Pass
|
|
91
|
+
* `imageSource` for the default image or `media` for a full slot override.
|
|
92
|
+
* - **Title** — a centered headline + subtitle rendered through the shared
|
|
93
|
+
* {@link Title} component (`title/*`, `pageSubtitle/*` tokens).
|
|
94
|
+
* - **Metrics** — a row of {@link PdpCcCardMetric} columns (title / value /
|
|
95
|
+
* caption) separated by vertical `Divider`s (`metricdata/*` tokens).
|
|
96
|
+
* - **CTA** — a small tonal {@link Button} (`Button / Size: S`,
|
|
97
|
+
* `AppearanceBrand: Secondary`, `Emphasis: Medium`) with a leading icon.
|
|
98
|
+
*
|
|
99
|
+
* All defaults can be overridden via `modes`.
|
|
100
|
+
*/
|
|
101
|
+
function PdpCcCard({
|
|
102
|
+
imageSource,
|
|
103
|
+
imageWidth = 100,
|
|
104
|
+
imageHeight = 60,
|
|
105
|
+
media,
|
|
106
|
+
title = 'Title',
|
|
107
|
+
subtitle = 'Subtitle',
|
|
108
|
+
metrics = DEFAULT_METRICS,
|
|
109
|
+
buttonLabel = 'button',
|
|
110
|
+
buttonIcon = 'ic_add_circle',
|
|
111
|
+
onButtonPress,
|
|
112
|
+
button,
|
|
113
|
+
showButton = true,
|
|
114
|
+
onPress,
|
|
115
|
+
width = 344,
|
|
116
|
+
modes = EMPTY_MODES,
|
|
117
|
+
style,
|
|
118
|
+
accessibilityLabel,
|
|
119
|
+
}: PdpCcCardProps) {
|
|
120
|
+
const tokens = useMemo(() => resolveTokens(modes), [modes])
|
|
121
|
+
|
|
122
|
+
// The CTA uses the brand "Secondary" appearance at "Medium" emphasis (lilac
|
|
123
|
+
// fill + purple label) and the small size — matching the design. A
|
|
124
|
+
// consumer-supplied `modes` value still wins via spread order.
|
|
125
|
+
const ctaModes = useMemo<Modes>(
|
|
126
|
+
() => ({ AppearanceBrand: 'Secondary', Emphasis: 'Medium', 'Button / Size': 'S', ...modes }),
|
|
127
|
+
[modes]
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
const buttonForeground = useMemo(
|
|
131
|
+
() => asStr(getVariableByName('button/foreground', ctaModes), '#5d00b5'),
|
|
132
|
+
[ctaModes]
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
const mediaNode = media ? (
|
|
136
|
+
cloneChildrenWithModes(media, modes)
|
|
137
|
+
) : (
|
|
138
|
+
<Image
|
|
139
|
+
imageSource={imageSource}
|
|
140
|
+
width={imageWidth}
|
|
141
|
+
height={imageHeight}
|
|
142
|
+
borderRadius={tokens.imageRadius}
|
|
143
|
+
resizeMode="cover"
|
|
144
|
+
accessibilityElementsHidden
|
|
145
|
+
importantForAccessibility="no"
|
|
146
|
+
/>
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
const ctaNode = button ? (
|
|
150
|
+
cloneChildrenWithModes(button, ctaModes)
|
|
151
|
+
) : (
|
|
152
|
+
<Button
|
|
153
|
+
label={buttonLabel}
|
|
154
|
+
modes={ctaModes}
|
|
155
|
+
onPress={onButtonPress}
|
|
156
|
+
leading={
|
|
157
|
+
buttonIcon ? (
|
|
158
|
+
<Icon iconName={buttonIcon} size={tokens.buttonIconSize} color={buttonForeground} />
|
|
159
|
+
) : undefined
|
|
160
|
+
}
|
|
161
|
+
/>
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
const content = (
|
|
165
|
+
<>
|
|
166
|
+
<View style={styles.mediaSlot}>{mediaNode}</View>
|
|
167
|
+
|
|
168
|
+
<Title title={title} subtitle={subtitle} textAlign="Center" modes={modes} />
|
|
169
|
+
|
|
170
|
+
{metrics.length > 0 ? (
|
|
171
|
+
<View style={styles.metricsRow}>
|
|
172
|
+
{metrics.map((metric, index) => (
|
|
173
|
+
<React.Fragment key={index}>
|
|
174
|
+
{index > 0 ? (
|
|
175
|
+
<Divider direction="vertical" modes={modes} style={styles.metricDivider} />
|
|
176
|
+
) : null}
|
|
177
|
+
<Metricdata metric={metric} tokens={tokens} />
|
|
178
|
+
</React.Fragment>
|
|
179
|
+
))}
|
|
180
|
+
</View>
|
|
181
|
+
) : null}
|
|
182
|
+
|
|
183
|
+
{showButton ? ctaNode : null}
|
|
184
|
+
</>
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
const containerStyle = useMemo<ViewStyle>(
|
|
188
|
+
() => ({ ...tokens.container, width }),
|
|
189
|
+
[tokens.container, width]
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
if (onPress) {
|
|
193
|
+
return (
|
|
194
|
+
<Pressable
|
|
195
|
+
style={({ pressed }) => [containerStyle, pressed ? styles.pressed : null, style]}
|
|
196
|
+
accessibilityRole="button"
|
|
197
|
+
accessibilityLabel={accessibilityLabel ?? title}
|
|
198
|
+
onPress={onPress}
|
|
199
|
+
>
|
|
200
|
+
{content}
|
|
201
|
+
</Pressable>
|
|
202
|
+
)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return (
|
|
206
|
+
<View style={[containerStyle, style]} accessibilityLabel={accessibilityLabel}>
|
|
207
|
+
{content}
|
|
208
|
+
</View>
|
|
209
|
+
)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Metricdata — internal metric column (Figma node 5352:256)
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
|
|
216
|
+
function Metricdata({ metric, tokens }: { metric: PdpCcCardMetric; tokens: ResolvedTokens }) {
|
|
217
|
+
return (
|
|
218
|
+
<View style={tokens.metric}>
|
|
219
|
+
{metric.title != null ? <Text style={tokens.metricTitle}>{metric.title}</Text> : null}
|
|
220
|
+
{metric.value != null ? <Text style={tokens.metricValue}>{metric.value}</Text> : null}
|
|
221
|
+
{metric.caption != null ? <Text style={tokens.metricCaption}>{metric.caption}</Text> : null}
|
|
222
|
+
</View>
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
// Tokens / static styles
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
|
|
230
|
+
interface ResolvedTokens {
|
|
231
|
+
container: ViewStyle
|
|
232
|
+
imageRadius: number
|
|
233
|
+
buttonIconSize: number
|
|
234
|
+
metric: ViewStyle
|
|
235
|
+
metricTitle: TextStyle
|
|
236
|
+
metricValue: TextStyle
|
|
237
|
+
metricCaption: TextStyle
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function asNum(raw: unknown, fallback: number): number {
|
|
241
|
+
const n = typeof raw === 'number' ? raw : parseFloat(raw as string)
|
|
242
|
+
return Number.isFinite(n) ? n : fallback
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function asStr(raw: unknown, fallback: string): string {
|
|
246
|
+
return raw != null ? String(raw) : fallback
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function resolveTokens(modes: Modes): ResolvedTokens {
|
|
250
|
+
// NOTE: token names are passed as string literals DIRECTLY to
|
|
251
|
+
// getVariableByName so the `extract-component-tokens` script can statically
|
|
252
|
+
// collect them for the generated docs. Do not refactor these into a helper
|
|
253
|
+
// that receives the name as a variable.
|
|
254
|
+
const background = asStr(getVariableByName('PDPcccard/bg/color', modes), '#ffffff')
|
|
255
|
+
const paddingHorizontal = asNum(getVariableByName('PDPcccard/padding/horizontal', modes), 16)
|
|
256
|
+
const paddingVertical = asNum(getVariableByName('PDPcccard/padding/vertical', modes), 20)
|
|
257
|
+
const gap = asNum(getVariableByName('PDPcccard/gap', modes), 12)
|
|
258
|
+
|
|
259
|
+
const imageRadius = asNum(getVariableByName('image/radius', modes), 8)
|
|
260
|
+
const buttonIconSize = asNum(getVariableByName('button/iconSize', modes), 16)
|
|
261
|
+
|
|
262
|
+
const metricGap = asNum(getVariableByName('metricdata/gap', modes), 4)
|
|
263
|
+
const metricPadH = asNum(getVariableByName('metricdata/padding/horizontal', modes), 10)
|
|
264
|
+
const metricPadV = asNum(getVariableByName('metricdata/padding/vertical', modes), 10)
|
|
265
|
+
|
|
266
|
+
const titleColor = asStr(getVariableByName('metricdata/title/color', modes), '#000000')
|
|
267
|
+
const titleSize = asNum(getVariableByName('metricdata/title/fontsize', modes), 12)
|
|
268
|
+
const titleFamily = asStr(getVariableByName('metricdata/title/fontfamily', modes), 'JioType Var')
|
|
269
|
+
const titleWeight = asStr(getVariableByName('metricdata/title/fontweight', modes), '400')
|
|
270
|
+
|
|
271
|
+
const valueColor = asStr(getVariableByName('metricdata/value/color', modes), '#000000')
|
|
272
|
+
const valueSize = asNum(getVariableByName('metricdata/value/fontsize', modes), 20)
|
|
273
|
+
const valueFamily = asStr(getVariableByName('metricdata/value/fontfamily', modes), 'JioType Var')
|
|
274
|
+
const valueWeight = asStr(getVariableByName('metricdata/value/fontweight', modes), '700')
|
|
275
|
+
|
|
276
|
+
const captionColor = asStr(getVariableByName('metricdata/caption/color', modes), '#777777')
|
|
277
|
+
const captionSize = asNum(getVariableByName('metricdata/caption/fontsize', modes), 12)
|
|
278
|
+
const captionFamily = asStr(getVariableByName('metricdata/caption/fontfamily', modes), 'JioType Var')
|
|
279
|
+
const captionWeight = asStr(getVariableByName('metricdata/caption/fontweight', modes), '500')
|
|
280
|
+
|
|
281
|
+
return {
|
|
282
|
+
container: {
|
|
283
|
+
backgroundColor: background,
|
|
284
|
+
paddingHorizontal,
|
|
285
|
+
paddingVertical,
|
|
286
|
+
gap,
|
|
287
|
+
flexDirection: 'column',
|
|
288
|
+
alignItems: 'center',
|
|
289
|
+
justifyContent: 'center',
|
|
290
|
+
},
|
|
291
|
+
imageRadius,
|
|
292
|
+
buttonIconSize,
|
|
293
|
+
metric: {
|
|
294
|
+
flex: 1,
|
|
295
|
+
gap: metricGap,
|
|
296
|
+
paddingHorizontal: metricPadH,
|
|
297
|
+
paddingVertical: metricPadV,
|
|
298
|
+
alignItems: 'center',
|
|
299
|
+
justifyContent: 'center',
|
|
300
|
+
},
|
|
301
|
+
metricTitle: {
|
|
302
|
+
color: titleColor,
|
|
303
|
+
fontSize: titleSize,
|
|
304
|
+
fontFamily: titleFamily,
|
|
305
|
+
fontWeight: titleWeight as TextStyle['fontWeight'],
|
|
306
|
+
lineHeight: Math.round(titleSize * 1.2),
|
|
307
|
+
textAlign: 'center',
|
|
308
|
+
includeFontPadding: false as any,
|
|
309
|
+
},
|
|
310
|
+
metricValue: {
|
|
311
|
+
color: valueColor,
|
|
312
|
+
fontSize: valueSize,
|
|
313
|
+
fontFamily: valueFamily,
|
|
314
|
+
fontWeight: valueWeight as TextStyle['fontWeight'],
|
|
315
|
+
lineHeight: Math.round(valueSize * 1.2),
|
|
316
|
+
textAlign: 'center',
|
|
317
|
+
includeFontPadding: false as any,
|
|
318
|
+
},
|
|
319
|
+
metricCaption: {
|
|
320
|
+
color: captionColor,
|
|
321
|
+
fontSize: captionSize,
|
|
322
|
+
fontFamily: captionFamily,
|
|
323
|
+
fontWeight: captionWeight as TextStyle['fontWeight'],
|
|
324
|
+
lineHeight: Math.round(captionSize * 1.2),
|
|
325
|
+
textAlign: 'center',
|
|
326
|
+
includeFontPadding: false as any,
|
|
327
|
+
},
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const DEFAULT_METRICS: PdpCcCardMetric[] = [
|
|
332
|
+
{ title: 'Title', value: 'Value', caption: 'caption' },
|
|
333
|
+
{ title: 'Title', value: 'Value', caption: 'caption' },
|
|
334
|
+
]
|
|
335
|
+
|
|
336
|
+
const styles = StyleSheet.create({
|
|
337
|
+
mediaSlot: {
|
|
338
|
+
alignSelf: 'stretch',
|
|
339
|
+
alignItems: 'center',
|
|
340
|
+
justifyContent: 'center',
|
|
341
|
+
},
|
|
342
|
+
metricsRow: {
|
|
343
|
+
alignSelf: 'stretch',
|
|
344
|
+
flexDirection: 'row',
|
|
345
|
+
alignItems: 'stretch',
|
|
346
|
+
},
|
|
347
|
+
metricDivider: {
|
|
348
|
+
alignSelf: 'center',
|
|
349
|
+
height: '70%',
|
|
350
|
+
},
|
|
351
|
+
pressed: {
|
|
352
|
+
opacity: 0.92,
|
|
353
|
+
},
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
export default PdpCcCard
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
12
12
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
|
|
13
13
|
import Icon from '../../icons/Icon';
|
|
14
|
+
import type { Modes } from '../../design-tokens'
|
|
14
15
|
|
|
15
16
|
/** Figma grid: label column 1.8fr, each plan column 1fr. */
|
|
16
17
|
const LABEL_COLUMN_FR = 1.8;
|
|
@@ -73,7 +74,7 @@ export type PlanComparisonCardProps = {
|
|
|
73
74
|
/** Feature rows compared across the plan columns. */
|
|
74
75
|
rows?: PlanComparisonRow[];
|
|
75
76
|
/** Design token modes for theming (e.g. `{ "Color Mode": "Light" }`). */
|
|
76
|
-
modes?:
|
|
77
|
+
modes?: Modes;
|
|
77
78
|
/** Override the outer container style. */
|
|
78
79
|
style?: StyleProp<ViewStyle>;
|
|
79
80
|
};
|
|
@@ -13,6 +13,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
13
13
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
14
14
|
import VStack from '../VStack/VStack'
|
|
15
15
|
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
16
|
+
import type { Modes } from '../../design-tokens'
|
|
16
17
|
|
|
17
18
|
export type PopupRef = {
|
|
18
19
|
open: () => void
|
|
@@ -31,7 +32,7 @@ export type PopupProps = {
|
|
|
31
32
|
/** Slot content displayed inside the popup. */
|
|
32
33
|
children?: React.ReactNode
|
|
33
34
|
/** Mode configuration for design token resolution. */
|
|
34
|
-
modes?:
|
|
35
|
+
modes?: Modes
|
|
35
36
|
/** Whether pressing the backdrop closes the popup. */
|
|
36
37
|
closeOnBackdropPress?: boolean
|
|
37
38
|
/** Backdrop overlay color. */
|
|
@@ -10,6 +10,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
10
10
|
import { cloneChildrenWithModes } from '../../utils/react-utils'
|
|
11
11
|
import Avatar from '../Avatar/Avatar'
|
|
12
12
|
import MoneyValue from '../MoneyValue/MoneyValue'
|
|
13
|
+
import type { Modes } from '../../design-tokens'
|
|
13
14
|
|
|
14
15
|
export type PortfolioHeroProps = {
|
|
15
16
|
/** Product label text displayed next to the avatar. */
|
|
@@ -21,7 +22,7 @@ export type PortfolioHeroProps = {
|
|
|
21
22
|
/** Currency symbol or ISO code. */
|
|
22
23
|
currency?: string
|
|
23
24
|
/** Modes configuration mapped to Figma tokens. */
|
|
24
|
-
modes?:
|
|
25
|
+
modes?: Modes
|
|
25
26
|
/** Slot content rendered below the money value (e.g. Badge, subtitle). */
|
|
26
27
|
children?: React.ReactNode
|
|
27
28
|
/** Container style override. */
|
|
@@ -11,6 +11,7 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
11
11
|
import { useTokens } from '../../design-tokens/JFSThemeProvider'
|
|
12
12
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
|
|
13
13
|
import MediaSource, { type UnifiedSource } from '../../utils/MediaSource'
|
|
14
|
+
import type { Modes } from '../../design-tokens'
|
|
14
15
|
|
|
15
16
|
// Default bundled FINVU brand logo, matching the Figma reference so the
|
|
16
17
|
// component renders correctly out of the box without any image prop.
|
|
@@ -52,7 +53,7 @@ export type PoweredByLabelProps = {
|
|
|
52
53
|
/**
|
|
53
54
|
* Design token modes for theming (e.g. `{ 'Color Mode': 'Dark' }`).
|
|
54
55
|
*/
|
|
55
|
-
modes?:
|
|
56
|
+
modes?: Modes
|
|
56
57
|
/** Container style override. */
|
|
57
58
|
style?: StyleProp<ViewStyle>
|
|
58
59
|
/** Label text style override. */
|
|
@@ -3,6 +3,7 @@ import { View, Text, type ViewStyle, type TextStyle, type ImageSourcePropType }
|
|
|
3
3
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
4
4
|
import Avatar from '../Avatar/Avatar'
|
|
5
5
|
import { EMPTY_MODES } from '../../utils/react-utils'
|
|
6
|
+
import type { Modes } from '../../design-tokens'
|
|
6
7
|
|
|
7
8
|
export type ProductLabelProps = {
|
|
8
9
|
/** The product name label text. */
|
|
@@ -10,7 +11,7 @@ export type ProductLabelProps = {
|
|
|
10
11
|
/** Image source for the product avatar. */
|
|
11
12
|
imageSource?: ImageSourcePropType | string
|
|
12
13
|
/** Modes configuration for design token resolution. */
|
|
13
|
-
modes?:
|
|
14
|
+
modes?: Modes
|
|
14
15
|
/** Container style override. */
|
|
15
16
|
style?: ViewStyle
|
|
16
17
|
}
|