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
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,24 @@ All notable changes to this project are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
|
|
7
|
+
## [0.1.1] - 2026-06-10
|
|
8
|
+
|
|
9
|
+
- Design tokens — the `modes` prop is now strongly typed end to end. A generated `Modes` type gives autocomplete and validation for both collection-name keys and mode-name values across every component, while staying fully backward compatible (opt-in `StrictModes` turns typos into compile errors). `FIGMA_MODES`, `CollectionName`, and `ModeOf` are exported from the package.
|
|
10
|
+
- Storybook — components now expose per-collection mode `select` controls (auto-generated) in place of the freeform `modes` object control. Collection detection is composition-aware, so wrapper components (e.g. `Balance`, `BubbleChart`, `BrandChip`) surface the modes of the children they theme.
|
|
11
|
+
- `FullscreenModal` — hero media now fills the modal edge to edge: the surface width is measured and an explicit ratio-derived box is applied to the background, fixing the right-side gap / mis-sized image on native.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## [0.1.0] - 2026-06-08
|
|
16
|
+
|
|
17
|
+
- Added `TestimonialsCard` — compact avatar + title + body card for testimonial carousels.
|
|
18
|
+
- `Drawer` — programmatic ref API (`expand` / `collapse` / `toggle` / `getState`), controlled `state` + `onStateChange`, touch-overlay and gesture-loop fixes.
|
|
19
|
+
- `FullscreenModal` — safe-area-aware footer and close button; new `closeOffsetY` prop.
|
|
20
|
+
- `Dropdown` — `boxShadow`-based popup shadow with inner clip view (fixes clipped shadow on native).
|
|
21
|
+
- `Spinner` / `Skeleton` — shimmer overlay uses explicit absolute positioning instead of `absoluteFillObject`.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
7
25
|
## [0.0.95] - 2026-06-04
|
|
8
26
|
|
|
9
27
|
- Added `Icon` — token-driven design-system icon primitive (`iconName`, `source`, `children` slot); exported from the package barrel.
|
|
@@ -11,6 +11,13 @@ var _MoneyValue = _interopRequireDefault(require("../MoneyValue/MoneyValue"));
|
|
|
11
11
|
var _reactUtils = require("../../utils/react-utils");
|
|
12
12
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
// The Balance design renders its money value at the 36 px / 900-weight scale.
|
|
15
|
+
// The `moneyValue/*` tokens alias into the `Context3` collection, where the
|
|
16
|
+
// `Balance & Cards` mode supplies those larger values. Applied *before* the
|
|
17
|
+
// caller's `modes` so any consumer can still override individual keys.
|
|
18
|
+
const DEFAULT_MONEY_VALUE_MODES = {
|
|
19
|
+
Context3: 'Balance & Cards'
|
|
20
|
+
};
|
|
14
21
|
/**
|
|
15
22
|
* Balance component that displays a title and a monetary value.
|
|
16
23
|
*
|
|
@@ -34,7 +41,7 @@ function Balance({
|
|
|
34
41
|
// Title styles
|
|
35
42
|
const titleColor = (0, _figmaVariablesResolver.getVariableByName)('balance/title/foreground', modes) ?? '#0c0d10';
|
|
36
43
|
const titleFontSize = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontSize', modes) ?? 14;
|
|
37
|
-
const titleFontFamily = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontFamily', modes) ?? '
|
|
44
|
+
const titleFontFamily = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontFamily', modes) ?? 'JioType Var';
|
|
38
45
|
const titleLineHeight = (0, _figmaVariablesResolver.getVariableByName)('balance/title/lineHeight', modes) ?? 18;
|
|
39
46
|
const titleFontWeightValue = (0, _figmaVariablesResolver.getVariableByName)('balance/title/fontWeight', modes) ?? 500;
|
|
40
47
|
const titleFontWeight = typeof titleFontWeightValue === 'number' ? titleFontWeightValue.toString() : titleFontWeightValue;
|
|
@@ -51,15 +58,13 @@ function Balance({
|
|
|
51
58
|
fontWeight: titleFontWeight
|
|
52
59
|
};
|
|
53
60
|
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
return child;
|
|
62
|
-
});
|
|
61
|
+
// The money value renders at the Balance & Cards scale. Merge the default
|
|
62
|
+
// context mode first so the caller's `modes` can still override it, and
|
|
63
|
+
// force that context onto any slotted children so custom money values match.
|
|
64
|
+
const moneyValueModes = {
|
|
65
|
+
...DEFAULT_MONEY_VALUE_MODES,
|
|
66
|
+
...modes
|
|
67
|
+
};
|
|
63
68
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
64
69
|
style: [containerStyle, style],
|
|
65
70
|
"data-node-id": "1986:6203",
|
|
@@ -67,10 +72,10 @@ function Balance({
|
|
|
67
72
|
style: titleStyle,
|
|
68
73
|
"data-node-id": "1986:2613",
|
|
69
74
|
children: title
|
|
70
|
-
}), children ?
|
|
75
|
+
}), children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes, DEFAULT_MONEY_VALUE_MODES) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_MoneyValue.default, {
|
|
71
76
|
value: amount,
|
|
72
77
|
currency: currency,
|
|
73
|
-
modes:
|
|
78
|
+
modes: moneyValueModes
|
|
74
79
|
})]
|
|
75
80
|
});
|
|
76
81
|
}
|
|
@@ -15,7 +15,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
15
15
|
* Context to share 'modes' with child components like Card.Title and Card.SupportText.
|
|
16
16
|
* This ensures that nested components can resolve their tokens correctly without
|
|
17
17
|
* needing explicit mode prop passing for every child.
|
|
18
|
-
*/
|
|
18
|
+
*/
|
|
19
|
+
const CardContext = /*#__PURE__*/(0, _react.createContext)({});
|
|
19
20
|
/**
|
|
20
21
|
* Card component implementation from Figma node 765:6186.
|
|
21
22
|
*
|
|
@@ -19,7 +19,8 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
19
19
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
20
20
|
/**
|
|
21
21
|
* Context to share 'modes' with child components.
|
|
22
|
-
*/
|
|
22
|
+
*/
|
|
23
|
+
const CardFeedbackContext = /*#__PURE__*/(0, _react.createContext)({});
|
|
23
24
|
/**
|
|
24
25
|
* CardFeedback component from Figma node 1280:4481.
|
|
25
26
|
*
|
|
@@ -15,7 +15,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
15
15
|
* Tracks whether the last user interaction was a keyboard event (Tab).
|
|
16
16
|
* Capture-phase document listeners fire before any element-level handlers,
|
|
17
17
|
* so the flag is always up-to-date when onFocus runs.
|
|
18
|
-
*/
|
|
18
|
+
*/
|
|
19
|
+
function useFocusVisible() {
|
|
19
20
|
const [isFocusVisible, setIsFocusVisible] = (0, _react.useState)(false);
|
|
20
21
|
const hadKeyboardEventRef = (0, _react.useRef)(false);
|
|
21
22
|
(0, _react.useEffect)(() => {
|
|
@@ -10,7 +10,9 @@ var _reactNativeGestureHandler = require("react-native-gesture-handler");
|
|
|
10
10
|
var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated"));
|
|
11
11
|
var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
|
|
12
12
|
var _reactUtils = require("../../utils/react-utils");
|
|
13
|
+
var _Overlay = _interopRequireDefault(require("../Overlay/Overlay"));
|
|
13
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
16
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
15
17
|
const AnimatedScrollView = _reactNativeReanimated.default.createAnimatedComponent(_reactNativeGestureHandler.ScrollView);
|
|
16
18
|
|
|
@@ -72,7 +74,9 @@ function DrawerInner({
|
|
|
72
74
|
contentContainerStyle,
|
|
73
75
|
showsVerticalScrollIndicator = false,
|
|
74
76
|
bottomInset = 80,
|
|
75
|
-
onStateChange
|
|
77
|
+
onStateChange,
|
|
78
|
+
showOverlay = false,
|
|
79
|
+
onOverlayPress
|
|
76
80
|
}, ref) {
|
|
77
81
|
const {
|
|
78
82
|
height: screenHeight
|
|
@@ -370,10 +374,15 @@ function DrawerInner({
|
|
|
370
374
|
// Per the standard react-native-gesture-handler architecture, a single
|
|
371
375
|
// GestureHandlerRootView must wrap the app root; this overlay only needs to
|
|
372
376
|
// let touches fall through where the sheet isn't.
|
|
373
|
-
(0, _jsxRuntime.
|
|
377
|
+
(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
374
378
|
style: [styles.host, style],
|
|
375
379
|
pointerEvents: "box-none",
|
|
376
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
380
|
+
children: [showOverlay ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Overlay.default, {
|
|
381
|
+
modes: modes,
|
|
382
|
+
...(onOverlayPress ? {
|
|
383
|
+
onPress: onOverlayPress
|
|
384
|
+
} : {})
|
|
385
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, {
|
|
377
386
|
gesture: gesture,
|
|
378
387
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
|
|
379
388
|
style: [styles.sheet, {
|
|
@@ -446,7 +455,7 @@ function DrawerInner({
|
|
|
446
455
|
})]
|
|
447
456
|
})
|
|
448
457
|
})
|
|
449
|
-
})
|
|
458
|
+
})]
|
|
450
459
|
})
|
|
451
460
|
);
|
|
452
461
|
}
|
|
@@ -178,18 +178,34 @@ function Dropdown({
|
|
|
178
178
|
const shadowOffsetX = parseInt((0, _figmaVariablesResolver.getVariableByName)('dropdown/shadow/offsetX', modes), 10) || 0;
|
|
179
179
|
const shadowOffsetY = parseInt((0, _figmaVariablesResolver.getVariableByName)('dropdown/shadow/offsetY', modes), 10) || 4;
|
|
180
180
|
const shadowBlur = parseInt((0, _figmaVariablesResolver.getVariableByName)('dropdown/shadow/blur', modes), 10) || 16;
|
|
181
|
-
|
|
181
|
+
|
|
182
|
+
// Shadow lives on the OUTER view, which must NOT set `overflow: 'hidden'`.
|
|
183
|
+
// On native, clipping a view also clips its shadow (iOS clips the layer
|
|
184
|
+
// shadow; Android clips the elevation shadow), so the soft popup shadow
|
|
185
|
+
// that renders fine on web (CSS box-shadow paints outside the box) would
|
|
186
|
+
// get cut off. The rounded-corner clipping is moved to a separate inner
|
|
187
|
+
// view below.
|
|
188
|
+
//
|
|
189
|
+
// The `boxShadow` style prop (RN 0.76+ / react-native-web) is used as the
|
|
190
|
+
// single source of truth so the designed color/offset/blur are honored on
|
|
191
|
+
// iOS, Android AND web. We intentionally do NOT also set the legacy
|
|
192
|
+
// `shadow*` / `elevation` props: on the new architecture (and web) those
|
|
193
|
+
// are translated into a box-shadow internally, so combining them with an
|
|
194
|
+
// explicit `boxShadow` would stack two shadows. Android's legacy
|
|
195
|
+
// `elevation` is also undesirable here because it ignores the shadow color
|
|
196
|
+
// and only paints a generic gray shadow.
|
|
197
|
+
const shadowStyle = {
|
|
182
198
|
backgroundColor: background,
|
|
199
|
+
borderRadius: radius,
|
|
200
|
+
boxShadow: `${shadowOffsetX}px ${shadowOffsetY}px ${shadowBlur}px 0px ${shadowColor}`
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
// Inner view carries the rounded corners + clipping so list/scroll content
|
|
204
|
+
// stays inside the radius without affecting the outer view's shadow.
|
|
205
|
+
const clipStyle = {
|
|
183
206
|
borderRadius: radius,
|
|
184
207
|
overflow: 'hidden',
|
|
185
|
-
|
|
186
|
-
shadowOffset: {
|
|
187
|
-
width: shadowOffsetX,
|
|
188
|
-
height: shadowOffsetY
|
|
189
|
-
},
|
|
190
|
-
shadowOpacity: 1,
|
|
191
|
-
shadowRadius: shadowBlur / 2,
|
|
192
|
-
elevation: 4
|
|
208
|
+
backgroundColor: background
|
|
193
209
|
};
|
|
194
210
|
const content = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
195
211
|
style: {
|
|
@@ -198,17 +214,20 @@ function Dropdown({
|
|
|
198
214
|
children: (0, _reactUtils.cloneChildrenWithModes)(children, modes)
|
|
199
215
|
});
|
|
200
216
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
201
|
-
style: [
|
|
217
|
+
style: [shadowStyle, style],
|
|
202
218
|
accessibilityRole: "menu",
|
|
203
219
|
accessibilityLabel: accessibilityLabel || 'Dropdown menu',
|
|
204
|
-
children:
|
|
205
|
-
style:
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
220
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
221
|
+
style: clipStyle,
|
|
222
|
+
children: maxHeight != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ScrollView, {
|
|
223
|
+
style: {
|
|
224
|
+
maxHeight
|
|
225
|
+
},
|
|
226
|
+
showsVerticalScrollIndicator: true,
|
|
227
|
+
keyboardShouldPersistTaps: "handled",
|
|
228
|
+
children: content
|
|
229
|
+
}) : content
|
|
230
|
+
})
|
|
212
231
|
});
|
|
213
232
|
}
|
|
214
233
|
var _default = exports.default = Dropdown;
|
|
@@ -537,7 +537,7 @@ function DropdownInput({
|
|
|
537
537
|
transparent: true,
|
|
538
538
|
statusBarTranslucent: true,
|
|
539
539
|
navigationBarTranslucent: true,
|
|
540
|
-
animationType: "
|
|
540
|
+
animationType: "none",
|
|
541
541
|
onRequestClose: closeMenu,
|
|
542
542
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
|
|
543
543
|
style: _reactNative.StyleSheet.absoluteFill,
|
|
@@ -189,6 +189,7 @@ function FullscreenModal({
|
|
|
189
189
|
heroMedia,
|
|
190
190
|
heroHeight = 420,
|
|
191
191
|
showClose = true,
|
|
192
|
+
closeOffsetY = 0,
|
|
192
193
|
onClose,
|
|
193
194
|
closeAccessibilityLabel = 'Close',
|
|
194
195
|
footer,
|
|
@@ -225,8 +226,8 @@ function FullscreenModal({
|
|
|
225
226
|
// SafeAreaProvider — every inset is 0, so the layout is unchanged.
|
|
226
227
|
const insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
|
|
227
228
|
const closeButtonInsetStyle = (0, _react.useMemo)(() => ({
|
|
228
|
-
top: 12 + insets.top
|
|
229
|
-
}), [insets.top]);
|
|
229
|
+
top: 12 + insets.top + closeOffsetY
|
|
230
|
+
}), [insets.top, closeOffsetY]);
|
|
230
231
|
// Extend (not replace) the footer's token bottom padding by the bottom inset
|
|
231
232
|
// so the action button never sits under the system navigation area.
|
|
232
233
|
const footerInsetStyle = (0, _react.useMemo)(() => {
|
|
@@ -252,7 +253,57 @@ function FullscreenModal({
|
|
|
252
253
|
useNativeDriver: true
|
|
253
254
|
}), [scrollY]);
|
|
254
255
|
const heroTranslateY = (0, _react.useMemo)(() => _reactNative.Animated.multiply(scrollY, -1), [scrollY]);
|
|
255
|
-
|
|
256
|
+
|
|
257
|
+
// The hero media is a full-bleed background pinned to the top of the modal.
|
|
258
|
+
// Its wrapper is absolutely positioned (`top/left/right: 0`) so it never
|
|
259
|
+
// contributes to scroll height. We measure the modal's own width so we can
|
|
260
|
+
// give the hero media a DEFINITE { width, height } box (see
|
|
261
|
+
// `processedHeroMedia` below) — relying on the media's own `width: '100%'` +
|
|
262
|
+
// `aspectRatio` is unreliable inside an indefinite-height absolute box (RN's
|
|
263
|
+
// `<Image>` falls back to its intrinsic width and leaves a gap), so we size
|
|
264
|
+
// it explicitly here instead.
|
|
265
|
+
const [containerWidth, setContainerWidth] = (0, _react.useState)(0);
|
|
266
|
+
const onContainerLayout = (0, _react.useCallback)(e => {
|
|
267
|
+
const w = e.nativeEvent.layout.width;
|
|
268
|
+
setContainerWidth(prev => prev !== w ? w : prev);
|
|
269
|
+
}, []);
|
|
270
|
+
const processedHeroMedia = (0, _react.useMemo)(() => {
|
|
271
|
+
if (!heroMedia) return null;
|
|
272
|
+
// Defer rendering the hero until we have measured the modal width. This
|
|
273
|
+
// matters for image sharpness: React Native decodes a bitmap once, on the
|
|
274
|
+
// first render, and caches it. If we rendered the media before knowing the
|
|
275
|
+
// final box, that first decode would be sized/sampled for the wrong box and
|
|
276
|
+
// the cached (downsampled) bitmap would then just be scaled up — blurry.
|
|
277
|
+
// Rendering only once the explicit { width, height } box is known means the
|
|
278
|
+
// very first decode is already full-resolution for the correct box.
|
|
279
|
+
if (containerWidth <= 0) return null;
|
|
280
|
+
const withModes = (0, _reactUtils.cloneChildrenWithModes)(heroMedia, modes, FULLSCREEN_MODAL_FORCED_MODES);
|
|
281
|
+
|
|
282
|
+
// Force the hero to fill the modal width edge to edge, top-aligned, with the
|
|
283
|
+
// height derived from the media's native aspect ratio.
|
|
284
|
+
//
|
|
285
|
+
// Why we inject explicit width/height instead of relying on the media's own
|
|
286
|
+
// `width: '100%'` + `aspectRatio`: the hero wrapper is absolutely positioned
|
|
287
|
+
// with an INDEFINITE height, and in that layout context React Native's
|
|
288
|
+
// `<Image>` falls back to its INTRINSIC width (so a 361px-wide asset renders
|
|
289
|
+
// 361px wide and leaves a gap on the right) rather than stretching to the
|
|
290
|
+
// parent. By computing `height = containerWidth / ratio` here and passing a
|
|
291
|
+
// DEFINITE { width, height } box (which makes `<Image>` skip aspectRatio and
|
|
292
|
+
// cover-fit into that exact box), the hero always fills the width with the
|
|
293
|
+
// correct ratio-derived height.
|
|
294
|
+
return _react.default.Children.map(withModes, child => {
|
|
295
|
+
if (! /*#__PURE__*/_react.default.isValidElement(child)) return child;
|
|
296
|
+
const props = child.props;
|
|
297
|
+
const ratio = typeof props.ratio === 'number' && props.ratio > 0 ? props.ratio : undefined;
|
|
298
|
+
// Only size media that exposes a numeric `ratio` and hasn't already been
|
|
299
|
+
// given an explicit box by the caller.
|
|
300
|
+
if (ratio == null || props.width != null || props.height != null) return child;
|
|
301
|
+
return /*#__PURE__*/_react.default.cloneElement(child, {
|
|
302
|
+
width: containerWidth,
|
|
303
|
+
height: containerWidth / ratio
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
}, [heroMedia, modes, containerWidth]);
|
|
256
307
|
const processedChildren = (0, _react.useMemo)(() => children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [children, modes]);
|
|
257
308
|
|
|
258
309
|
// The hero text region always reserves `heroHeight` and anchors its content
|
|
@@ -305,8 +356,18 @@ function FullscreenModal({
|
|
|
305
356
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
306
357
|
style: [rootStyle, style],
|
|
307
358
|
testID: testID,
|
|
359
|
+
onLayout: onContainerLayout,
|
|
308
360
|
children: [processedHeroMedia ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
|
|
309
|
-
style: [heroBackgroundStyle,
|
|
361
|
+
style: [heroBackgroundStyle,
|
|
362
|
+
// Give the absolute wrapper a DEFINITE width (the measured modal
|
|
363
|
+
// width) so the media's `width: '100%'` + `aspectRatio` resolves to
|
|
364
|
+
// a true edge-to-edge fill with a ratio-derived height, top-aligned.
|
|
365
|
+
// Before the first layout pass `containerWidth` is 0 — fall back to
|
|
366
|
+
// stretching via `left/right: 0` so there is no flash of a mis-sized
|
|
367
|
+
// image.
|
|
368
|
+
containerWidth > 0 ? {
|
|
369
|
+
width: containerWidth
|
|
370
|
+
} : null, {
|
|
310
371
|
transform: [{
|
|
311
372
|
translateY: heroTranslateY
|
|
312
373
|
}]
|
|
@@ -43,6 +43,7 @@ function Image({
|
|
|
43
43
|
imageSource,
|
|
44
44
|
ratio = DEFAULT_RATIO,
|
|
45
45
|
resizeMode = 'cover',
|
|
46
|
+
resizeMethod,
|
|
46
47
|
width,
|
|
47
48
|
height,
|
|
48
49
|
borderRadius,
|
|
@@ -53,11 +54,15 @@ function Image({
|
|
|
53
54
|
loading
|
|
54
55
|
}) {
|
|
55
56
|
const source = (0, _react.useMemo)(() => normalizeSource(imageSource), [imageSource]);
|
|
57
|
+
|
|
58
|
+
// Explicit { width, height } means a "fill an exact box" layout — typically a
|
|
59
|
+
// full-bleed hero/background where the asset is high-res and sharpness
|
|
60
|
+
// matters most. There, default to `'none'` (full-resolution, no pre-decode
|
|
61
|
+
// downsample) so detail is never thrown away. Aspect-ratio images keep the
|
|
62
|
+
// memory-safe `'scale'` default. A caller-supplied `resizeMethod` always wins.
|
|
63
|
+
const isExplicitBox = width != null && height != null;
|
|
64
|
+
const effectiveResizeMethod = resizeMethod ?? (isExplicitBox ? 'none' : 'scale');
|
|
56
65
|
const layoutStyle = (0, _react.useMemo)(() => {
|
|
57
|
-
// If the caller has fully specified width AND height, they're doing a
|
|
58
|
-
// non-aspect layout (e.g. "fill the parent") — respect that and skip
|
|
59
|
-
// `aspectRatio` so it doesn't conflict.
|
|
60
|
-
const isExplicitBox = width != null && height != null;
|
|
61
66
|
const s = {
|
|
62
67
|
width: width ?? '100%',
|
|
63
68
|
...(isExplicitBox ? {
|
|
@@ -71,7 +76,7 @@ function Image({
|
|
|
71
76
|
};
|
|
72
77
|
if (borderRadius != null) s.borderRadius = borderRadius;
|
|
73
78
|
return s;
|
|
74
|
-
}, [ratio, width, height, borderRadius]);
|
|
79
|
+
}, [ratio, width, height, borderRadius, isExplicitBox]);
|
|
75
80
|
const {
|
|
76
81
|
active: groupActive
|
|
77
82
|
} = (0, _SkeletonGroup.useSkeleton)();
|
|
@@ -102,6 +107,7 @@ function Image({
|
|
|
102
107
|
source: source,
|
|
103
108
|
style: [layoutStyle, style],
|
|
104
109
|
resizeMode: resizeMode,
|
|
110
|
+
resizeMethod: effectiveResizeMethod,
|
|
105
111
|
accessibilityLabel: accessibilityLabel,
|
|
106
112
|
accessibilityElementsHidden: accessibilityElementsHidden,
|
|
107
113
|
importantForAccessibility: importantForAccessibility
|
|
@@ -11,17 +11,6 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
11
11
|
/** Props we forward to the underlying native Lottie view. */
|
|
12
12
|
|
|
13
13
|
const INSTALL_HINT = 'LottiePlayer requires lottie-react-native in your app.\n' + ' npm install lottie-react-native\n' + ' cd ios && pod install';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Metro resolves `require('lottie-react-native')` at bundle time even inside
|
|
17
|
-
* try/catch, which breaks apps that import `jfs-components` without having
|
|
18
|
-
* the optional peer installed. Splitting the module id into a runtime string
|
|
19
|
-
* keeps Metro from statically linking it — the native module is loaded only
|
|
20
|
-
* when present in the consumer's node_modules.
|
|
21
|
-
*/
|
|
22
|
-
function resolveNativeLottieModuleName() {
|
|
23
|
-
return ['lottie', '-react', '-native'].join('');
|
|
24
|
-
}
|
|
25
14
|
function LottieUnavailableView({
|
|
26
15
|
style
|
|
27
16
|
}) {
|
|
@@ -65,8 +54,14 @@ let cachedView;
|
|
|
65
54
|
function getNativeLottieView() {
|
|
66
55
|
if (cachedView !== undefined) return cachedView;
|
|
67
56
|
try {
|
|
68
|
-
|
|
69
|
-
|
|
57
|
+
// Static require so Metro resolves the module by its build-time numeric id.
|
|
58
|
+
// A runtime-constructed string path is NOT resolvable by Metro's `require`
|
|
59
|
+
// (it indexes modules by number, not path), so it would always throw and
|
|
60
|
+
// fall back to the install hint even when the package is installed. The
|
|
61
|
+
// dependency stays an *optional* peer: apps that use LottiePlayer install
|
|
62
|
+
// it; apps that don't simply never import this module.
|
|
63
|
+
const mod = require('lottie-react-native');
|
|
64
|
+
cachedView = mod.default ?? mod.LottieView ?? LottieUnavailable;
|
|
70
65
|
} catch {
|
|
71
66
|
cachedView = LottieUnavailable;
|
|
72
67
|
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactNative = require("react-native");
|
|
9
|
+
var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
|
|
10
|
+
var _JFSThemeProvider = require("../../design-tokens/JFSThemeProvider");
|
|
11
|
+
var _reactUtils = require("../../utils/react-utils");
|
|
12
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
14
|
+
const PLACEMENT_STYLE = {
|
|
15
|
+
center: {
|
|
16
|
+
justifyContent: 'center',
|
|
17
|
+
alignItems: 'center'
|
|
18
|
+
},
|
|
19
|
+
top: {
|
|
20
|
+
justifyContent: 'flex-start',
|
|
21
|
+
alignItems: 'stretch'
|
|
22
|
+
},
|
|
23
|
+
bottom: {
|
|
24
|
+
justifyContent: 'flex-end',
|
|
25
|
+
alignItems: 'stretch'
|
|
26
|
+
},
|
|
27
|
+
stretch: {
|
|
28
|
+
justifyContent: 'center',
|
|
29
|
+
alignItems: 'stretch'
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Overlay — a token-driven scrim that dims content behind an overlaid surface.
|
|
35
|
+
*
|
|
36
|
+
* Renders a semi-transparent backdrop using the `overlay/background` design
|
|
37
|
+
* token and optionally hosts content (e.g. a modal, sheet or dialog) on top.
|
|
38
|
+
* Pair it with a `Modal` for true full-screen overlays, or drop it inside any
|
|
39
|
+
* relatively-positioned container to dim just that region.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```tsx
|
|
43
|
+
* <Overlay modes={modes} onPress={close}>
|
|
44
|
+
* <Card>Dialog content</Card>
|
|
45
|
+
* </Overlay>
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
function Overlay({
|
|
49
|
+
children,
|
|
50
|
+
contentPlacement = 'center',
|
|
51
|
+
onPress,
|
|
52
|
+
fill = true,
|
|
53
|
+
modes: propModes = _reactUtils.EMPTY_MODES,
|
|
54
|
+
style,
|
|
55
|
+
...rest
|
|
56
|
+
}) {
|
|
57
|
+
const {
|
|
58
|
+
modes: globalModes
|
|
59
|
+
} = (0, _JFSThemeProvider.useTokens)();
|
|
60
|
+
const modes = (0, _react.useMemo)(() => ({
|
|
61
|
+
...globalModes,
|
|
62
|
+
...propModes
|
|
63
|
+
}), [globalModes, propModes]);
|
|
64
|
+
const {
|
|
65
|
+
containerStyle,
|
|
66
|
+
processedChildren
|
|
67
|
+
} = (0, _react.useMemo)(() => {
|
|
68
|
+
const backgroundColor = (0, _figmaVariablesResolver.getVariableByName)('overlay/background', modes) ?? 'rgba(0, 0, 0, 0.7)';
|
|
69
|
+
const container = {
|
|
70
|
+
backgroundColor,
|
|
71
|
+
overflow: 'hidden',
|
|
72
|
+
...PLACEMENT_STYLE[contentPlacement]
|
|
73
|
+
};
|
|
74
|
+
const processed = children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes) : null;
|
|
75
|
+
return {
|
|
76
|
+
containerStyle: container,
|
|
77
|
+
processedChildren: processed
|
|
78
|
+
};
|
|
79
|
+
}, [children, modes, contentPlacement]);
|
|
80
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
81
|
+
style: [fill && _reactNative.StyleSheet.absoluteFill, containerStyle, style],
|
|
82
|
+
accessibilityViewIsModal: true,
|
|
83
|
+
...rest,
|
|
84
|
+
children: [onPress ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
|
|
85
|
+
style: _reactNative.StyleSheet.absoluteFill,
|
|
86
|
+
onPress: onPress,
|
|
87
|
+
accessibilityRole: "button",
|
|
88
|
+
accessibilityLabel: "Dismiss overlay"
|
|
89
|
+
}) : null, processedChildren]
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
var _default = exports.default = /*#__PURE__*/_react.default.memo(Overlay);
|
|
@@ -11,7 +11,8 @@ var _reactUtils = require("../../utils/react-utils");
|
|
|
11
11
|
var _Icon = _interopRequireDefault(require("../../icons/Icon"));
|
|
12
12
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
13
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
-
/** Figma grid: label column 1.8fr, each plan column 1fr. */
|
|
14
|
+
/** Figma grid: label column 1.8fr, each plan column 1fr. */
|
|
15
|
+
const LABEL_COLUMN_FR = 1.8;
|
|
15
16
|
const PLAN_COLUMN_FR = 1;
|
|
16
17
|
|
|
17
18
|
/**
|