jfs-components 0.1.36 → 0.1.48

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 (47) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/lib/commonjs/components/Accordion/Accordion.js +16 -3
  3. package/lib/commonjs/components/AppBar/AppBar.js +118 -93
  4. package/lib/commonjs/components/CompareTable/CompareTable.js +98 -33
  5. package/lib/commonjs/components/FormField/FormField.js +9 -1
  6. package/lib/commonjs/components/FullscreenModal/FullscreenModal.js +4 -14
  7. package/lib/commonjs/components/HelloJioInput/HelloJioInput.js +20 -4
  8. package/lib/commonjs/components/PageHero/PageHero.js +3 -0
  9. package/lib/commonjs/components/ProductMerchandisingCard/ProductMerchandisingCard.js +50 -30
  10. package/lib/commonjs/components/ValueBackMetric/ValueBackMetric.js +117 -89
  11. package/lib/commonjs/components/index.js +7 -1
  12. package/lib/commonjs/design-tokens/Coin Variables-variables-full.json +1 -42204
  13. package/lib/commonjs/icons/registry.js +1 -1
  14. package/lib/module/components/Accordion/Accordion.js +16 -3
  15. package/lib/module/components/AppBar/AppBar.js +116 -93
  16. package/lib/module/components/CompareTable/CompareTable.js +99 -34
  17. package/lib/module/components/FormField/FormField.js +9 -1
  18. package/lib/module/components/FullscreenModal/FullscreenModal.js +4 -14
  19. package/lib/module/components/HelloJioInput/HelloJioInput.js +20 -4
  20. package/lib/module/components/PageHero/PageHero.js +3 -0
  21. package/lib/module/components/ProductMerchandisingCard/ProductMerchandisingCard.js +50 -30
  22. package/lib/module/components/ValueBackMetric/ValueBackMetric.js +120 -93
  23. package/lib/module/components/index.js +1 -1
  24. package/lib/module/design-tokens/Coin Variables-variables-full.json +1 -42204
  25. package/lib/module/icons/registry.js +1 -1
  26. package/lib/typescript/src/components/Accordion/Accordion.d.ts +14 -1
  27. package/lib/typescript/src/components/AppBar/AppBar.d.ts +46 -14
  28. package/lib/typescript/src/components/CompareTable/CompareTable.d.ts +29 -12
  29. package/lib/typescript/src/components/HelloJioInput/HelloJioInput.d.ts +6 -4
  30. package/lib/typescript/src/components/PageHero/PageHero.d.ts +1 -0
  31. package/lib/typescript/src/components/ProductMerchandisingCard/ProductMerchandisingCard.d.ts +8 -1
  32. package/lib/typescript/src/components/ValueBackMetric/ValueBackMetric.d.ts +27 -16
  33. package/lib/typescript/src/components/index.d.ts +1 -1
  34. package/lib/typescript/src/icons/registry.d.ts +1 -1
  35. package/package.json +1 -1
  36. package/src/components/Accordion/Accordion.tsx +61 -33
  37. package/src/components/AppBar/AppBar.tsx +154 -124
  38. package/src/components/CompareTable/CompareTable.tsx +138 -52
  39. package/src/components/FormField/FormField.tsx +7 -0
  40. package/src/components/FullscreenModal/FullscreenModal.tsx +5 -14
  41. package/src/components/HelloJioInput/HelloJioInput.tsx +31 -12
  42. package/src/components/PageHero/PageHero.tsx +5 -0
  43. package/src/components/ProductMerchandisingCard/ProductMerchandisingCard.tsx +63 -30
  44. package/src/components/ValueBackMetric/ValueBackMetric.tsx +178 -104
  45. package/src/components/index.ts +6 -1
  46. package/src/design-tokens/Coin Variables-variables-full.json +1 -42204
  47. package/src/icons/registry.ts +1 -1
@@ -1,7 +1,7 @@
1
- import React from 'react'
1
+ import React, { useMemo } from 'react'
2
2
  import {
3
3
  View,
4
- Text,
4
+ Text as RNText,
5
5
  Pressable,
6
6
  type StyleProp,
7
7
  type ViewStyle,
@@ -11,35 +11,18 @@ import {
11
11
  import { getVariableByName } from '../../design-tokens/figma-variables-resolver'
12
12
  import { EMPTY_MODES, cloneChildrenWithModes } from '../../utils/react-utils'
13
13
  import Icon from '../Icon/Icon'
14
- import Link from '../Link/Link'
14
+ import Text from '../Text/Text'
15
15
  import type { Modes } from '../../design-tokens'
16
16
 
17
17
  const TITLE_LINE_HEIGHT_RATIO = 1.2
18
18
  const VALUE_LINE_HEIGHT_RATIO = 1.2
19
19
  const CAPTION_LINE_HEIGHT_RATIO = 1.5
20
-
21
- // The Figma node binds the header-icon size and the per-part font sizes/weights
22
- // to `valueBackMetric/*` variables, but those tokens are NOT in the committed
23
- // variables snapshot (`npm run tokens -- find valueBackMetric` → no matches).
24
- // They also intentionally differ from the `metricdata/*` typography defaults
25
- // (e.g. `metricdata/value` resolves to 20px/700, whereas this component's value
26
- // is 16px/500). So the sizes/weights below are encoded as literal constants
27
- // matching the Figma design exactly. Colours, gaps and padding DO exist as real
28
- // `metricdata/*` tokens (and match the design), so those resolve through
29
- // `getVariableByName` and stay themeable.
30
- const TITLE_FONT_SIZE = 12
31
- const TITLE_FONT_WEIGHT: TextStyle['fontWeight'] = '500'
32
- const VALUE_FONT_SIZE = 16
33
- const VALUE_FONT_WEIGHT: TextStyle['fontWeight'] = '500'
34
- const CAPTION_FONT_SIZE = 12
35
- const CAPTION_FONT_WEIGHT: TextStyle['fontWeight'] = '400'
36
- const FONT_FAMILY = 'JioType Var'
37
- const CARD_BACKGROUND = '#ffffff'
38
20
  const CARD_MIN_HEIGHT = 82
39
21
  const ICON_SIZE = 18
22
+ const TEXT_WRAP_GAP = 4
23
+
40
24
  // Figma renders the header glyph flush (all `icon/padding/*` tokens are 0); the
41
- // shared Icon pulls padding from those tokens, so mirror MetricData and zero it
42
- // explicitly to keep the icon flush against the title.
25
+ // shared Icon pulls padding from those tokens, so zero it explicitly.
43
26
  const ICON_PADDING_RESET: ViewStyle = {
44
27
  paddingLeft: 0,
45
28
  paddingRight: 0,
@@ -69,19 +52,31 @@ export type ValueBackMetricProps = {
69
52
  value?: string | React.ReactNode
70
53
  /** Muted caption below the value (12px, `#777`). Hidden when omitted. */
71
54
  caption?: string
72
- /** Bottom link label (underlined, brand accent). Hidden when omitted. */
55
+ /**
56
+ * Bottom CTA label rendered as the shared {@link Text} (purple 12px via
57
+ * seeded `Text Appearance: Secondary` + `Text Sizes: Small`). Hidden when
58
+ * omitted. Ignored when the {@link link} slot is provided.
59
+ */
73
60
  linkLabel?: string
74
- /** Fired when the link is pressed. Navigation is the consumer's job. */
61
+ /**
62
+ * Real slot for the bottom CTA. Highest precedence — when provided, these
63
+ * children render instead of the declarative `linkLabel` Text. Seeded
64
+ * `Text Appearance: Secondary` + `Text Sizes: Small` cascade into the slot
65
+ * (so a bare `<Text text="Earn" />` matches the design); child-level modes
66
+ * still win.
67
+ */
68
+ link?: React.ReactNode
69
+ /** Fired when the declarative CTA (`linkLabel`) is pressed. */
75
70
  onLinkPress?: (event: GestureResponderEvent) => void
76
71
  /**
77
72
  * Press handler for the whole card. When set, the card becomes pressable
78
73
  * (rendered through a `Pressable` with `accessibilityRole="button"`).
79
- * Independent of {@link onLinkPress} — the bottom link keeps its own handler.
74
+ * Independent of {@link onLinkPress} — the bottom CTA keeps its own handler.
80
75
  */
81
76
  onPress?: (event: GestureResponderEvent) => void
82
77
  /** Disable interaction when `onPress` is set. */
83
78
  disabled?: boolean
84
- /** Design-token modes for theming. */
79
+ /** Design-token modes for theming. Cascaded to slot children. */
85
80
  modes?: Modes
86
81
  /** Override the container styles. */
87
82
  style?: StyleProp<ViewStyle>
@@ -98,22 +93,114 @@ export type ValueBackMetricProps = {
98
93
  accessibilityLabel?: string
99
94
  }
100
95
 
96
+ interface ValueBackMetricTokens {
97
+ titleColor: string
98
+ titleFontFamily: string
99
+ titleFontSize: number
100
+ titleFontWeight: TextStyle['fontWeight']
101
+ valueColor: string
102
+ valueFontFamily: string
103
+ valueFontSize: number
104
+ valueFontWeight: TextStyle['fontWeight']
105
+ captionColor: string
106
+ captionFontFamily: string
107
+ captionFontSize: number
108
+ captionFontWeight: TextStyle['fontWeight']
109
+ gap: number
110
+ valueWrapGap: number
111
+ paddingHorizontal: number
112
+ paddingVertical: number
113
+ backgroundColor: string
114
+ iconColor: string
115
+ iconSize: number
116
+ }
117
+
118
+ // The `valueBackMetric/*` layout + typography tokens are bound on the Figma
119
+ // node but are NOT yet in the committed variables snapshot
120
+ // (`npm run tokens -- find valueBackMetric` → no matches). Colours and the
121
+ // header-row gap do exist as `metricdata/*` / `icon/*` tokens. Until the
122
+ // export is re-synced, `getVariableByName` returns undefined for the
123
+ // valueBackMetric names and the Figma-node fallbacks below take over.
124
+ function resolveTokens(modes: Modes): ValueBackMetricTokens {
125
+ const titleColor = (getVariableByName('metricdata/title/color', modes) as string | null) ?? '#000000'
126
+ const valueColor = (getVariableByName('metricdata/value/color', modes) as string | null) ?? '#000000'
127
+ const captionColor = (getVariableByName('metricdata/caption/color', modes) as string | null) ?? '#777777'
128
+
129
+ const titleFontFamily =
130
+ (getVariableByName('valueBackMetric/title/fontfamily', modes) as string | null) ?? 'JioType Var'
131
+ const titleFontSize =
132
+ (getVariableByName('valueBackMetric/title/fontsize', modes) as number | null) ?? 12
133
+ const titleFontWeight = String(
134
+ getVariableByName('valueBackMetric/title/fontweight', modes) ?? 500
135
+ ) as TextStyle['fontWeight']
136
+
137
+ const valueFontFamily =
138
+ (getVariableByName('valueBackMetric/value/fontfamily', modes) as string | null) ?? 'JioType Var'
139
+ const valueFontSize =
140
+ (getVariableByName('valueBackMetric/value/fontsize', modes) as number | null) ?? 16
141
+ // Figma binds the value face to JioType Medium; there is no dedicated
142
+ // valueBackMetric/value/fontweight token yet, so fall back to 500.
143
+ const valueFontWeight = '500' as TextStyle['fontWeight']
144
+
145
+ const captionFontFamily =
146
+ (getVariableByName('valueBackMetric/caption/fontfamily', modes) as string | null) ?? 'JioType Var'
147
+ const captionFontSize =
148
+ (getVariableByName('valueBackMetric/caption/fontsize', modes) as number | null) ?? 12
149
+ const captionFontWeight = String(
150
+ getVariableByName('valueBackMetric/caption/fontweight', modes) ?? 400
151
+ ) as TextStyle['fontWeight']
152
+
153
+ const gap = (getVariableByName('valueBackMetric/gap', modes) as number | null) ?? 4
154
+ const valueWrapGap = (getVariableByName('metricdata/valueWrap/gap', modes) as number | null) ?? 4
155
+ // Design padding is 0 — do NOT fall back to metricdata/padding (10).
156
+ const paddingHorizontal =
157
+ (getVariableByName('valueBackMetric/padding/horizontal', modes) as number | null) ?? 0
158
+ const paddingVertical =
159
+ (getVariableByName('valueBackMetric/padding/vertical', modes) as number | null) ?? 0
160
+ const backgroundColor =
161
+ (getVariableByName('valueBackMetric/background/color', modes) as string | null) ?? '#ffffff'
162
+
163
+ const iconColor = (getVariableByName('icon/color', modes) as string | null) ?? '#ad8444'
164
+ const iconSize = (getVariableByName('icon/size', modes) as number | null) ?? ICON_SIZE
165
+
166
+ return {
167
+ titleColor,
168
+ titleFontFamily,
169
+ titleFontSize,
170
+ titleFontWeight,
171
+ valueColor,
172
+ valueFontFamily,
173
+ valueFontSize,
174
+ valueFontWeight,
175
+ captionColor,
176
+ captionFontFamily,
177
+ captionFontSize,
178
+ captionFontWeight,
179
+ gap,
180
+ valueWrapGap,
181
+ paddingHorizontal,
182
+ paddingVertical,
183
+ backgroundColor,
184
+ iconColor,
185
+ iconSize,
186
+ }
187
+ }
188
+
101
189
  /**
102
190
  * ValueBackMetric — a compact, left-aligned "value back" card.
103
191
  *
104
192
  * Stacks a branded header row (icon + `title`, e.g. "JioPoints"), a prominent
105
- * `value`, a muted `caption`, and an optional bottom `linkLabel` (e.g. "Earn").
106
- * `value`, `caption` and `linkLabel` each render only when provided; the header
107
- * (icon + title) always shows.
193
+ * `value`, a muted `caption`, and an optional bottom CTA (`linkLabel` / `link`
194
+ * slot, e.g. "Earn"). `value`, `caption` and the CTA each render only when
195
+ * provided; the header (icon + title) always shows.
108
196
  *
109
- * Colours, gaps and padding resolve from the `metricdata/*` tokens; the header
110
- * glyph from the `icon/*` tokens (default 18px gold); the link entirely from
111
- * the `link/*` + `text/foreground` tokens via the shared {@link Link}, with
112
- * `Text Appearance: Secondary` and `Text Sizes: Small` seeded so it renders
113
- * purple at 12px like the design (caller `modes` win). The per-part font
114
- * sizes/weights come from the Figma `valueBackMetric/*` variables, which are
115
- * not yet in the committed token snapshot, so they are encoded as constants
116
- * matching the design.
197
+ * Colours resolve from the `metricdata/*` tokens; the header glyph from the
198
+ * `icon/*` tokens (default 18px gold); the CTA from the shared {@link Text}
199
+ * with `Text Appearance: Secondary` + `Text Sizes: Small` seeded so it renders
200
+ * purple at 12px like the design (caller `modes` win). Layout/typography
201
+ * follow the Figma `valueBackMetric/*` variables not yet in the committed
202
+ * token snapshot, so they resolve through `getVariableByName` with Figma-node
203
+ * fallbacks.
117
204
  *
118
205
  * @example
119
206
  * ```tsx
@@ -133,6 +220,7 @@ function ValueBackMetric({
133
220
  value,
134
221
  caption,
135
222
  linkLabel,
223
+ link,
136
224
  onLinkPress,
137
225
  onPress,
138
226
  disabled,
@@ -143,76 +231,56 @@ function ValueBackMetric({
143
231
  captionStyle,
144
232
  accessibilityLabel,
145
233
  }: ValueBackMetricProps) {
146
- const titleColor = (getVariableByName('metricdata/title/color', modes) as string | null) ?? '#000000'
147
- const valueColor = (getVariableByName('metricdata/value/color', modes) as string | null) ?? '#000000'
148
- const captionColor = (getVariableByName('metricdata/caption/color', modes) as string | null) ?? '#777777'
149
- // The design's link is purple (`text/foreground` under `Text Appearance:
150
- // Secondary`) at 12px (`link/fontSize` under `Text Sizes: Small`), while the
151
- // header icon keeps the default gold `icon/color`. Seed only the link's
152
- // modes; caller-supplied modes win.
153
- const linkModes = React.useMemo<Modes>(
234
+ const tokens = useMemo(() => resolveTokens(modes), [modes])
235
+
236
+ // Figma Code-Connects the CTA to Text (not Link): purple, no underline.
237
+ // Seed Secondary + Small so it matches the design; caller modes win.
238
+ const linkModes = useMemo<Modes>(
154
239
  () => ({ 'Text Appearance': 'Secondary', 'Text Sizes': 'Small', ...modes }),
155
240
  [modes]
156
241
  )
157
242
 
158
- // The header glyph is token-driven: `icon/color` (gold by default, retinted
159
- // via `AppearanceBrand`) and `icon/size` (18px). Passing them explicitly — as
160
- // MetricData does — makes the glyph deterministic instead of relying on the
161
- // shared Icon's internal token lookups.
162
- const iconColor = (getVariableByName('icon/color', modes) as string | null) ?? '#ad8444'
163
- const iconSize = (getVariableByName('icon/size', modes) as number | null) ?? ICON_SIZE
164
-
165
- const gap = (getVariableByName('metricdata/gap', modes) as number | null) ?? 4
166
- const valueWrapGap = (getVariableByName('metricdata/valueWrap/gap', modes) as number | null) ?? 4
167
- const paddingHorizontal = (getVariableByName('metricdata/padding/horizontal', modes) as number | null) ?? 10
168
- const paddingVertical = (getVariableByName('metricdata/padding/vertical', modes) as number | null) ?? 10
169
-
170
243
  const containerStyle: ViewStyle = {
171
244
  flexDirection: 'column',
172
245
  alignItems: 'flex-start',
173
246
  justifyContent: 'center',
174
- gap,
175
- paddingHorizontal,
176
- paddingVertical,
247
+ gap: tokens.gap,
248
+ paddingHorizontal: tokens.paddingHorizontal,
249
+ paddingVertical: tokens.paddingVertical,
177
250
  minHeight: CARD_MIN_HEIGHT,
178
- backgroundColor: CARD_BACKGROUND,
251
+ backgroundColor: tokens.backgroundColor,
179
252
  }
180
253
 
181
254
  const titleTextStyle: TextStyle = {
182
- color: titleColor,
183
- fontFamily: FONT_FAMILY,
184
- fontSize: TITLE_FONT_SIZE,
185
- fontWeight: TITLE_FONT_WEIGHT,
186
- lineHeight: TITLE_FONT_SIZE * TITLE_LINE_HEIGHT_RATIO,
255
+ color: tokens.titleColor,
256
+ fontFamily: tokens.titleFontFamily,
257
+ fontSize: tokens.titleFontSize,
258
+ fontWeight: tokens.titleFontWeight,
259
+ lineHeight: tokens.titleFontSize * TITLE_LINE_HEIGHT_RATIO,
187
260
  }
188
261
 
189
262
  const valueTextStyle: TextStyle = {
190
- color: valueColor,
191
- fontFamily: FONT_FAMILY,
192
- fontSize: VALUE_FONT_SIZE,
193
- fontWeight: VALUE_FONT_WEIGHT,
194
- lineHeight: VALUE_FONT_SIZE * VALUE_LINE_HEIGHT_RATIO,
263
+ color: tokens.valueColor,
264
+ fontFamily: tokens.valueFontFamily,
265
+ fontSize: tokens.valueFontSize,
266
+ fontWeight: tokens.valueFontWeight,
267
+ lineHeight: tokens.valueFontSize * VALUE_LINE_HEIGHT_RATIO,
195
268
  }
196
269
 
197
270
  const captionTextStyle: TextStyle = {
198
- color: captionColor,
199
- fontFamily: FONT_FAMILY,
200
- fontSize: CAPTION_FONT_SIZE,
201
- fontWeight: CAPTION_FONT_WEIGHT,
202
- lineHeight: CAPTION_FONT_SIZE * CAPTION_LINE_HEIGHT_RATIO,
271
+ color: tokens.captionColor,
272
+ fontFamily: tokens.captionFontFamily,
273
+ fontSize: tokens.captionFontSize,
274
+ fontWeight: tokens.captionFontWeight,
275
+ lineHeight: tokens.captionFontSize * CAPTION_LINE_HEIGHT_RATIO,
203
276
  }
204
277
 
205
- // Mirrors the Figma swap slot, whose preferred instances are `Icon` and
206
- // `Image`. A registry name renders the token-driven `Icon` (18px, gold,
207
- // flush — all from the `icon/*` tokens); a custom node (`<Icon/>`,
208
- // `<Image/>`, anything) renders as-is with `modes` cascaded into it, so an
209
- // Icon instance follows the icon tokens while an Image keeps its own sizing.
210
278
  const iconNode =
211
279
  icon == null ? null : typeof icon === 'string' ? (
212
280
  <Icon
213
281
  iconName={icon}
214
- size={iconSize}
215
- color={iconColor}
282
+ size={tokens.iconSize}
283
+ color={tokens.iconColor}
216
284
  modes={modes}
217
285
  style={ICON_PADDING_RESET}
218
286
  />
@@ -222,6 +290,8 @@ function ValueBackMetric({
222
290
 
223
291
  const hasValue = value !== undefined && value !== null && value !== ''
224
292
  const hasCaption = caption !== undefined && caption !== ''
293
+ const hasLinkSlot = link !== undefined && link !== null && link !== false
294
+ const hasLinkLabel = linkLabel !== undefined && linkLabel !== ''
225
295
 
226
296
  const resolvedLabel =
227
297
  accessibilityLabel ??
@@ -229,43 +299,47 @@ function ValueBackMetric({
229
299
  .filter(Boolean)
230
300
  .join(', ') || undefined)
231
301
 
302
+ // Seed Secondary + Small into the CTA slot too, so a bare `<Text text="Earn" />`
303
+ // matches the design without the consumer re-seeding. Child-level modes still win.
304
+ const ctaNode = hasLinkSlot ? (
305
+ cloneChildrenWithModes(link, linkModes)
306
+ ) : hasLinkLabel ? (
307
+ onLinkPress ? (
308
+ <Pressable
309
+ onPress={onLinkPress}
310
+ accessibilityRole="link"
311
+ accessibilityLabel={linkLabel}
312
+ >
313
+ <Text text={linkLabel} textAlign="Left" modes={linkModes} />
314
+ </Pressable>
315
+ ) : (
316
+ <Text text={linkLabel} textAlign="Left" modes={linkModes} />
317
+ )
318
+ ) : null
319
+
232
320
  const content = (
233
321
  <>
234
- {/* Header row: brand glyph + title (always shown). */}
235
- <View style={{ flexDirection: 'row', alignItems: 'center', gap: valueWrapGap }}>
322
+ <View style={{ flexDirection: 'row', alignItems: 'center', gap: tokens.valueWrapGap }}>
236
323
  {iconNode}
237
324
  {title !== undefined && title !== '' ? (
238
- <Text style={[titleTextStyle, titleStyle]}>{title}</Text>
325
+ <RNText style={[titleTextStyle, titleStyle]}>{title}</RNText>
239
326
  ) : null}
240
327
  </View>
241
328
 
242
- {/* Value + caption block (each optional). */}
243
329
  {hasValue || hasCaption ? (
244
- <View style={{ flexDirection: 'column', alignItems: 'flex-start', gap: 4 }}>
330
+ <View style={{ flexDirection: 'column', alignItems: 'flex-start', gap: TEXT_WRAP_GAP }}>
245
331
  {hasValue ? (
246
332
  typeof value === 'string' ? (
247
- <Text style={[valueTextStyle, valueStyle]}>{value}</Text>
333
+ <RNText style={[valueTextStyle, valueStyle]}>{value}</RNText>
248
334
  ) : (
249
335
  value
250
336
  )
251
337
  ) : null}
252
- {hasCaption ? <Text style={[captionTextStyle, captionStyle]}>{caption}</Text> : null}
338
+ {hasCaption ? <RNText style={[captionTextStyle, captionStyle]}>{caption}</RNText> : null}
253
339
  </View>
254
340
  ) : null}
255
341
 
256
- {/* Bottom link (optional). Fully token-driven via the seeded `linkModes`
257
- (purple 12px, see above). `linkLabel` is checked inline (narrows it to
258
- a non-undefined `string`) and `onPress` is spread conditionally, since
259
- `exactOptionalPropertyTypes` forbids passing `undefined` to Link's
260
- non-`undefined` optional props. */}
261
- {linkLabel ? (
262
- <Link
263
- text={linkLabel}
264
- autolayout="Hug"
265
- modes={linkModes}
266
- {...(onLinkPress ? { onPress: onLinkPress } : null)}
267
- />
268
- ) : null}
342
+ {ctaNode}
269
343
  </>
270
344
  )
271
345
 
@@ -1,7 +1,12 @@
1
1
  export { default as AccountCard, type AccountCardProps, type AccountCardState } from './AccountCard/AccountCard'
2
2
  export { default as ActionFooter, type ActionFooterProps } from './ActionFooter/ActionFooter'
3
3
  export { default as Attached, type AttachedProps, type AttachedPosition } from './Attached/Attached'
4
- export { default as AppBar } from './AppBar/AppBar'
4
+ export {
5
+ default as AppBar,
6
+ JioDot,
7
+ type AppBarProps,
8
+ type JioDotProps,
9
+ } from './AppBar/AppBar'
5
10
  export { default as Avatar, type AvatarProps } from './Avatar/Avatar'
6
11
  export { default as AvatarGroup } from './AvatarGroup/AvatarGroup'
7
12
  export { default as Badge, type BadgeProps, type BadgeType } from './Badge/Badge'