@compsych-ui-components/react-native 4.0.4 → 4.0.13

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 (172) hide show
  1. package/package.json +22 -14
  2. package/src/components/ActionSheet/index.d.ts +16 -0
  3. package/src/components/ActionSheet/index.js +256 -0
  4. package/src/components/ActionSheet/index.js.map +1 -0
  5. package/src/components/Alert/index.d.ts +24 -0
  6. package/src/components/Alert/index.js +304 -0
  7. package/src/components/Alert/index.js.map +1 -0
  8. package/src/components/Avatar/index.d.ts +22 -0
  9. package/src/components/Avatar/index.js +253 -0
  10. package/src/components/Avatar/index.js.map +1 -0
  11. package/src/components/Badge/index.d.ts +12 -0
  12. package/src/components/Badge/index.js +206 -0
  13. package/src/components/Badge/index.js.map +1 -0
  14. package/src/components/BodyText/index.d.ts +9 -0
  15. package/src/components/BodyText/index.js +58 -0
  16. package/src/components/BodyText/index.js.map +1 -0
  17. package/src/components/Breadcrumb/index.d.ts +24 -0
  18. package/src/components/Breadcrumb/index.js +194 -0
  19. package/src/components/Breadcrumb/index.js.map +1 -0
  20. package/src/components/Button/index.d.ts +16 -0
  21. package/src/components/Button/index.js +260 -0
  22. package/src/components/Button/index.js.map +1 -0
  23. package/src/components/Checkbox/index.d.ts +16 -0
  24. package/src/components/Checkbox/index.js +196 -0
  25. package/src/components/Checkbox/index.js.map +1 -0
  26. package/src/components/Chip/index.d.ts +18 -0
  27. package/src/components/Chip/index.js +280 -0
  28. package/src/components/Chip/index.js.map +1 -0
  29. package/src/components/Divider/index.d.ts +11 -0
  30. package/src/components/Divider/index.js +59 -0
  31. package/src/components/Divider/index.js.map +1 -0
  32. package/src/components/EmptyState/index.d.ts +25 -0
  33. package/src/components/EmptyState/index.js +376 -0
  34. package/src/components/EmptyState/index.js.map +1 -0
  35. package/src/components/HeaderText/index.d.ts +9 -0
  36. package/src/components/HeaderText/index.js +62 -0
  37. package/src/components/HeaderText/index.js.map +1 -0
  38. package/src/components/Input/index.d.ts +13 -0
  39. package/src/components/Input/index.js +231 -0
  40. package/src/components/Input/index.js.map +1 -0
  41. package/src/components/List/index.d.ts +19 -0
  42. package/src/components/List/index.js +170 -0
  43. package/src/components/List/index.js.map +1 -0
  44. package/src/components/Pagination/index.d.ts +15 -0
  45. package/src/components/Pagination/index.js +322 -0
  46. package/src/components/Pagination/index.js.map +1 -0
  47. package/src/components/PlanCard/index.d.ts +27 -0
  48. package/src/components/PlanCard/index.js +364 -0
  49. package/src/components/PlanCard/index.js.map +1 -0
  50. package/src/components/ProgressTracker/index.d.ts +26 -0
  51. package/src/components/ProgressTracker/index.js +180 -0
  52. package/src/components/ProgressTracker/index.js.map +1 -0
  53. package/src/components/PromotionCard/index.d.ts +23 -0
  54. package/src/components/PromotionCard/index.js +496 -0
  55. package/src/components/PromotionCard/index.js.map +1 -0
  56. package/src/components/RadioButton/index.d.ts +15 -0
  57. package/src/components/RadioButton/index.js +188 -0
  58. package/src/components/RadioButton/index.js.map +1 -0
  59. package/src/components/ScreenContainer/index.d.ts +15 -0
  60. package/src/components/ScreenContainer/index.js +43 -0
  61. package/src/components/ScreenContainer/index.js.map +1 -0
  62. package/src/components/SegmentedControl/index.d.ts +16 -0
  63. package/src/components/SegmentedControl/index.js +115 -0
  64. package/src/components/SegmentedControl/index.js.map +1 -0
  65. package/src/components/SelectionCard/index.d.ts +16 -0
  66. package/src/components/SelectionCard/index.js +222 -0
  67. package/src/components/SelectionCard/index.js.map +1 -0
  68. package/src/components/ServiceCard/index.d.ts +22 -0
  69. package/src/components/ServiceCard/index.js +385 -0
  70. package/src/components/ServiceCard/index.js.map +1 -0
  71. package/src/components/Slider/index.d.ts +24 -0
  72. package/src/components/Slider/index.js +320 -0
  73. package/src/components/Slider/index.js.map +1 -0
  74. package/src/components/Snackbar/index.d.ts +13 -0
  75. package/src/components/Snackbar/index.js +229 -0
  76. package/src/components/Snackbar/index.js.map +1 -0
  77. package/src/components/Switch/index.d.ts +14 -0
  78. package/src/components/Switch/index.js +221 -0
  79. package/src/components/Switch/index.js.map +1 -0
  80. package/src/components/Tooltip/index.d.ts +21 -0
  81. package/src/components/Tooltip/index.js +206 -0
  82. package/src/components/Tooltip/index.js.map +1 -0
  83. package/src/icons/AtomIcon.d.ts +2 -0
  84. package/src/icons/AtomIcon.js +85 -0
  85. package/src/icons/AtomIcon.js.map +1 -0
  86. package/src/icons/BinocularsIcon.d.ts +2 -0
  87. package/src/icons/BinocularsIcon.js +103 -0
  88. package/src/icons/BinocularsIcon.js.map +1 -0
  89. package/src/icons/FileChartColumnIncreasingIcon.d.ts +2 -0
  90. package/src/icons/FileChartColumnIncreasingIcon.js +97 -0
  91. package/src/icons/FileChartColumnIncreasingIcon.js.map +1 -0
  92. package/src/icons/FlagIcon.d.ts +2 -0
  93. package/src/icons/FlagIcon.js +71 -0
  94. package/src/icons/FlagIcon.js.map +1 -0
  95. package/src/icons/GlobeIcon.d.ts +2 -0
  96. package/src/icons/GlobeIcon.js +71 -0
  97. package/src/icons/GlobeIcon.js.map +1 -0
  98. package/src/icons/GraduationCapIcon.d.ts +2 -0
  99. package/src/icons/GraduationCapIcon.js +85 -0
  100. package/src/icons/GraduationCapIcon.js.map +1 -0
  101. package/src/icons/HandHeartIcon.d.ts +2 -0
  102. package/src/icons/HandHeartIcon.js +91 -0
  103. package/src/icons/HandHeartIcon.js.map +1 -0
  104. package/src/icons/HandshakeIcon.d.ts +2 -0
  105. package/src/icons/HandshakeIcon.js +97 -0
  106. package/src/icons/HandshakeIcon.js.map +1 -0
  107. package/src/icons/HazeIcon.d.ts +2 -0
  108. package/src/icons/HazeIcon.js +115 -0
  109. package/src/icons/HazeIcon.js.map +1 -0
  110. package/src/icons/HeartHandshakeIcon.d.ts +2 -0
  111. package/src/icons/HeartHandshakeIcon.js +71 -0
  112. package/src/icons/HeartHandshakeIcon.js.map +1 -0
  113. package/src/icons/HourglassIcon.d.ts +2 -0
  114. package/src/icons/HourglassIcon.js +91 -0
  115. package/src/icons/HourglassIcon.js.map +1 -0
  116. package/src/icons/IdCardIcon.d.ts +2 -0
  117. package/src/icons/IdCardIcon.js +97 -0
  118. package/src/icons/IdCardIcon.js.map +1 -0
  119. package/src/icons/MessageCirclePlusIcon.d.ts +2 -0
  120. package/src/icons/MessageCirclePlusIcon.js +85 -0
  121. package/src/icons/MessageCirclePlusIcon.js.map +1 -0
  122. package/src/icons/MountainSnowIcon.d.ts +2 -0
  123. package/src/icons/MountainSnowIcon.js +79 -0
  124. package/src/icons/MountainSnowIcon.js.map +1 -0
  125. package/src/icons/SnowflakeIcon.d.ts +2 -0
  126. package/src/icons/SnowflakeIcon.js +139 -0
  127. package/src/icons/SnowflakeIcon.js.map +1 -0
  128. package/src/icons/StethoscopeIcon.d.ts +2 -0
  129. package/src/icons/StethoscopeIcon.js +97 -0
  130. package/src/icons/StethoscopeIcon.js.map +1 -0
  131. package/src/icons/UserRoundIcon.d.ts +2 -0
  132. package/src/icons/UserRoundIcon.js +79 -0
  133. package/src/icons/UserRoundIcon.js.map +1 -0
  134. package/src/icons/WheatIcon.d.ts +2 -0
  135. package/src/icons/WheatIcon.js +115 -0
  136. package/src/icons/WheatIcon.js.map +1 -0
  137. package/src/icons/index.d.ts +22 -0
  138. package/src/icons/index.js +109 -0
  139. package/src/icons/index.js.map +1 -0
  140. package/src/icons/types.d.ts +16 -0
  141. package/src/icons/types.js +52 -0
  142. package/src/icons/types.js.map +1 -0
  143. package/src/index.d.ts +60 -2
  144. package/src/index.js +197 -5
  145. package/src/index.js.map +1 -1
  146. package/src/theme/ThemeContext.d.ts +258 -0
  147. package/src/theme/ThemeContext.js +15 -0
  148. package/src/theme/ThemeContext.js.map +1 -0
  149. package/src/theme/ThemeProvider.d.ts +27 -0
  150. package/src/theme/ThemeProvider.js +66 -0
  151. package/src/theme/ThemeProvider.js.map +1 -0
  152. package/src/theme/defaultTheme.d.ts +13 -0
  153. package/src/theme/defaultTheme.js +14 -0
  154. package/src/theme/defaultTheme.js.map +1 -0
  155. package/src/theme/index.d.ts +5 -0
  156. package/src/theme/index.js +26 -0
  157. package/src/theme/index.js.map +1 -0
  158. package/src/theme/mergeTheme.d.ts +7 -0
  159. package/src/theme/mergeTheme.js +40 -0
  160. package/src/theme/mergeTheme.js.map +1 -0
  161. package/src/theme/types.d.ts +25 -0
  162. package/src/theme/types.js +6 -0
  163. package/src/theme/types.js.map +1 -0
  164. package/src/theme/useTheme.d.ts +10 -0
  165. package/src/theme/useTheme.js +17 -0
  166. package/src/theme/useTheme.js.map +1 -0
  167. package/src/tokens.d.ts +253 -0
  168. package/src/tokens.js +265 -0
  169. package/src/tokens.js.map +1 -0
  170. package/src/lib/button.d.ts +0 -7
  171. package/src/lib/button.js +0 -58
  172. package/src/lib/button.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../packages/react-native/src/components/Alert/index.tsx"],"sourcesContent":["import React from 'react';\r\n\r\nimport {\r\n Pressable,\r\n StyleProp,\r\n StyleSheet,\r\n Text,\r\n View,\r\n ViewStyle,\r\n} from 'react-native';\r\n\r\nimport { Ionicons } from '@expo/vector-icons';\r\n\r\nimport { useTheme } from '../../theme';\r\n\r\nexport type AlertVariant =\r\n | 'default'\r\n | 'elevated'\r\n | 'informative'\r\n | 'warning'\r\n | 'positive'\r\n | 'danger';\r\n\r\nexport type AlertSize = 'sm' | 'lg';\r\n\r\nexport interface AlertProps {\r\n variant?: AlertVariant;\r\n size?: AlertSize;\r\n /** Bold title — lg size only */\r\n title?: string;\r\n /** Body / description text */\r\n description: string;\r\n /** Custom leading icon — overrides the default per-variant icon */\r\n icon?: React.ReactNode;\r\n /** Hide the leading icon entirely */\r\n hideIcon?: boolean;\r\n /** Label for the optional action button */\r\n actionLabel?: string;\r\n onAction?: () => void;\r\n /** Show dismiss (×) button */\r\n dismissible?: boolean;\r\n onDismiss?: () => void;\r\n style?: StyleProp<ViewStyle>;\r\n}\r\n\r\n// ── Variant color map ────────────────────────────────────────────────────────\r\n\r\ntype VariantColors = {\r\n bg: string;\r\n text: string;\r\n iconColor: string;\r\n elevated: boolean;\r\n actionBorder: boolean;\r\n};\r\n\r\ntype ColorRoles = ReturnType<typeof useTheme>['colorRoles'];\r\n\r\nfunction getVariantColors(\r\n variant: AlertVariant,\r\n cr: ColorRoles,\r\n): VariantColors {\r\n switch (variant) {\r\n case 'default':\r\n return {\r\n bg: cr.surface.surfaceContainer.sysSurfaceContainerLow,\r\n text: cr.surface.surface.sysOnSurface,\r\n iconColor: cr.surface.surface.sysOnSurfaceVariant,\r\n elevated: false,\r\n actionBorder: false,\r\n };\r\n case 'elevated':\r\n return {\r\n bg: cr.surface.surfaceContainer.sysSurfaceContainerLowest,\r\n text: cr.surface.surface.sysOnSurface,\r\n iconColor: cr.surface.surface.sysOnSurfaceVariant,\r\n elevated: true,\r\n actionBorder: true,\r\n };\r\n case 'informative':\r\n return {\r\n bg: cr.custom.info.sysInfoContainer,\r\n text: cr.custom.info.sysOnInfoContainer,\r\n iconColor: cr.custom.info.sysOnInfoContainer,\r\n elevated: false,\r\n actionBorder: false,\r\n };\r\n case 'warning':\r\n return {\r\n bg: cr.custom.warning.sysWarningContainer,\r\n text: cr.custom.warning.sysOnWarningContainer,\r\n iconColor: cr.custom.warning.sysOnWarningContainer,\r\n elevated: false,\r\n actionBorder: false,\r\n };\r\n case 'positive':\r\n return {\r\n bg: cr.custom.success.sysSuccessContainer,\r\n text: cr.custom.success.sysOnSuccessContainer,\r\n iconColor: cr.custom.success.sysOnSuccessContainer,\r\n elevated: false,\r\n actionBorder: false,\r\n };\r\n case 'danger':\r\n return {\r\n bg: cr.error.sysErrorContainer,\r\n text: cr.error.sysOnErrorContainer,\r\n iconColor: cr.error.sysOnErrorContainer,\r\n elevated: false,\r\n actionBorder: false,\r\n };\r\n }\r\n}\r\n\r\n// ── Default icon per variant ─────────────────────────────────────────────────\r\n\r\nfunction defaultIconName(\r\n variant: AlertVariant,\r\n): React.ComponentProps<typeof Ionicons>['name'] {\r\n switch (variant) {\r\n case 'default':\r\n case 'elevated':\r\n return 'information-circle-outline';\r\n case 'informative':\r\n return 'information-circle';\r\n case 'warning':\r\n return 'warning';\r\n case 'positive':\r\n return 'checkmark-circle';\r\n case 'danger':\r\n return 'alert-circle';\r\n }\r\n}\r\n\r\n// ── Component ────────────────────────────────────────────────────────────────\r\n\r\nexport function Alert({\r\n variant = 'default',\r\n size = 'lg',\r\n title,\r\n description,\r\n icon,\r\n hideIcon = false,\r\n actionLabel,\r\n onAction,\r\n dismissible = false,\r\n onDismiss,\r\n style,\r\n}: AlertProps) {\r\n const { colorRoles: cr, dimensions: dim, typeScale: ts } = useTheme();\r\n const c = getVariantColors(variant, cr);\r\n const isLg = size === 'lg';\r\n\r\n const resolvedIcon =\r\n !hideIcon &&\r\n (icon ?? (\r\n <Ionicons\r\n name={defaultIconName(variant)}\r\n size={isLg ? 24 : 20}\r\n color={c.iconColor}\r\n />\r\n ));\r\n\r\n return (\r\n <View\r\n accessibilityRole=\"alert\"\r\n accessibilityLiveRegion=\"polite\"\r\n style={[\r\n styles.root,\r\n {\r\n backgroundColor: c.bg,\r\n borderRadius: isLg\r\n ? dim.borderRadius.sysRadiusLg\r\n : dim.borderRadius.sysRadiusMd,\r\n },\r\n c.elevated && styles.elevated,\r\n style,\r\n ]}\r\n >\r\n {/* ── Content row ─────────────────────────────────────────────────── */}\r\n <View\r\n style={[\r\n styles.content,\r\n {\r\n paddingHorizontal: isLg\r\n ? dim.spacing.padding.sysPadding24\r\n : dim.spacing.padding.sysPadding16,\r\n paddingVertical: isLg\r\n ? dim.spacing.padding.sysPadding16\r\n : dim.spacing.padding.sysPadding16,\r\n gap: isLg\r\n ? dim.spacing.padding.sysPadding16\r\n : dim.spacing.padding.sysPadding12,\r\n alignItems: isLg ? 'flex-start' : 'center',\r\n },\r\n ]}\r\n >\r\n {/* Leading icon */}\r\n {resolvedIcon && (\r\n <View\r\n style={{\r\n paddingTop: isLg ? dim.spacing.padding.sysPadding2 : 0,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {resolvedIcon}\r\n </View>\r\n )}\r\n\r\n {/* Text + action */}\r\n <View style={styles.textAction}>\r\n {/* Text block */}\r\n <View style={[styles.textBlock, { gap: 4 }]}>\r\n {isLg && title && (\r\n <Text\r\n style={{\r\n color: c.text,\r\n fontSize: ts.titleSmall.sysFontSize,\r\n lineHeight: ts.titleSmall.sysLineHeight,\r\n fontWeight: '500',\r\n includeFontPadding: false,\r\n }}\r\n >\r\n {title}\r\n </Text>\r\n )}\r\n <Text\r\n style={{\r\n color: c.text,\r\n fontSize: isLg\r\n ? ts.bodyMedium.sysFontSize\r\n : ts.bodySmall.sysFontSize,\r\n lineHeight: isLg\r\n ? ts.bodyMedium.sysLineHeight\r\n : ts.bodySmall.sysLineHeight,\r\n fontWeight: '400',\r\n includeFontPadding: false,\r\n }}\r\n >\r\n {description}\r\n </Text>\r\n </View>\r\n\r\n {/* Action button */}\r\n {actionLabel &&\r\n (isLg ? (\r\n // lg: pill button with white bg + shadow (or border for elevated)\r\n <Pressable\r\n onPress={onAction}\r\n accessibilityRole=\"button\"\r\n accessibilityLabel={actionLabel}\r\n style={({ pressed }) => [\r\n styles.actionLg,\r\n {\r\n backgroundColor:\r\n cr.surface.surfaceContainer.sysSurfaceContainerLowest,\r\n },\r\n c.actionBorder && [\r\n styles.actionLgBorderBase,\r\n { borderColor: cr.outline.sysOutline },\r\n ],\r\n pressed && { opacity: 0.84 },\r\n ]}\r\n >\r\n <Text\r\n style={{\r\n color: cr.surface.surface.sysOnSurface,\r\n fontSize: ts.labelMedium.sysFontSize,\r\n lineHeight: ts.labelMedium.sysLineHeight,\r\n fontWeight: '400',\r\n includeFontPadding: false,\r\n }}\r\n >\r\n {actionLabel}\r\n </Text>\r\n </Pressable>\r\n ) : (\r\n // sm: text-only button\r\n <Pressable\r\n onPress={onAction}\r\n accessibilityRole=\"button\"\r\n accessibilityLabel={actionLabel}\r\n style={styles.actionSm}\r\n >\r\n <Text\r\n style={{\r\n color: c.text,\r\n fontSize: ts.labelMedium.sysFontSize,\r\n lineHeight: ts.labelMedium.sysLineHeight,\r\n fontWeight: '500',\r\n includeFontPadding: false,\r\n }}\r\n >\r\n {actionLabel}\r\n </Text>\r\n </Pressable>\r\n ))}\r\n </View>\r\n\r\n {/* Dismiss button */}\r\n {dismissible && (\r\n <Pressable\r\n onPress={onDismiss}\r\n accessibilityRole=\"button\"\r\n accessibilityLabel=\"Dismiss\"\r\n style={({ pressed }) => [\r\n styles.closeBtn,\r\n isLg ? styles.closeBtnLg : styles.closeBtnSm,\r\n pressed && { opacity: 0.6 },\r\n ]}\r\n >\r\n <Ionicons name=\"close\" size={16} color={c.iconColor} />\r\n </Pressable>\r\n )}\r\n </View>\r\n </View>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n root: {\r\n overflow: 'hidden',\r\n },\r\n elevated: {\r\n shadowColor: '#000',\r\n shadowOffset: { width: 0, height: 2 },\r\n shadowOpacity: 0.06,\r\n shadowRadius: 4,\r\n elevation: 1,\r\n overflow: 'visible',\r\n },\r\n content: {\r\n flexDirection: 'row',\r\n },\r\n textAction: {\r\n flex: 1,\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n minWidth: 0,\r\n gap: 16,\r\n },\r\n textBlock: {\r\n flex: 1,\r\n minWidth: 0,\r\n },\r\n // lg action button — elevated pill (backgroundColor and borderColor applied inline)\r\n actionLg: {\r\n height: 40,\r\n paddingHorizontal: 24,\r\n borderRadius: 9999,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexShrink: 0,\r\n shadowColor: '#000',\r\n shadowOffset: { width: 0, height: 2 },\r\n shadowOpacity: 0.06,\r\n shadowRadius: 4,\r\n elevation: 1,\r\n },\r\n actionLgBorderBase: {\r\n borderWidth: 1,\r\n },\r\n // sm action button — text only\r\n actionSm: {\r\n flexShrink: 0,\r\n },\r\n closeBtn: {\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n borderRadius: 9999,\r\n },\r\n closeBtnLg: {\r\n position: 'absolute',\r\n top: 8,\r\n right: 8,\r\n width: 32,\r\n height: 32,\r\n },\r\n closeBtnSm: {\r\n width: 32,\r\n height: 32,\r\n flexShrink: 0,\r\n },\r\n});\r\n"],"names":["Alert","getVariantColors","variant","cr","bg","surface","surfaceContainer","sysSurfaceContainerLow","text","sysOnSurface","iconColor","sysOnSurfaceVariant","elevated","actionBorder","sysSurfaceContainerLowest","custom","info","sysInfoContainer","sysOnInfoContainer","warning","sysWarningContainer","sysOnWarningContainer","success","sysSuccessContainer","sysOnSuccessContainer","error","sysErrorContainer","sysOnErrorContainer","defaultIconName","size","title","description","icon","hideIcon","actionLabel","onAction","dismissible","onDismiss","style","colorRoles","dimensions","dim","typeScale","ts","useTheme","c","isLg","resolvedIcon","Ionicons","name","color","View","accessibilityRole","accessibilityLiveRegion","styles","root","backgroundColor","borderRadius","sysRadiusLg","sysRadiusMd","content","paddingHorizontal","spacing","padding","sysPadding24","sysPadding16","paddingVertical","gap","sysPadding12","alignItems","paddingTop","sysPadding2","flexShrink","textAction","textBlock","Text","fontSize","titleSmall","sysFontSize","lineHeight","sysLineHeight","fontWeight","includeFontPadding","bodyMedium","bodySmall","Pressable","onPress","accessibilityLabel","pressed","actionLg","actionLgBorderBase","borderColor","outline","sysOutline","opacity","labelMedium","actionSm","closeBtn","closeBtnLg","closeBtnSm","StyleSheet","create","overflow","shadowColor","shadowOffset","width","height","shadowOpacity","shadowRadius","elevation","flexDirection","flex","justifyContent","minWidth","borderWidth","position","top","right"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { ImageSourcePropType, StyleProp, ViewStyle } from 'react-native';
3
+ export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
4
+ export type AvatarVariant = 'text' | 'image' | 'icon';
5
+ export interface AvatarProps {
6
+ variant?: AvatarVariant;
7
+ size?: AvatarSize;
8
+ /** Text variant — up to 2 initials, e.g. "CP" */
9
+ initials?: string;
10
+ /** Image variant — any React Native image source */
11
+ source?: ImageSourcePropType;
12
+ /** Icon variant — custom node; omit to use the default person icon */
13
+ icon?: React.ReactNode;
14
+ /** Renders a coloured ring around the avatar */
15
+ activityRing?: boolean;
16
+ /** Renders a shield-check badge at the bottom-right corner */
17
+ presenceBadge?: boolean;
18
+ /** Accessible label announced by screen readers */
19
+ accessibilityLabel?: string;
20
+ style?: StyleProp<ViewStyle>;
21
+ }
22
+ export declare function Avatar({ variant, size, initials, source, icon, activityRing, presenceBadge, accessibilityLabel, style, }: AvatarProps): React.JSX.Element;
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "Avatar", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return Avatar;
9
+ }
10
+ });
11
+ const _jsxruntime = require("react/jsx-runtime");
12
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
13
+ const _reactnative = require("react-native");
14
+ const _vectoricons = require("@expo/vector-icons");
15
+ const _theme = require("../../theme");
16
+ function _getRequireWildcardCache(nodeInterop) {
17
+ if (typeof WeakMap !== "function") return null;
18
+ var cacheBabelInterop = new WeakMap();
19
+ var cacheNodeInterop = new WeakMap();
20
+ return (_getRequireWildcardCache = function(nodeInterop) {
21
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
22
+ })(nodeInterop);
23
+ }
24
+ function _interop_require_wildcard(obj, nodeInterop) {
25
+ if (!nodeInterop && obj && obj.__esModule) {
26
+ return obj;
27
+ }
28
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
29
+ return {
30
+ default: obj
31
+ };
32
+ }
33
+ var cache = _getRequireWildcardCache(nodeInterop);
34
+ if (cache && cache.has(obj)) {
35
+ return cache.get(obj);
36
+ }
37
+ var newObj = {
38
+ __proto__: null
39
+ };
40
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
41
+ for(var key in obj){
42
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
43
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
44
+ if (desc && (desc.get || desc.set)) {
45
+ Object.defineProperty(newObj, key, desc);
46
+ } else {
47
+ newObj[key] = obj[key];
48
+ }
49
+ }
50
+ }
51
+ newObj.default = obj;
52
+ if (cache) {
53
+ cache.set(obj, newObj);
54
+ }
55
+ return newObj;
56
+ }
57
+ function Avatar({ variant = 'text', size = 'md', initials = 'CP', source, icon, activityRing = false, presenceBadge = false, accessibilityLabel, style }) {
58
+ const { colorRoles: cr, dimensions: dim, typeScale: ts } = (0, _theme.useTheme)();
59
+ const sizeTokens = (0, _react.useMemo)(()=>({
60
+ xs: {
61
+ diameter: 24,
62
+ fontSize: ts.labelSmall.sysFontSize,
63
+ lineHeight: ts.labelSmall.sysLineHeight,
64
+ fontWeight: '400',
65
+ iconSize: 12,
66
+ ringBorder: dim.borderWidth.sysStrokeMedium,
67
+ ringInset: -1,
68
+ badgeSize: 0,
69
+ badgeIconSize: 0,
70
+ badgeOffset: 0
71
+ },
72
+ sm: {
73
+ diameter: 32,
74
+ fontSize: ts.labelMedium.sysFontSize,
75
+ lineHeight: ts.labelMedium.sysLineHeight,
76
+ fontWeight: '400',
77
+ iconSize: 16,
78
+ ringBorder: dim.borderWidth.sysStrokeMedium,
79
+ ringInset: -2,
80
+ badgeSize: 16,
81
+ badgeIconSize: 12,
82
+ badgeOffset: -4
83
+ },
84
+ md: {
85
+ diameter: 40,
86
+ fontSize: ts.labelLarge.sysFontSize,
87
+ lineHeight: ts.labelLarge.sysLineHeight,
88
+ fontWeight: '500',
89
+ iconSize: 20,
90
+ ringBorder: dim.borderWidth.sysStrokeThick,
91
+ ringInset: -2,
92
+ badgeSize: 20,
93
+ badgeIconSize: 16,
94
+ badgeOffset: -4
95
+ },
96
+ lg: {
97
+ diameter: 48,
98
+ fontSize: ts.labelLarge.sysFontSize,
99
+ lineHeight: ts.labelLarge.sysLineHeight,
100
+ fontWeight: '500',
101
+ iconSize: 24,
102
+ ringBorder: dim.borderWidth.sysStrokeThick,
103
+ ringInset: -2,
104
+ badgeSize: 20,
105
+ badgeIconSize: 16,
106
+ badgeOffset: -4
107
+ },
108
+ xl: {
109
+ diameter: 64,
110
+ fontSize: ts.labelLarge.sysFontSize,
111
+ lineHeight: ts.labelLarge.sysLineHeight,
112
+ fontWeight: '500',
113
+ iconSize: 32,
114
+ ringBorder: dim.borderWidth.sysStrokeThick,
115
+ ringInset: -2,
116
+ badgeSize: 24,
117
+ badgeIconSize: 20,
118
+ badgeOffset: -4
119
+ },
120
+ '2xl': {
121
+ diameter: 88,
122
+ fontSize: ts.titleMedium.sysFontSize,
123
+ lineHeight: ts.titleMedium.sysLineHeight,
124
+ fontWeight: '400',
125
+ iconSize: 44,
126
+ ringBorder: dim.borderWidth.sysStrokeBold,
127
+ ringInset: -2,
128
+ badgeSize: 32,
129
+ badgeIconSize: 24,
130
+ badgeOffset: 0
131
+ },
132
+ '3xl': {
133
+ diameter: 120,
134
+ fontSize: ts.titleLarge.sysFontSize,
135
+ lineHeight: ts.titleLarge.sysLineHeight,
136
+ fontWeight: '500',
137
+ iconSize: 60,
138
+ ringBorder: dim.borderWidth.sysStrokeBold,
139
+ ringInset: -2,
140
+ badgeSize: 32,
141
+ badgeIconSize: 24,
142
+ badgeOffset: 0
143
+ }
144
+ }), [
145
+ dim,
146
+ ts
147
+ ]);
148
+ const s = sizeTokens[size];
149
+ const r = s.diameter / 2;
150
+ const defaultLabel = variant === 'text' ? `Avatar: ${initials}` : 'Avatar';
151
+ return(// Outer wrapper — same footprint as avatar, does NOT clip so ring/badge
152
+ // can overflow its bounds freely.
153
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_reactnative.View, {
154
+ accessible: true,
155
+ accessibilityRole: "image",
156
+ accessibilityLabel: accessibilityLabel ?? defaultLabel,
157
+ style: [
158
+ {
159
+ width: s.diameter,
160
+ height: s.diameter
161
+ },
162
+ style
163
+ ],
164
+ children: [
165
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)(_reactnative.View, {
166
+ style: [
167
+ styles.circle,
168
+ {
169
+ width: s.diameter,
170
+ height: s.diameter,
171
+ borderRadius: r,
172
+ backgroundColor: variant !== 'image' ? cr.custom.info.sysInfoContainer : undefined
173
+ }
174
+ ],
175
+ children: [
176
+ variant === 'text' && /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.Text, {
177
+ style: {
178
+ color: cr.custom.info.sysOnInfoContainer,
179
+ fontSize: s.fontSize,
180
+ lineHeight: s.lineHeight,
181
+ fontWeight: s.fontWeight,
182
+ includeFontPadding: false,
183
+ textAlign: 'center'
184
+ },
185
+ numberOfLines: 1,
186
+ children: initials
187
+ }),
188
+ variant === 'image' && source && /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.Image, {
189
+ source: source,
190
+ style: {
191
+ width: s.diameter,
192
+ height: s.diameter
193
+ },
194
+ resizeMode: "cover"
195
+ }),
196
+ variant === 'icon' && (icon ?? /*#__PURE__*/ (0, _jsxruntime.jsx)(_vectoricons.Ionicons, {
197
+ name: "person",
198
+ size: s.iconSize,
199
+ color: cr.custom.info.sysOnInfoContainer
200
+ }))
201
+ ]
202
+ }),
203
+ activityRing && /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.View, {
204
+ accessible: false,
205
+ style: {
206
+ position: 'absolute',
207
+ top: s.ringInset,
208
+ left: s.ringInset,
209
+ right: s.ringInset,
210
+ bottom: s.ringInset,
211
+ borderRadius: r + Math.abs(s.ringInset),
212
+ borderWidth: s.ringBorder,
213
+ borderColor: cr.accent.primary.sysPrimary
214
+ },
215
+ pointerEvents: "none"
216
+ }),
217
+ presenceBadge && s.badgeSize > 0 && /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.View, {
218
+ accessible: false,
219
+ style: [
220
+ styles.badge,
221
+ {
222
+ width: s.badgeSize,
223
+ height: s.badgeSize,
224
+ borderRadius: s.badgeSize / 2,
225
+ bottom: s.badgeOffset,
226
+ right: s.badgeOffset,
227
+ backgroundColor: cr.surface.surfaceContainer.sysSurfaceContainerLowest
228
+ }
229
+ ],
230
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_vectoricons.Ionicons, {
231
+ name: "shield-checkmark",
232
+ size: s.badgeIconSize,
233
+ color: cr.custom.info.sysOnInfoContainer
234
+ })
235
+ })
236
+ ]
237
+ }));
238
+ }
239
+ const styles = _reactnative.StyleSheet.create({
240
+ circle: {
241
+ alignItems: 'center',
242
+ justifyContent: 'center',
243
+ overflow: 'hidden'
244
+ },
245
+ badge: {
246
+ position: 'absolute',
247
+ alignItems: 'center',
248
+ justifyContent: 'center',
249
+ overflow: 'hidden'
250
+ }
251
+ });
252
+
253
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../packages/react-native/src/components/Avatar/index.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\n\r\nimport {\r\n Image,\r\n ImageSourcePropType,\r\n StyleProp,\r\n StyleSheet,\r\n Text,\r\n View,\r\n ViewStyle,\r\n} from 'react-native';\r\n\r\nimport { Ionicons } from '@expo/vector-icons';\r\n\r\nimport { useTheme } from '../../theme';\r\n\r\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';\r\nexport type AvatarVariant = 'text' | 'image' | 'icon';\r\n\r\nexport interface AvatarProps {\r\n variant?: AvatarVariant;\r\n size?: AvatarSize;\r\n /** Text variant — up to 2 initials, e.g. \"CP\" */\r\n initials?: string;\r\n /** Image variant — any React Native image source */\r\n source?: ImageSourcePropType;\r\n /** Icon variant — custom node; omit to use the default person icon */\r\n icon?: React.ReactNode;\r\n /** Renders a coloured ring around the avatar */\r\n activityRing?: boolean;\r\n /** Renders a shield-check badge at the bottom-right corner */\r\n presenceBadge?: boolean;\r\n /** Accessible label announced by screen readers */\r\n accessibilityLabel?: string;\r\n style?: StyleProp<ViewStyle>;\r\n}\r\n\r\nexport function Avatar({\r\n variant = 'text',\r\n size = 'md',\r\n initials = 'CP',\r\n source,\r\n icon,\r\n activityRing = false,\r\n presenceBadge = false,\r\n accessibilityLabel,\r\n style,\r\n}: AvatarProps) {\r\n const { colorRoles: cr, dimensions: dim, typeScale: ts } = useTheme();\r\n\r\n const sizeTokens = useMemo(\r\n () => ({\r\n xs: {\r\n diameter: 24,\r\n fontSize: ts.labelSmall.sysFontSize,\r\n lineHeight: ts.labelSmall.sysLineHeight,\r\n fontWeight: '400' as const,\r\n iconSize: 12,\r\n ringBorder: dim.borderWidth.sysStrokeMedium,\r\n ringInset: -1,\r\n badgeSize: 0,\r\n badgeIconSize: 0,\r\n badgeOffset: 0,\r\n },\r\n sm: {\r\n diameter: 32,\r\n fontSize: ts.labelMedium.sysFontSize,\r\n lineHeight: ts.labelMedium.sysLineHeight,\r\n fontWeight: '400' as const,\r\n iconSize: 16,\r\n ringBorder: dim.borderWidth.sysStrokeMedium,\r\n ringInset: -2,\r\n badgeSize: 16,\r\n badgeIconSize: 12,\r\n badgeOffset: -4,\r\n },\r\n md: {\r\n diameter: 40,\r\n fontSize: ts.labelLarge.sysFontSize,\r\n lineHeight: ts.labelLarge.sysLineHeight,\r\n fontWeight: '500' as const,\r\n iconSize: 20,\r\n ringBorder: dim.borderWidth.sysStrokeThick,\r\n ringInset: -2,\r\n badgeSize: 20,\r\n badgeIconSize: 16,\r\n badgeOffset: -4,\r\n },\r\n lg: {\r\n diameter: 48,\r\n fontSize: ts.labelLarge.sysFontSize,\r\n lineHeight: ts.labelLarge.sysLineHeight,\r\n fontWeight: '500' as const,\r\n iconSize: 24,\r\n ringBorder: dim.borderWidth.sysStrokeThick,\r\n ringInset: -2,\r\n badgeSize: 20,\r\n badgeIconSize: 16,\r\n badgeOffset: -4,\r\n },\r\n xl: {\r\n diameter: 64,\r\n fontSize: ts.labelLarge.sysFontSize,\r\n lineHeight: ts.labelLarge.sysLineHeight,\r\n fontWeight: '500' as const,\r\n iconSize: 32,\r\n ringBorder: dim.borderWidth.sysStrokeThick,\r\n ringInset: -2,\r\n badgeSize: 24,\r\n badgeIconSize: 20,\r\n badgeOffset: -4,\r\n },\r\n '2xl': {\r\n diameter: 88,\r\n fontSize: ts.titleMedium.sysFontSize,\r\n lineHeight: ts.titleMedium.sysLineHeight,\r\n fontWeight: '400' as const,\r\n iconSize: 44,\r\n ringBorder: dim.borderWidth.sysStrokeBold,\r\n ringInset: -2,\r\n badgeSize: 32,\r\n badgeIconSize: 24,\r\n badgeOffset: 0,\r\n },\r\n '3xl': {\r\n diameter: 120,\r\n fontSize: ts.titleLarge.sysFontSize,\r\n lineHeight: ts.titleLarge.sysLineHeight,\r\n fontWeight: '500' as const,\r\n iconSize: 60,\r\n ringBorder: dim.borderWidth.sysStrokeBold,\r\n ringInset: -2,\r\n badgeSize: 32,\r\n badgeIconSize: 24,\r\n badgeOffset: 0,\r\n },\r\n }),\r\n [dim, ts],\r\n );\r\n\r\n const s = sizeTokens[size];\r\n const r = s.diameter / 2;\r\n\r\n const defaultLabel = variant === 'text' ? `Avatar: ${initials}` : 'Avatar';\r\n\r\n return (\r\n // Outer wrapper — same footprint as avatar, does NOT clip so ring/badge\r\n // can overflow its bounds freely.\r\n <View\r\n accessible\r\n accessibilityRole=\"image\"\r\n accessibilityLabel={accessibilityLabel ?? defaultLabel}\r\n style={[{ width: s.diameter, height: s.diameter }, style]}\r\n >\r\n {/* ── Avatar circle ─────────────────────────────────────────────── */}\r\n <View\r\n style={[\r\n styles.circle,\r\n {\r\n width: s.diameter,\r\n height: s.diameter,\r\n borderRadius: r,\r\n backgroundColor:\r\n variant !== 'image' ? cr.custom.info.sysInfoContainer : undefined,\r\n },\r\n ]}\r\n >\r\n {variant === 'text' && (\r\n <Text\r\n style={{\r\n color: cr.custom.info.sysOnInfoContainer,\r\n fontSize: s.fontSize,\r\n lineHeight: s.lineHeight,\r\n fontWeight: s.fontWeight,\r\n includeFontPadding: false,\r\n textAlign: 'center',\r\n }}\r\n numberOfLines={1}\r\n >\r\n {initials}\r\n </Text>\r\n )}\r\n\r\n {variant === 'image' && source && (\r\n <Image\r\n source={source}\r\n style={{ width: s.diameter, height: s.diameter }}\r\n resizeMode=\"cover\"\r\n />\r\n )}\r\n\r\n {variant === 'icon' &&\r\n (icon ?? (\r\n <Ionicons\r\n name=\"person\"\r\n size={s.iconSize}\r\n color={cr.custom.info.sysOnInfoContainer}\r\n />\r\n ))}\r\n </View>\r\n\r\n {/* ── Activity ring ─────────────────────────────────────────────── */}\r\n {activityRing && (\r\n <View\r\n accessible={false}\r\n style={{\r\n position: 'absolute',\r\n top: s.ringInset,\r\n left: s.ringInset,\r\n right: s.ringInset,\r\n bottom: s.ringInset,\r\n borderRadius: r + Math.abs(s.ringInset),\r\n borderWidth: s.ringBorder,\r\n borderColor: cr.accent.primary.sysPrimary,\r\n }}\r\n pointerEvents=\"none\"\r\n />\r\n )}\r\n\r\n {/* ── Presence badge ────────────────────────────────────────────── */}\r\n {presenceBadge && s.badgeSize > 0 && (\r\n <View\r\n accessible={false}\r\n style={[\r\n styles.badge,\r\n {\r\n width: s.badgeSize,\r\n height: s.badgeSize,\r\n borderRadius: s.badgeSize / 2,\r\n bottom: s.badgeOffset,\r\n right: s.badgeOffset,\r\n backgroundColor:\r\n cr.surface.surfaceContainer.sysSurfaceContainerLowest,\r\n },\r\n ]}\r\n >\r\n <Ionicons\r\n name=\"shield-checkmark\"\r\n size={s.badgeIconSize}\r\n color={cr.custom.info.sysOnInfoContainer}\r\n />\r\n </View>\r\n )}\r\n </View>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n circle: {\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n overflow: 'hidden', // clips images to the circle\r\n },\r\n badge: {\r\n position: 'absolute',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n overflow: 'hidden',\r\n },\r\n});\r\n"],"names":["Avatar","variant","size","initials","source","icon","activityRing","presenceBadge","accessibilityLabel","style","colorRoles","cr","dimensions","dim","typeScale","ts","useTheme","sizeTokens","useMemo","xs","diameter","fontSize","labelSmall","sysFontSize","lineHeight","sysLineHeight","fontWeight","iconSize","ringBorder","borderWidth","sysStrokeMedium","ringInset","badgeSize","badgeIconSize","badgeOffset","sm","labelMedium","md","labelLarge","sysStrokeThick","lg","xl","titleMedium","sysStrokeBold","titleLarge","s","r","defaultLabel","View","accessible","accessibilityRole","width","height","styles","circle","borderRadius","backgroundColor","custom","info","sysInfoContainer","undefined","Text","color","sysOnInfoContainer","includeFontPadding","textAlign","numberOfLines","Image","resizeMode","Ionicons","name","position","top","left","right","bottom","Math","abs","borderColor","accent","primary","sysPrimary","pointerEvents","badge","surface","surfaceContainer","sysSurfaceContainerLowest","StyleSheet","create","alignItems","justifyContent","overflow"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { StyleProp, ViewStyle } from 'react-native';
3
+ export type BadgeSize = 'sm' | 'md' | 'lg';
4
+ export type BadgeStyle = 'filled' | 'positive' | 'danger' | 'elevated' | 'tonal' | 'dot';
5
+ export interface BadgeProps {
6
+ /** Number or short string to display — ignored for `dot` style */
7
+ label?: number | string;
8
+ size?: BadgeSize;
9
+ badgeStyle?: BadgeStyle;
10
+ style?: StyleProp<ViewStyle>;
11
+ }
12
+ export declare function Badge({ label, size, badgeStyle, style, }: BadgeProps): React.JSX.Element;
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "Badge", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return Badge;
9
+ }
10
+ });
11
+ const _jsxruntime = require("react/jsx-runtime");
12
+ const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
13
+ const _reactnative = require("react-native");
14
+ const _theme = require("../../theme");
15
+ function _getRequireWildcardCache(nodeInterop) {
16
+ if (typeof WeakMap !== "function") return null;
17
+ var cacheBabelInterop = new WeakMap();
18
+ var cacheNodeInterop = new WeakMap();
19
+ return (_getRequireWildcardCache = function(nodeInterop) {
20
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
21
+ })(nodeInterop);
22
+ }
23
+ function _interop_require_wildcard(obj, nodeInterop) {
24
+ if (!nodeInterop && obj && obj.__esModule) {
25
+ return obj;
26
+ }
27
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
28
+ return {
29
+ default: obj
30
+ };
31
+ }
32
+ var cache = _getRequireWildcardCache(nodeInterop);
33
+ if (cache && cache.has(obj)) {
34
+ return cache.get(obj);
35
+ }
36
+ var newObj = {
37
+ __proto__: null
38
+ };
39
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
40
+ for(var key in obj){
41
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
42
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
43
+ if (desc && (desc.get || desc.set)) {
44
+ Object.defineProperty(newObj, key, desc);
45
+ } else {
46
+ newObj[key] = obj[key];
47
+ }
48
+ }
49
+ }
50
+ newObj.default = obj;
51
+ if (cache) {
52
+ cache.set(obj, newObj);
53
+ }
54
+ return newObj;
55
+ }
56
+ function getStyleColors(style, cr) {
57
+ switch(style){
58
+ case 'filled':
59
+ return {
60
+ bg: cr.accent.primary.sysPrimary,
61
+ text: cr.accent.primary.sysOnPrimary,
62
+ elevated: false
63
+ };
64
+ case 'positive':
65
+ return {
66
+ bg: cr.custom.success.sysSuccess,
67
+ text: cr.custom.success.sysOnSuccess,
68
+ elevated: false
69
+ };
70
+ case 'danger':
71
+ return {
72
+ bg: cr.error.sysError,
73
+ text: cr.error.sysOnError,
74
+ elevated: false
75
+ };
76
+ case 'elevated':
77
+ return {
78
+ bg: cr.surface.surfaceContainer.sysSurfaceContainerLowest,
79
+ text: cr.surface.surface.sysOnSurface,
80
+ elevated: true
81
+ };
82
+ case 'tonal':
83
+ return {
84
+ bg: cr.surface.surfaceContainer.sysSurfaceContainer,
85
+ text: cr.surface.surface.sysOnSurface,
86
+ elevated: false
87
+ };
88
+ case 'dot':
89
+ // Container is transparent; the dot itself is sysPrimary
90
+ return {
91
+ bg: 'transparent',
92
+ text: 'transparent',
93
+ elevated: false
94
+ };
95
+ }
96
+ }
97
+ function Badge({ label, size = 'md', badgeStyle = 'filled', style }) {
98
+ const { colorRoles: cr, dimensions: dim, typeScale: ts } = (0, _theme.useTheme)();
99
+ const sizeTokens = (0, _react.useMemo)(()=>({
100
+ sm: {
101
+ outerSize: 16,
102
+ paddingH: dim.spacing.padding.sysPadding4,
103
+ fontSize: ts.labelSmall.sysFontSize,
104
+ lineHeight: ts.labelSmall.sysLineHeight,
105
+ letterSpacing: ts.labelSmall.sysTracking,
106
+ dotInner: 6
107
+ },
108
+ md: {
109
+ outerSize: 20,
110
+ paddingH: dim.spacing.padding.sysPadding8,
111
+ fontSize: ts.labelMedium.sysFontSize,
112
+ lineHeight: ts.labelMedium.sysLineHeight,
113
+ letterSpacing: ts.labelMedium.sysTracking,
114
+ dotInner: 8
115
+ },
116
+ lg: {
117
+ outerSize: 24,
118
+ paddingH: dim.spacing.padding.sysPadding8,
119
+ fontSize: ts.labelMedium.sysFontSize,
120
+ lineHeight: ts.labelMedium.sysLineHeight,
121
+ letterSpacing: ts.labelMedium.sysTracking,
122
+ dotInner: 12
123
+ }
124
+ }), [
125
+ dim,
126
+ ts
127
+ ]);
128
+ const s = sizeTokens[size];
129
+ const c = getStyleColors(badgeStyle, cr);
130
+ // Dot variant — render a solid filled circle inside a transparent wrapper
131
+ if (badgeStyle === 'dot') {
132
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.View, {
133
+ accessible: false,
134
+ style: [
135
+ {
136
+ width: s.outerSize,
137
+ height: s.outerSize,
138
+ borderRadius: s.outerSize / 2,
139
+ alignItems: 'center',
140
+ justifyContent: 'center'
141
+ },
142
+ style
143
+ ],
144
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.View, {
145
+ style: {
146
+ width: s.dotInner,
147
+ height: s.dotInner,
148
+ borderRadius: s.dotInner / 2,
149
+ backgroundColor: cr.accent.primary.sysPrimary
150
+ }
151
+ })
152
+ });
153
+ }
154
+ // Number/text badge — pill that is at minimum a circle, grows wider for
155
+ // longer labels (e.g. "99+")
156
+ const displayLabel = label !== undefined ? String(label) : '';
157
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.View, {
158
+ accessible: true,
159
+ accessibilityLabel: displayLabel ? `${displayLabel} badge` : 'Badge',
160
+ style: [
161
+ styles.root,
162
+ {
163
+ minWidth: s.outerSize,
164
+ height: s.outerSize,
165
+ borderRadius: s.outerSize / 2,
166
+ paddingHorizontal: s.paddingH,
167
+ backgroundColor: c.bg
168
+ },
169
+ c.elevated && styles.elevated,
170
+ style
171
+ ],
172
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_reactnative.Text, {
173
+ style: {
174
+ color: c.text,
175
+ fontSize: s.fontSize,
176
+ lineHeight: s.lineHeight,
177
+ letterSpacing: s.letterSpacing,
178
+ fontWeight: '500',
179
+ includeFontPadding: false,
180
+ textAlign: 'center'
181
+ },
182
+ numberOfLines: 1,
183
+ children: displayLabel
184
+ })
185
+ });
186
+ }
187
+ const styles = _reactnative.StyleSheet.create({
188
+ root: {
189
+ alignItems: 'center',
190
+ justifyContent: 'center',
191
+ // overflow visible so elevated shadow renders outside the pill
192
+ overflow: 'visible'
193
+ },
194
+ elevated: {
195
+ shadowColor: '#000',
196
+ shadowOffset: {
197
+ width: 0,
198
+ height: 2
199
+ },
200
+ shadowOpacity: 0.06,
201
+ shadowRadius: 4,
202
+ elevation: 1
203
+ }
204
+ });
205
+
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../packages/react-native/src/components/Badge/index.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\r\n\r\nimport { StyleProp, StyleSheet, Text, View, ViewStyle } from 'react-native';\r\n\r\nimport { useTheme } from '../../theme';\r\n\r\nexport type BadgeSize = 'sm' | 'md' | 'lg';\r\nexport type BadgeStyle =\r\n | 'filled'\r\n | 'positive'\r\n | 'danger'\r\n | 'elevated'\r\n | 'tonal'\r\n | 'dot';\r\n\r\nexport interface BadgeProps {\r\n /** Number or short string to display — ignored for `dot` style */\r\n label?: number | string;\r\n size?: BadgeSize;\r\n badgeStyle?: BadgeStyle;\r\n style?: StyleProp<ViewStyle>;\r\n}\r\n\r\n// ── Style/color tokens ────────────────────────────────────────────────────────\r\n\r\ntype StyleColors = {\r\n bg: string;\r\n text: string;\r\n elevated: boolean;\r\n};\r\n\r\ntype ColorRoles = ReturnType<typeof useTheme>['colorRoles'];\r\n\r\nfunction getStyleColors(style: BadgeStyle, cr: ColorRoles): StyleColors {\r\n switch (style) {\r\n case 'filled':\r\n return {\r\n bg: cr.accent.primary.sysPrimary,\r\n text: cr.accent.primary.sysOnPrimary,\r\n elevated: false,\r\n };\r\n case 'positive':\r\n return {\r\n bg: cr.custom.success.sysSuccess,\r\n text: cr.custom.success.sysOnSuccess,\r\n elevated: false,\r\n };\r\n case 'danger':\r\n return {\r\n bg: cr.error.sysError,\r\n text: cr.error.sysOnError,\r\n elevated: false,\r\n };\r\n case 'elevated':\r\n return {\r\n bg: cr.surface.surfaceContainer.sysSurfaceContainerLowest,\r\n text: cr.surface.surface.sysOnSurface,\r\n elevated: true,\r\n };\r\n case 'tonal':\r\n return {\r\n bg: cr.surface.surfaceContainer.sysSurfaceContainer,\r\n text: cr.surface.surface.sysOnSurface,\r\n elevated: false,\r\n };\r\n case 'dot':\r\n // Container is transparent; the dot itself is sysPrimary\r\n return {\r\n bg: 'transparent',\r\n text: 'transparent',\r\n elevated: false,\r\n };\r\n }\r\n}\r\n\r\n// ── Component ─────────────────────────────────────────────────────────────────\r\n\r\nexport function Badge({\r\n label,\r\n size = 'md',\r\n badgeStyle = 'filled',\r\n style,\r\n}: BadgeProps) {\r\n const { colorRoles: cr, dimensions: dim, typeScale: ts } = useTheme();\r\n\r\n const sizeTokens = useMemo(\r\n () => ({\r\n sm: {\r\n outerSize: 16,\r\n paddingH: dim.spacing.padding.sysPadding4,\r\n fontSize: ts.labelSmall.sysFontSize,\r\n lineHeight: ts.labelSmall.sysLineHeight,\r\n letterSpacing: ts.labelSmall.sysTracking,\r\n dotInner: 6,\r\n },\r\n md: {\r\n outerSize: 20,\r\n paddingH: dim.spacing.padding.sysPadding8,\r\n fontSize: ts.labelMedium.sysFontSize,\r\n lineHeight: ts.labelMedium.sysLineHeight,\r\n letterSpacing: ts.labelMedium.sysTracking,\r\n dotInner: 8,\r\n },\r\n lg: {\r\n outerSize: 24,\r\n paddingH: dim.spacing.padding.sysPadding8,\r\n fontSize: ts.labelMedium.sysFontSize,\r\n lineHeight: ts.labelMedium.sysLineHeight,\r\n letterSpacing: ts.labelMedium.sysTracking,\r\n dotInner: 12,\r\n },\r\n }),\r\n [dim, ts],\r\n );\r\n\r\n const s = sizeTokens[size];\r\n const c = getStyleColors(badgeStyle, cr);\r\n\r\n // Dot variant — render a solid filled circle inside a transparent wrapper\r\n if (badgeStyle === 'dot') {\r\n return (\r\n <View\r\n accessible={false}\r\n style={[\r\n {\r\n width: s.outerSize,\r\n height: s.outerSize,\r\n borderRadius: s.outerSize / 2,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n },\r\n style,\r\n ]}\r\n >\r\n <View\r\n style={{\r\n width: s.dotInner,\r\n height: s.dotInner,\r\n borderRadius: s.dotInner / 2,\r\n backgroundColor: cr.accent.primary.sysPrimary,\r\n }}\r\n />\r\n </View>\r\n );\r\n }\r\n\r\n // Number/text badge — pill that is at minimum a circle, grows wider for\r\n // longer labels (e.g. \"99+\")\r\n const displayLabel = label !== undefined ? String(label) : '';\r\n\r\n return (\r\n <View\r\n accessible\r\n accessibilityLabel={displayLabel ? `${displayLabel} badge` : 'Badge'}\r\n style={[\r\n styles.root,\r\n {\r\n minWidth: s.outerSize,\r\n height: s.outerSize,\r\n borderRadius: s.outerSize / 2,\r\n paddingHorizontal: s.paddingH,\r\n backgroundColor: c.bg,\r\n },\r\n c.elevated && styles.elevated,\r\n style,\r\n ]}\r\n >\r\n <Text\r\n style={{\r\n color: c.text,\r\n fontSize: s.fontSize,\r\n lineHeight: s.lineHeight,\r\n letterSpacing: s.letterSpacing,\r\n fontWeight: '500',\r\n includeFontPadding: false,\r\n textAlign: 'center',\r\n }}\r\n numberOfLines={1}\r\n >\r\n {displayLabel}\r\n </Text>\r\n </View>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n root: {\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n // overflow visible so elevated shadow renders outside the pill\r\n overflow: 'visible',\r\n },\r\n elevated: {\r\n shadowColor: '#000',\r\n shadowOffset: { width: 0, height: 2 },\r\n shadowOpacity: 0.06,\r\n shadowRadius: 4,\r\n elevation: 1,\r\n },\r\n});\r\n"],"names":["Badge","getStyleColors","style","cr","bg","accent","primary","sysPrimary","text","sysOnPrimary","elevated","custom","success","sysSuccess","sysOnSuccess","error","sysError","sysOnError","surface","surfaceContainer","sysSurfaceContainerLowest","sysOnSurface","sysSurfaceContainer","label","size","badgeStyle","colorRoles","dimensions","dim","typeScale","ts","useTheme","sizeTokens","useMemo","sm","outerSize","paddingH","spacing","padding","sysPadding4","fontSize","labelSmall","sysFontSize","lineHeight","sysLineHeight","letterSpacing","sysTracking","dotInner","md","sysPadding8","labelMedium","lg","s","c","View","accessible","width","height","borderRadius","alignItems","justifyContent","backgroundColor","displayLabel","undefined","String","accessibilityLabel","styles","root","minWidth","paddingHorizontal","Text","color","fontWeight","includeFontPadding","textAlign","numberOfLines","StyleSheet","create","overflow","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { type TextProps } from 'react-native';
3
+ export type BodyVariant = 'large' | 'medium' | 'small' | 'labelLarge' | 'labelMedium' | 'labelSmall';
4
+ export interface BodyTextProps extends TextProps {
5
+ variant?: BodyVariant;
6
+ emphasized?: boolean;
7
+ color?: string;
8
+ }
9
+ export declare function BodyText({ variant, emphasized, color, style, ...rest }: BodyTextProps): React.JSX.Element;