@compsych-ui-components/react-native 4.0.0 → 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.
- package/package.json +22 -14
- package/src/components/ActionSheet/index.d.ts +16 -0
- package/src/components/ActionSheet/index.js +256 -0
- package/src/components/ActionSheet/index.js.map +1 -0
- package/src/components/Alert/index.d.ts +24 -0
- package/src/components/Alert/index.js +304 -0
- package/src/components/Alert/index.js.map +1 -0
- package/src/components/Avatar/index.d.ts +22 -0
- package/src/components/Avatar/index.js +253 -0
- package/src/components/Avatar/index.js.map +1 -0
- package/src/components/Badge/index.d.ts +12 -0
- package/src/components/Badge/index.js +206 -0
- package/src/components/Badge/index.js.map +1 -0
- package/src/components/BodyText/index.d.ts +9 -0
- package/src/components/BodyText/index.js +58 -0
- package/src/components/BodyText/index.js.map +1 -0
- package/src/components/Breadcrumb/index.d.ts +24 -0
- package/src/components/Breadcrumb/index.js +194 -0
- package/src/components/Breadcrumb/index.js.map +1 -0
- package/src/components/Button/index.d.ts +16 -0
- package/src/components/Button/index.js +260 -0
- package/src/components/Button/index.js.map +1 -0
- package/src/components/Checkbox/index.d.ts +16 -0
- package/src/components/Checkbox/index.js +196 -0
- package/src/components/Checkbox/index.js.map +1 -0
- package/src/components/Chip/index.d.ts +18 -0
- package/src/components/Chip/index.js +280 -0
- package/src/components/Chip/index.js.map +1 -0
- package/src/components/Divider/index.d.ts +11 -0
- package/src/components/Divider/index.js +59 -0
- package/src/components/Divider/index.js.map +1 -0
- package/src/components/EmptyState/index.d.ts +25 -0
- package/src/components/EmptyState/index.js +376 -0
- package/src/components/EmptyState/index.js.map +1 -0
- package/src/components/HeaderText/index.d.ts +9 -0
- package/src/components/HeaderText/index.js +62 -0
- package/src/components/HeaderText/index.js.map +1 -0
- package/src/components/Input/index.d.ts +13 -0
- package/src/components/Input/index.js +231 -0
- package/src/components/Input/index.js.map +1 -0
- package/src/components/List/index.d.ts +19 -0
- package/src/components/List/index.js +170 -0
- package/src/components/List/index.js.map +1 -0
- package/src/components/Pagination/index.d.ts +15 -0
- package/src/components/Pagination/index.js +322 -0
- package/src/components/Pagination/index.js.map +1 -0
- package/src/components/PlanCard/index.d.ts +27 -0
- package/src/components/PlanCard/index.js +364 -0
- package/src/components/PlanCard/index.js.map +1 -0
- package/src/components/ProgressTracker/index.d.ts +26 -0
- package/src/components/ProgressTracker/index.js +180 -0
- package/src/components/ProgressTracker/index.js.map +1 -0
- package/src/components/PromotionCard/index.d.ts +23 -0
- package/src/components/PromotionCard/index.js +496 -0
- package/src/components/PromotionCard/index.js.map +1 -0
- package/src/components/RadioButton/index.d.ts +15 -0
- package/src/components/RadioButton/index.js +188 -0
- package/src/components/RadioButton/index.js.map +1 -0
- package/src/components/ScreenContainer/index.d.ts +15 -0
- package/src/components/ScreenContainer/index.js +43 -0
- package/src/components/ScreenContainer/index.js.map +1 -0
- package/src/components/SegmentedControl/index.d.ts +16 -0
- package/src/components/SegmentedControl/index.js +115 -0
- package/src/components/SegmentedControl/index.js.map +1 -0
- package/src/components/SelectionCard/index.d.ts +16 -0
- package/src/components/SelectionCard/index.js +222 -0
- package/src/components/SelectionCard/index.js.map +1 -0
- package/src/components/ServiceCard/index.d.ts +22 -0
- package/src/components/ServiceCard/index.js +385 -0
- package/src/components/ServiceCard/index.js.map +1 -0
- package/src/components/Slider/index.d.ts +24 -0
- package/src/components/Slider/index.js +320 -0
- package/src/components/Slider/index.js.map +1 -0
- package/src/components/Snackbar/index.d.ts +13 -0
- package/src/components/Snackbar/index.js +229 -0
- package/src/components/Snackbar/index.js.map +1 -0
- package/src/components/Switch/index.d.ts +14 -0
- package/src/components/Switch/index.js +221 -0
- package/src/components/Switch/index.js.map +1 -0
- package/src/components/Tooltip/index.d.ts +21 -0
- package/src/components/Tooltip/index.js +206 -0
- package/src/components/Tooltip/index.js.map +1 -0
- package/src/icons/AtomIcon.d.ts +2 -0
- package/src/icons/AtomIcon.js +85 -0
- package/src/icons/AtomIcon.js.map +1 -0
- package/src/icons/BinocularsIcon.d.ts +2 -0
- package/src/icons/BinocularsIcon.js +103 -0
- package/src/icons/BinocularsIcon.js.map +1 -0
- package/src/icons/FileChartColumnIncreasingIcon.d.ts +2 -0
- package/src/icons/FileChartColumnIncreasingIcon.js +97 -0
- package/src/icons/FileChartColumnIncreasingIcon.js.map +1 -0
- package/src/icons/FlagIcon.d.ts +2 -0
- package/src/icons/FlagIcon.js +71 -0
- package/src/icons/FlagIcon.js.map +1 -0
- package/src/icons/GlobeIcon.d.ts +2 -0
- package/src/icons/GlobeIcon.js +71 -0
- package/src/icons/GlobeIcon.js.map +1 -0
- package/src/icons/GraduationCapIcon.d.ts +2 -0
- package/src/icons/GraduationCapIcon.js +85 -0
- package/src/icons/GraduationCapIcon.js.map +1 -0
- package/src/icons/HandHeartIcon.d.ts +2 -0
- package/src/icons/HandHeartIcon.js +91 -0
- package/src/icons/HandHeartIcon.js.map +1 -0
- package/src/icons/HandshakeIcon.d.ts +2 -0
- package/src/icons/HandshakeIcon.js +97 -0
- package/src/icons/HandshakeIcon.js.map +1 -0
- package/src/icons/HazeIcon.d.ts +2 -0
- package/src/icons/HazeIcon.js +115 -0
- package/src/icons/HazeIcon.js.map +1 -0
- package/src/icons/HeartHandshakeIcon.d.ts +2 -0
- package/src/icons/HeartHandshakeIcon.js +71 -0
- package/src/icons/HeartHandshakeIcon.js.map +1 -0
- package/src/icons/HourglassIcon.d.ts +2 -0
- package/src/icons/HourglassIcon.js +91 -0
- package/src/icons/HourglassIcon.js.map +1 -0
- package/src/icons/IdCardIcon.d.ts +2 -0
- package/src/icons/IdCardIcon.js +97 -0
- package/src/icons/IdCardIcon.js.map +1 -0
- package/src/icons/MessageCirclePlusIcon.d.ts +2 -0
- package/src/icons/MessageCirclePlusIcon.js +85 -0
- package/src/icons/MessageCirclePlusIcon.js.map +1 -0
- package/src/icons/MountainSnowIcon.d.ts +2 -0
- package/src/icons/MountainSnowIcon.js +79 -0
- package/src/icons/MountainSnowIcon.js.map +1 -0
- package/src/icons/SnowflakeIcon.d.ts +2 -0
- package/src/icons/SnowflakeIcon.js +139 -0
- package/src/icons/SnowflakeIcon.js.map +1 -0
- package/src/icons/StethoscopeIcon.d.ts +2 -0
- package/src/icons/StethoscopeIcon.js +97 -0
- package/src/icons/StethoscopeIcon.js.map +1 -0
- package/src/icons/UserRoundIcon.d.ts +2 -0
- package/src/icons/UserRoundIcon.js +79 -0
- package/src/icons/UserRoundIcon.js.map +1 -0
- package/src/icons/WheatIcon.d.ts +2 -0
- package/src/icons/WheatIcon.js +115 -0
- package/src/icons/WheatIcon.js.map +1 -0
- package/src/icons/index.d.ts +22 -0
- package/src/icons/index.js +109 -0
- package/src/icons/index.js.map +1 -0
- package/src/icons/types.d.ts +16 -0
- package/src/icons/types.js +52 -0
- package/src/icons/types.js.map +1 -0
- package/src/index.d.ts +60 -2
- package/src/index.js +203 -1
- package/src/index.js.map +1 -1
- package/src/theme/ThemeContext.d.ts +258 -0
- package/src/theme/ThemeContext.js +15 -0
- package/src/theme/ThemeContext.js.map +1 -0
- package/src/theme/ThemeProvider.d.ts +27 -0
- package/src/theme/ThemeProvider.js +66 -0
- package/src/theme/ThemeProvider.js.map +1 -0
- package/src/theme/defaultTheme.d.ts +13 -0
- package/src/theme/defaultTheme.js +14 -0
- package/src/theme/defaultTheme.js.map +1 -0
- package/src/theme/index.d.ts +5 -0
- package/src/theme/index.js +26 -0
- package/src/theme/index.js.map +1 -0
- package/src/theme/mergeTheme.d.ts +7 -0
- package/src/theme/mergeTheme.js +40 -0
- package/src/theme/mergeTheme.js.map +1 -0
- package/src/theme/types.d.ts +25 -0
- package/src/theme/types.js +6 -0
- package/src/theme/types.js.map +1 -0
- package/src/theme/useTheme.d.ts +10 -0
- package/src/theme/useTheme.js +17 -0
- package/src/theme/useTheme.js.map +1 -0
- package/src/tokens.d.ts +253 -0
- package/src/tokens.js +265 -0
- package/src/tokens.js.map +1 -0
- package/src/lib/button.d.ts +0 -7
- package/src/lib/button.js +0 -43
- 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":";;;;+BAqCgBA;;;eAAAA;;;;+DArCe;6BAUxB;6BAEkB;uBAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBlB,SAASA,OAAO,EACrBC,UAAU,MAAM,EAChBC,OAAO,IAAI,EACXC,WAAW,IAAI,EACfC,MAAM,EACNC,IAAI,EACJC,eAAe,KAAK,EACpBC,gBAAgB,KAAK,EACrBC,kBAAkB,EAClBC,KAAK,EACO;IACZ,MAAM,EAAEC,YAAYC,EAAE,EAAEC,YAAYC,GAAG,EAAEC,WAAWC,EAAE,EAAE,GAAGC,IAAAA,eAAQ;IAEnE,MAAMC,aAAaC,IAAAA,cAAO,EACxB,IAAO,CAAA;YACLC,IAAI;gBACFC,UAAU;gBACVC,UAAUN,GAAGO,UAAU,CAACC,WAAW;gBACnCC,YAAYT,GAAGO,UAAU,CAACG,aAAa;gBACvCC,YAAY;gBACZC,UAAU;gBACVC,YAAYf,IAAIgB,WAAW,CAACC,eAAe;gBAC3CC,WAAW,CAAC;gBACZC,WAAW;gBACXC,eAAe;gBACfC,aAAa;YACf;YACAC,IAAI;gBACFf,UAAU;gBACVC,UAAUN,GAAGqB,WAAW,CAACb,WAAW;gBACpCC,YAAYT,GAAGqB,WAAW,CAACX,aAAa;gBACxCC,YAAY;gBACZC,UAAU;gBACVC,YAAYf,IAAIgB,WAAW,CAACC,eAAe;gBAC3CC,WAAW,CAAC;gBACZC,WAAW;gBACXC,eAAe;gBACfC,aAAa,CAAC;YAChB;YACAG,IAAI;gBACFjB,UAAU;gBACVC,UAAUN,GAAGuB,UAAU,CAACf,WAAW;gBACnCC,YAAYT,GAAGuB,UAAU,CAACb,aAAa;gBACvCC,YAAY;gBACZC,UAAU;gBACVC,YAAYf,IAAIgB,WAAW,CAACU,cAAc;gBAC1CR,WAAW,CAAC;gBACZC,WAAW;gBACXC,eAAe;gBACfC,aAAa,CAAC;YAChB;YACAM,IAAI;gBACFpB,UAAU;gBACVC,UAAUN,GAAGuB,UAAU,CAACf,WAAW;gBACnCC,YAAYT,GAAGuB,UAAU,CAACb,aAAa;gBACvCC,YAAY;gBACZC,UAAU;gBACVC,YAAYf,IAAIgB,WAAW,CAACU,cAAc;gBAC1CR,WAAW,CAAC;gBACZC,WAAW;gBACXC,eAAe;gBACfC,aAAa,CAAC;YAChB;YACAO,IAAI;gBACFrB,UAAU;gBACVC,UAAUN,GAAGuB,UAAU,CAACf,WAAW;gBACnCC,YAAYT,GAAGuB,UAAU,CAACb,aAAa;gBACvCC,YAAY;gBACZC,UAAU;gBACVC,YAAYf,IAAIgB,WAAW,CAACU,cAAc;gBAC1CR,WAAW,CAAC;gBACZC,WAAW;gBACXC,eAAe;gBACfC,aAAa,CAAC;YAChB;YACA,OAAO;gBACLd,UAAU;gBACVC,UAAUN,GAAG2B,WAAW,CAACnB,WAAW;gBACpCC,YAAYT,GAAG2B,WAAW,CAACjB,aAAa;gBACxCC,YAAY;gBACZC,UAAU;gBACVC,YAAYf,IAAIgB,WAAW,CAACc,aAAa;gBACzCZ,WAAW,CAAC;gBACZC,WAAW;gBACXC,eAAe;gBACfC,aAAa;YACf;YACA,OAAO;gBACLd,UAAU;gBACVC,UAAUN,GAAG6B,UAAU,CAACrB,WAAW;gBACnCC,YAAYT,GAAG6B,UAAU,CAACnB,aAAa;gBACvCC,YAAY;gBACZC,UAAU;gBACVC,YAAYf,IAAIgB,WAAW,CAACc,aAAa;gBACzCZ,WAAW,CAAC;gBACZC,WAAW;gBACXC,eAAe;gBACfC,aAAa;YACf;QACF,CAAA,GACA;QAACrB;QAAKE;KAAG;IAGX,MAAM8B,IAAI5B,UAAU,CAACf,KAAK;IAC1B,MAAM4C,IAAID,EAAEzB,QAAQ,GAAG;IAEvB,MAAM2B,eAAe9C,YAAY,SAAS,CAAC,QAAQ,EAAEE,UAAU,GAAG;IAElE,OACE,wEAAwE;IACxE,kCAAkC;kBAClC,sBAAC6C,iBAAI;QACHC,UAAU;QACVC,mBAAkB;QAClB1C,oBAAoBA,sBAAsBuC;QAC1CtC,OAAO;YAAC;gBAAE0C,OAAON,EAAEzB,QAAQ;gBAAEgC,QAAQP,EAAEzB,QAAQ;YAAC;YAAGX;SAAM;;0BAGzD,sBAACuC,iBAAI;gBACHvC,OAAO;oBACL4C,OAAOC,MAAM;oBACb;wBACEH,OAAON,EAAEzB,QAAQ;wBACjBgC,QAAQP,EAAEzB,QAAQ;wBAClBmC,cAAcT;wBACdU,iBACEvD,YAAY,UAAUU,GAAG8C,MAAM,CAACC,IAAI,CAACC,gBAAgB,GAAGC;oBAC5D;iBACD;;oBAEA3D,YAAY,wBACX,qBAAC4D,iBAAI;wBACHpD,OAAO;4BACLqD,OAAOnD,GAAG8C,MAAM,CAACC,IAAI,CAACK,kBAAkB;4BACxC1C,UAAUwB,EAAExB,QAAQ;4BACpBG,YAAYqB,EAAErB,UAAU;4BACxBE,YAAYmB,EAAEnB,UAAU;4BACxBsC,oBAAoB;4BACpBC,WAAW;wBACb;wBACAC,eAAe;kCAEd/D;;oBAIJF,YAAY,WAAWG,wBACtB,qBAAC+D,kBAAK;wBACJ/D,QAAQA;wBACRK,OAAO;4BAAE0C,OAAON,EAAEzB,QAAQ;4BAAEgC,QAAQP,EAAEzB,QAAQ;wBAAC;wBAC/CgD,YAAW;;oBAIdnE,YAAY,UACVI,CAAAA,sBACC,qBAACgE,qBAAQ;wBACPC,MAAK;wBACLpE,MAAM2C,EAAElB,QAAQ;wBAChBmC,OAAOnD,GAAG8C,MAAM,CAACC,IAAI,CAACK,kBAAkB;sBAE5C;;;YAIHzD,8BACC,qBAAC0C,iBAAI;gBACHC,YAAY;gBACZxC,OAAO;oBACL8D,UAAU;oBACVC,KAAK3B,EAAEd,SAAS;oBAChB0C,MAAM5B,EAAEd,SAAS;oBACjB2C,OAAO7B,EAAEd,SAAS;oBAClB4C,QAAQ9B,EAAEd,SAAS;oBACnBwB,cAAcT,IAAI8B,KAAKC,GAAG,CAAChC,EAAEd,SAAS;oBACtCF,aAAagB,EAAEjB,UAAU;oBACzBkD,aAAanE,GAAGoE,MAAM,CAACC,OAAO,CAACC,UAAU;gBAC3C;gBACAC,eAAc;;YAKjB3E,iBAAiBsC,EAAEb,SAAS,GAAG,mBAC9B,qBAACgB,iBAAI;gBACHC,YAAY;gBACZxC,OAAO;oBACL4C,OAAO8B,KAAK;oBACZ;wBACEhC,OAAON,EAAEb,SAAS;wBAClBoB,QAAQP,EAAEb,SAAS;wBACnBuB,cAAcV,EAAEb,SAAS,GAAG;wBAC5B2C,QAAQ9B,EAAEX,WAAW;wBACrBwC,OAAO7B,EAAEX,WAAW;wBACpBsB,iBACE7C,GAAGyE,OAAO,CAACC,gBAAgB,CAACC,yBAAyB;oBACzD;iBACD;0BAED,cAAA,qBAACjB,qBAAQ;oBACPC,MAAK;oBACLpE,MAAM2C,EAAEZ,aAAa;oBACrB6B,OAAOnD,GAAG8C,MAAM,CAACC,IAAI,CAACK,kBAAkB;;;;;AAMpD;AAEA,MAAMV,SAASkC,uBAAU,CAACC,MAAM,CAAC;IAC/BlC,QAAQ;QACNmC,YAAY;QACZC,gBAAgB;QAChBC,UAAU;IACZ;IACAR,OAAO;QACLZ,UAAU;QACVkB,YAAY;QACZC,gBAAgB;QAChBC,UAAU;IACZ;AACF"}
|
|
@@ -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;
|