jfs-components 0.1.2 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/lib/commonjs/components/AmountInput/AmountInput.js +8 -5
  3. package/lib/commonjs/components/BenefitCard/BenefitCard.js +231 -0
  4. package/lib/commonjs/components/CcCard/CcCard.js +470 -0
  5. package/lib/commonjs/components/Checkbox/Checkbox.js +4 -3
  6. package/lib/commonjs/components/CheckboxItem/CheckboxItem.js +4 -3
  7. package/lib/commonjs/components/CompareTable/CompareTable.js +372 -0
  8. package/lib/commonjs/components/ComparisonBar/ComparisonBar.js +266 -0
  9. package/lib/commonjs/components/DropdownInput/DropdownInput.js +35 -3
  10. package/lib/commonjs/components/FormField/FormField.js +4 -3
  11. package/lib/commonjs/components/InputSearch/InputSearch.js +6 -4
  12. package/lib/commonjs/components/NoteInput/NoteInput.js +6 -5
  13. package/lib/commonjs/components/PdpCcCard/PdpCcCard.js +273 -0
  14. package/lib/commonjs/components/ProductMerchandisingCard/GlassFill.js +263 -0
  15. package/lib/commonjs/components/ProductMerchandisingCard/GlassFill.web.js +116 -0
  16. package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +353 -0
  17. package/lib/commonjs/components/ProjectionMarker/ProjectionMarker.js +161 -0
  18. package/lib/commonjs/components/Radio/Radio.js +5 -5
  19. package/lib/commonjs/components/Slider/Slider.js +473 -0
  20. package/lib/commonjs/components/TextInput/TextInput.js +13 -8
  21. package/lib/commonjs/components/TextSegment/TextSegment.js +118 -0
  22. package/lib/commonjs/components/index.js +63 -0
  23. package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -1
  24. package/lib/commonjs/design-tokens/figma-modes.generated.js +38 -9
  25. package/lib/commonjs/icons/registry.js +1 -1
  26. package/lib/commonjs/utils/react-utils.js +22 -0
  27. package/lib/module/components/AmountInput/AmountInput.js +6 -4
  28. package/lib/module/components/BenefitCard/BenefitCard.js +225 -0
  29. package/lib/module/components/CcCard/CcCard.js +464 -0
  30. package/lib/module/components/Checkbox/Checkbox.js +5 -4
  31. package/lib/module/components/CheckboxItem/CheckboxItem.js +5 -4
  32. package/lib/module/components/CompareTable/CompareTable.js +367 -0
  33. package/lib/module/components/ComparisonBar/ComparisonBar.js +260 -0
  34. package/lib/module/components/DropdownInput/DropdownInput.js +36 -4
  35. package/lib/module/components/FormField/FormField.js +5 -4
  36. package/lib/module/components/InputSearch/InputSearch.js +6 -4
  37. package/lib/module/components/NoteInput/NoteInput.js +7 -6
  38. package/lib/module/components/PdpCcCard/PdpCcCard.js +267 -0
  39. package/lib/module/components/ProductMerchandisingCard/GlassFill.js +257 -0
  40. package/lib/module/components/ProductMerchandisingCard/GlassFill.web.js +111 -0
  41. package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +347 -0
  42. package/lib/module/components/ProjectionMarker/ProjectionMarker.js +156 -0
  43. package/lib/module/components/Radio/Radio.js +5 -4
  44. package/lib/module/components/Slider/Slider.js +468 -0
  45. package/lib/module/components/TextInput/TextInput.js +15 -10
  46. package/lib/module/components/TextSegment/TextSegment.js +113 -0
  47. package/lib/module/components/index.js +9 -0
  48. package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -1
  49. package/lib/module/design-tokens/figma-modes.generated.js +38 -9
  50. package/lib/module/icons/registry.js +1 -1
  51. package/lib/module/utils/react-utils.js +21 -0
  52. package/lib/typescript/src/components/AmountInput/AmountInput.d.ts +3 -2
  53. package/lib/typescript/src/components/BenefitCard/BenefitCard.d.ts +93 -0
  54. package/lib/typescript/src/components/CcCard/CcCard.d.ts +137 -0
  55. package/lib/typescript/src/components/Checkbox/Checkbox.d.ts +3 -2
  56. package/lib/typescript/src/components/CheckboxItem/CheckboxItem.d.ts +2 -2
  57. package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +88 -0
  58. package/lib/typescript/src/components/ComparisonBar/ComparisonBar.d.ts +118 -0
  59. package/lib/typescript/src/components/DropdownInput/DropdownInput.d.ts +20 -1
  60. package/lib/typescript/src/components/FormField/FormField.d.ts +2 -2
  61. package/lib/typescript/src/components/InputSearch/InputSearch.d.ts +23 -2
  62. package/lib/typescript/src/components/NoteInput/NoteInput.d.ts +19 -2
  63. package/lib/typescript/src/components/PdpCcCard/PdpCcCard.d.ts +84 -0
  64. package/lib/typescript/src/components/ProductMerchandisingCard/GlassFill.d.ts +56 -0
  65. package/lib/typescript/src/components/ProductMerchandisingCard/GlassFill.web.d.ts +27 -0
  66. package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +81 -0
  67. package/lib/typescript/src/components/ProjectionMarker/ProjectionMarker.d.ts +82 -0
  68. package/lib/typescript/src/components/Radio/Radio.d.ts +3 -2
  69. package/lib/typescript/src/components/RadioButton/RadioButton.d.ts +2 -2
  70. package/lib/typescript/src/components/Slider/Slider.d.ts +99 -0
  71. package/lib/typescript/src/components/TextInput/TextInput.d.ts +9 -29
  72. package/lib/typescript/src/components/TextSegment/TextSegment.d.ts +100 -0
  73. package/lib/typescript/src/components/index.d.ts +10 -1
  74. package/lib/typescript/src/design-tokens/figma-modes.generated.d.ts +22 -2
  75. package/lib/typescript/src/icons/registry.d.ts +1 -1
  76. package/lib/typescript/src/utils/react-utils.d.ts +10 -0
  77. package/package.json +2 -1
  78. package/src/components/AmountInput/AmountInput.tsx +7 -5
  79. package/src/components/BenefitCard/BenefitCard.tsx +309 -0
  80. package/src/components/CcCard/CcCard.tsx +598 -0
  81. package/src/components/Checkbox/Checkbox.tsx +5 -4
  82. package/src/components/CheckboxItem/CheckboxItem.tsx +5 -4
  83. package/src/components/CompareTable/CompareTable.tsx +477 -0
  84. package/src/components/ComparisonBar/ComparisonBar.tsx +356 -0
  85. package/src/components/DropdownInput/DropdownInput.tsx +55 -3
  86. package/src/components/FormField/FormField.tsx +5 -4
  87. package/src/components/InputSearch/InputSearch.tsx +8 -5
  88. package/src/components/NoteInput/NoteInput.tsx +8 -6
  89. package/src/components/PdpCcCard/PdpCcCard.tsx +356 -0
  90. package/src/components/ProductMerchandisingCard/GlassFill.tsx +276 -0
  91. package/src/components/ProductMerchandisingCard/GlassFill.web.tsx +127 -0
  92. package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +423 -0
  93. package/src/components/ProjectionMarker/ProjectionMarker.tsx +277 -0
  94. package/src/components/Radio/Radio.tsx +5 -4
  95. package/src/components/Slider/Slider.tsx +628 -0
  96. package/src/components/TextInput/TextInput.tsx +15 -11
  97. package/src/components/TextSegment/TextSegment.tsx +166 -0
  98. package/src/components/index.ts +10 -1
  99. package/src/design-tokens/Coin Variables-variables-full.json +1 -1
  100. package/src/design-tokens/figma-modes.generated.ts +38 -9
  101. package/src/icons/registry.ts +1 -1
  102. package/src/utils/react-utils.ts +23 -0
  103. package/lib/typescript/scripts/extract-component-tokens.d.ts +0 -9
  104. package/lib/typescript/scripts/generate-component-docs.d.ts +0 -9
  105. package/lib/typescript/scripts/generate-icon-registry.d.ts +0 -3
  106. package/lib/typescript/scripts/generate-mode-types.d.ts +0 -2
  107. package/lib/typescript/scripts/retype-modes.d.cts +0 -2
@@ -1,8 +1,8 @@
1
- import React, { useRef, useState } from 'react'
1
+ import React, { forwardRef, useRef, useState } from 'react'
2
2
  import { Platform, Pressable, View, TextInput as RNTextInput, type StyleProp, type ViewStyle, type TextInputProps as RNTextInputProps, type TextStyle } from 'react-native'
3
3
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
4
  import Icon from '../../icons/Icon'
5
- import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
5
+ import { EMPTY_MODES, cloneChildrenWithModes, mergeRefs } from '../../utils/react-utils'
6
6
  import type { Modes } from '../../design-tokens'
7
7
 
8
8
  /**
@@ -112,7 +112,7 @@ type TextInputProps = {
112
112
  accessibilityHint?: string;
113
113
  } & Omit<RNTextInputProps, 'style' | 'onChangeText' | 'onFocus' | 'onBlur' | 'placeholder' | 'value'>;
114
114
 
115
- function TextInput({
115
+ const TextInputBase = forwardRef<RNTextInput, TextInputProps>(function TextInput({
116
116
  placeholder = '',
117
117
  value = '',
118
118
  onChangeText,
@@ -127,7 +127,7 @@ function TextInput({
127
127
  accessibilityLabel,
128
128
  accessibilityHint,
129
129
  ...rest
130
- }: TextInputProps) {
130
+ }: TextInputProps, ref: React.Ref<RNTextInput>) {
131
131
  // Track focus state to hide placeholder when focused
132
132
  const [isFocused, setIsFocused] = useState(false)
133
133
  const [isHovered, setIsHovered] = useState(false)
@@ -251,7 +251,7 @@ function TextInput({
251
251
  </View>
252
252
  )}
253
253
  <RNTextInput
254
- ref={inputRef}
254
+ ref={mergeRefs(inputRef, ref)}
255
255
  accessibilityLabel={undefined}
256
256
  accessibilityHint={accessibilityHint}
257
257
  placeholder={displayPlaceholder}
@@ -290,7 +290,7 @@ function TextInput({
290
290
  }
291
291
 
292
292
  return <View style={containerStyleArray}>{inner}</View>
293
- }
293
+ })
294
294
 
295
295
  /**
296
296
  * TextInput.Search component that mirrors the Figma "textInput.search" component.
@@ -325,7 +325,7 @@ type TextInputSearchProps = {
325
325
  onBlur?: (e: any) => void;
326
326
  } & Omit<RNTextInputProps, 'style' | 'onChangeText' | 'onFocus' | 'onBlur' | 'placeholder' | 'value'>;
327
327
 
328
- function TextInputSearch({
328
+ const TextInputSearch = forwardRef<RNTextInput, TextInputSearchProps>(function TextInputSearch({
329
329
  placeholder = 'Search',
330
330
  value = '',
331
331
  onChangeText,
@@ -338,7 +338,7 @@ function TextInputSearch({
338
338
  onFocus,
339
339
  onBlur,
340
340
  ...rest
341
- }: TextInputSearchProps) {
341
+ }: TextInputSearchProps, ref: React.Ref<RNTextInput>) {
342
342
  // Resolve icon tokens for default search icon
343
343
  const iconColor = getVariableByName('textInput/icon/color', modes) || '#24262b'
344
344
  const iconSize = getVariableByName('textInput/icon/size', modes) || 18
@@ -379,10 +379,14 @@ function TextInputSearch({
379
379
  textInputProps.accessibilityHint = accessibilityHint
380
380
  }
381
381
 
382
- return <TextInput {...(textInputProps as TextInputProps)} />
383
- }
382
+ return <TextInput ref={ref} {...(textInputProps as TextInputProps)} />
383
+ })
384
384
 
385
- // Attach Search as a property of TextInput using namespace pattern
385
+ // Attach Search as a property of TextInput using namespace pattern. The base
386
+ // component is created via forwardRef, so we compose the static onto a typed
387
+ // alias to keep `TextInput.Search` strongly typed.
388
+ type TextInputComponent = typeof TextInputBase & { Search: typeof TextInputSearch }
389
+ const TextInput = TextInputBase as TextInputComponent
386
390
  TextInput.Search = TextInputSearch
387
391
 
388
392
  export default TextInput
@@ -0,0 +1,166 @@
1
+ import React, { useMemo } from 'react'
2
+ import { Text as RNText, type TextStyle, type StyleProp } from 'react-native'
3
+ import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
4
+ import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
5
+ import type { Modes } from '../../design-tokens'
6
+
7
+ /**
8
+ * A single coloured run inside a {@link TextSegment}. Each run can carry its own
9
+ * `modes`, so individual fragments of the same paragraph can resolve different
10
+ * design tokens (most commonly a different `text/foreground` colour) while still
11
+ * flowing — and wrapping — inline as one continuous line of text.
12
+ */
13
+ export type TextSegmentRun = {
14
+ /** The text for this run. Include trailing/leading spaces yourself when you want spacing between runs (inline text has no gap concept). */
15
+ text: string
16
+ /**
17
+ * Per-run mode overrides. Merged on top of the parent `TextSegment` modes, so
18
+ * a run only needs to specify what differs (e.g. `{ 'Text Appearance': 'Primary' }`
19
+ * to recolour just that fragment). Everything else is inherited.
20
+ */
21
+ modes?: Modes
22
+ /** Optional per-run style override applied last, on top of the token-resolved style. */
23
+ style?: StyleProp<TextStyle>
24
+ }
25
+
26
+ export type TextSegmentProps = {
27
+ /**
28
+ * Declarative, data-driven way to compose a multi-colour string. Each entry
29
+ * becomes an inline run. This is the simplest API when the segments are known
30
+ * up front:
31
+ *
32
+ * ```tsx
33
+ * <TextSegment segments={[
34
+ * { text: 'Upsell message ' },
35
+ * { text: 'JioFinance+', modes: { 'Text Appearance': 'Primary' } },
36
+ * ]} />
37
+ * ```
38
+ *
39
+ * When both `segments` and `children` are provided, `children` win.
40
+ */
41
+ segments?: TextSegmentRun[]
42
+ /**
43
+ * Compositional alternative to {@link TextSegmentProps.segments}. Pass library
44
+ * `Text` elements (or plain strings) as children and they are rendered nested
45
+ * inside the same paragraph so they wrap together. The parent `modes` cascade
46
+ * down to every child via `cloneChildrenWithModes`, and each child may still
47
+ * override with its own `modes`:
48
+ *
49
+ * ```tsx
50
+ * <TextSegment>
51
+ * <Text>Upsell message </Text>
52
+ * <Text modes={{ 'Text Appearance': 'Primary' }}>JioFinance+</Text>
53
+ * </TextSegment>
54
+ * ```
55
+ */
56
+ children?: React.ReactNode
57
+ /** Horizontal alignment of the whole paragraph. */
58
+ textAlign?: 'Left' | 'Center'
59
+ /** Clamp the paragraph to this many lines (truncates with an ellipsis). Applies to the whole composed line, not per-run. */
60
+ numberOfLines?: number
61
+ /** Mode configuration used for the base style and cascaded to every run/child. */
62
+ modes?: Modes
63
+ /** Style override applied to the outer paragraph (e.g. width constraints to force wrapping). */
64
+ style?: StyleProp<TextStyle>
65
+ }
66
+
67
+ const TEXT_ALIGN_MAP: Record<NonNullable<TextSegmentProps['textAlign']>, TextStyle['textAlign']> = {
68
+ Left: 'left',
69
+ Center: 'center',
70
+ }
71
+
72
+ /**
73
+ * Resolves the `text/*` design tokens for a given modes object into an RN
74
+ * `TextStyle`. Shared by the outer paragraph and every inline run so a run that
75
+ * only overrides colour still inherits the family/size/weight/spacing.
76
+ */
77
+ function resolveTextStyle(modes: Modes): TextStyle {
78
+ return {
79
+ color: (getVariableByName('text/foreground', modes) ?? '#000000') as string,
80
+ fontFamily: (getVariableByName('text/fontFamily', modes) ?? 'JioType') as string,
81
+ fontSize: (getVariableByName('text/fontSize', modes) ?? 14) as number,
82
+ fontWeight: String(getVariableByName('text/fontWeight', modes) ?? '500') as TextStyle['fontWeight'],
83
+ lineHeight: (getVariableByName('text/lineHeight', modes) ?? 20) as number,
84
+ letterSpacing: (getVariableByName('text/letterSpacing', modes) ?? -0.5) as number,
85
+ }
86
+ }
87
+
88
+ /**
89
+ * TextSegment — composes several differently-styled text runs into a single
90
+ * paragraph that wraps as one continuous line.
91
+ *
92
+ * On the web you would reach for `<span>`s inside a `<p>`; the React Native
93
+ * equivalent is nesting `<Text>` inside a parent `<Text>`. That nesting is the
94
+ * whole trick: sibling `<View>`s would lay out as flex blocks and break onto
95
+ * rigid rows, but nested `<Text>` nodes flow inline and wrap naturally at word
96
+ * boundaries — exactly like a real paragraph — while each nested run keeps its
97
+ * own colour/weight resolved from its own `modes`.
98
+ *
99
+ * Two equivalent ways to author content:
100
+ * - **`segments` prop** — declarative array of `{ text, modes }` runs.
101
+ * - **`children`** — pass library `Text` elements (or strings); the parent
102
+ * `modes` cascade down and each child may override its own.
103
+ *
104
+ * @example Data-driven
105
+ * ```tsx
106
+ * <TextSegment
107
+ * segments={[
108
+ * { text: 'Upsell message ' },
109
+ * { text: 'JioFinance+', modes: { 'Text Appearance': 'Primary' } },
110
+ * ]}
111
+ * />
112
+ * ```
113
+ *
114
+ * @example Compositional
115
+ * ```tsx
116
+ * <TextSegment numberOfLines={2}>
117
+ * <Text>Pay with </Text>
118
+ * <Text modes={{ 'Text Appearance': 'Primary' }}>JioFinance+</Text>
119
+ * <Text> and earn rewards on every transaction.</Text>
120
+ * </TextSegment>
121
+ * ```
122
+ */
123
+ function TextSegment({
124
+ segments,
125
+ children,
126
+ textAlign = 'Left',
127
+ numberOfLines,
128
+ modes = EMPTY_MODES,
129
+ style,
130
+ }: TextSegmentProps) {
131
+ const baseStyle = useMemo<TextStyle>(
132
+ () => ({ ...resolveTextStyle(modes), textAlign: TEXT_ALIGN_MAP[textAlign] }),
133
+ [modes, textAlign]
134
+ )
135
+
136
+ // children win over `segments` so the compositional API can always override.
137
+ const hasChildren = children !== undefined && children !== null && children !== false
138
+
139
+ const renderedSegments = useMemo(() => {
140
+ if (hasChildren || !segments?.length) return null
141
+ return segments.map((run, index) => {
142
+ // Parent modes first, then the run's own modes override them — mirrors the
143
+ // merge order used by `cloneChildrenWithModes` for the children API.
144
+ const runModes = run.modes ? { ...modes, ...run.modes } : modes
145
+ const runStyle = run.modes ? resolveTextStyle(runModes) : undefined
146
+ return (
147
+ <RNText key={index} style={[runStyle, run.style]}>
148
+ {run.text}
149
+ </RNText>
150
+ )
151
+ })
152
+ }, [segments, hasChildren, modes])
153
+
154
+ // The cascade: every child (and its descendants) receives the parent modes so
155
+ // nested library `Text` runs resolve their tokens against the same baseline,
156
+ // while still honouring any per-child `modes` override.
157
+ const content = hasChildren ? cloneChildrenWithModes(children, modes) : renderedSegments
158
+
159
+ return (
160
+ <RNText style={[baseStyle, style]} numberOfLines={numberOfLines}>
161
+ {content}
162
+ </RNText>
163
+ )
164
+ }
165
+
166
+ export default React.memo(TextSegment)
@@ -5,6 +5,7 @@ export { default as AppBar } from './AppBar/AppBar';
5
5
  export { default as Avatar, type AvatarProps } from './Avatar/Avatar';
6
6
  export { default as AvatarGroup } from './AvatarGroup/AvatarGroup';
7
7
  export { default as Badge } from './Badge/Badge';
8
+ export { default as BenefitCard, type BenefitCardProps, type BenefitCardItem } from './BenefitCard/BenefitCard';
8
9
  export { default as BottomNav } from './BottomNav/BottomNav';
9
10
  export { default as BottomNavItem } from './BottomNavItem/BottomNavItem';
10
11
  export { default as BrandChip, type BrandChipProps } from './BrandChip/BrandChip';
@@ -20,11 +21,12 @@ export { default as CheckboxGroup, type CheckboxGroupProps } from './CheckboxGro
20
21
  export { default as CardFeedback, type CardFeedbackProps } from './CardFeedback/CardFeedback';
21
22
  export { default as CardFinancialCondition, type CardFinancialConditionProps } from './CardFinancialCondition/CardFinancialCondition';
22
23
  export { default as CardInsight, type CardInsightProps } from './CardInsight/CardInsight';
24
+ export { default as CcCard, type CcCardProps, type CcCardBadge, type CcCardListItem } from './CcCard/CcCard';
23
25
  export { default as Disclaimer } from './Disclaimer/Disclaimer';
24
26
  export { default as Divider, type DividerProps, type DividerDirection } from './Divider/Divider';
25
27
  export { default as Drawer, type DrawerProps, type DrawerHandle } from './Drawer/Drawer';
26
28
  export { default as Dropdown, DropdownItem, type DropdownProps, type DropdownItemProps } from './Dropdown/Dropdown';
27
- export { default as DropdownInput, type DropdownInputProps, type DropdownInputOption, type DropdownInputOptionValue } from './DropdownInput/DropdownInput';
29
+ export { default as DropdownInput, type DropdownInputProps, type DropdownInputHandle, type DropdownInputOption, type DropdownInputOptionValue } from './DropdownInput/DropdownInput';
28
30
  export { default as SuggestiveSearch, type SuggestiveSearchProps, type SuggestiveSearchOption, type SuggestiveSearchOptionValue, type SuggestiveSearchItem } from './SuggestiveSearch/SuggestiveSearch';
29
31
  export { default as CardCTA, type CardCTAProps, type CardCTAType } from './CardCTA/CardCTA'
30
32
  export { default as DebitCard, type DebitCardProps } from './DebitCard/DebitCard';
@@ -38,6 +40,7 @@ export { default as CircularProgressBarDoted, type CircularProgressBarDotedProps
38
40
  export { default as CircularRating, type CircularRatingProps } from './CircularRating/CircularRating'
39
41
  export { default as CoverageRing, type CoverageRingProps } from './CoverageRing/CoverageRing'
40
42
  export { default as CoverageBarComparison, type CoverageBarComparisonProps, type CoverageBarComparisonItem } from './CoverageBarComparison/CoverageBarComparison'
43
+ export { default as ComparisonBar, type ComparisonBarProps, type ComparisonBarItem } from './ComparisonBar/ComparisonBar'
41
44
  export { default as AllocationComparisonChart, type AllocationComparisonChartProps, type AllocationSegment } from './AllocationComparisonChart/AllocationComparisonChart'
42
45
  export { default as MonthlyStatusGrid, CalendarGlyph, type MonthlyStatusGridProps, type MonthlyStatusGridMonth, type MonthlyStatus, type CalendarGlyphProps } from './MonthlyStatusGrid/MonthlyStatusGrid'
43
46
  export { default as Gauge, type GaugeProps } from './Gauge/Gauge';
@@ -67,6 +70,7 @@ export { default as Overlay, type OverlayProps } from './Overlay/Overlay';
67
70
  export { default as Title, type TitleProps } from './Title/Title';
68
71
  export { default as Screen, type ScreenProps } from './Screen/Screen';
69
72
  export { default as Section } from './Section/Section';
73
+ export { default as Slider, type SliderProps, type SliderHandle } from './Slider/Slider';
70
74
  export { default as Slot, type SlotProps, type SlotLayoutDirection } from './Slot/Slot';
71
75
  export { default as Spinner, type SpinnerProps, type SpinnerColors } from './Spinner/Spinner';
72
76
  export { default as Stepper, type StepperProps } from './Stepper/Stepper';
@@ -126,12 +130,16 @@ export { default as ToastProvider, type ToastProviderProps } from './Toast/Toast
126
130
  export { useToast, addToast, closeToast, closeAll, type ToastOptions, type ToastEntry, type ToastPlacement } from './Toast/useToast';
127
131
  export { default as AmountInput, type AmountInputProps } from './AmountInput/AmountInput';
128
132
  export { default as PageHero, type PageHeroProps } from './PageHero/PageHero';
133
+ export { default as PdpCcCard, type PdpCcCardProps, type PdpCcCardMetric } from './PdpCcCard/PdpCcCard';
129
134
  export { default as Popup, type PopupProps, type PopupRef } from './Popup/Popup';
130
135
  export { default as PortfolioHero, type PortfolioHeroProps } from './PortfolioHero/PortfolioHero';
131
136
  export { default as PlanComparisonCard, type PlanComparisonCardProps, type PlanComparisonColumn, type PlanComparisonRow, type PlanComparisonCellValue } from './PlanComparisonCard/PlanComparisonCard';
137
+ export { default as CompareTable, type CompareTableProps, type CompareTableColumn, type CompareTableRow, type CompareTableCellValue, type CompareTableSection } from './CompareTable/CompareTable';
132
138
  export { default as PoweredByLabel, type PoweredByLabelProps } from './PoweredByLabel/PoweredByLabel';
133
139
  export { default as ProductLabel, type ProductLabelProps } from './ProductLabel/ProductLabel';
140
+ export { default as ProductMerchandisingCard, type ProductMerchandisingCardProps } from './ProductMerchandisingCard/ProductMerchandisingCard';
134
141
  export { default as ProductOverview, type ProductOverviewProps, type ProductOverviewStat } from './ProductOverview/ProductOverview';
142
+ export { default as ProjectionMarker, type ProjectionMarkerProps } from './ProjectionMarker/ProjectionMarker';
135
143
  export { default as ProgressBadge, type ProgressBadgeProps } from './ProgressBadge/ProgressBadge';
136
144
  export { default as SwappableAmount, type SwappableAmountProps } from './SwappableAmount/SwappableAmount';
137
145
  export {
@@ -152,5 +160,6 @@ export { default as StrengthIndicator, type StrengthIndicatorProps, type Strengt
152
160
  export { default as SummaryTile, type SummaryTileProps } from './SummaryTile/SummaryTile';
153
161
  export { default as TestimonialsCard, type TestimonialsCardProps } from './TestimonialsCard/TestimonialsCard';
154
162
  export { default as Text, type TextProps } from './Text/Text';
163
+ export { default as TextSegment, type TextSegmentProps, type TextSegmentRun } from './TextSegment/TextSegment';
155
164
  export { default as SegmentedControl, type SegmentedControlProps, type SegmentedControlItem } from './SegmentedControl/SegmentedControl';
156
165
  export { default as Toggle, type ToggleProps } from './Toggle/Toggle';