jfs-components 0.0.99 → 0.1.2
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 +18 -0
- package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +1 -1
- package/lib/commonjs/components/Balance/Balance.js +17 -12
- package/lib/commonjs/components/Card/Card.js +2 -1
- package/lib/commonjs/components/CardFeedback/CardFeedback.js +2 -1
- package/lib/commonjs/components/Checkbox/Checkbox.js +2 -1
- package/lib/commonjs/components/Drawer/Drawer.js +13 -4
- package/lib/commonjs/components/Dropdown/Dropdown.js +37 -18
- package/lib/commonjs/components/DropdownInput/DropdownInput.js +1 -1
- package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +65 -4
- package/lib/commonjs/components/Image/Image.js +11 -5
- package/lib/commonjs/components/LottiePlayer/loadNativeLottieView.js +8 -13
- package/lib/commonjs/components/Overlay/Overlay.js +92 -0
- package/lib/commonjs/components/PlanComparisonCard/PlanComparisonCard.js +2 -1
- package/lib/commonjs/components/TestimonialsCard/TestimonialsCard.js +121 -0
- package/lib/commonjs/components/TextInput/TextInput.js +2 -1
- package/lib/commonjs/components/docs/modeControls.js +116 -0
- package/lib/commonjs/components/index.js +14 -0
- package/lib/commonjs/design-tokens/JFSThemeProvider.js +1 -1
- package/lib/commonjs/design-tokens/figma-modes.generated.js +391 -0
- package/lib/commonjs/design-tokens/index.js +11 -0
- package/lib/commonjs/icons/registry.js +1 -1
- package/lib/module/components/Accordion/Accordion.js +1 -2
- package/lib/module/components/AreaLineChart/AreaLineChart.js +1 -1
- package/lib/module/components/Balance/Balance.js +18 -13
- package/lib/module/components/Card/Card.js +1 -2
- package/lib/module/components/CardFeedback/CardFeedback.js +1 -2
- package/lib/module/components/Checkbox/Checkbox.js +1 -2
- package/lib/module/components/Drawer/Drawer.js +12 -4
- package/lib/module/components/Dropdown/Dropdown.js +37 -18
- package/lib/module/components/DropdownInput/DropdownInput.js +1 -1
- package/lib/module/components/FullscreenModal/FullscreenModal.js +67 -7
- package/lib/module/components/Image/Image.js +11 -5
- 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/OTP/OTP.js +1 -2
- package/lib/module/components/Overlay/Overlay.js +87 -0
- package/lib/module/components/PlanComparisonCard/PlanComparisonCard.js +1 -2
- package/lib/module/components/PoweredByLabel/PoweredByLabel.js +1 -2
- package/lib/module/components/RechargeCard/RechargeCard.js +1 -2
- package/lib/module/components/Section/Section.js +1 -2
- package/lib/module/components/TestimonialsCard/TestimonialsCard.js +116 -0
- package/lib/module/components/TextInput/TextInput.js +1 -2
- package/lib/module/components/UpiHandle/UpiHandle.js +1 -2
- package/lib/module/components/docs/modeControls.js +111 -0
- package/lib/module/components/index.js +2 -0
- package/lib/module/design-tokens/JFSThemeProvider.js +1 -1
- package/lib/module/design-tokens/figma-modes.generated.js +387 -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 +0 -1
- package/lib/typescript/scripts/extract-component-tokens.d.ts +1 -1
- package/lib/typescript/scripts/generate-mode-types.d.ts +2 -0
- package/lib/typescript/scripts/retype-modes.d.cts +2 -0
- 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 +2 -1
- 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/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/Checkbox/Checkbox.d.ts +2 -1
- package/lib/typescript/src/components/CheckboxGroup/CheckboxGroup.d.ts +2 -1
- package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -1
- 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/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 +2 -1
- 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 +2 -1
- package/lib/typescript/src/components/FullscreenModal/FullscreenModal.d.ts +9 -2
- 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 +2 -1
- 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 +2 -1
- 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/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/ProductOverview/ProductOverview.d.ts +2 -1
- package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +2 -1
- package/lib/typescript/src/components/Radio/Radio.d.ts +2 -1
- 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/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 +52 -0
- package/lib/typescript/src/components/Text/Text.d.ts +2 -1
- package/lib/typescript/src/components/TextInput/TextInput.d.ts +3 -2
- 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 +2 -0
- package/lib/typescript/src/design-tokens/JFSThemeProvider.d.ts +4 -3
- package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +264 -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 +2 -1
- package/package.json +3 -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 +2 -1
- 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/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/Checkbox/Checkbox.tsx +2 -1
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +2 -1
- package/src/components/CheckboxItem/CheckboxItem.tsx +2 -1
- 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/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 +42 -21
- package/src/components/DropdownInput/DropdownInput.tsx +5 -4
- 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 +3 -2
- package/src/components/FullscreenModal/FullscreenModal.tsx +77 -12
- 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 +3 -2
- 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 +2 -1
- 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/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/ProductOverview/ProductOverview.tsx +2 -1
- package/src/components/ProgressBadge/ProgressBadge.tsx +2 -1
- package/src/components/Radio/Radio.tsx +2 -1
- 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/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 +163 -0
- package/src/components/Text/Text.tsx +2 -1
- package/src/components/TextInput/TextInput.tsx +3 -2
- 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 +2 -0
- package/src/design-tokens/JFSThemeProvider.tsx +4 -3
- package/src/design-tokens/figma-modes.generated.ts +396 -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 +3 -2
|
@@ -6,9 +6,8 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
6
6
|
import Icon from '../../icons/Icon';
|
|
7
7
|
import { usePressableWebSupport } from '../../utils/web-platform-utils';
|
|
8
8
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
|
|
9
|
-
|
|
10
|
-
// Enable LayoutAnimation on Android
|
|
11
9
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
|
+
// Enable LayoutAnimation on Android
|
|
12
11
|
if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental) {
|
|
13
12
|
UIManager.setLayoutAnimationEnabledExperimental(true);
|
|
14
13
|
}
|
|
@@ -4,8 +4,15 @@ import React from 'react';
|
|
|
4
4
|
import { View, Text } from 'react-native';
|
|
5
5
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
6
6
|
import MoneyValue from '../MoneyValue/MoneyValue';
|
|
7
|
-
import { EMPTY_MODES } from '../../utils/react-utils';
|
|
7
|
+
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
|
|
8
8
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
// The Balance design renders its money value at the 36 px / 900-weight scale.
|
|
10
|
+
// The `moneyValue/*` tokens alias into the `Context3` collection, where the
|
|
11
|
+
// `Balance & Cards` mode supplies those larger values. Applied *before* the
|
|
12
|
+
// caller's `modes` so any consumer can still override individual keys.
|
|
13
|
+
const DEFAULT_MONEY_VALUE_MODES = {
|
|
14
|
+
Context3: 'Balance & Cards'
|
|
15
|
+
};
|
|
9
16
|
/**
|
|
10
17
|
* Balance component that displays a title and a monetary value.
|
|
11
18
|
*
|
|
@@ -29,7 +36,7 @@ function Balance({
|
|
|
29
36
|
// Title styles
|
|
30
37
|
const titleColor = getVariableByName('balance/title/foreground', modes) ?? '#0c0d10';
|
|
31
38
|
const titleFontSize = getVariableByName('balance/title/fontSize', modes) ?? 14;
|
|
32
|
-
const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? '
|
|
39
|
+
const titleFontFamily = getVariableByName('balance/title/fontFamily', modes) ?? 'JioType Var';
|
|
33
40
|
const titleLineHeight = getVariableByName('balance/title/lineHeight', modes) ?? 18;
|
|
34
41
|
const titleFontWeightValue = getVariableByName('balance/title/fontWeight', modes) ?? 500;
|
|
35
42
|
const titleFontWeight = typeof titleFontWeightValue === 'number' ? titleFontWeightValue.toString() : titleFontWeightValue;
|
|
@@ -46,15 +53,13 @@ function Balance({
|
|
|
46
53
|
fontWeight: titleFontWeight
|
|
47
54
|
};
|
|
48
55
|
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return child;
|
|
57
|
-
});
|
|
56
|
+
// The money value renders at the Balance & Cards scale. Merge the default
|
|
57
|
+
// context mode first so the caller's `modes` can still override it, and
|
|
58
|
+
// force that context onto any slotted children so custom money values match.
|
|
59
|
+
const moneyValueModes = {
|
|
60
|
+
...DEFAULT_MONEY_VALUE_MODES,
|
|
61
|
+
...modes
|
|
62
|
+
};
|
|
58
63
|
return /*#__PURE__*/_jsxs(View, {
|
|
59
64
|
style: [containerStyle, style],
|
|
60
65
|
"data-node-id": "1986:6203",
|
|
@@ -62,10 +67,10 @@ function Balance({
|
|
|
62
67
|
style: titleStyle,
|
|
63
68
|
"data-node-id": "1986:2613",
|
|
64
69
|
children: title
|
|
65
|
-
}), children ?
|
|
70
|
+
}), children ? cloneChildrenWithModes(children, modes, DEFAULT_MONEY_VALUE_MODES) : /*#__PURE__*/_jsx(MoneyValue, {
|
|
66
71
|
value: amount,
|
|
67
72
|
currency: currency,
|
|
68
|
-
modes:
|
|
73
|
+
modes: moneyValueModes
|
|
69
74
|
})]
|
|
70
75
|
});
|
|
71
76
|
}
|
|
@@ -4,13 +4,12 @@ import React, { createContext, useContext, isValidElement, cloneElement } from '
|
|
|
4
4
|
import { View, Text } from 'react-native';
|
|
5
5
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
6
6
|
import { EMPTY_MODES } from '../../utils/react-utils';
|
|
7
|
-
|
|
7
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
8
|
/**
|
|
9
9
|
* Context to share 'modes' with child components like Card.Title and Card.SupportText.
|
|
10
10
|
* This ensures that nested components can resolve their tokens correctly without
|
|
11
11
|
* needing explicit mode prop passing for every child.
|
|
12
12
|
*/
|
|
13
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
13
|
const CardContext = /*#__PURE__*/createContext({});
|
|
15
14
|
/**
|
|
16
15
|
* Card component implementation from Figma node 765:6186.
|
|
@@ -4,11 +4,10 @@ import React, { createContext, useContext, isValidElement, cloneElement } from '
|
|
|
4
4
|
import { View, Text } from 'react-native';
|
|
5
5
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
6
6
|
import IconComponent from '../../icons/Icon';
|
|
7
|
-
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
8
|
/**
|
|
9
9
|
* Context to share 'modes' with child components.
|
|
10
10
|
*/
|
|
11
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
11
|
const CardFeedbackContext = /*#__PURE__*/createContext({});
|
|
13
12
|
/**
|
|
14
13
|
* CardFeedback component from Figma node 1280:4481.
|
|
@@ -5,13 +5,12 @@ import { Pressable, Platform, View } from 'react-native';
|
|
|
5
5
|
import Svg, { Path } from 'react-native-svg';
|
|
6
6
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
7
7
|
import { EMPTY_MODES } from '../../utils/react-utils';
|
|
8
|
-
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
9
|
/**
|
|
10
10
|
* Tracks whether the last user interaction was a keyboard event (Tab).
|
|
11
11
|
* Capture-phase document listeners fire before any element-level handlers,
|
|
12
12
|
* so the flag is always up-to-date when onFocus runs.
|
|
13
13
|
*/
|
|
14
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
15
14
|
function useFocusVisible() {
|
|
16
15
|
const [isFocusVisible, setIsFocusVisible] = useState(false);
|
|
17
16
|
const hadKeyboardEventRef = useRef(false);
|
|
@@ -6,6 +6,7 @@ import { Gesture, GestureDetector, ScrollView } from 'react-native-gesture-handl
|
|
|
6
6
|
import Animated, { runOnJS, useAnimatedProps, useAnimatedScrollHandler, useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated';
|
|
7
7
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
8
8
|
import { EMPTY_MODES } from '../../utils/react-utils';
|
|
9
|
+
import Overlay from '../Overlay/Overlay';
|
|
9
10
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
11
|
const AnimatedScrollView = Animated.createAnimatedComponent(ScrollView);
|
|
11
12
|
|
|
@@ -67,7 +68,9 @@ function DrawerInner({
|
|
|
67
68
|
contentContainerStyle,
|
|
68
69
|
showsVerticalScrollIndicator = false,
|
|
69
70
|
bottomInset = 80,
|
|
70
|
-
onStateChange
|
|
71
|
+
onStateChange,
|
|
72
|
+
showOverlay = false,
|
|
73
|
+
onOverlayPress
|
|
71
74
|
}, ref) {
|
|
72
75
|
const {
|
|
73
76
|
height: screenHeight
|
|
@@ -365,10 +368,15 @@ function DrawerInner({
|
|
|
365
368
|
// Per the standard react-native-gesture-handler architecture, a single
|
|
366
369
|
// GestureHandlerRootView must wrap the app root; this overlay only needs to
|
|
367
370
|
// let touches fall through where the sheet isn't.
|
|
368
|
-
|
|
371
|
+
_jsxs(View, {
|
|
369
372
|
style: [styles.host, style],
|
|
370
373
|
pointerEvents: "box-none",
|
|
371
|
-
children: /*#__PURE__*/_jsx(
|
|
374
|
+
children: [showOverlay ? /*#__PURE__*/_jsx(Overlay, {
|
|
375
|
+
modes: modes,
|
|
376
|
+
...(onOverlayPress ? {
|
|
377
|
+
onPress: onOverlayPress
|
|
378
|
+
} : {})
|
|
379
|
+
}) : null, /*#__PURE__*/_jsx(GestureDetector, {
|
|
372
380
|
gesture: gesture,
|
|
373
381
|
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
374
382
|
style: [styles.sheet, {
|
|
@@ -441,7 +449,7 @@ function DrawerInner({
|
|
|
441
449
|
})]
|
|
442
450
|
})
|
|
443
451
|
})
|
|
444
|
-
})
|
|
452
|
+
})]
|
|
445
453
|
})
|
|
446
454
|
);
|
|
447
455
|
}
|
|
@@ -170,18 +170,34 @@ export function Dropdown({
|
|
|
170
170
|
const shadowOffsetX = parseInt(getVariableByName('dropdown/shadow/offsetX', modes), 10) || 0;
|
|
171
171
|
const shadowOffsetY = parseInt(getVariableByName('dropdown/shadow/offsetY', modes), 10) || 4;
|
|
172
172
|
const shadowBlur = parseInt(getVariableByName('dropdown/shadow/blur', modes), 10) || 16;
|
|
173
|
-
|
|
173
|
+
|
|
174
|
+
// Shadow lives on the OUTER view, which must NOT set `overflow: 'hidden'`.
|
|
175
|
+
// On native, clipping a view also clips its shadow (iOS clips the layer
|
|
176
|
+
// shadow; Android clips the elevation shadow), so the soft popup shadow
|
|
177
|
+
// that renders fine on web (CSS box-shadow paints outside the box) would
|
|
178
|
+
// get cut off. The rounded-corner clipping is moved to a separate inner
|
|
179
|
+
// view below.
|
|
180
|
+
//
|
|
181
|
+
// The `boxShadow` style prop (RN 0.76+ / react-native-web) is used as the
|
|
182
|
+
// single source of truth so the designed color/offset/blur are honored on
|
|
183
|
+
// iOS, Android AND web. We intentionally do NOT also set the legacy
|
|
184
|
+
// `shadow*` / `elevation` props: on the new architecture (and web) those
|
|
185
|
+
// are translated into a box-shadow internally, so combining them with an
|
|
186
|
+
// explicit `boxShadow` would stack two shadows. Android's legacy
|
|
187
|
+
// `elevation` is also undesirable here because it ignores the shadow color
|
|
188
|
+
// and only paints a generic gray shadow.
|
|
189
|
+
const shadowStyle = {
|
|
174
190
|
backgroundColor: background,
|
|
191
|
+
borderRadius: radius,
|
|
192
|
+
boxShadow: `${shadowOffsetX}px ${shadowOffsetY}px ${shadowBlur}px 0px ${shadowColor}`
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// Inner view carries the rounded corners + clipping so list/scroll content
|
|
196
|
+
// stays inside the radius without affecting the outer view's shadow.
|
|
197
|
+
const clipStyle = {
|
|
175
198
|
borderRadius: radius,
|
|
176
199
|
overflow: 'hidden',
|
|
177
|
-
|
|
178
|
-
shadowOffset: {
|
|
179
|
-
width: shadowOffsetX,
|
|
180
|
-
height: shadowOffsetY
|
|
181
|
-
},
|
|
182
|
-
shadowOpacity: 1,
|
|
183
|
-
shadowRadius: shadowBlur / 2,
|
|
184
|
-
elevation: 4
|
|
200
|
+
backgroundColor: background
|
|
185
201
|
};
|
|
186
202
|
const content = /*#__PURE__*/_jsx(View, {
|
|
187
203
|
style: {
|
|
@@ -190,17 +206,20 @@ export function Dropdown({
|
|
|
190
206
|
children: cloneChildrenWithModes(children, modes)
|
|
191
207
|
});
|
|
192
208
|
return /*#__PURE__*/_jsx(View, {
|
|
193
|
-
style: [
|
|
209
|
+
style: [shadowStyle, style],
|
|
194
210
|
accessibilityRole: "menu",
|
|
195
211
|
accessibilityLabel: accessibilityLabel || 'Dropdown menu',
|
|
196
|
-
children:
|
|
197
|
-
style:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
212
|
+
children: /*#__PURE__*/_jsx(View, {
|
|
213
|
+
style: clipStyle,
|
|
214
|
+
children: maxHeight != null ? /*#__PURE__*/_jsx(ScrollView, {
|
|
215
|
+
style: {
|
|
216
|
+
maxHeight
|
|
217
|
+
},
|
|
218
|
+
showsVerticalScrollIndicator: true,
|
|
219
|
+
keyboardShouldPersistTaps: "handled",
|
|
220
|
+
children: content
|
|
221
|
+
}) : content
|
|
222
|
+
})
|
|
204
223
|
});
|
|
205
224
|
}
|
|
206
225
|
export default Dropdown;
|
|
@@ -531,7 +531,7 @@ function DropdownInput({
|
|
|
531
531
|
transparent: true,
|
|
532
532
|
statusBarTranslucent: true,
|
|
533
533
|
navigationBarTranslucent: true,
|
|
534
|
-
animationType: "
|
|
534
|
+
animationType: "none",
|
|
535
535
|
onRequestClose: closeMenu,
|
|
536
536
|
children: /*#__PURE__*/_jsx(Pressable, {
|
|
537
537
|
style: StyleSheet.absoluteFill,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import React, { useMemo, useRef } from 'react';
|
|
3
|
+
import React, { useMemo, useRef, useState, useCallback } from 'react';
|
|
4
4
|
import { View, Text, Animated } from 'react-native';
|
|
5
5
|
import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
6
6
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
@@ -11,7 +11,7 @@ import Disclaimer from '../Disclaimer/Disclaimer';
|
|
|
11
11
|
import IconButton from '../IconButton/IconButton';
|
|
12
12
|
import ActionFooter from '../ActionFooter/ActionFooter';
|
|
13
13
|
import Slot from '../Slot/Slot';
|
|
14
|
-
|
|
14
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
16
|
// Forced modes
|
|
17
17
|
//
|
|
@@ -24,7 +24,6 @@ import Slot from '../Slot/Slot';
|
|
|
24
24
|
// stays hot, and so `cloneChildrenWithModes` can use it as the
|
|
25
25
|
// always-wins `forcedModes` argument.
|
|
26
26
|
// ---------------------------------------------------------------------------
|
|
27
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
28
27
|
const FULLSCREEN_MODAL_FORCED_MODES = Object.freeze({
|
|
29
28
|
context5: 'Fullscreen Modal'
|
|
30
29
|
});
|
|
@@ -184,6 +183,7 @@ function FullscreenModal({
|
|
|
184
183
|
heroMedia,
|
|
185
184
|
heroHeight = 420,
|
|
186
185
|
showClose = true,
|
|
186
|
+
closeOffsetY = 0,
|
|
187
187
|
onClose,
|
|
188
188
|
closeAccessibilityLabel = 'Close',
|
|
189
189
|
footer,
|
|
@@ -220,8 +220,8 @@ function FullscreenModal({
|
|
|
220
220
|
// SafeAreaProvider — every inset is 0, so the layout is unchanged.
|
|
221
221
|
const insets = useSafeAreaInsets();
|
|
222
222
|
const closeButtonInsetStyle = useMemo(() => ({
|
|
223
|
-
top: 12 + insets.top
|
|
224
|
-
}), [insets.top]);
|
|
223
|
+
top: 12 + insets.top + closeOffsetY
|
|
224
|
+
}), [insets.top, closeOffsetY]);
|
|
225
225
|
// Extend (not replace) the footer's token bottom padding by the bottom inset
|
|
226
226
|
// so the action button never sits under the system navigation area.
|
|
227
227
|
const footerInsetStyle = useMemo(() => {
|
|
@@ -247,7 +247,57 @@ function FullscreenModal({
|
|
|
247
247
|
useNativeDriver: true
|
|
248
248
|
}), [scrollY]);
|
|
249
249
|
const heroTranslateY = useMemo(() => Animated.multiply(scrollY, -1), [scrollY]);
|
|
250
|
-
|
|
250
|
+
|
|
251
|
+
// The hero media is a full-bleed background pinned to the top of the modal.
|
|
252
|
+
// Its wrapper is absolutely positioned (`top/left/right: 0`) so it never
|
|
253
|
+
// contributes to scroll height. We measure the modal's own width so we can
|
|
254
|
+
// give the hero media a DEFINITE { width, height } box (see
|
|
255
|
+
// `processedHeroMedia` below) — relying on the media's own `width: '100%'` +
|
|
256
|
+
// `aspectRatio` is unreliable inside an indefinite-height absolute box (RN's
|
|
257
|
+
// `<Image>` falls back to its intrinsic width and leaves a gap), so we size
|
|
258
|
+
// it explicitly here instead.
|
|
259
|
+
const [containerWidth, setContainerWidth] = useState(0);
|
|
260
|
+
const onContainerLayout = useCallback(e => {
|
|
261
|
+
const w = e.nativeEvent.layout.width;
|
|
262
|
+
setContainerWidth(prev => prev !== w ? w : prev);
|
|
263
|
+
}, []);
|
|
264
|
+
const processedHeroMedia = useMemo(() => {
|
|
265
|
+
if (!heroMedia) return null;
|
|
266
|
+
// Defer rendering the hero until we have measured the modal width. This
|
|
267
|
+
// matters for image sharpness: React Native decodes a bitmap once, on the
|
|
268
|
+
// first render, and caches it. If we rendered the media before knowing the
|
|
269
|
+
// final box, that first decode would be sized/sampled for the wrong box and
|
|
270
|
+
// the cached (downsampled) bitmap would then just be scaled up — blurry.
|
|
271
|
+
// Rendering only once the explicit { width, height } box is known means the
|
|
272
|
+
// very first decode is already full-resolution for the correct box.
|
|
273
|
+
if (containerWidth <= 0) return null;
|
|
274
|
+
const withModes = cloneChildrenWithModes(heroMedia, modes, FULLSCREEN_MODAL_FORCED_MODES);
|
|
275
|
+
|
|
276
|
+
// Force the hero to fill the modal width edge to edge, top-aligned, with the
|
|
277
|
+
// height derived from the media's native aspect ratio.
|
|
278
|
+
//
|
|
279
|
+
// Why we inject explicit width/height instead of relying on the media's own
|
|
280
|
+
// `width: '100%'` + `aspectRatio`: the hero wrapper is absolutely positioned
|
|
281
|
+
// with an INDEFINITE height, and in that layout context React Native's
|
|
282
|
+
// `<Image>` falls back to its INTRINSIC width (so a 361px-wide asset renders
|
|
283
|
+
// 361px wide and leaves a gap on the right) rather than stretching to the
|
|
284
|
+
// parent. By computing `height = containerWidth / ratio` here and passing a
|
|
285
|
+
// DEFINITE { width, height } box (which makes `<Image>` skip aspectRatio and
|
|
286
|
+
// cover-fit into that exact box), the hero always fills the width with the
|
|
287
|
+
// correct ratio-derived height.
|
|
288
|
+
return React.Children.map(withModes, child => {
|
|
289
|
+
if (! /*#__PURE__*/React.isValidElement(child)) return child;
|
|
290
|
+
const props = child.props;
|
|
291
|
+
const ratio = typeof props.ratio === 'number' && props.ratio > 0 ? props.ratio : undefined;
|
|
292
|
+
// Only size media that exposes a numeric `ratio` and hasn't already been
|
|
293
|
+
// given an explicit box by the caller.
|
|
294
|
+
if (ratio == null || props.width != null || props.height != null) return child;
|
|
295
|
+
return /*#__PURE__*/React.cloneElement(child, {
|
|
296
|
+
width: containerWidth,
|
|
297
|
+
height: containerWidth / ratio
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
}, [heroMedia, modes, containerWidth]);
|
|
251
301
|
const processedChildren = useMemo(() => children ? cloneChildrenWithModes(children, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [children, modes]);
|
|
252
302
|
|
|
253
303
|
// The hero text region always reserves `heroHeight` and anchors its content
|
|
@@ -300,8 +350,18 @@ function FullscreenModal({
|
|
|
300
350
|
return /*#__PURE__*/_jsxs(View, {
|
|
301
351
|
style: [rootStyle, style],
|
|
302
352
|
testID: testID,
|
|
353
|
+
onLayout: onContainerLayout,
|
|
303
354
|
children: [processedHeroMedia ? /*#__PURE__*/_jsx(Animated.View, {
|
|
304
|
-
style: [heroBackgroundStyle,
|
|
355
|
+
style: [heroBackgroundStyle,
|
|
356
|
+
// Give the absolute wrapper a DEFINITE width (the measured modal
|
|
357
|
+
// width) so the media's `width: '100%'` + `aspectRatio` resolves to
|
|
358
|
+
// a true edge-to-edge fill with a ratio-derived height, top-aligned.
|
|
359
|
+
// Before the first layout pass `containerWidth` is 0 — fall back to
|
|
360
|
+
// stretching via `left/right: 0` so there is no flash of a mis-sized
|
|
361
|
+
// image.
|
|
362
|
+
containerWidth > 0 ? {
|
|
363
|
+
width: containerWidth
|
|
364
|
+
} : null, {
|
|
305
365
|
transform: [{
|
|
306
366
|
translateY: heroTranslateY
|
|
307
367
|
}]
|
|
@@ -37,6 +37,7 @@ function Image({
|
|
|
37
37
|
imageSource,
|
|
38
38
|
ratio = DEFAULT_RATIO,
|
|
39
39
|
resizeMode = 'cover',
|
|
40
|
+
resizeMethod,
|
|
40
41
|
width,
|
|
41
42
|
height,
|
|
42
43
|
borderRadius,
|
|
@@ -47,11 +48,15 @@ function Image({
|
|
|
47
48
|
loading
|
|
48
49
|
}) {
|
|
49
50
|
const source = useMemo(() => normalizeSource(imageSource), [imageSource]);
|
|
51
|
+
|
|
52
|
+
// Explicit { width, height } means a "fill an exact box" layout — typically a
|
|
53
|
+
// full-bleed hero/background where the asset is high-res and sharpness
|
|
54
|
+
// matters most. There, default to `'none'` (full-resolution, no pre-decode
|
|
55
|
+
// downsample) so detail is never thrown away. Aspect-ratio images keep the
|
|
56
|
+
// memory-safe `'scale'` default. A caller-supplied `resizeMethod` always wins.
|
|
57
|
+
const isExplicitBox = width != null && height != null;
|
|
58
|
+
const effectiveResizeMethod = resizeMethod ?? (isExplicitBox ? 'none' : 'scale');
|
|
50
59
|
const layoutStyle = useMemo(() => {
|
|
51
|
-
// If the caller has fully specified width AND height, they're doing a
|
|
52
|
-
// non-aspect layout (e.g. "fill the parent") — respect that and skip
|
|
53
|
-
// `aspectRatio` so it doesn't conflict.
|
|
54
|
-
const isExplicitBox = width != null && height != null;
|
|
55
60
|
const s = {
|
|
56
61
|
width: width ?? '100%',
|
|
57
62
|
...(isExplicitBox ? {
|
|
@@ -65,7 +70,7 @@ function Image({
|
|
|
65
70
|
};
|
|
66
71
|
if (borderRadius != null) s.borderRadius = borderRadius;
|
|
67
72
|
return s;
|
|
68
|
-
}, [ratio, width, height, borderRadius]);
|
|
73
|
+
}, [ratio, width, height, borderRadius, isExplicitBox]);
|
|
69
74
|
const {
|
|
70
75
|
active: groupActive
|
|
71
76
|
} = useSkeleton();
|
|
@@ -96,6 +101,7 @@ function Image({
|
|
|
96
101
|
source: source,
|
|
97
102
|
style: [layoutStyle, style],
|
|
98
103
|
resizeMode: resizeMode,
|
|
104
|
+
resizeMethod: effectiveResizeMethod,
|
|
99
105
|
accessibilityLabel: accessibilityLabel,
|
|
100
106
|
accessibilityElementsHidden: accessibilityElementsHidden,
|
|
101
107
|
importantForAccessibility: importantForAccessibility
|
|
@@ -6,11 +6,10 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
6
6
|
import { useTokens } from '../../design-tokens/JFSThemeProvider';
|
|
7
7
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
|
|
8
8
|
import MediaSource from '../../utils/MediaSource';
|
|
9
|
-
|
|
9
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
10
|
// Default avatar asset (shared with the Avatar component) so that
|
|
11
11
|
// InstitutionBadge has a sensible visual fallback when no `source` is
|
|
12
12
|
// provided in stories or playgrounds.
|
|
13
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
13
|
const DEFAULT_AVATAR_IMAGE = require('../Avatar/31595e70c4181263f9971590224b12934b280c9b.png');
|
|
15
14
|
const toNumber = (value, fallback) => {
|
|
16
15
|
if (typeof value === 'number') {
|
|
@@ -6,17 +6,6 @@ import { Text, View } from 'react-native';
|
|
|
6
6
|
/** Props we forward to the underlying native Lottie view. */
|
|
7
7
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
8
|
const INSTALL_HINT = 'LottiePlayer requires lottie-react-native in your app.\n' + ' npm install lottie-react-native\n' + ' cd ios && pod install';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Metro resolves `require('lottie-react-native')` at bundle time even inside
|
|
12
|
-
* try/catch, which breaks apps that import `jfs-components` without having
|
|
13
|
-
* the optional peer installed. Splitting the module id into a runtime string
|
|
14
|
-
* keeps Metro from statically linking it — the native module is loaded only
|
|
15
|
-
* when present in the consumer's node_modules.
|
|
16
|
-
*/
|
|
17
|
-
function resolveNativeLottieModuleName() {
|
|
18
|
-
return ['lottie', '-react', '-native'].join('');
|
|
19
|
-
}
|
|
20
9
|
function LottieUnavailableView({
|
|
21
10
|
style
|
|
22
11
|
}) {
|
|
@@ -60,8 +49,14 @@ let cachedView;
|
|
|
60
49
|
export function getNativeLottieView() {
|
|
61
50
|
if (cachedView !== undefined) return cachedView;
|
|
62
51
|
try {
|
|
63
|
-
|
|
64
|
-
|
|
52
|
+
// Static require so Metro resolves the module by its build-time numeric id.
|
|
53
|
+
// A runtime-constructed string path is NOT resolvable by Metro's `require`
|
|
54
|
+
// (it indexes modules by number, not path), so it would always throw and
|
|
55
|
+
// fall back to the install hint even when the package is installed. The
|
|
56
|
+
// dependency stays an *optional* peer: apps that use LottiePlayer install
|
|
57
|
+
// it; apps that don't simply never import this module.
|
|
58
|
+
const mod = require('lottie-react-native');
|
|
59
|
+
cachedView = mod.default ?? mod.LottieView ?? LottieUnavailable;
|
|
65
60
|
} catch {
|
|
66
61
|
cachedView = LottieUnavailable;
|
|
67
62
|
}
|
|
@@ -4,9 +4,8 @@ import React, { useMemo, useEffect, useRef } from 'react';
|
|
|
4
4
|
import { View, Text, Pressable, Animated } from 'react-native';
|
|
5
5
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
6
6
|
import { EMPTY_MODES } from '../../utils/react-utils';
|
|
7
|
-
|
|
8
|
-
// Map of common ISO 4217 currency codes to display symbols
|
|
9
7
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
8
|
+
// Map of common ISO 4217 currency codes to display symbols
|
|
10
9
|
const CURRENCY_SYMBOLS = {
|
|
11
10
|
INR: '₹',
|
|
12
11
|
USD: '$',
|
|
@@ -7,11 +7,10 @@ import { useTokens } from '../../design-tokens/JFSThemeProvider';
|
|
|
7
7
|
import SupportText from '../SupportText/SupportText';
|
|
8
8
|
import Button from '../Button/Button';
|
|
9
9
|
import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils';
|
|
10
|
-
|
|
10
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
11
11
|
// Default mode overrides for the resend Button. Per design: a small,
|
|
12
12
|
// low-emphasis, neutral-appearance button. Consumers can override any of
|
|
13
13
|
// these via OTPResendConfig.resendButtonModes.
|
|
14
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
15
14
|
const DEFAULT_RESEND_BUTTON_MODES = {
|
|
16
15
|
AppearanceBrand: 'Neutral',
|
|
17
16
|
'Button / Size': 'S',
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import { Pressable, StyleSheet, View } from 'react-native';
|
|
5
|
+
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
6
|
+
import { useTokens } from '../../design-tokens/JFSThemeProvider';
|
|
7
|
+
import { cloneChildrenWithModes, EMPTY_MODES } from '../../utils/react-utils';
|
|
8
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
const PLACEMENT_STYLE = {
|
|
10
|
+
center: {
|
|
11
|
+
justifyContent: 'center',
|
|
12
|
+
alignItems: 'center'
|
|
13
|
+
},
|
|
14
|
+
top: {
|
|
15
|
+
justifyContent: 'flex-start',
|
|
16
|
+
alignItems: 'stretch'
|
|
17
|
+
},
|
|
18
|
+
bottom: {
|
|
19
|
+
justifyContent: 'flex-end',
|
|
20
|
+
alignItems: 'stretch'
|
|
21
|
+
},
|
|
22
|
+
stretch: {
|
|
23
|
+
justifyContent: 'center',
|
|
24
|
+
alignItems: 'stretch'
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Overlay — a token-driven scrim that dims content behind an overlaid surface.
|
|
30
|
+
*
|
|
31
|
+
* Renders a semi-transparent backdrop using the `overlay/background` design
|
|
32
|
+
* token and optionally hosts content (e.g. a modal, sheet or dialog) on top.
|
|
33
|
+
* Pair it with a `Modal` for true full-screen overlays, or drop it inside any
|
|
34
|
+
* relatively-positioned container to dim just that region.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```tsx
|
|
38
|
+
* <Overlay modes={modes} onPress={close}>
|
|
39
|
+
* <Card>Dialog content</Card>
|
|
40
|
+
* </Overlay>
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
function Overlay({
|
|
44
|
+
children,
|
|
45
|
+
contentPlacement = 'center',
|
|
46
|
+
onPress,
|
|
47
|
+
fill = true,
|
|
48
|
+
modes: propModes = EMPTY_MODES,
|
|
49
|
+
style,
|
|
50
|
+
...rest
|
|
51
|
+
}) {
|
|
52
|
+
const {
|
|
53
|
+
modes: globalModes
|
|
54
|
+
} = useTokens();
|
|
55
|
+
const modes = useMemo(() => ({
|
|
56
|
+
...globalModes,
|
|
57
|
+
...propModes
|
|
58
|
+
}), [globalModes, propModes]);
|
|
59
|
+
const {
|
|
60
|
+
containerStyle,
|
|
61
|
+
processedChildren
|
|
62
|
+
} = useMemo(() => {
|
|
63
|
+
const backgroundColor = getVariableByName('overlay/background', modes) ?? 'rgba(0, 0, 0, 0.7)';
|
|
64
|
+
const container = {
|
|
65
|
+
backgroundColor,
|
|
66
|
+
overflow: 'hidden',
|
|
67
|
+
...PLACEMENT_STYLE[contentPlacement]
|
|
68
|
+
};
|
|
69
|
+
const processed = children ? cloneChildrenWithModes(children, modes) : null;
|
|
70
|
+
return {
|
|
71
|
+
containerStyle: container,
|
|
72
|
+
processedChildren: processed
|
|
73
|
+
};
|
|
74
|
+
}, [children, modes, contentPlacement]);
|
|
75
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
76
|
+
style: [fill && StyleSheet.absoluteFill, containerStyle, style],
|
|
77
|
+
accessibilityViewIsModal: true,
|
|
78
|
+
...rest,
|
|
79
|
+
children: [onPress ? /*#__PURE__*/_jsx(Pressable, {
|
|
80
|
+
style: StyleSheet.absoluteFill,
|
|
81
|
+
onPress: onPress,
|
|
82
|
+
accessibilityRole: "button",
|
|
83
|
+
accessibilityLabel: "Dismiss overlay"
|
|
84
|
+
}) : null, processedChildren]
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
export default /*#__PURE__*/React.memo(Overlay);
|
|
@@ -5,9 +5,8 @@ import { View, Text, Pressable, Platform } from 'react-native';
|
|
|
5
5
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
6
6
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
|
|
7
7
|
import Icon from '../../icons/Icon';
|
|
8
|
-
|
|
9
|
-
/** Figma grid: label column 1.8fr, each plan column 1fr. */
|
|
10
8
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
|
+
/** Figma grid: label column 1.8fr, each plan column 1fr. */
|
|
11
10
|
const LABEL_COLUMN_FR = 1.8;
|
|
12
11
|
const PLAN_COLUMN_FR = 1;
|
|
13
12
|
|
|
@@ -6,10 +6,9 @@ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
|
|
|
6
6
|
import { useTokens } from '../../design-tokens/JFSThemeProvider';
|
|
7
7
|
import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils';
|
|
8
8
|
import MediaSource from '../../utils/MediaSource';
|
|
9
|
-
|
|
9
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
10
|
// Default bundled FINVU brand logo, matching the Figma reference so the
|
|
11
11
|
// component renders correctly out of the box without any image prop.
|
|
12
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
12
|
const DEFAULT_LOGO = require('./finvu.png');
|
|
14
13
|
const DEFAULT_LABEL = 'Powered by RBI-regulated account aggregator';
|
|
15
14
|
const DEFAULT_IMAGE_WIDTH = 33;
|
|
@@ -7,11 +7,10 @@ import AvatarGroup from '../AvatarGroup/AvatarGroup';
|
|
|
7
7
|
import { getVariableByName } from '../../design-tokens/figma-variables-resolver';
|
|
8
8
|
import { EMPTY_MODES } from '../../utils/react-utils';
|
|
9
9
|
import MoneyValue from '../MoneyValue/MoneyValue';
|
|
10
|
-
|
|
10
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
11
11
|
// Defaults applied to the inner ButtonGroup so the card matches Figma out of
|
|
12
12
|
// the box. They are spread *before* the caller's `modes` so any consumer can
|
|
13
13
|
// override an individual key (e.g. swap the size to "M").
|
|
14
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
14
|
const DEFAULT_BUTTON_GROUP_MODES = {
|
|
16
15
|
AppearanceBrand: 'Secondary',
|
|
17
16
|
'Button / Size': 'S',
|
|
@@ -9,10 +9,9 @@ import IconCapsule from '../IconCapsule/IconCapsule';
|
|
|
9
9
|
import ListItem from '../ListItem/ListItem';
|
|
10
10
|
import { usePressableWebSupport } from '../../utils/web-platform-utils';
|
|
11
11
|
import { EMPTY_MODES, cloneChildrenWithModes, flattenChildren } from '../../utils/react-utils';
|
|
12
|
-
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
13
13
|
// Match Button: delay the press visual on iOS so a scroll-cancelled touch
|
|
14
14
|
// never applies the "pressed" style. See Button.tsx for the rationale.
|
|
15
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
16
15
|
const IS_WEB = Platform.OS === 'web';
|
|
17
16
|
const IS_IOS = Platform.OS === 'ios';
|
|
18
17
|
const HEADER_PRESS_DELAY = IS_IOS ? 130 : 0;
|