jfs-components 0.1.0 → 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 +8 -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/DropdownInput/DropdownInput.js +1 -1
- package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +62 -2
- 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/TextInput/TextInput.js +2 -1
- package/lib/commonjs/components/docs/modeControls.js +116 -0
- package/lib/commonjs/components/index.js +7 -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/DropdownInput/DropdownInput.js +1 -1
- package/lib/module/components/FullscreenModal/FullscreenModal.js +64 -5
- 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/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 +1 -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 +2 -1
- package/lib/typescript/src/components/Gauge/Gauge.d.ts +2 -1
- package/lib/typescript/src/components/HStack/HStack.d.ts +2 -1
- package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +2 -1
- package/lib/typescript/src/components/Icon/Icon.d.ts +2 -1
- package/lib/typescript/src/components/IconButton/IconButton.d.ts +2 -1
- package/lib/typescript/src/components/IconCapsule/IconCapsule.d.ts +2 -1
- package/lib/typescript/src/components/Image/Image.d.ts +17 -1
- package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +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 +2 -1
- 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 +1 -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 +4 -3
- 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 +68 -10
- package/src/components/Gauge/Gauge.tsx +2 -1
- package/src/components/HStack/HStack.tsx +2 -1
- package/src/components/HoldingsCard/HoldingsCard.tsx +2 -1
- package/src/components/Icon/Icon.tsx +3 -2
- package/src/components/IconButton/IconButton.tsx +3 -2
- package/src/components/IconCapsule/IconCapsule.tsx +3 -2
- package/src/components/Image/Image.tsx +29 -5
- package/src/components/InputSearch/InputSearch.tsx +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 +2 -1
- 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 +1 -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,14 @@ 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
|
+
|
|
7
15
|
## [0.1.0] - 2026-06-08
|
|
8
16
|
|
|
9
17
|
- Added `TestimonialsCard` — compact avatar + title + body card for testimonial carousels.
|
|
@@ -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
|
}
|
|
@@ -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,
|
|
@@ -253,7 +253,57 @@ function FullscreenModal({
|
|
|
253
253
|
useNativeDriver: true
|
|
254
254
|
}), [scrollY]);
|
|
255
255
|
const heroTranslateY = (0, _react.useMemo)(() => _reactNative.Animated.multiply(scrollY, -1), [scrollY]);
|
|
256
|
-
|
|
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]);
|
|
257
307
|
const processedChildren = (0, _react.useMemo)(() => children ? (0, _reactUtils.cloneChildrenWithModes)(children, modes, FULLSCREEN_MODAL_FORCED_MODES) : null, [children, modes]);
|
|
258
308
|
|
|
259
309
|
// The hero text region always reserves `heroHeight` and anchors its content
|
|
@@ -306,8 +356,18 @@ function FullscreenModal({
|
|
|
306
356
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
307
357
|
style: [rootStyle, style],
|
|
308
358
|
testID: testID,
|
|
359
|
+
onLayout: onContainerLayout,
|
|
309
360
|
children: [processedHeroMedia ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Animated.View, {
|
|
310
|
-
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, {
|
|
311
371
|
transform: [{
|
|
312
372
|
translateY: heroTranslateY
|
|
313
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
|
/**
|
|
@@ -43,7 +43,8 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
43
43
|
/**
|
|
44
44
|
* Helper function to convert a color to a more transparent version for placeholder text.
|
|
45
45
|
* Takes a color string (hex, rgb, rgba) and returns it with reduced opacity.
|
|
46
|
-
*/
|
|
46
|
+
*/
|
|
47
|
+
const IS_WEB = _reactNative.Platform.OS === 'web';
|
|
47
48
|
function makePlaceholderColor(color, opacity = 0.5) {
|
|
48
49
|
if (!color || typeof color !== 'string') {
|
|
49
50
|
return color || '';
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.modeArgTypes = modeArgTypes;
|
|
7
|
+
exports.modeDecorator = modeDecorator;
|
|
8
|
+
exports.withModeControls = withModeControls;
|
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
|
+
var _figmaModes = require("../../design-tokens/figma-modes.generated");
|
|
11
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
/**
|
|
14
|
+
* Storybook helpers that turn a component's design-token collections into real,
|
|
15
|
+
* per-collection `select` controls and merge the picked values into the `modes`
|
|
16
|
+
* prop — so authors get the same enum-driven DX in the Storybook Controls panel
|
|
17
|
+
* that the typed `modes` prop gives them in code.
|
|
18
|
+
*
|
|
19
|
+
* Fully backward compatible:
|
|
20
|
+
* - If nothing is picked, `modes` is left exactly as the story provided it.
|
|
21
|
+
* - Any `modes` value the story already sets WINS over a control selection,
|
|
22
|
+
* so existing stories render identically until someone touches a control.
|
|
23
|
+
* - The synthetic control args are stripped before they reach the component,
|
|
24
|
+
* so they never leak in as unknown props.
|
|
25
|
+
*/const UNSET = '(default)';
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the list of collections to expose. Accepts a component name (looked up
|
|
28
|
+
* in the generated map), an explicit list, or both (merged + de-duplicated).
|
|
29
|
+
*/
|
|
30
|
+
function resolveCollections(componentOrCollections, extra = []) {
|
|
31
|
+
const fromName = typeof componentOrCollections === 'string' ? _figmaModes.FIGMA_COMPONENT_MODES[componentOrCollections] || [] : componentOrCollections;
|
|
32
|
+
const merged = new Set([...fromName, ...extra]);
|
|
33
|
+
// Only keep collections that actually have more than one mode to choose from.
|
|
34
|
+
return [...merged].filter(name => {
|
|
35
|
+
const modes = _figmaModes.FIGMA_MODES[name];
|
|
36
|
+
return Array.isArray(modes) && modes.length > 1;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Build `argTypes` entries — one `select` per multi-mode collection, grouped
|
|
42
|
+
* under a "Modes" category. Spread the result into your story `meta.argTypes`.
|
|
43
|
+
*/
|
|
44
|
+
function modeArgTypes(componentOrCollections, extra = []) {
|
|
45
|
+
const collections = resolveCollections(componentOrCollections, extra);
|
|
46
|
+
const argTypes = {};
|
|
47
|
+
for (const name of collections) {
|
|
48
|
+
const modes = _figmaModes.FIGMA_MODES[name];
|
|
49
|
+
argTypes[name] = {
|
|
50
|
+
name,
|
|
51
|
+
description: `\`${name}\` collection mode`,
|
|
52
|
+
control: {
|
|
53
|
+
type: 'select'
|
|
54
|
+
},
|
|
55
|
+
options: [UNSET, ...modes],
|
|
56
|
+
table: {
|
|
57
|
+
category: 'Modes'
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return argTypes;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A decorator that merges the picked collection modes into `args.modes` and
|
|
66
|
+
* strips the synthetic control args before they reach the component.
|
|
67
|
+
*/
|
|
68
|
+
function modeDecorator(componentOrCollections, extra = []) {
|
|
69
|
+
const collections = resolveCollections(componentOrCollections, extra);
|
|
70
|
+
return function ModeControlsDecorator(Story, context) {
|
|
71
|
+
const args = context?.args || {};
|
|
72
|
+
const picked = {};
|
|
73
|
+
// Start from the real story args so nothing is dropped. Passing only the
|
|
74
|
+
// synthetic keys here would REPLACE the story args in this Storybook
|
|
75
|
+
// renderer, wiping out real props (e.g. `series`, slot nodes) and leaving
|
|
76
|
+
// the component to render empty/crash.
|
|
77
|
+
const override = {
|
|
78
|
+
...args
|
|
79
|
+
};
|
|
80
|
+
for (const name of collections) {
|
|
81
|
+
const value = args[name];
|
|
82
|
+
if (value && value !== UNSET) {
|
|
83
|
+
picked[name] = value;
|
|
84
|
+
}
|
|
85
|
+
// Neutralise the synthetic arg so it is never spread onto the component.
|
|
86
|
+
override[name] = undefined;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Explicit story-provided modes win over control selections.
|
|
90
|
+
override.modes = {
|
|
91
|
+
...picked,
|
|
92
|
+
...(args.modes || {})
|
|
93
|
+
};
|
|
94
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(Story, {
|
|
95
|
+
args: override
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Convenience: returns `{ argTypes, decorators }` to spread directly into a
|
|
102
|
+
* story `meta`.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* const meta = {
|
|
106
|
+
* title: 'Components/Button',
|
|
107
|
+
* component: Button,
|
|
108
|
+
* ...withModeControls('Button'),
|
|
109
|
+
* }
|
|
110
|
+
*/
|
|
111
|
+
function withModeControls(componentOrCollections, extra = []) {
|
|
112
|
+
return {
|
|
113
|
+
argTypes: modeArgTypes(componentOrCollections, extra),
|
|
114
|
+
decorators: [modeDecorator(componentOrCollections, extra)]
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -513,6 +513,12 @@ Object.defineProperty(exports, "OTPResend", {
|
|
|
513
513
|
return _OTP.OTPResend;
|
|
514
514
|
}
|
|
515
515
|
});
|
|
516
|
+
Object.defineProperty(exports, "Overlay", {
|
|
517
|
+
enumerable: true,
|
|
518
|
+
get: function () {
|
|
519
|
+
return _Overlay.default;
|
|
520
|
+
}
|
|
521
|
+
});
|
|
516
522
|
Object.defineProperty(exports, "PageHero", {
|
|
517
523
|
enumerable: true,
|
|
518
524
|
get: function () {
|
|
@@ -924,6 +930,7 @@ var _NoteInput = _interopRequireDefault(require("./NoteInput/NoteInput"));
|
|
|
924
930
|
var _Nudge = _interopRequireDefault(require("./Nudge/Nudge"));
|
|
925
931
|
var _NavArrow = _interopRequireDefault(require("./NavArrow/NavArrow"));
|
|
926
932
|
var _Numpad = _interopRequireDefault(require("./Numpad/Numpad"));
|
|
933
|
+
var _Overlay = _interopRequireDefault(require("./Overlay/Overlay"));
|
|
927
934
|
var _Title = _interopRequireDefault(require("./Title/Title"));
|
|
928
935
|
var _Screen = _interopRequireDefault(require("./Screen/Screen"));
|
|
929
936
|
var _Section = _interopRequireDefault(require("./Section/Section"));
|
|
@@ -43,7 +43,7 @@ const JFSThemeProvider = ({
|
|
|
43
43
|
* Hook to access the current design token context.
|
|
44
44
|
*
|
|
45
45
|
* returns {
|
|
46
|
-
* modes:
|
|
46
|
+
* modes: Modes - The current active modes
|
|
47
47
|
* getVariable: (name: string) => any - Function to resolve a token value
|
|
48
48
|
* }
|
|
49
49
|
*/
|