jfs-components 0.1.2 → 0.1.12
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 +45 -0
- package/lib/commonjs/components/Accordion/Accordion.js +2 -1
- package/lib/commonjs/components/AccordionCheckbox/AccordionCheckbox.js +4 -3
- package/lib/commonjs/components/AccountCard/AccountCard.js +4 -3
- package/lib/commonjs/components/AllocationComparisonChart/AllocationComparisonChart.js +9 -6
- package/lib/commonjs/components/AmountInput/AmountInput.js +8 -5
- package/lib/commonjs/components/AreaLineChart/AreaLineChart.js +11 -7
- package/lib/commonjs/components/Badge/Badge.js +47 -8
- package/lib/commonjs/components/BenefitCard/BenefitCard.js +231 -0
- package/lib/commonjs/components/BrandChip/BrandChip.js +3 -3
- package/lib/commonjs/components/Button/Button.js +2 -1
- package/lib/commonjs/components/CardAdvisory/CardAdvisory.js +2 -1
- package/lib/commonjs/components/CardBankAccount/CardBankAccount.js +3 -2
- package/lib/commonjs/components/CardCTA/CardCTA.js +197 -27
- package/lib/commonjs/components/CardInsight/CardInsight.js +5 -1
- package/lib/commonjs/components/CcCard/CcCard.js +470 -0
- package/lib/commonjs/components/Checkbox/Checkbox.js +4 -3
- package/lib/commonjs/components/CheckboxItem/CheckboxItem.js +4 -3
- package/lib/commonjs/components/CircularProgressBar/CircularProgressBar.js +7 -3
- package/lib/commonjs/components/CircularProgressBarDoted/CircularProgressBarDoted.js +3 -2
- package/lib/commonjs/components/CircularRating/CircularRating.js +2 -1
- package/lib/commonjs/components/ClusterBubble/ClusterBubble.js +3 -2
- package/lib/commonjs/components/CompareTable/CompareTable.js +401 -0
- package/lib/commonjs/components/ComparisonBar/ComparisonBar.js +266 -0
- package/lib/commonjs/components/CoverageBarComparison/CoverageBarComparison.js +3 -2
- package/lib/commonjs/components/DonutChart/DonutChart.js +4 -3
- package/lib/commonjs/components/Dropdown/Dropdown.js +3 -2
- package/lib/commonjs/components/DropdownInput/DropdownInput.js +38 -5
- package/lib/commonjs/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
- package/lib/commonjs/components/FormField/FormField.js +45 -4
- package/lib/commonjs/components/Gauge/Gauge.js +1 -1
- package/lib/commonjs/components/HoldingsCard/HoldingsCard.js +3 -2
- package/lib/commonjs/components/InputSearch/InputSearch.js +6 -4
- package/lib/commonjs/components/InstitutionBadge/InstitutionBadge.js +2 -1
- package/lib/commonjs/components/ListGroup/ListGroup.js +2 -1
- package/lib/commonjs/components/ListItem/ListItem.js +3 -2
- package/lib/commonjs/components/MediaCard/MediaCard.js +4 -2
- package/lib/commonjs/components/MetricLegendItem/MetricLegendItem.js +3 -2
- package/lib/commonjs/components/MonthlyStatusGrid/MonthlyStatusGrid.js +6 -3
- package/lib/commonjs/components/NoteInput/NoteInput.js +6 -5
- package/lib/commonjs/components/PdpCcCard/PdpCcCard.js +273 -0
- package/lib/commonjs/components/PoweredByLabel/PoweredByLabel.js +3 -2
- package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +427 -0
- package/lib/commonjs/components/ProductOverview/ProductOverview.js +4 -3
- package/lib/commonjs/components/ProgressBadge/ProgressBadge.js +2 -2
- package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +162 -0
- package/lib/commonjs/components/Radio/Radio.js +5 -5
- package/lib/commonjs/components/Section/Section.js +3 -2
- package/lib/commonjs/components/Slider/Slider.js +474 -0
- package/lib/commonjs/components/Stack/Stack.js +86 -0
- package/lib/commonjs/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
- package/lib/commonjs/components/SummaryTile/SummaryTile.js +3 -2
- package/lib/commonjs/components/Table/Table.js +324 -0
- package/lib/commonjs/components/Text/Text.js +2 -1
- package/lib/commonjs/components/TextInput/TextInput.js +22 -9
- package/lib/commonjs/components/TextSegment/TextSegment.js +119 -0
- package/lib/commonjs/components/ThreadHero/ThreadHero.js +4 -5
- package/lib/commonjs/components/Title/Title.js +2 -1
- package/lib/commonjs/components/Toast/Toast.js +3 -2
- package/lib/commonjs/components/TransactionBubble/TransactionBubble.js +2 -1
- package/lib/commonjs/components/TransactionStatus/TransactionStatus.js +3 -2
- package/lib/commonjs/components/UpiHandle/UpiHandle.js +2 -2
- package/lib/commonjs/components/index.js +107 -0
- package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/commonjs/design-tokens/figma-modes.generated.js +39 -9
- package/lib/commonjs/icons/registry.js +1 -1
- package/lib/commonjs/utils/GlassFill/GlassFill.js +271 -0
- package/lib/commonjs/utils/GlassFill/GlassFill.web.js +120 -0
- package/lib/commonjs/utils/react-utils.js +78 -0
- package/lib/commonjs/utils/web-platform-utils.js +59 -0
- package/lib/module/components/Accordion/Accordion.js +3 -2
- package/lib/module/components/AccordionCheckbox/AccordionCheckbox.js +5 -4
- package/lib/module/components/AccountCard/AccountCard.js +5 -4
- package/lib/module/components/AllocationComparisonChart/AllocationComparisonChart.js +10 -7
- package/lib/module/components/AmountInput/AmountInput.js +6 -4
- package/lib/module/components/AreaLineChart/AreaLineChart.js +12 -8
- package/lib/module/components/Badge/Badge.js +49 -10
- package/lib/module/components/BenefitCard/BenefitCard.js +225 -0
- package/lib/module/components/BrandChip/BrandChip.js +4 -4
- package/lib/module/components/Button/Button.js +3 -2
- package/lib/module/components/CardAdvisory/CardAdvisory.js +3 -2
- package/lib/module/components/CardBankAccount/CardBankAccount.js +4 -3
- package/lib/module/components/CardCTA/CardCTA.js +198 -28
- package/lib/module/components/CardInsight/CardInsight.js +5 -1
- package/lib/module/components/CcCard/CcCard.js +464 -0
- package/lib/module/components/Checkbox/Checkbox.js +5 -4
- package/lib/module/components/CheckboxItem/CheckboxItem.js +5 -4
- package/lib/module/components/CircularProgressBar/CircularProgressBar.js +8 -4
- package/lib/module/components/CircularProgressBarDoted/CircularProgressBarDoted.js +4 -3
- package/lib/module/components/CircularRating/CircularRating.js +3 -2
- package/lib/module/components/ClusterBubble/ClusterBubble.js +4 -3
- package/lib/module/components/CompareTable/CompareTable.js +396 -0
- package/lib/module/components/ComparisonBar/ComparisonBar.js +260 -0
- package/lib/module/components/CoverageBarComparison/CoverageBarComparison.js +4 -3
- package/lib/module/components/DonutChart/DonutChart.js +5 -4
- package/lib/module/components/Dropdown/Dropdown.js +4 -3
- package/lib/module/components/DropdownInput/DropdownInput.js +40 -7
- package/lib/module/components/ExpandableCheckbox/ExpandableCheckbox.js +2 -1
- package/lib/module/components/FormField/FormField.js +48 -7
- package/lib/module/components/Gauge/Gauge.js +1 -1
- package/lib/module/components/HoldingsCard/HoldingsCard.js +4 -3
- package/lib/module/components/InputSearch/InputSearch.js +6 -4
- package/lib/module/components/InstitutionBadge/InstitutionBadge.js +3 -2
- package/lib/module/components/ListGroup/ListGroup.js +3 -2
- package/lib/module/components/ListItem/ListItem.js +4 -3
- package/lib/module/components/MediaCard/MediaCard.js +4 -2
- package/lib/module/components/MetricLegendItem/MetricLegendItem.js +4 -3
- package/lib/module/components/MonthlyStatusGrid/MonthlyStatusGrid.js +7 -4
- package/lib/module/components/NoteInput/NoteInput.js +7 -6
- package/lib/module/components/PdpCcCard/PdpCcCard.js +267 -0
- package/lib/module/components/PoweredByLabel/PoweredByLabel.js +4 -3
- package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +421 -0
- package/lib/module/components/ProductOverview/ProductOverview.js +5 -4
- package/lib/module/components/ProgressBadge/ProgressBadge.js +3 -3
- package/lib/module/components/ProjectionMarker/ProjectionMarker.js +157 -0
- package/lib/module/components/Radio/Radio.js +5 -4
- package/lib/module/components/Section/Section.js +4 -3
- package/lib/module/components/Slider/Slider.js +469 -0
- package/lib/module/components/Stack/Stack.js +81 -0
- package/lib/module/components/SuggestiveSearch/SuggestiveSearch.js +10 -1
- package/lib/module/components/SummaryTile/SummaryTile.js +4 -3
- package/lib/module/components/Table/Table.js +315 -0
- package/lib/module/components/Text/Text.js +3 -2
- package/lib/module/components/TextInput/TextInput.js +24 -11
- package/lib/module/components/TextSegment/TextSegment.js +114 -0
- package/lib/module/components/ThreadHero/ThreadHero.js +5 -6
- package/lib/module/components/Title/Title.js +3 -2
- package/lib/module/components/Toast/Toast.js +4 -3
- package/lib/module/components/TransactionBubble/TransactionBubble.js +3 -2
- package/lib/module/components/TransactionStatus/TransactionStatus.js +4 -3
- package/lib/module/components/UpiHandle/UpiHandle.js +3 -3
- package/lib/module/components/index.js +11 -0
- package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
- package/lib/module/design-tokens/figma-modes.generated.js +39 -9
- package/lib/module/icons/registry.js +1 -1
- package/lib/module/utils/GlassFill/GlassFill.js +265 -0
- package/lib/module/utils/GlassFill/GlassFill.web.js +115 -0
- package/lib/module/utils/react-utils.js +75 -0
- package/lib/module/utils/web-platform-utils.js +58 -0
- package/lib/typescript/src/components/Accordion/Accordion.d.ts +7 -1
- package/lib/typescript/src/components/AccordionCheckbox/AccordionCheckbox.d.ts +7 -1
- package/lib/typescript/src/components/AccountCard/AccountCard.d.ts +7 -1
- package/lib/typescript/src/components/AllocationComparisonChart/AllocationComparisonChart.d.ts +7 -1
- package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +3 -2
- package/lib/typescript/src/components/AreaLineChart/AreaLineChart.d.ts +8 -1
- package/lib/typescript/src/components/Badge/Badge.d.ts +32 -2
- package/lib/typescript/src/components/BenefitCard/BenefitCard.d.ts +93 -0
- package/lib/typescript/src/components/BrandChip/BrandChip.d.ts +7 -1
- package/lib/typescript/src/components/Button/Button.d.ts +7 -1
- package/lib/typescript/src/components/CardAdvisory/CardAdvisory.d.ts +7 -1
- package/lib/typescript/src/components/CardBankAccount/CardBankAccount.d.ts +7 -1
- package/lib/typescript/src/components/CardCTA/CardCTA.d.ts +27 -5
- package/lib/typescript/src/components/CcCard/CcCard.d.ts +137 -0
- package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +3 -2
- package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -2
- package/lib/typescript/src/components/CircularProgressBar/CircularProgressBar.d.ts +7 -1
- package/lib/typescript/src/components/CircularProgressBarDoted/CircularProgressBarDoted.d.ts +7 -1
- package/lib/typescript/src/components/CircularRating/CircularRating.d.ts +7 -1
- package/lib/typescript/src/components/ClusterBubble/ClusterBubble.d.ts +7 -1
- package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +94 -0
- package/lib/typescript/src/components/ComparisonBar/ComparisonBar.d.ts +118 -0
- package/lib/typescript/src/components/CoverageBarComparison/CoverageBarComparison.d.ts +7 -1
- package/lib/typescript/src/components/DonutChart/DonutChart.d.ts +7 -1
- package/lib/typescript/src/components/Dropdown/Dropdown.d.ts +7 -1
- package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +26 -1
- package/lib/typescript/src/components/ExpandableCheckbox/ExpandableCheckbox.d.ts +7 -1
- package/lib/typescript/src/components/FormField/FormField.d.ts +2 -2
- package/lib/typescript/src/components/HoldingsCard/HoldingsCard.d.ts +7 -1
- package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +23 -2
- package/lib/typescript/src/components/InstitutionBadge/InstitutionBadge.d.ts +7 -1
- package/lib/typescript/src/components/ListGroup/ListGroup.d.ts +7 -1
- package/lib/typescript/src/components/ListItem/ListItem.d.ts +7 -1
- package/lib/typescript/src/components/MetricLegendItem/MetricLegendItem.d.ts +7 -1
- package/lib/typescript/src/components/MonthlyStatusGrid/MonthlyStatusGrid.d.ts +14 -2
- package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +19 -2
- package/lib/typescript/src/components/PdpCcCard/PdpCcCard.d.ts +84 -0
- package/lib/typescript/src/components/PoweredByLabel/PoweredByLabel.d.ts +7 -1
- package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +87 -0
- package/lib/typescript/src/components/ProductOverview/ProductOverview.d.ts +7 -1
- package/lib/typescript/src/components/ProgressBadge/ProgressBadge.d.ts +7 -1
- package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +88 -0
- package/lib/typescript/src/components/Radio/Radio.d.ts +3 -2
- package/lib/typescript/src/components/RadioButton/RadioButton.d.ts +2 -2
- package/lib/typescript/src/components/Section/Section.d.ts +7 -1
- package/lib/typescript/src/components/Slider/Slider.d.ts +105 -0
- package/lib/typescript/src/components/Stack/Stack.d.ts +81 -0
- package/lib/typescript/src/components/SummaryTile/SummaryTile.d.ts +7 -1
- package/lib/typescript/src/components/Table/Table.d.ts +139 -0
- package/lib/typescript/src/components/Text/Text.d.ts +7 -1
- package/lib/typescript/src/components/TextInput/TextInput.d.ts +9 -29
- package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +106 -0
- package/lib/typescript/src/components/ThreadHero/ThreadHero.d.ts +7 -1
- package/lib/typescript/src/components/Title/Title.d.ts +7 -1
- package/lib/typescript/src/components/Toast/Toast.d.ts +7 -1
- package/lib/typescript/src/components/TransactionBubble/TransactionBubble.d.ts +7 -1
- package/lib/typescript/src/components/TransactionStatus/TransactionStatus.d.ts +7 -1
- package/lib/typescript/src/components/UpiHandle/UpiHandle.d.ts +7 -1
- package/lib/typescript/src/components/index.d.ts +14 -3
- package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +22 -2
- package/lib/typescript/src/icons/registry.d.ts +1 -1
- package/lib/typescript/src/utils/GlassFill/GlassFill.d.ts +84 -0
- package/lib/typescript/src/utils/GlassFill/GlassFill.web.d.ts +43 -0
- package/lib/typescript/src/utils/react-utils.d.ts +47 -0
- package/lib/typescript/src/utils/web-platform-utils.d.ts +36 -0
- package/package.json +2 -1
- package/src/components/Accordion/Accordion.tsx +9 -2
- package/src/components/AccordionCheckbox/AccordionCheckbox.tsx +10 -3
- package/src/components/AccountCard/AccountCard.tsx +10 -3
- package/src/components/AllocationComparisonChart/AllocationComparisonChart.tsx +14 -4
- package/src/components/AmountInput/AmountInput.tsx +7 -5
- package/src/components/AreaLineChart/AreaLineChart.tsx +15 -5
- package/src/components/Badge/Badge.tsx +78 -8
- package/src/components/BenefitCard/BenefitCard.tsx +309 -0
- package/src/components/BrandChip/BrandChip.tsx +9 -3
- package/src/components/Button/Button.tsx +9 -2
- package/src/components/CardAdvisory/CardAdvisory.tsx +9 -2
- package/src/components/CardBankAccount/CardBankAccount.tsx +9 -2
- package/src/components/CardCTA/CardCTA.tsx +214 -41
- package/src/components/CardInsight/CardInsight.tsx +7 -1
- package/src/components/CcCard/CcCard.tsx +598 -0
- package/src/components/Checkbox/Checkbox.tsx +5 -4
- package/src/components/CheckboxItem/CheckboxItem.tsx +5 -4
- package/src/components/CircularProgressBar/CircularProgressBar.tsx +14 -4
- package/src/components/CircularProgressBarDoted/CircularProgressBarDoted.tsx +10 -3
- package/src/components/CircularRating/CircularRating.tsx +9 -2
- package/src/components/ClusterBubble/ClusterBubble.tsx +9 -2
- package/src/components/CompareTable/CompareTable.tsx +525 -0
- package/src/components/ComparisonBar/ComparisonBar.tsx +356 -0
- package/src/components/CoverageBarComparison/CoverageBarComparison.tsx +9 -2
- package/src/components/DonutChart/DonutChart.tsx +10 -3
- package/src/components/Dropdown/Dropdown.tsx +9 -2
- package/src/components/DropdownInput/DropdownInput.tsx +64 -5
- package/src/components/ExpandableCheckbox/ExpandableCheckbox.tsx +8 -1
- package/src/components/FormField/FormField.tsx +52 -6
- package/src/components/Gauge/Gauge.tsx +1 -1
- package/src/components/HoldingsCard/HoldingsCard.tsx +9 -2
- package/src/components/InputSearch/InputSearch.tsx +8 -5
- package/src/components/InstitutionBadge/InstitutionBadge.tsx +9 -2
- package/src/components/ListGroup/ListGroup.tsx +9 -2
- package/src/components/ListItem/ListItem.tsx +10 -3
- package/src/components/MediaCard/MediaCard.tsx +2 -2
- package/src/components/MetricLegendItem/MetricLegendItem.tsx +9 -2
- package/src/components/MonthlyStatusGrid/MonthlyStatusGrid.tsx +17 -2
- package/src/components/NoteInput/NoteInput.tsx +8 -6
- package/src/components/PdpCcCard/PdpCcCard.tsx +356 -0
- package/src/components/PoweredByLabel/PoweredByLabel.tsx +9 -2
- package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +490 -0
- package/src/components/ProductOverview/ProductOverview.tsx +10 -3
- package/src/components/ProgressBadge/ProgressBadge.tsx +9 -3
- package/src/components/ProjectionMarker/ProjectionMarker.tsx +284 -0
- package/src/components/Radio/Radio.tsx +5 -4
- package/src/components/Section/Section.tsx +10 -3
- package/src/components/Slider/Slider.tsx +635 -0
- package/src/components/Stack/Stack.tsx +131 -0
- package/src/components/SuggestiveSearch/SuggestiveSearch.tsx +10 -1
- package/src/components/SummaryTile/SummaryTile.tsx +9 -2
- package/src/components/Table/Table.tsx +449 -0
- package/src/components/Text/Text.tsx +9 -2
- package/src/components/TextInput/TextInput.tsx +22 -12
- package/src/components/TextSegment/TextSegment.tsx +173 -0
- package/src/components/ThreadHero/ThreadHero.tsx +10 -3
- package/src/components/Title/Title.tsx +9 -2
- package/src/components/Toast/Toast.tsx +9 -2
- package/src/components/TransactionBubble/TransactionBubble.tsx +9 -2
- package/src/components/TransactionStatus/TransactionStatus.tsx +9 -2
- package/src/components/UpiHandle/UpiHandle.tsx +9 -3
- package/src/components/index.ts +33 -3
- package/src/design-tokens/Coin Variables-variables-full.json +1 -1
- package/src/design-tokens/figma-modes.generated.ts +39 -9
- package/src/icons/registry.ts +1 -1
- package/src/utils/GlassFill/GlassFill.tsx +305 -0
- package/src/utils/GlassFill/GlassFill.web.tsx +148 -0
- package/src/utils/react-utils.ts +84 -0
- package/src/utils/web-platform-utils.ts +68 -0
- package/lib/commonjs/components/MediaCard/GlassFill.js +0 -62
- package/lib/commonjs/components/MediaCard/GlassFill.web.js +0 -48
- package/lib/module/components/MediaCard/GlassFill.js +0 -57
- package/lib/module/components/MediaCard/GlassFill.web.js +0 -43
- package/lib/typescript/scripts/extract-component-tokens.d.ts +0 -9
- package/lib/typescript/scripts/generate-component-docs.d.ts +0 -9
- package/lib/typescript/scripts/generate-icon-registry.d.ts +0 -3
- package/lib/typescript/scripts/generate-mode-types.d.ts +0 -2
- package/lib/typescript/scripts/retype-modes.d.cts +0 -2
- package/lib/typescript/src/components/MediaCard/GlassFill.d.ts +0 -47
- package/lib/typescript/src/components/MediaCard/GlassFill.web.d.ts +0 -20
- package/src/components/MediaCard/GlassFill.tsx +0 -89
- package/src/components/MediaCard/GlassFill.web.tsx +0 -53
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,51 @@ 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.12] - 2026-06-22
|
|
8
|
+
|
|
9
|
+
- Added `Stack` — token-driven vertical/horizontal layout container with `equalHeight` / `fullWidth` stretch enforcement, mode cascade to children, and `injectChildStyle` for cross-axis alignment that children cannot override.
|
|
10
|
+
- Added `Table` — compound data table (`TableHeader`, `TableHeaderCell`, `TableBody`, `TableRow`, `TableCell`) with token-driven header/body styling and horizontal scroll support.
|
|
11
|
+
- `CardCTA` — new `sip` variant (avatar-led card with headline / description / subtitle footer); accepts PascalCase Figma variant names (`CTA` / `Rating` / `Sip`) via `CardCTATypeInput`; body typography defaults aligned to Figma.
|
|
12
|
+
- `Badge` — new `glass` type (frosted pill via shared `GlassFill`); optional `leading` slot; `glassOverlayColor` / `glassIntensity` overrides; exported `BadgeProps` and `BadgeType`.
|
|
13
|
+
- `CompareTable` — feature rows now render through the shared `Table` primitive; selection cards pick up `selectionCard/radius`; `disableTruncation` support.
|
|
14
|
+
- `ProductMerchandisingCard` — footer special badge now uses `<Badge type="glass">`; progressive footer blur via `MaskedView` + gradient mask on native; `disableTruncation` support.
|
|
15
|
+
- `GlassFill` — consolidated into shared `src/utils/GlassFill/` (native blur + web `backdrop-filter`); removed per-component copies under `MediaCard` and `ProductMerchandisingCard`.
|
|
16
|
+
- `FormField` — iOS single-line input no longer applies row-height token as `lineHeight` (fixes vertically sunk text on iOS); web blur-on-outside-press via `useWebOutsidePress` so fields exit Active state when tapping buttons/links outside.
|
|
17
|
+
- Shared utilities — `injectChildStyle`, `resolveTruncation`, and `useWebOutsidePress` in `react-utils` / `web-platform-utils`.
|
|
18
|
+
- `disableTruncation` — opt-out of ellipsis / `numberOfLines` clamps rolled out across interactive and data-display components (e.g. `ListItem`, `Button`, `CompareTable`, charts, form controls).
|
|
19
|
+
- Figma/token sync pass; refreshed `.token-metadata.json`, `figma-modes.generated.ts`, icons registry, and Coin Variables tokens.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## [0.1.8] - 2026-06-12
|
|
24
|
+
|
|
25
|
+
- Added `BenefitCard` — header highlight + body benefit rows with icon/title/trailing value and optional CTA.
|
|
26
|
+
- Added `CcCard` — credit-card merchandising card with badge row, media, benefit list, footer CTA, and `compact` variant.
|
|
27
|
+
- Added `CompareTable` — accordion-style product comparison table with selection-card columns and feature rows.
|
|
28
|
+
- Added `ComparisonBar` — controlled add/remove image slots with a trailing Compare action.
|
|
29
|
+
- Added `PdpCcCard` — PDP credit-card hero with media, title, metrics row, and footer CTA.
|
|
30
|
+
- Added `ProductMerchandisingCard` — full-bleed media card with glass footer, avatar, badge, and CTA (`GlassFill` platform split for native blur / web `backdrop-filter`).
|
|
31
|
+
- Added `ProjectionMarker` — investment projection timeline with start/end values and a center duration/rate badge.
|
|
32
|
+
- Added `Slider` — token-driven range slider with SVG track, step snapping, and imperative ref API (`getValue` / `setValue` / `increment` / `decrement`).
|
|
33
|
+
- Added `TextSegment` — token-driven multi-colour inline text via `segments` or compositional `Text` children.
|
|
34
|
+
- `DropdownInput` — imperative ref API (`open` / `close` / `toggle` / `focus` / `blur` / `measureInWindow`).
|
|
35
|
+
- Form inputs — refs forwarded through `Checkbox`, `CheckboxItem`, `Radio`, `TextInput`, `InputSearch`, `NoteInput`, `AmountInput`, and `FormField`.
|
|
36
|
+
- Figma/token sync pass; refreshed `.token-metadata.json`, `figma-modes.generated.ts`, icons registry, and Coin Variables tokens.
|
|
37
|
+
- Added `npm run tokens` script (`scripts/figma-token-explorer.js`); `tsconfig.build.json` now excludes `scripts/`.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## [0.1.2] - 2026-06-10
|
|
42
|
+
|
|
43
|
+
- Added `Overlay` — full-screen scrim with optional dismiss-on-press and `contentPlacement` (`center` / `top` / `bottom` / `stretch`).
|
|
44
|
+
- `Drawer` — optional `showOverlay` + `onOverlayPress` scrim behind the sheet.
|
|
45
|
+
- `Image` — new `resizeMethod` prop for sharper high-res bitmap rendering.
|
|
46
|
+
- `FullscreenModal` — defers hero media render until modal width is measured.
|
|
47
|
+
- `DropdownInput` — popup animation set to `none`.
|
|
48
|
+
- `LottiePlayer` — fixed native module resolution (static `require` so Metro resolves when the peer is installed).
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
7
52
|
## [0.1.1] - 2026-06-10
|
|
8
53
|
|
|
9
54
|
- 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.
|
|
@@ -67,6 +67,7 @@ function Accordion({
|
|
|
67
67
|
accessibilityHint,
|
|
68
68
|
accessibilityState,
|
|
69
69
|
webAccessibilityProps,
|
|
70
|
+
disableTruncation,
|
|
70
71
|
...rest
|
|
71
72
|
}) {
|
|
72
73
|
const [internalExpanded, setInternalExpanded] = (0, _react.useState)(defaultExpanded);
|
|
@@ -166,7 +167,7 @@ function Accordion({
|
|
|
166
167
|
...webProps,
|
|
167
168
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
168
169
|
style: titleStyle,
|
|
169
|
-
|
|
170
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
170
171
|
children: title
|
|
171
172
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
|
|
172
173
|
name: isExpanded ? 'ic_minus' : 'ic_add',
|
|
@@ -64,7 +64,8 @@ function AccordionCheckbox({
|
|
|
64
64
|
children,
|
|
65
65
|
modes = _reactUtils.EMPTY_MODES,
|
|
66
66
|
style,
|
|
67
|
-
accessibilityLabel
|
|
67
|
+
accessibilityLabel,
|
|
68
|
+
disableTruncation
|
|
68
69
|
}) {
|
|
69
70
|
const isExpandedControlled = controlledExpanded !== undefined;
|
|
70
71
|
const [internalExpanded, setInternalExpanded] = (0, _react.useState)(defaultExpanded);
|
|
@@ -209,12 +210,12 @@ function AccordionCheckbox({
|
|
|
209
210
|
style: textWrapStyle,
|
|
210
211
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
211
212
|
style: titleStyle,
|
|
212
|
-
|
|
213
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
213
214
|
selectable: false,
|
|
214
215
|
children: title
|
|
215
216
|
}), subtitle ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
216
217
|
style: subtitleStyle,
|
|
217
|
-
|
|
218
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
218
219
|
selectable: false,
|
|
219
220
|
children: subtitle
|
|
220
221
|
}) : null]
|
|
@@ -78,7 +78,8 @@ function AccountCard({
|
|
|
78
78
|
modes = _reactUtils.EMPTY_MODES,
|
|
79
79
|
style,
|
|
80
80
|
accessibilityLabel,
|
|
81
|
-
accessibilityHint
|
|
81
|
+
accessibilityHint,
|
|
82
|
+
disableTruncation
|
|
82
83
|
}) {
|
|
83
84
|
const iconModes = (0, _react.useMemo)(() => modes === _reactUtils.EMPTY_MODES ? ADD_ICON_DEFAULT_MODES : {
|
|
84
85
|
...ADD_ICON_DEFAULT_MODES,
|
|
@@ -211,11 +212,11 @@ function AccountCard({
|
|
|
211
212
|
},
|
|
212
213
|
children: [title != null && title !== '' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
213
214
|
style: titleStyle,
|
|
214
|
-
|
|
215
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
215
216
|
children: title
|
|
216
217
|
}) : null, showSubtitle ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
217
218
|
style: subtitleStyle,
|
|
218
|
-
|
|
219
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
219
220
|
children: subtitle
|
|
220
221
|
}) : null]
|
|
221
222
|
}) : null]
|
|
@@ -67,7 +67,8 @@ function SegmentBar({
|
|
|
67
67
|
baselineHeightPx,
|
|
68
68
|
baselineLabel,
|
|
69
69
|
showMarker,
|
|
70
|
-
theme
|
|
70
|
+
theme,
|
|
71
|
+
disableTruncation
|
|
71
72
|
}) {
|
|
72
73
|
const {
|
|
73
74
|
barWidth,
|
|
@@ -94,7 +95,7 @@ function SegmentBar({
|
|
|
94
95
|
},
|
|
95
96
|
accessibilityLabel: segment.accessibilityLabel,
|
|
96
97
|
children: [showValueLabel ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
97
|
-
|
|
98
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
98
99
|
style: labelStyle,
|
|
99
100
|
children: segment.valueLabel
|
|
100
101
|
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
@@ -140,7 +141,7 @@ function SegmentBar({
|
|
|
140
141
|
strokeDasharray: "2 2"
|
|
141
142
|
})
|
|
142
143
|
}), isShown(baselineLabel) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
143
|
-
|
|
144
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
144
145
|
style: [labelStyle, {
|
|
145
146
|
marginLeft: 6
|
|
146
147
|
}],
|
|
@@ -149,7 +150,7 @@ function SegmentBar({
|
|
|
149
150
|
}) : null]
|
|
150
151
|
}) : null
|
|
151
152
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
152
|
-
|
|
153
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
153
154
|
style: labelStyle,
|
|
154
155
|
children: segment.label
|
|
155
156
|
})]
|
|
@@ -186,7 +187,8 @@ function AllocationComparisonChart({
|
|
|
186
187
|
style,
|
|
187
188
|
chartStyle,
|
|
188
189
|
legendStyle,
|
|
189
|
-
accessibilityLabel
|
|
190
|
+
accessibilityLabel,
|
|
191
|
+
disableTruncation
|
|
190
192
|
}) {
|
|
191
193
|
const {
|
|
192
194
|
modes: globalModes
|
|
@@ -290,7 +292,8 @@ function AllocationComparisonChart({
|
|
|
290
292
|
baselineHeightPx: baselineHeightPx,
|
|
291
293
|
baselineLabel: baselineLabel,
|
|
292
294
|
showMarker: showMarker,
|
|
293
|
-
theme: theme
|
|
295
|
+
theme: theme,
|
|
296
|
+
disableTruncation: disableTruncation
|
|
294
297
|
}, segment.key ?? `segment-${index}`);
|
|
295
298
|
})
|
|
296
299
|
})]
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default =
|
|
7
|
-
var _react =
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
9
|
var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resolver");
|
|
10
10
|
var _JFSThemeProvider = require("../../design-tokens/JFSThemeProvider");
|
|
@@ -13,17 +13,18 @@ var _NoteInput = _interopRequireDefault(require("../NoteInput/NoteInput"));
|
|
|
13
13
|
var _reactUtils = require("../../utils/react-utils");
|
|
14
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
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); }
|
|
16
17
|
/**
|
|
17
18
|
* AmountInput component that combines MoneyValue and NoteInput from Figma design.
|
|
18
19
|
*
|
|
19
20
|
* @component
|
|
20
21
|
*/
|
|
21
|
-
function AmountInput({
|
|
22
|
+
const AmountInput = /*#__PURE__*/(0, _react.forwardRef)(function AmountInput({
|
|
22
23
|
moneyValueSlot,
|
|
23
24
|
noteInputSlot,
|
|
24
25
|
modes: propModes = _reactUtils.EMPTY_MODES,
|
|
25
26
|
style
|
|
26
|
-
}) {
|
|
27
|
+
}, ref) {
|
|
27
28
|
const {
|
|
28
29
|
modes: globalModes
|
|
29
30
|
} = (0, _JFSThemeProvider.useTokens)();
|
|
@@ -77,7 +78,9 @@ function AmountInput({
|
|
|
77
78
|
return noteInputSlot;
|
|
78
79
|
};
|
|
79
80
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
81
|
+
ref: ref,
|
|
80
82
|
style: containerStyle,
|
|
81
83
|
children: [renderMoneyValueSlot(), renderNoteInputSlot()]
|
|
82
84
|
});
|
|
83
|
-
}
|
|
85
|
+
});
|
|
86
|
+
var _default = exports.default = AmountInput;
|
|
@@ -123,7 +123,8 @@ function AreaLineChart({
|
|
|
123
123
|
modes: propModes = _reactUtils.EMPTY_MODES,
|
|
124
124
|
style,
|
|
125
125
|
children,
|
|
126
|
-
accessibilityLabel
|
|
126
|
+
accessibilityLabel,
|
|
127
|
+
disableTruncation
|
|
127
128
|
}) {
|
|
128
129
|
const {
|
|
129
130
|
modes: globalModes
|
|
@@ -243,8 +244,9 @@ function AreaLineChart({
|
|
|
243
244
|
formatX,
|
|
244
245
|
formatY,
|
|
245
246
|
showDots,
|
|
246
|
-
modes
|
|
247
|
-
|
|
247
|
+
modes,
|
|
248
|
+
disableTruncation
|
|
249
|
+
}), [plotWidth, height, inset, xScale, yScale, yTicks, indexXs, count, resolvedSeries, curve, activeIndex, setActiveIndex, xLabels, formatX, formatY, showDots, modes, disableTruncation]);
|
|
248
250
|
const isMultiSeries = resolvedSeries.length > 1;
|
|
249
251
|
const resolvedFormatValue = formatValue ?? (v => formatY(v));
|
|
250
252
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(ChartContext.Provider, {
|
|
@@ -385,7 +387,8 @@ function ChartYAxis({
|
|
|
385
387
|
yScale,
|
|
386
388
|
yTicks,
|
|
387
389
|
formatY,
|
|
388
|
-
modes
|
|
390
|
+
modes,
|
|
391
|
+
disableTruncation
|
|
389
392
|
} = useChart();
|
|
390
393
|
const typo = useAxisTypography(modes);
|
|
391
394
|
const format = formatLabel ?? formatY;
|
|
@@ -413,7 +416,7 @@ function ChartYAxis({
|
|
|
413
416
|
},
|
|
414
417
|
children: showLabels ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
415
418
|
style: typo.style,
|
|
416
|
-
|
|
419
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
417
420
|
children: format(t)
|
|
418
421
|
}) : null
|
|
419
422
|
}, `yl-${t}`);
|
|
@@ -464,7 +467,8 @@ function ChartXAxis({
|
|
|
464
467
|
formatX,
|
|
465
468
|
modes,
|
|
466
469
|
activeIndex,
|
|
467
|
-
setActiveIndex
|
|
470
|
+
setActiveIndex,
|
|
471
|
+
disableTruncation
|
|
468
472
|
} = useChart();
|
|
469
473
|
const typo = useAxisTypography(modes);
|
|
470
474
|
const format = formatLabel ?? formatX;
|
|
@@ -510,7 +514,7 @@ function ChartXAxis({
|
|
|
510
514
|
color: activeColor,
|
|
511
515
|
fontWeight: '700'
|
|
512
516
|
} : null],
|
|
513
|
-
|
|
517
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
514
518
|
children: format(label, i)
|
|
515
519
|
});
|
|
516
520
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
@@ -10,21 +10,34 @@ var _figmaVariablesResolver = require("../../design-tokens/figma-variables-resol
|
|
|
10
10
|
var _reactUtils = require("../../utils/react-utils");
|
|
11
11
|
var _Skeleton = _interopRequireDefault(require("../../skeleton/Skeleton"));
|
|
12
12
|
var _SkeletonGroup = require("../../skeleton/SkeletonGroup");
|
|
13
|
+
var _GlassFill = _interopRequireDefault(require("../../utils/GlassFill/GlassFill"));
|
|
13
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
14
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
16
|
function Badge({
|
|
16
17
|
label = 'Label',
|
|
18
|
+
type = 'default',
|
|
17
19
|
modes = _reactUtils.EMPTY_MODES,
|
|
18
20
|
onPress,
|
|
19
21
|
accessibilityLabel,
|
|
20
22
|
style,
|
|
21
23
|
labelStyle,
|
|
22
24
|
loading,
|
|
25
|
+
disableTruncation,
|
|
26
|
+
leading,
|
|
27
|
+
glassOverlayColor,
|
|
28
|
+
glassIntensity,
|
|
23
29
|
...rest
|
|
24
30
|
}) {
|
|
25
|
-
|
|
31
|
+
const isGlass = type === 'glass';
|
|
32
|
+
const hasLeading = leading != null;
|
|
33
|
+
|
|
34
|
+
// Resolve token values (fall back to sensible defaults). The glass type
|
|
35
|
+
// swaps the solid fill for a translucent overlay + white label, matching the
|
|
36
|
+
// Figma `badge/glass/*` tokens.
|
|
26
37
|
const backgroundColor = (0, _figmaVariablesResolver.getVariableByName)('badge/color/background', modes) || '#d8effe';
|
|
27
|
-
const
|
|
38
|
+
const glassBackground = (0, _figmaVariablesResolver.getVariableByName)('badge/glass/color/background', modes) || '#ffffff26';
|
|
39
|
+
const glassLabelColor = (0, _figmaVariablesResolver.getVariableByName)('badge/glass/color/label', modes) || '#ffffff';
|
|
40
|
+
const labelColor = isGlass ? glassLabelColor : (0, _figmaVariablesResolver.getVariableByName)('badge/color/label', modes) || '#000000';
|
|
28
41
|
const fontSize = Number((0, _figmaVariablesResolver.getVariableByName)('badge/label/fontSize', modes)) || 12;
|
|
29
42
|
const fontFamily = (0, _figmaVariablesResolver.getVariableByName)('badge/fontFamily', modes) || undefined;
|
|
30
43
|
const fontWeight = (0, _figmaVariablesResolver.getVariableByName)('badge/label/fontWeight', modes) || '600';
|
|
@@ -32,6 +45,9 @@ function Badge({
|
|
|
32
45
|
const paddingVertical = Number((0, _figmaVariablesResolver.getVariableByName)('badge/padding/vertical', modes)) || 4;
|
|
33
46
|
const borderRadius = Number((0, _figmaVariablesResolver.getVariableByName)('badge/radius', modes)) || 4;
|
|
34
47
|
const lineHeight = Number((0, _figmaVariablesResolver.getVariableByName)('badge/label/lineHeight', modes)) || Math.round(fontSize * 1.2);
|
|
48
|
+
// Figma `blur/minimal` (px radius) -> GlassFill's 0–100 intensity scale, the
|
|
49
|
+
// same 1:1 mapping the merchandising card footer uses.
|
|
50
|
+
const blurIntensity = Math.max(0, Math.min(100, Math.round(Number((0, _figmaVariablesResolver.getVariableByName)('blur/minimal', modes)) || 29)));
|
|
35
51
|
|
|
36
52
|
// Skeleton short-circuit. Size derived from the same tokens the loaded
|
|
37
53
|
// badge would use so the placeholder occupies the same box.
|
|
@@ -54,13 +70,25 @@ function Badge({
|
|
|
54
70
|
}
|
|
55
71
|
const Container = onPress ? _reactNative.Pressable : _reactNative.View;
|
|
56
72
|
const containerStyle = {
|
|
57
|
-
|
|
73
|
+
// Glass keeps the container transparent so the GlassFill blur shows through;
|
|
74
|
+
// `overflow: 'hidden'` clips the native blur view to the rounded pill (the
|
|
75
|
+
// blur view does not honor borderRadius itself).
|
|
76
|
+
backgroundColor: isGlass ? 'transparent' : backgroundColor,
|
|
58
77
|
paddingHorizontal,
|
|
59
78
|
paddingVertical,
|
|
60
79
|
borderRadius,
|
|
61
80
|
alignSelf: 'flex-start',
|
|
62
81
|
alignItems: 'center',
|
|
63
82
|
justifyContent: 'center',
|
|
83
|
+
// A leading node sits in-line before the label, so switch to a row with a
|
|
84
|
+
// small gap. Consumer `style` (spread last) can still override either.
|
|
85
|
+
...(hasLeading ? {
|
|
86
|
+
flexDirection: 'row',
|
|
87
|
+
gap: 4
|
|
88
|
+
} : null),
|
|
89
|
+
...(isGlass ? {
|
|
90
|
+
overflow: 'hidden'
|
|
91
|
+
} : null),
|
|
64
92
|
...(style || {})
|
|
65
93
|
};
|
|
66
94
|
const textStyle = {
|
|
@@ -73,19 +101,30 @@ function Badge({
|
|
|
73
101
|
...(labelStyle || {})
|
|
74
102
|
};
|
|
75
103
|
const defaultAccessibilityLabel = accessibilityLabel || label;
|
|
76
|
-
return /*#__PURE__*/(0, _jsxRuntime.
|
|
104
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Container, {
|
|
77
105
|
style: containerStyle,
|
|
78
106
|
accessibilityRole: onPress ? 'button' : 'text',
|
|
79
107
|
accessibilityLabel: undefined,
|
|
80
108
|
onPress: onPress,
|
|
81
109
|
...rest,
|
|
82
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
110
|
+
children: [isGlass ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_GlassFill.default, {
|
|
111
|
+
tint: "light",
|
|
112
|
+
intensity: glassIntensity ?? blurIntensity,
|
|
113
|
+
overlayColor: glassOverlayColor ?? glassBackground,
|
|
114
|
+
androidTintWash: false
|
|
115
|
+
}) : null, hasLeading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
116
|
+
style: LEADING_WRAP,
|
|
117
|
+
children: leading
|
|
118
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
83
119
|
style: textStyle,
|
|
84
|
-
|
|
85
|
-
ellipsizeMode: "tail",
|
|
120
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1, 'tail'),
|
|
86
121
|
accessibilityElementsHidden: false,
|
|
87
122
|
children: label
|
|
88
|
-
})
|
|
123
|
+
})]
|
|
89
124
|
});
|
|
90
125
|
}
|
|
126
|
+
const LEADING_WRAP = {
|
|
127
|
+
justifyContent: 'center',
|
|
128
|
+
alignItems: 'center'
|
|
129
|
+
};
|
|
91
130
|
var _default = exports.default = Badge;
|
|
@@ -0,0 +1,231 @@
|
|
|
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 _reactUtils = require("../../utils/react-utils");
|
|
11
|
+
var _Icon = _interopRequireDefault(require("../Icon/Icon"));
|
|
12
|
+
var _Text = _interopRequireDefault(require("../Text/Text"));
|
|
13
|
+
var _ListItem = _interopRequireDefault(require("../ListItem/ListItem"));
|
|
14
|
+
var _Divider = _interopRequireDefault(require("../Divider/Divider"));
|
|
15
|
+
var _Button = _interopRequireDefault(require("../Button/Button"));
|
|
16
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
|
+
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); }
|
|
19
|
+
/**
|
|
20
|
+
* A single benefit row rendered with the shared `ListItem` primitive: a
|
|
21
|
+
* leading icon, a title and an optional right-aligned trailing value.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* BenefitCard — Figma node 5352:1077 ("Benefit Card").
|
|
26
|
+
*
|
|
27
|
+
* A white, rounded card that summarises the rewards a user will earn. It is
|
|
28
|
+
* composed entirely from the shared design-system primitives so it stays in
|
|
29
|
+
* sync with the rest of the library:
|
|
30
|
+
*
|
|
31
|
+
* - **Header** — a section title + a single highlighted {@link ListItem}
|
|
32
|
+
* (leading `Icon`, title, right-aligned trailing value) followed by a
|
|
33
|
+
* `Divider`.
|
|
34
|
+
* - **Body** — a section title + a column of benefit {@link ListItem}s. The
|
|
35
|
+
* list is a real slot: pass `children` to fully control it, or `items` for
|
|
36
|
+
* the declarative path.
|
|
37
|
+
* - **CTA** — a small {@link Button} (Figma `Button / Size = S`).
|
|
38
|
+
*
|
|
39
|
+
* The list rows resolve through the `List Item Style: Minimal` mode (12px /
|
|
40
|
+
* regular title, 4px gap, no padding) and the leading icons use the
|
|
41
|
+
* `AppearanceBrand: Secondary` brand color, exactly matching the design. All
|
|
42
|
+
* three defaults can be overridden via `modes`.
|
|
43
|
+
*/
|
|
44
|
+
function BenefitCard({
|
|
45
|
+
headerTitle = 'You will earn',
|
|
46
|
+
headerItem,
|
|
47
|
+
showHeader = true,
|
|
48
|
+
bodyTitle = 'Upgrade to JioFinance+ and earn more',
|
|
49
|
+
items,
|
|
50
|
+
children,
|
|
51
|
+
buttonLabel = 'Upgrade',
|
|
52
|
+
onButtonPress,
|
|
53
|
+
button,
|
|
54
|
+
showButton = true,
|
|
55
|
+
onPress,
|
|
56
|
+
width = 344,
|
|
57
|
+
modes = _reactUtils.EMPTY_MODES,
|
|
58
|
+
style,
|
|
59
|
+
accessibilityLabel
|
|
60
|
+
}) {
|
|
61
|
+
const tokens = (0, _react.useMemo)(() => resolveTokens(modes), [modes]);
|
|
62
|
+
|
|
63
|
+
// Sub-component modes. Consumer-supplied `modes` always win via spread order.
|
|
64
|
+
const listItemModes = (0, _react.useMemo)(() => ({
|
|
65
|
+
'List Item Style': 'Minimal',
|
|
66
|
+
...modes
|
|
67
|
+
}), [modes]);
|
|
68
|
+
const iconModes = (0, _react.useMemo)(() => ({
|
|
69
|
+
AppearanceBrand: 'Secondary',
|
|
70
|
+
...modes
|
|
71
|
+
}), [modes]);
|
|
72
|
+
const trailingTextModes = (0, _react.useMemo)(() => ({
|
|
73
|
+
'Text Sizes': 'Small',
|
|
74
|
+
Weight: 'Regular',
|
|
75
|
+
...modes
|
|
76
|
+
}), [modes]);
|
|
77
|
+
const ctaModes = (0, _react.useMemo)(() => ({
|
|
78
|
+
'Button / Size': 'S',
|
|
79
|
+
...modes
|
|
80
|
+
}), [modes]);
|
|
81
|
+
const renderItem = (item, key) => {
|
|
82
|
+
const leading = item.leading ?? (item.icon != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
|
|
83
|
+
iconName: item.icon,
|
|
84
|
+
color: item.iconColor,
|
|
85
|
+
modes: iconModes
|
|
86
|
+
}) : null);
|
|
87
|
+
const trailing = item.trailing ?? (item.trailingText != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.default, {
|
|
88
|
+
modes: trailingTextModes,
|
|
89
|
+
children: item.trailingText
|
|
90
|
+
}) : undefined);
|
|
91
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItem.default, {
|
|
92
|
+
layout: "Horizontal",
|
|
93
|
+
navArrow: false,
|
|
94
|
+
showSupportText: false,
|
|
95
|
+
title: item.title,
|
|
96
|
+
leading: leading,
|
|
97
|
+
trailing: trailing,
|
|
98
|
+
onPress: item.onPress,
|
|
99
|
+
modes: listItemModes
|
|
100
|
+
}, key);
|
|
101
|
+
};
|
|
102
|
+
const headerNode = showHeader && (headerTitle != null || headerItem != null) ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
103
|
+
style: styles.section,
|
|
104
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
105
|
+
style: styles.cardHeader,
|
|
106
|
+
children: [headerTitle != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
107
|
+
style: tokens.title,
|
|
108
|
+
children: headerTitle
|
|
109
|
+
}) : null, headerItem != null ? renderItem(headerItem, 'header-item') : null]
|
|
110
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Divider.default, {
|
|
111
|
+
modes: modes
|
|
112
|
+
})]
|
|
113
|
+
}) : null;
|
|
114
|
+
const bodyList = children ? (0, _reactUtils.cloneChildrenWithModes)(children, listItemModes) : (items ?? DEFAULT_ITEMS).map((item, index) => renderItem(item, index));
|
|
115
|
+
const ctaNode = button ?? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
|
|
116
|
+
label: buttonLabel,
|
|
117
|
+
modes: ctaModes,
|
|
118
|
+
onPress: onButtonPress
|
|
119
|
+
});
|
|
120
|
+
const containerStyle = (0, _react.useMemo)(() => ({
|
|
121
|
+
...tokens.container,
|
|
122
|
+
width
|
|
123
|
+
}), [tokens.container, width]);
|
|
124
|
+
const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
125
|
+
children: [headerNode, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
126
|
+
style: tokens.body,
|
|
127
|
+
children: [bodyTitle != null ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
128
|
+
style: tokens.title,
|
|
129
|
+
children: bodyTitle
|
|
130
|
+
}) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
131
|
+
style: tokens.listWrap,
|
|
132
|
+
children: bodyList
|
|
133
|
+
})]
|
|
134
|
+
}), showButton ? ctaNode : null]
|
|
135
|
+
});
|
|
136
|
+
if (onPress) {
|
|
137
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
|
|
138
|
+
style: ({
|
|
139
|
+
pressed
|
|
140
|
+
}) => [containerStyle, pressed ? styles.pressed : null, style],
|
|
141
|
+
accessibilityRole: "button",
|
|
142
|
+
accessibilityLabel: accessibilityLabel ?? headerTitle ?? bodyTitle,
|
|
143
|
+
onPress: onPress,
|
|
144
|
+
children: content
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
148
|
+
style: [containerStyle, style],
|
|
149
|
+
accessibilityLabel: accessibilityLabel,
|
|
150
|
+
children: content
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Tokens / static styles
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
|
|
158
|
+
// The "card header" inner gap (title -> highlighted item) is a fixed 4px in
|
|
159
|
+
// the Figma node and has no dedicated token.
|
|
160
|
+
const CARD_HEADER_GAP = 4;
|
|
161
|
+
function asNum(raw, fallback) {
|
|
162
|
+
const n = typeof raw === 'number' ? raw : parseFloat(raw);
|
|
163
|
+
return Number.isFinite(n) ? n : fallback;
|
|
164
|
+
}
|
|
165
|
+
function asStr(raw, fallback) {
|
|
166
|
+
return raw != null ? String(raw) : fallback;
|
|
167
|
+
}
|
|
168
|
+
function resolveTokens(modes) {
|
|
169
|
+
// NOTE: token names are passed as string literals DIRECTLY to
|
|
170
|
+
// getVariableByName so the `extract-component-tokens` script can statically
|
|
171
|
+
// collect them for the generated docs. Do not refactor these into a helper
|
|
172
|
+
// that receives the name as a variable.
|
|
173
|
+
const background = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/background', modes), '#ffffff');
|
|
174
|
+
const paddingHorizontal = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/padding/horizontal', modes), 12);
|
|
175
|
+
const paddingVertical = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/padding/vertical', modes), 12);
|
|
176
|
+
const radius = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/radius', modes), 12);
|
|
177
|
+
const gap = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/gap', modes), 8);
|
|
178
|
+
const titleColor = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/foreground', modes), '#000000');
|
|
179
|
+
const titleSize = asNum((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/fontsize', modes), 14);
|
|
180
|
+
const titleFamily = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/fontFamily', modes), 'JioType Var');
|
|
181
|
+
const titleWeight = asStr((0, _figmaVariablesResolver.getVariableByName)('benefitCard/title/fontWeight', modes), '500');
|
|
182
|
+
return {
|
|
183
|
+
container: {
|
|
184
|
+
backgroundColor: background,
|
|
185
|
+
paddingHorizontal,
|
|
186
|
+
paddingVertical,
|
|
187
|
+
borderRadius: radius,
|
|
188
|
+
gap,
|
|
189
|
+
flexDirection: 'column',
|
|
190
|
+
alignItems: 'flex-start'
|
|
191
|
+
},
|
|
192
|
+
body: {
|
|
193
|
+
alignSelf: 'stretch',
|
|
194
|
+
gap
|
|
195
|
+
},
|
|
196
|
+
listWrap: {
|
|
197
|
+
alignSelf: 'stretch',
|
|
198
|
+
gap
|
|
199
|
+
},
|
|
200
|
+
title: {
|
|
201
|
+
color: titleColor,
|
|
202
|
+
fontSize: titleSize,
|
|
203
|
+
fontFamily: titleFamily,
|
|
204
|
+
fontWeight: titleWeight,
|
|
205
|
+
lineHeight: 20,
|
|
206
|
+
letterSpacing: -0.5,
|
|
207
|
+
includeFontPadding: false
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const DEFAULT_ITEMS = [{
|
|
212
|
+
icon: 'ic_card',
|
|
213
|
+
title: 'Up to ₹5000 cashback'
|
|
214
|
+
}, {
|
|
215
|
+
icon: 'ic_card',
|
|
216
|
+
title: '25% extra JioPoints'
|
|
217
|
+
}];
|
|
218
|
+
const styles = _reactNative.StyleSheet.create({
|
|
219
|
+
section: {
|
|
220
|
+
alignSelf: 'stretch',
|
|
221
|
+
gap: 8
|
|
222
|
+
},
|
|
223
|
+
cardHeader: {
|
|
224
|
+
alignSelf: 'stretch',
|
|
225
|
+
gap: CARD_HEADER_GAP
|
|
226
|
+
},
|
|
227
|
+
pressed: {
|
|
228
|
+
opacity: 0.92
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
var _default = exports.default = BenefitCard;
|
|
@@ -95,7 +95,8 @@ function BrandChip({
|
|
|
95
95
|
modes: propModes = _reactUtils.EMPTY_MODES,
|
|
96
96
|
style,
|
|
97
97
|
labelStyle,
|
|
98
|
-
accessibilityLabel
|
|
98
|
+
accessibilityLabel,
|
|
99
|
+
disableTruncation
|
|
99
100
|
}) {
|
|
100
101
|
const {
|
|
101
102
|
modes: globalModes
|
|
@@ -126,8 +127,7 @@ function BrandChip({
|
|
|
126
127
|
const content = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
127
128
|
children: [avatarNode, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
128
129
|
style: [tokens.labelStyle, labelStyle],
|
|
129
|
-
|
|
130
|
-
ellipsizeMode: "tail",
|
|
130
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1, 'tail'),
|
|
131
131
|
children: label
|
|
132
132
|
})]
|
|
133
133
|
});
|
|
@@ -176,6 +176,7 @@ function ButtonImpl({
|
|
|
176
176
|
accessibilityState,
|
|
177
177
|
webAccessibilityProps,
|
|
178
178
|
loading,
|
|
179
|
+
disableTruncation,
|
|
179
180
|
...rest
|
|
180
181
|
}) {
|
|
181
182
|
// Hover state is web-only in practice; the setter is gated so native taps
|
|
@@ -220,7 +221,7 @@ function ButtonImpl({
|
|
|
220
221
|
} else {
|
|
221
222
|
content = /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
|
|
222
223
|
style: activeLabelStyle,
|
|
223
|
-
|
|
224
|
+
...(0, _reactUtils.resolveTruncation)(disableTruncation, 1),
|
|
224
225
|
children: label
|
|
225
226
|
});
|
|
226
227
|
}
|