@almadar/mobile 1.2.6 → 1.6.0
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/dist/chunk-4GLV4XIP.js +140 -0
- package/dist/chunk-4GLV4XIP.js.map +1 -0
- package/dist/{chunk-QUFLYKWA.js → chunk-A6AK75GP.js} +43 -554
- package/dist/chunk-A6AK75GP.js.map +1 -0
- package/dist/chunk-BUN5QD6C.js +525 -0
- package/dist/chunk-BUN5QD6C.js.map +1 -0
- package/dist/{chunk-PBO6ZN2M.js → chunk-C3USTXJ7.js} +1372 -2255
- package/dist/chunk-C3USTXJ7.js.map +1 -0
- package/dist/{chunk-5U5Z65ZO.js → chunk-DNC6CO6E.js} +58 -187
- package/dist/chunk-DNC6CO6E.js.map +1 -0
- package/dist/chunk-I6UYSB5R.js +935 -0
- package/dist/chunk-I6UYSB5R.js.map +1 -0
- package/dist/{chunk-ETD72PHO.js → chunk-SLYJ52HW.js} +30 -21
- package/dist/chunk-SLYJ52HW.js.map +1 -0
- package/dist/chunk-UIU7NWN2.js +924 -0
- package/dist/chunk-UIU7NWN2.js.map +1 -0
- package/dist/{chunk-BFRVXKSP.js → chunk-VNRKHWR7.js} +87 -4
- package/dist/chunk-VNRKHWR7.js.map +1 -0
- package/dist/{chunk-CA6Z3OTE.js → chunk-WHAG42QJ.js} +1 -1
- package/dist/chunk-WHAG42QJ.js.map +1 -0
- package/dist/{chunk-GMR5FKKB.js → chunk-XWPR5FXS.js} +2 -2
- package/dist/chunk-XWPR5FXS.js.map +1 -0
- package/dist/{chunk-MLTSQPVN.js → chunk-YWQRLHTP.js} +2 -2
- package/dist/chunk-YWQRLHTP.js.map +1 -0
- package/dist/components/atoms/Button.d.ts +3 -2
- package/dist/components/atoms/Button.d.ts.map +1 -1
- package/dist/components/atoms/Card.d.ts +3 -2
- package/dist/components/atoms/Card.d.ts.map +1 -1
- package/dist/components/atoms/Checkbox.d.ts +3 -2
- package/dist/components/atoms/Checkbox.d.ts.map +1 -1
- package/dist/components/atoms/DayCell.d.ts +3 -2
- package/dist/components/atoms/DayCell.d.ts.map +1 -1
- package/dist/components/atoms/InfiniteScrollSentinel.d.ts +3 -2
- package/dist/components/atoms/InfiniteScrollSentinel.d.ts.map +1 -1
- package/dist/components/atoms/Radio.d.ts +3 -2
- package/dist/components/atoms/Radio.d.ts.map +1 -1
- package/dist/components/atoms/RangeSlider.d.ts +3 -2
- package/dist/components/atoms/RangeSlider.d.ts.map +1 -1
- package/dist/components/atoms/Select.d.ts +3 -2
- package/dist/components/atoms/Select.d.ts.map +1 -1
- package/dist/components/atoms/Switch.d.ts +3 -2
- package/dist/components/atoms/Switch.d.ts.map +1 -1
- package/dist/components/atoms/TextHighlight.d.ts +3 -2
- package/dist/components/atoms/TextHighlight.d.ts.map +1 -1
- package/dist/components/atoms/game/OrbitalGameCanvas.d.ts +25 -0
- package/dist/components/atoms/game/OrbitalGameCanvas.d.ts.map +1 -0
- package/dist/components/atoms/game/index.d.ts +2 -0
- package/dist/components/atoms/game/index.d.ts.map +1 -1
- package/dist/components/atoms/index.d.ts +4 -4
- package/dist/components/atoms/index.d.ts.map +1 -1
- package/dist/components/atoms/index.js +14 -9
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +47 -20
- package/dist/components/molecules/Alert.d.ts +3 -2
- package/dist/components/molecules/Alert.d.ts.map +1 -1
- package/dist/components/molecules/DataGrid.d.ts +6 -5
- package/dist/components/molecules/DataGrid.d.ts.map +1 -1
- package/dist/components/molecules/DataList.d.ts +5 -4
- package/dist/components/molecules/DataList.d.ts.map +1 -1
- package/dist/components/molecules/NumberStepper.d.ts +3 -2
- package/dist/components/molecules/NumberStepper.d.ts.map +1 -1
- package/dist/components/molecules/PullToRefresh.d.ts +3 -2
- package/dist/components/molecules/PullToRefresh.d.ts.map +1 -1
- package/dist/components/molecules/RelationSelect.d.ts +3 -2
- package/dist/components/molecules/RelationSelect.d.ts.map +1 -1
- package/dist/components/molecules/RepeatableFormSection.d.ts +6 -5
- package/dist/components/molecules/RepeatableFormSection.d.ts.map +1 -1
- package/dist/components/molecules/SortableList.d.ts +2 -1
- package/dist/components/molecules/SortableList.d.ts.map +1 -1
- package/dist/components/molecules/StarRating.d.ts +3 -2
- package/dist/components/molecules/StarRating.d.ts.map +1 -1
- package/dist/components/molecules/SwipeableRow.d.ts +3 -2
- package/dist/components/molecules/SwipeableRow.d.ts.map +1 -1
- package/dist/components/molecules/Toast.d.ts +3 -2
- package/dist/components/molecules/Toast.d.ts.map +1 -1
- package/dist/components/molecules/index.js +9 -6
- package/dist/components/organisms/CardGrid.d.ts +6 -5
- package/dist/components/organisms/CardGrid.d.ts.map +1 -1
- package/dist/components/organisms/ComponentPatterns.d.ts.map +1 -1
- package/dist/components/organisms/ContentRenderer.d.ts.map +1 -1
- package/dist/components/organisms/DataTable.d.ts +2 -4
- package/dist/components/organisms/DataTable.d.ts.map +1 -1
- package/dist/components/organisms/DocumentViewer.d.ts.map +1 -1
- package/dist/components/organisms/DrawerSlot.d.ts +5 -4
- package/dist/components/organisms/DrawerSlot.d.ts.map +1 -1
- package/dist/components/organisms/FormSection.d.ts +8 -1
- package/dist/components/organisms/FormSection.d.ts.map +1 -1
- package/dist/components/organisms/Header.d.ts +3 -2
- package/dist/components/organisms/Header.d.ts.map +1 -1
- package/dist/components/organisms/LayoutPatterns.d.ts.map +1 -1
- package/dist/components/organisms/MasterDetail.d.ts.map +1 -1
- package/dist/components/organisms/MediaGallery.d.ts +2 -1
- package/dist/components/organisms/MediaGallery.d.ts.map +1 -1
- package/dist/components/organisms/ModalSlot.d.ts +5 -4
- package/dist/components/organisms/ModalSlot.d.ts.map +1 -1
- package/dist/components/organisms/PageHeader.d.ts +7 -0
- package/dist/components/organisms/PageHeader.d.ts.map +1 -1
- package/dist/components/organisms/SignaturePad.d.ts.map +1 -1
- package/dist/components/organisms/StatCard.d.ts +3 -2
- package/dist/components/organisms/StatCard.d.ts.map +1 -1
- package/dist/components/organisms/StateMachineView.d.ts.map +1 -1
- package/dist/components/organisms/Table.d.ts.map +1 -1
- package/dist/components/organisms/ToastSlot.d.ts +6 -5
- package/dist/components/organisms/ToastSlot.d.ts.map +1 -1
- package/dist/components/organisms/UISlotRenderer.d.ts +2 -1
- package/dist/components/organisms/UISlotRenderer.d.ts.map +1 -1
- package/dist/components/organisms/book/BookChapterView.d.ts +2 -1
- package/dist/components/organisms/book/BookChapterView.d.ts.map +1 -1
- package/dist/components/organisms/book/BookCoverPage.d.ts +2 -1
- package/dist/components/organisms/book/BookCoverPage.d.ts.map +1 -1
- package/dist/components/organisms/book/BookNavBar.d.ts +2 -1
- package/dist/components/organisms/book/BookNavBar.d.ts.map +1 -1
- package/dist/components/organisms/book/BookTableOfContents.d.ts +2 -1
- package/dist/components/organisms/book/BookTableOfContents.d.ts.map +1 -1
- package/dist/components/organisms/book/BookViewer.d.ts +2 -1
- package/dist/components/organisms/book/BookViewer.d.ts.map +1 -1
- package/dist/components/organisms/game/DialogueBox.d.ts.map +1 -1
- package/dist/components/organisms/game/InventoryPanel.d.ts.map +1 -1
- package/dist/components/organisms/game/physics-sim/SimulationCanvas.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/sequencer/ActionPalette.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/sequencer/ActionTile.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/sequencer/SequenceBar.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/state-architect/CodeView.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/state-architect/StateArchitectBoard.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/state-architect/StateNode.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/state-architect/TransitionArrow.d.ts.map +1 -1
- package/dist/components/organisms/game/puzzles/state-architect/VariablePanel.d.ts.map +1 -1
- package/dist/components/organisms/index.d.ts +1 -1
- package/dist/components/organisms/index.d.ts.map +1 -1
- package/dist/components/organisms/index.js +14 -10
- package/dist/components/organisms/layout/DashboardGrid.d.ts +3 -2
- package/dist/components/organisms/layout/DashboardGrid.d.ts.map +1 -1
- package/dist/components/templates/BattleTemplate.d.ts.map +1 -1
- package/dist/components/templates/index.js +26 -0
- package/dist/components/templates/index.js.map +1 -0
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/useTraitState.d.ts +3 -3
- package/dist/hooks/useTraitState.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -910
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/package.json +14 -16
- package/dist/chunk-5U5Z65ZO.js.map +0 -1
- package/dist/chunk-BFRVXKSP.js.map +0 -1
- package/dist/chunk-CA6Z3OTE.js.map +0 -1
- package/dist/chunk-ETD72PHO.js.map +0 -1
- package/dist/chunk-GMR5FKKB.js.map +0 -1
- package/dist/chunk-MLTSQPVN.js.map +0 -1
- package/dist/chunk-PBO6ZN2M.js.map +0 -1
- package/dist/chunk-QUFLYKWA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/atoms/Typography.tsx","../src/components/molecules/LoadingState.tsx","../src/components/atoms/Stack.tsx","../src/components/molecules/ErrorState.tsx","../src/components/atoms/Button.tsx","../src/components/atoms/Card.tsx","../src/components/atoms/game/HealthBar.tsx","../src/components/atoms/game/ScoreDisplay.tsx"],"sourcesContent":["import React from 'react';\nimport { Text, StyleSheet, TextStyle, TextProps } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\n\nexport type TypographyVariant = \n | 'h1' \n | 'h2' \n | 'h3' \n | 'h4' \n | 'body' \n | 'caption' \n | 'label';\n\nexport interface TypographyProps extends TextProps {\n variant?: TypographyVariant;\n color?: string;\n align?: 'left' | 'center' | 'right';\n children: React.ReactNode;\n /** Loading state indicator - renders as skeleton when true */\n isLoading?: boolean;\n /** Error state - can affect styling */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n}\n\nexport function Typography({\n variant = 'body',\n color,\n align = 'left',\n children,\n style,\n isLoading,\n error,\n ...rest\n}: TypographyProps) {\n const theme = useTheme();\n\n // When loading, return a skeleton-like placeholder\n if (isLoading) {\n return (\n <Text\n style={[\n styles.skeleton,\n {\n backgroundColor: theme.colors.muted,\n width: '60%',\n },\n style,\n ]}\n {...rest}\n >\n {' '}\n </Text>\n );\n }\n\n const variantStyles: Record<TypographyVariant, TextStyle> = {\n h1: {\n fontSize: theme.typography.sizes['4xl'],\n fontWeight: theme.typography.fontWeight.bold as TextStyle['fontWeight'],\n lineHeight: theme.typography.lineHeight * theme.typography.sizes['4xl'],\n color: theme.colors.foreground,\n },\n h2: {\n fontSize: theme.typography.sizes['3xl'],\n fontWeight: theme.typography.fontWeight.bold as TextStyle['fontWeight'],\n lineHeight: theme.typography.lineHeight * theme.typography.sizes['3xl'],\n color: theme.colors.foreground,\n },\n h3: {\n fontSize: theme.typography.sizes['2xl'],\n fontWeight: theme.typography.fontWeight.bold as TextStyle['fontWeight'],\n lineHeight: theme.typography.lineHeight * theme.typography.sizes['2xl'],\n color: theme.colors.foreground,\n },\n h4: {\n fontSize: theme.typography.sizes.xl,\n fontWeight: theme.typography.fontWeight.medium as TextStyle['fontWeight'],\n lineHeight: theme.typography.lineHeight * theme.typography.sizes.xl,\n color: theme.colors.foreground,\n },\n body: {\n fontSize: theme.typography.sizes.base,\n fontWeight: theme.typography.fontWeight.normal as TextStyle['fontWeight'],\n lineHeight: theme.typography.lineHeight * theme.typography.sizes.base,\n color: theme.colors.foreground,\n },\n caption: {\n fontSize: theme.typography.sizes.sm,\n fontWeight: theme.typography.fontWeight.normal as TextStyle['fontWeight'],\n lineHeight: theme.typography.lineHeight * theme.typography.sizes.sm,\n color: theme.colors['muted-foreground'],\n },\n label: {\n fontSize: theme.typography.sizes.xs,\n fontWeight: theme.typography.fontWeight.medium as TextStyle['fontWeight'],\n lineHeight: theme.typography.lineHeight * theme.typography.sizes.xs,\n color: theme.colors['muted-foreground'],\n textTransform: 'uppercase',\n },\n };\n\n const textColor = error ? theme.colors.error : (color || variantStyles[variant].color);\n\n return (\n <Text\n style={[\n variantStyles[variant],\n { textAlign: align, color: textColor },\n style,\n ]}\n {...rest}\n >\n {children}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create({\n skeleton: {\n borderRadius: 4,\n },\n});\n\nTypography.displayName = 'Typography';\n","import React from 'react';\nimport { ActivityIndicator, StyleSheet } from 'react-native';\nimport { VStack } from '../atoms/Stack';\nimport { Typography } from '../atoms/Typography';\n\nexport interface LoadingStateProps {\n message?: string;\n}\n\nexport const LoadingState: React.FC<LoadingStateProps> = ({\n message = 'Loading...',\n}) => {\n return (\n <VStack align=\"center\" spacing={12} style={styles.container}>\n <ActivityIndicator size=\"large\" color=\"#6366f1\" />\n <Typography variant=\"body\" color=\"#6b7280\">\n {message}\n </Typography>\n </VStack>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 32,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nLoadingState.displayName = 'LoadingState';\n","import React from 'react';\nimport { View, StyleSheet, ViewStyle } from 'react-native';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\n\nexport interface VStackProps {\n spacing?: number;\n align?: 'flex-start' | 'center' | 'flex-end' | 'stretch';\n justify?: 'flex-start' | 'center' | 'flex-end' | 'space-between' | 'space-around';\n children: React.ReactNode;\n style?: ViewStyle | ViewStyle[] | undefined;\n testID?: string;\n /** Loading state indicator */\n isLoading?: boolean;\n /** Error state */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n}\n\nexport const VStack: React.FC<VStackProps> = ({\n spacing = 8,\n align = 'stretch',\n justify = 'flex-start',\n children,\n style,\n testID,\n isLoading,\n error,\n}) => {\n if (isLoading) {\n return (\n <View style={[styles.vstack, style]}>\n <LoadingState />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.vstack, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const stackStyles: ViewStyle[] = [\n styles.vstack,\n { gap: spacing, alignItems: align, justifyContent: justify },\n ];\n \n if (Array.isArray(style)) {\n stackStyles.push(...style);\n } else if (style) {\n stackStyles.push(style);\n }\n\n return (\n <View testID={testID} style={stackStyles}>\n {children}\n </View>\n );\n};\n\nexport interface HStackProps {\n spacing?: number;\n align?: 'flex-start' | 'center' | 'flex-end' | 'stretch' | 'baseline';\n justify?: 'flex-start' | 'center' | 'flex-end' | 'space-between' | 'space-around' | 'space-evenly';\n children: React.ReactNode;\n style?: ViewStyle | ViewStyle[] | undefined;\n testID?: string;\n /** Loading state indicator */\n isLoading?: boolean;\n /** Error state */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n}\n\nexport const HStack: React.FC<HStackProps> = ({\n spacing = 8,\n align = 'center',\n justify = 'flex-start',\n children,\n style,\n testID,\n isLoading,\n error,\n}) => {\n if (isLoading) {\n return (\n <View style={[styles.hstack, style]}>\n <LoadingState />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.hstack, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const stackStyles: ViewStyle[] = [\n styles.hstack,\n { gap: spacing, alignItems: align, justifyContent: justify },\n ];\n \n if (Array.isArray(style)) {\n stackStyles.push(...style);\n } else if (style) {\n stackStyles.push(style);\n }\n\n return (\n <View testID={testID} style={stackStyles}>\n {children}\n </View>\n );\n};\n\nexport interface BoxProps {\n children?: React.ReactNode;\n style?: ViewStyle | ViewStyle[] | undefined;\n testID?: string;\n /** Loading state indicator */\n isLoading?: boolean;\n /** Error state */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n}\n\nexport const Box: React.FC<BoxProps> = ({ \n children, \n style, \n testID,\n isLoading,\n error,\n}) => {\n if (isLoading) {\n return (\n <View style={[styles.box, style]}>\n <LoadingState />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.box, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const boxStyles: ViewStyle[] = [styles.box];\n \n if (Array.isArray(style)) {\n boxStyles.push(...style);\n } else if (style) {\n boxStyles.push(style);\n }\n\n return <View testID={testID} style={boxStyles}>{children}</View>;\n};\n\nconst styles = StyleSheet.create({\n vstack: {\n flexDirection: 'column',\n },\n hstack: {\n flexDirection: 'row',\n },\n box: {\n // Base box styles - mostly empty to allow full customization\n },\n});\n\nVStack.displayName = 'VStack';\nHStack.displayName = 'HStack';\nBox.displayName = 'Box';\n","import React from 'react';\nimport { StyleSheet } from 'react-native';\nimport { Typography } from '../atoms/Typography';\nimport { Button } from '../atoms/Button';\nimport { VStack } from '../atoms/Stack';\n\nexport interface ErrorStateProps {\n message?: string;\n onRetry?: () => void;\n}\n\nexport const ErrorState: React.FC<ErrorStateProps> = ({\n message = 'Something went wrong',\n onRetry,\n}) => {\n return (\n <VStack align=\"center\" spacing={16} style={styles.container}>\n <Typography variant=\"body\" color=\"#ef4444\">\n {message}\n </Typography>\n {onRetry && (\n <Button variant=\"secondary\" onPress={onRetry}>\n Retry\n </Button>\n )}\n </VStack>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 32,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nErrorState.displayName = 'ErrorState';\n","import React from 'react';\nimport { \n TouchableOpacity, \n Text, \n StyleSheet, \n ActivityIndicator,\n ViewStyle,\n TextStyle \n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport type { EventKey, EventPayload } from '../../types';\n\n\nexport interface ButtonProps {\n onPress?: () => void;\n children: React.ReactNode;\n variant?: 'default' | 'primary' | 'secondary' | 'ghost' | 'destructive';\n size?: 'sm' | 'md' | 'lg';\n disabled?: boolean;\n isLoading?: boolean;\n style?: ViewStyle;\n textStyle?: TextStyle;\n /** Declarative event name - emits UI:${action} via eventBus on press */\n action?: EventKey;\n /** Payload to include with the action event */\n actionPayload?: EventPayload;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n}\n\nexport const Button: React.FC<ButtonProps> = ({\n onPress,\n children,\n variant = 'default',\n size = 'md',\n disabled = false,\n isLoading = false,\n style,\n textStyle,\n action,\n actionPayload,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handlePress = () => {\n if (action) {\n eventBus.emit(`UI:${action}`, actionPayload);\n }\n onPress?.();\n };\n\n const getVariantStyles = (): { container: ViewStyle; text: TextStyle } => {\n switch (variant) {\n case 'primary':\n return {\n container: {\n backgroundColor: theme.colors.primary,\n },\n text: {\n color: theme.colors['primary-foreground'],\n },\n };\n case 'secondary':\n return {\n container: {\n backgroundColor: theme.colors.secondary,\n },\n text: {\n color: theme.colors['secondary-foreground'],\n },\n };\n case 'ghost':\n return {\n container: {\n backgroundColor: 'transparent',\n },\n text: {\n color: theme.colors.primary,\n },\n };\n case 'destructive':\n return {\n container: {\n backgroundColor: theme.colors.error,\n },\n text: {\n color: theme.colors['error-foreground'],\n },\n };\n default:\n return {\n container: {\n backgroundColor: theme.colors.card,\n borderWidth: 1,\n borderColor: theme.colors.border,\n },\n text: {\n color: theme.colors.foreground,\n },\n };\n }\n };\n\n const sizeStyles: Record<string, { container: ViewStyle; text: TextStyle }> = {\n sm: {\n container: {\n paddingVertical: theme.spacing[1],\n paddingHorizontal: theme.spacing[3],\n borderRadius: theme.borderRadius.md,\n },\n text: {\n fontSize: theme.typography.sizes.sm,\n },\n },\n md: {\n container: {\n paddingVertical: theme.spacing[2],\n paddingHorizontal: theme.spacing[4],\n borderRadius: theme.borderRadius.md,\n },\n text: {\n fontSize: theme.typography.sizes.base,\n },\n },\n lg: {\n container: {\n paddingVertical: theme.spacing[3],\n paddingHorizontal: theme.spacing[6],\n borderRadius: theme.borderRadius.lg,\n },\n text: {\n fontSize: theme.typography.sizes.lg,\n },\n },\n };\n\n const variantStyle = getVariantStyles();\n const sizeStyle = sizeStyles[size];\n\n return (\n <TouchableOpacity\n onPress={handlePress}\n disabled={disabled || isLoading}\n activeOpacity={0.8}\n style={[\n styles.button,\n variantStyle.container,\n sizeStyle.container,\n (disabled || isLoading) && { opacity: 0.5 },\n style,\n ]}\n >\n {isLoading ? (\n <ActivityIndicator color={variantStyle.text.color} size=\"small\" />\n ) : (\n <Text style={[styles.text, variantStyle.text, sizeStyle.text, textStyle]}>\n {children}\n </Text>\n )}\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n button: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n text: {\n fontWeight: '500',\n },\n});\n\nButton.displayName = 'Button';\n","import React from 'react';\nimport { View, StyleSheet, ViewStyle, TouchableOpacity } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\nimport type { EventKey, EventPayload } from '../../types';\n\n\nexport interface CardProps {\n children: React.ReactNode;\n onPress?: () => void;\n style?: ViewStyle | ViewStyle[] | undefined;\n padding?: 'none' | 'sm' | 'md' | 'lg';\n variant?: 'default' | 'elevated' | 'outlined';\n /** Loading state indicator */\n isLoading?: boolean;\n /** Error state */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n /** Declarative event name - emits UI:${action} via eventBus on press */\n action?: EventKey;\n /** Payload to include with the action event */\n actionPayload?: EventPayload;\n}\n\nexport const Card: React.FC<CardProps> = ({\n children,\n onPress,\n style,\n padding = 'md',\n variant = 'default',\n isLoading,\n error,\n action,\n actionPayload,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handlePress = () => {\n if (action) {\n eventBus.emit(`UI:${action}`, actionPayload);\n }\n onPress?.();\n };\n\n if (isLoading) {\n return (\n <View style={[styles.card, style]}>\n <LoadingState />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.card, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const paddingStyles: Record<string, ViewStyle> = {\n none: { padding: 0 },\n sm: { padding: theme.spacing[3] },\n md: { padding: theme.spacing[4] },\n lg: { padding: theme.spacing[6] },\n };\n\n const variantStyles: Record<string, ViewStyle> = {\n default: {\n backgroundColor: theme.colors.card,\n ...theme.shadows.main,\n },\n elevated: {\n backgroundColor: theme.colors.card,\n ...theme.shadows.lg,\n },\n outlined: {\n backgroundColor: theme.colors.card,\n borderWidth: 1,\n borderColor: theme.colors.border,\n ...theme.shadows.none,\n },\n };\n\n const cardStyles: ViewStyle[] = [\n styles.card,\n variantStyles[variant],\n paddingStyles[padding],\n ];\n\n if (Array.isArray(style)) {\n cardStyles.push(...style);\n } else if (style) {\n cardStyles.push(style);\n }\n\n const content = <View style={cardStyles}>{children}</View>;\n\n if (onPress || action) {\n return (\n <TouchableOpacity onPress={handlePress} activeOpacity={0.9}>\n {content}\n </TouchableOpacity>\n );\n }\n\n return content;\n};\n\nconst styles = StyleSheet.create({\n card: {\n borderRadius: 12,\n },\n});\n\nCard.displayName = 'Card';\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../../providers/ThemeContext';\n\nexport interface HealthBarProps {\n /** Current health value */\n current: number;\n /** Maximum health value */\n max: number;\n /** Display format */\n format?: 'hearts' | 'bar' | 'numeric';\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional styles */\n style?: ViewStyle;\n /** Animation on change */\n animated?: boolean;\n}\n\nconst sizeMap = {\n sm: { heart: 16, bar: 8, text: 12 },\n md: { heart: 24, bar: 12, text: 16 },\n lg: { heart: 32, bar: 16, text: 20 },\n};\n\nconst HeartIcon: React.FC<{ filled: boolean; size: number; color: string }> = ({ \n filled, \n size, \n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n color \n}) => (\n <View\n style={{\n width: size,\n height: size,\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Text\n style={{\n fontSize: size * 0.8,\n color: filled ? '#ef4444' : '#9ca3af',\n }}\n >\n {filled ? '♥' : '♡'}\n </Text>\n </View>\n);\n\nexport const HealthBar: React.FC<HealthBarProps> = ({\n current,\n max,\n format = 'hearts',\n size = 'md',\n style,\n animated = true,\n}) => {\n const theme = useTheme();\n const sizes = sizeMap[size];\n const percentage = Math.max(0, Math.min(100, (current / max) * 100));\n\n if (format === 'hearts') {\n return (\n <View style={[styles.heartsContainer, style]}>\n {Array.from({ length: max }).map((_, i) => (\n <View\n key={i}\n style={[\n animated && styles.animatedHeart,\n ]}\n >\n <HeartIcon\n filled={i < current}\n size={sizes.heart}\n color={theme.colors.error}\n />\n </View>\n ))}\n </View>\n );\n }\n\n if (format === 'bar') {\n const barColor = percentage > 66 \n ? '#22c55e' // green\n : percentage > 33 \n ? '#eab308' // yellow\n : '#ef4444'; // red\n\n return (\n <View\n style={[\n styles.barContainer,\n {\n height: sizes.bar,\n backgroundColor: theme.colors.muted,\n },\n style,\n ]}\n >\n <View\n style={[\n styles.barFill,\n {\n width: `${percentage}%`,\n backgroundColor: barColor,\n },\n animated && styles.animatedBar,\n ]}\n />\n </View>\n );\n }\n\n // Numeric format\n return (\n <Text\n style={[\n styles.numericText,\n {\n fontSize: sizes.text,\n color: theme.colors.foreground,\n },\n style as never,\n ]}\n >\n {current}/{max}\n </Text>\n );\n};\n\nconst styles = StyleSheet.create({\n heartsContainer: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n },\n animatedHeart: {\n // React Native transform animation could be added here\n },\n barContainer: {\n width: 96,\n borderRadius: 9999,\n overflow: 'hidden',\n },\n barFill: {\n height: '100%',\n borderRadius: 9999,\n },\n animatedBar: {\n // LayoutAnimation could be configured\n },\n numericText: {\n fontFamily: 'monospace',\n fontWeight: '700',\n },\n});\n\nHealthBar.displayName = 'HealthBar';\n","import React, { useState, useEffect } from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../../providers/ThemeContext';\n\nexport interface ScoreDisplayProps {\n /** Current score value */\n value: number;\n /** Label to display before score */\n label?: string;\n /** Icon component or emoji */\n icon?: React.ReactNode;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Additional styles */\n style?: ViewStyle;\n /** Animation on value change */\n animated?: boolean;\n /** Number formatting locale */\n locale?: string;\n}\n\nconst sizeMap: Record<string, { fontSize: number }> = {\n sm: { fontSize: 14 },\n md: { fontSize: 18 },\n lg: { fontSize: 24 },\n xl: { fontSize: 36 },\n};\n\nexport const ScoreDisplay: React.FC<ScoreDisplayProps> = ({\n value,\n label,\n icon,\n size = 'md',\n style,\n animated = true,\n locale = 'en-US',\n}) => {\n const theme = useTheme();\n const [displayValue, setDisplayValue] = useState(value);\n const [isAnimating, setIsAnimating] = useState(false);\n\n const sizeConfig = sizeMap[size] ?? sizeMap.md;\n\n useEffect(() => {\n if (!animated || displayValue === value) {\n setDisplayValue(value);\n return;\n }\n\n setIsAnimating(true);\n const diff = value - displayValue;\n const steps = Math.min(Math.abs(diff), 20);\n const increment = diff / steps;\n let current = displayValue;\n let step = 0;\n\n const timer = setInterval(() => {\n step++;\n current += increment;\n setDisplayValue(Math.round(current));\n\n if (step >= steps) {\n clearInterval(timer);\n setDisplayValue(value);\n setIsAnimating(false);\n }\n }, 50);\n\n return () => clearInterval(timer);\n }, [value, animated]);\n\n const formattedValue = new Intl.NumberFormat(locale).format(displayValue);\n\n return (\n <View\n style={[\n styles.container,\n {\n opacity: isAnimating ? 0.7 : 1,\n },\n style as never,\n ]}\n >\n {icon && (\n <Text style={{ fontSize: sizeConfig.fontSize, marginRight: 8 }}>\n {icon as string}\n </Text>\n )}\n {label && (\n <Text\n style={{\n fontSize: sizeConfig.fontSize,\n color: theme.colors['muted-foreground'],\n marginRight: 8,\n }}\n >\n {label}\n </Text>\n )}\n <Text\n style={{\n fontSize: sizeConfig.fontSize,\n color: theme.colors.foreground,\n fontWeight: '700',\n fontVariant: ['tabular-nums'],\n }}\n >\n {formattedValue}\n </Text>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n});\n\nScoreDisplay.displayName = 'ScoreDisplay';\n"],"mappings":"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","names":["React","ActivityIndicator","StyleSheet","React","StyleSheet","React","StyleSheet","React","Text","StyleSheet","React","styles","Text","StyleSheet","React","styles","StyleSheet","React","styles","StyleSheet","React","styles","ActivityIndicator","StyleSheet","React","View","StyleSheet","TouchableOpacity","React","View","styles","TouchableOpacity","StyleSheet","React","View","Text","StyleSheet","React","View","Text","styles","StyleSheet","React","View","Text","StyleSheet","sizeMap","React","View","styles","Text","StyleSheet"]}
|
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ErrorState,
|
|
3
|
+
LoadingState
|
|
4
|
+
} from "./chunk-A6AK75GP.js";
|
|
5
|
+
import {
|
|
6
|
+
useEventBus
|
|
7
|
+
} from "./chunk-YTVYMEKU.js";
|
|
8
|
+
import {
|
|
9
|
+
useTheme
|
|
10
|
+
} from "./chunk-CUAWHLEK.js";
|
|
11
|
+
|
|
12
|
+
// src/components/atoms/Input.tsx
|
|
13
|
+
import React from "react";
|
|
14
|
+
import {
|
|
15
|
+
TextInput,
|
|
16
|
+
StyleSheet,
|
|
17
|
+
View,
|
|
18
|
+
Text
|
|
19
|
+
} from "react-native";
|
|
20
|
+
var Input = ({
|
|
21
|
+
label,
|
|
22
|
+
errorMessage,
|
|
23
|
+
helperText,
|
|
24
|
+
containerStyle,
|
|
25
|
+
style,
|
|
26
|
+
isLoading,
|
|
27
|
+
error,
|
|
28
|
+
changeEvent,
|
|
29
|
+
focusEvent,
|
|
30
|
+
onChangeText,
|
|
31
|
+
onFocus,
|
|
32
|
+
onBlur,
|
|
33
|
+
...textInputProps
|
|
34
|
+
}) => {
|
|
35
|
+
const theme = useTheme();
|
|
36
|
+
const eventBus = useEventBus();
|
|
37
|
+
const handleChangeText = (text) => {
|
|
38
|
+
if (changeEvent) {
|
|
39
|
+
eventBus.emit(`UI:${changeEvent}`, { value: text });
|
|
40
|
+
}
|
|
41
|
+
onChangeText?.(text);
|
|
42
|
+
};
|
|
43
|
+
const handleFocus = () => {
|
|
44
|
+
if (focusEvent) {
|
|
45
|
+
eventBus.emit(`UI:${focusEvent}`);
|
|
46
|
+
}
|
|
47
|
+
onFocus?.({});
|
|
48
|
+
};
|
|
49
|
+
if (isLoading) {
|
|
50
|
+
return /* @__PURE__ */ React.createElement(View, { style: [styles.container, containerStyle] }, label && /* @__PURE__ */ React.createElement(Text, { style: [styles.label, { color: theme.colors.foreground }] }, label), /* @__PURE__ */ React.createElement(LoadingState, { message: "Loading..." }));
|
|
51
|
+
}
|
|
52
|
+
const errorText = error?.message || errorMessage;
|
|
53
|
+
return /* @__PURE__ */ React.createElement(View, { style: [styles.container, containerStyle] }, label && /* @__PURE__ */ React.createElement(Text, { style: [styles.label, { color: theme.colors.foreground }] }, label), /* @__PURE__ */ React.createElement(
|
|
54
|
+
TextInput,
|
|
55
|
+
{
|
|
56
|
+
style: [
|
|
57
|
+
styles.input,
|
|
58
|
+
{
|
|
59
|
+
borderColor: errorText ? theme.colors.error : theme.colors.border,
|
|
60
|
+
backgroundColor: theme.colors.card,
|
|
61
|
+
color: theme.colors.foreground
|
|
62
|
+
},
|
|
63
|
+
style
|
|
64
|
+
],
|
|
65
|
+
placeholderTextColor: theme.colors["muted-foreground"],
|
|
66
|
+
onChangeText: handleChangeText,
|
|
67
|
+
onFocus: handleFocus,
|
|
68
|
+
onBlur,
|
|
69
|
+
...textInputProps
|
|
70
|
+
}
|
|
71
|
+
), errorText ? /* @__PURE__ */ React.createElement(Text, { style: [styles.errorText, { color: theme.colors.error }] }, errorText) : helperText ? /* @__PURE__ */ React.createElement(Text, { style: [styles.helperText, { color: theme.colors["muted-foreground"] }] }, helperText) : null);
|
|
72
|
+
};
|
|
73
|
+
var styles = StyleSheet.create({
|
|
74
|
+
container: {
|
|
75
|
+
width: "100%"
|
|
76
|
+
},
|
|
77
|
+
label: {
|
|
78
|
+
fontSize: 14,
|
|
79
|
+
fontWeight: "500",
|
|
80
|
+
marginBottom: 6
|
|
81
|
+
},
|
|
82
|
+
input: {
|
|
83
|
+
borderWidth: 1,
|
|
84
|
+
borderRadius: 8,
|
|
85
|
+
paddingHorizontal: 12,
|
|
86
|
+
paddingVertical: 10,
|
|
87
|
+
fontSize: 16
|
|
88
|
+
},
|
|
89
|
+
errorText: {
|
|
90
|
+
fontSize: 12,
|
|
91
|
+
marginTop: 4
|
|
92
|
+
},
|
|
93
|
+
helperText: {
|
|
94
|
+
fontSize: 12,
|
|
95
|
+
marginTop: 4
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
Input.displayName = "Input";
|
|
99
|
+
|
|
100
|
+
// src/components/atoms/Select.tsx
|
|
101
|
+
import React2, { useState } from "react";
|
|
102
|
+
import {
|
|
103
|
+
TouchableOpacity,
|
|
104
|
+
View as View2,
|
|
105
|
+
Text as Text2,
|
|
106
|
+
StyleSheet as StyleSheet2,
|
|
107
|
+
Modal,
|
|
108
|
+
FlatList,
|
|
109
|
+
SafeAreaView
|
|
110
|
+
} from "react-native";
|
|
111
|
+
var Select = ({
|
|
112
|
+
options,
|
|
113
|
+
value,
|
|
114
|
+
onChange,
|
|
115
|
+
placeholder = "Select...",
|
|
116
|
+
disabled = false,
|
|
117
|
+
style,
|
|
118
|
+
textStyle,
|
|
119
|
+
isLoading,
|
|
120
|
+
error,
|
|
121
|
+
changeEvent,
|
|
122
|
+
actionPayload
|
|
123
|
+
}) => {
|
|
124
|
+
const theme = useTheme();
|
|
125
|
+
const eventBus = useEventBus();
|
|
126
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
127
|
+
const selectedOption = options.find((opt) => opt.value === value);
|
|
128
|
+
const handleSelect = (selectedValue) => {
|
|
129
|
+
if (changeEvent) {
|
|
130
|
+
eventBus.emit(`UI:${changeEvent}`, { ...actionPayload, value: selectedValue });
|
|
131
|
+
}
|
|
132
|
+
onChange?.(selectedValue);
|
|
133
|
+
setIsOpen(false);
|
|
134
|
+
};
|
|
135
|
+
const handleOpen = () => {
|
|
136
|
+
if (!disabled && !isLoading) {
|
|
137
|
+
setIsOpen(true);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
if (isLoading) {
|
|
141
|
+
return /* @__PURE__ */ React2.createElement(View2, { style: [styles2.container, style] }, /* @__PURE__ */ React2.createElement(LoadingState, { message: "Loading..." }));
|
|
142
|
+
}
|
|
143
|
+
if (error) {
|
|
144
|
+
return /* @__PURE__ */ React2.createElement(View2, { style: [styles2.container, style] }, /* @__PURE__ */ React2.createElement(ErrorState, { message: error.message }));
|
|
145
|
+
}
|
|
146
|
+
return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(
|
|
147
|
+
TouchableOpacity,
|
|
148
|
+
{
|
|
149
|
+
onPress: handleOpen,
|
|
150
|
+
disabled,
|
|
151
|
+
activeOpacity: 0.8,
|
|
152
|
+
style: [
|
|
153
|
+
styles2.button,
|
|
154
|
+
{
|
|
155
|
+
borderColor: theme.colors.border,
|
|
156
|
+
backgroundColor: theme.colors.card,
|
|
157
|
+
opacity: disabled ? 0.5 : 1
|
|
158
|
+
},
|
|
159
|
+
style
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
/* @__PURE__ */ React2.createElement(
|
|
163
|
+
Text2,
|
|
164
|
+
{
|
|
165
|
+
style: [
|
|
166
|
+
styles2.buttonText,
|
|
167
|
+
{
|
|
168
|
+
color: selectedOption ? theme.colors.foreground : theme.colors["muted-foreground"]
|
|
169
|
+
},
|
|
170
|
+
textStyle
|
|
171
|
+
],
|
|
172
|
+
numberOfLines: 1
|
|
173
|
+
},
|
|
174
|
+
selectedOption?.label || placeholder
|
|
175
|
+
),
|
|
176
|
+
/* @__PURE__ */ React2.createElement(Text2, { style: [styles2.chevron, { color: theme.colors["muted-foreground"] }] }, "\u25BC")
|
|
177
|
+
), /* @__PURE__ */ React2.createElement(
|
|
178
|
+
Modal,
|
|
179
|
+
{
|
|
180
|
+
visible: isOpen,
|
|
181
|
+
transparent: true,
|
|
182
|
+
animationType: "slide",
|
|
183
|
+
onRequestClose: () => setIsOpen(false)
|
|
184
|
+
},
|
|
185
|
+
/* @__PURE__ */ React2.createElement(SafeAreaView, { style: [styles2.modalContainer, { backgroundColor: theme.colors.background }] }, /* @__PURE__ */ React2.createElement(View2, { style: styles2.modalHeader }, /* @__PURE__ */ React2.createElement(TouchableOpacity, { onPress: () => setIsOpen(false) }, /* @__PURE__ */ React2.createElement(Text2, { style: [styles2.closeButton, { color: theme.colors.primary }] }, "Close"))), /* @__PURE__ */ React2.createElement(
|
|
186
|
+
FlatList,
|
|
187
|
+
{
|
|
188
|
+
data: options,
|
|
189
|
+
keyExtractor: (item) => item.value,
|
|
190
|
+
renderItem: ({ item }) => /* @__PURE__ */ React2.createElement(
|
|
191
|
+
TouchableOpacity,
|
|
192
|
+
{
|
|
193
|
+
style: [
|
|
194
|
+
styles2.option,
|
|
195
|
+
{
|
|
196
|
+
backgroundColor: item.value === value ? theme.colors.primary : theme.colors.card,
|
|
197
|
+
borderBottomColor: theme.colors.border
|
|
198
|
+
}
|
|
199
|
+
],
|
|
200
|
+
onPress: () => handleSelect(item.value)
|
|
201
|
+
},
|
|
202
|
+
/* @__PURE__ */ React2.createElement(
|
|
203
|
+
Text2,
|
|
204
|
+
{
|
|
205
|
+
style: {
|
|
206
|
+
color: item.value === value ? theme.colors["primary-foreground"] : theme.colors.foreground
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
item.label
|
|
210
|
+
)
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
))
|
|
214
|
+
));
|
|
215
|
+
};
|
|
216
|
+
var styles2 = StyleSheet2.create({
|
|
217
|
+
container: {
|
|
218
|
+
width: "100%"
|
|
219
|
+
},
|
|
220
|
+
button: {
|
|
221
|
+
flexDirection: "row",
|
|
222
|
+
alignItems: "center",
|
|
223
|
+
justifyContent: "space-between",
|
|
224
|
+
borderWidth: 1,
|
|
225
|
+
borderRadius: 8,
|
|
226
|
+
paddingHorizontal: 12,
|
|
227
|
+
paddingVertical: 10
|
|
228
|
+
},
|
|
229
|
+
buttonText: {
|
|
230
|
+
fontSize: 16,
|
|
231
|
+
flex: 1
|
|
232
|
+
},
|
|
233
|
+
chevron: {
|
|
234
|
+
fontSize: 12,
|
|
235
|
+
marginLeft: 8
|
|
236
|
+
},
|
|
237
|
+
modalContainer: {
|
|
238
|
+
flex: 1
|
|
239
|
+
},
|
|
240
|
+
modalHeader: {
|
|
241
|
+
flexDirection: "row",
|
|
242
|
+
justifyContent: "flex-end",
|
|
243
|
+
padding: 16,
|
|
244
|
+
borderBottomWidth: 1,
|
|
245
|
+
borderBottomColor: "#e2e8f0"
|
|
246
|
+
},
|
|
247
|
+
closeButton: {
|
|
248
|
+
fontSize: 16,
|
|
249
|
+
fontWeight: "500"
|
|
250
|
+
},
|
|
251
|
+
option: {
|
|
252
|
+
padding: 16,
|
|
253
|
+
borderBottomWidth: 1
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
Select.displayName = "Select";
|
|
257
|
+
|
|
258
|
+
// src/components/atoms/Badge.tsx
|
|
259
|
+
import React3 from "react";
|
|
260
|
+
import { View as View3, Text as Text3, StyleSheet as StyleSheet3 } from "react-native";
|
|
261
|
+
var Badge = ({
|
|
262
|
+
children,
|
|
263
|
+
variant = "default",
|
|
264
|
+
size = "md",
|
|
265
|
+
style,
|
|
266
|
+
isLoading,
|
|
267
|
+
error
|
|
268
|
+
}) => {
|
|
269
|
+
const theme = useTheme();
|
|
270
|
+
if (isLoading) {
|
|
271
|
+
return /* @__PURE__ */ React3.createElement(View3, { style: [styles3.badge, style] }, /* @__PURE__ */ React3.createElement(LoadingState, { message: "Loading..." }));
|
|
272
|
+
}
|
|
273
|
+
if (error) {
|
|
274
|
+
return /* @__PURE__ */ React3.createElement(View3, { style: [styles3.badge, style] }, /* @__PURE__ */ React3.createElement(ErrorState, { message: error.message }));
|
|
275
|
+
}
|
|
276
|
+
const variantStyles = {
|
|
277
|
+
default: {
|
|
278
|
+
container: {
|
|
279
|
+
backgroundColor: theme.colors.secondary
|
|
280
|
+
},
|
|
281
|
+
text: {
|
|
282
|
+
color: theme.colors["secondary-foreground"]
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
primary: {
|
|
286
|
+
container: {
|
|
287
|
+
backgroundColor: theme.colors.primary
|
|
288
|
+
},
|
|
289
|
+
text: {
|
|
290
|
+
color: theme.colors["primary-foreground"]
|
|
291
|
+
}
|
|
292
|
+
},
|
|
293
|
+
secondary: {
|
|
294
|
+
container: {
|
|
295
|
+
backgroundColor: theme.colors["secondary-hover"]
|
|
296
|
+
},
|
|
297
|
+
text: {
|
|
298
|
+
color: theme.colors["secondary-foreground"]
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
success: {
|
|
302
|
+
container: {
|
|
303
|
+
backgroundColor: theme.colors.success
|
|
304
|
+
},
|
|
305
|
+
text: {
|
|
306
|
+
color: theme.colors["success-foreground"]
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
warning: {
|
|
310
|
+
container: {
|
|
311
|
+
backgroundColor: theme.colors.warning
|
|
312
|
+
},
|
|
313
|
+
text: {
|
|
314
|
+
color: theme.colors["warning-foreground"]
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
error: {
|
|
318
|
+
container: {
|
|
319
|
+
backgroundColor: theme.colors.error
|
|
320
|
+
},
|
|
321
|
+
text: {
|
|
322
|
+
color: theme.colors["error-foreground"]
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
const sizeStyles = {
|
|
327
|
+
sm: {
|
|
328
|
+
container: {
|
|
329
|
+
paddingHorizontal: theme.spacing[2],
|
|
330
|
+
paddingVertical: 2,
|
|
331
|
+
borderRadius: theme.borderRadius.full
|
|
332
|
+
},
|
|
333
|
+
text: {
|
|
334
|
+
fontSize: theme.typography.sizes.xs
|
|
335
|
+
}
|
|
336
|
+
},
|
|
337
|
+
md: {
|
|
338
|
+
container: {
|
|
339
|
+
paddingHorizontal: theme.spacing[3],
|
|
340
|
+
paddingVertical: theme.spacing[1],
|
|
341
|
+
borderRadius: theme.borderRadius.full
|
|
342
|
+
},
|
|
343
|
+
text: {
|
|
344
|
+
fontSize: theme.typography.sizes.sm
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
const variantStyle = variantStyles[variant];
|
|
349
|
+
const sizeStyle = sizeStyles[size];
|
|
350
|
+
return /* @__PURE__ */ React3.createElement(View3, { style: [styles3.badge, variantStyle.container, sizeStyle.container, style] }, /* @__PURE__ */ React3.createElement(Text3, { style: [styles3.text, variantStyle.text, sizeStyle.text] }, children));
|
|
351
|
+
};
|
|
352
|
+
var styles3 = StyleSheet3.create({
|
|
353
|
+
badge: {
|
|
354
|
+
alignSelf: "flex-start"
|
|
355
|
+
},
|
|
356
|
+
text: {
|
|
357
|
+
fontWeight: "500"
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
Badge.displayName = "Badge";
|
|
361
|
+
|
|
362
|
+
// src/components/atoms/Icon.tsx
|
|
363
|
+
import React4 from "react";
|
|
364
|
+
import { View as View4, Text as Text4, StyleSheet as StyleSheet4 } from "react-native";
|
|
365
|
+
var iconMap = {
|
|
366
|
+
home: "\u{1F3E0}",
|
|
367
|
+
user: "\u{1F464}",
|
|
368
|
+
settings: "\u2699\uFE0F",
|
|
369
|
+
"arrow-right": "\u2192",
|
|
370
|
+
"arrow-left": "\u2190",
|
|
371
|
+
check: "\u2713",
|
|
372
|
+
x: "\u2715",
|
|
373
|
+
plus: "+",
|
|
374
|
+
minus: "\u2212",
|
|
375
|
+
search: "\u{1F50D}",
|
|
376
|
+
menu: "\u2630",
|
|
377
|
+
"more-vertical": "\u22EE",
|
|
378
|
+
"chevron-right": "\u203A",
|
|
379
|
+
"chevron-left": "\u2039",
|
|
380
|
+
"chevron-down": "\u2304",
|
|
381
|
+
"chevron-up": "\u2303"
|
|
382
|
+
};
|
|
383
|
+
var Icon = ({
|
|
384
|
+
name,
|
|
385
|
+
size = 24,
|
|
386
|
+
color = "#374151",
|
|
387
|
+
style
|
|
388
|
+
}) => {
|
|
389
|
+
return /* @__PURE__ */ React4.createElement(View4, { style: [styles4.container, { width: size, height: size }, style] }, /* @__PURE__ */ React4.createElement(Text4, { style: [
|
|
390
|
+
styles4.icon,
|
|
391
|
+
{ fontSize: size * 0.7, color, lineHeight: size }
|
|
392
|
+
] }, iconMap[name] || "?"));
|
|
393
|
+
};
|
|
394
|
+
var styles4 = StyleSheet4.create({
|
|
395
|
+
container: {
|
|
396
|
+
alignItems: "center",
|
|
397
|
+
justifyContent: "center"
|
|
398
|
+
},
|
|
399
|
+
icon: {
|
|
400
|
+
textAlign: "center"
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
Icon.displayName = "Icon";
|
|
404
|
+
|
|
405
|
+
// src/components/atoms/ProgressBar.tsx
|
|
406
|
+
import React5 from "react";
|
|
407
|
+
import { View as View5, StyleSheet as StyleSheet5, Text as Text5 } from "react-native";
|
|
408
|
+
var ProgressBar = ({
|
|
409
|
+
progress,
|
|
410
|
+
showLabel = false,
|
|
411
|
+
size = "md",
|
|
412
|
+
style,
|
|
413
|
+
trackStyle,
|
|
414
|
+
fillStyle,
|
|
415
|
+
isLoading,
|
|
416
|
+
error
|
|
417
|
+
}) => {
|
|
418
|
+
const theme = useTheme();
|
|
419
|
+
const clampedProgress = Math.max(0, Math.min(100, progress));
|
|
420
|
+
if (isLoading) {
|
|
421
|
+
return /* @__PURE__ */ React5.createElement(View5, { style: [styles5.container, style] }, /* @__PURE__ */ React5.createElement(LoadingState, { message: "Loading..." }));
|
|
422
|
+
}
|
|
423
|
+
if (error) {
|
|
424
|
+
return /* @__PURE__ */ React5.createElement(View5, { style: [styles5.container, style] }, /* @__PURE__ */ React5.createElement(ErrorState, { message: error.message }));
|
|
425
|
+
}
|
|
426
|
+
const heightMap = {
|
|
427
|
+
sm: 4,
|
|
428
|
+
md: 8,
|
|
429
|
+
lg: 12
|
|
430
|
+
};
|
|
431
|
+
const height = heightMap[size];
|
|
432
|
+
return /* @__PURE__ */ React5.createElement(View5, { style: [styles5.container, style] }, /* @__PURE__ */ React5.createElement(
|
|
433
|
+
View5,
|
|
434
|
+
{
|
|
435
|
+
style: [
|
|
436
|
+
styles5.track,
|
|
437
|
+
{
|
|
438
|
+
height,
|
|
439
|
+
backgroundColor: theme.colors.muted,
|
|
440
|
+
borderRadius: height / 2
|
|
441
|
+
},
|
|
442
|
+
trackStyle
|
|
443
|
+
]
|
|
444
|
+
},
|
|
445
|
+
/* @__PURE__ */ React5.createElement(
|
|
446
|
+
View5,
|
|
447
|
+
{
|
|
448
|
+
style: [
|
|
449
|
+
styles5.fill,
|
|
450
|
+
{
|
|
451
|
+
width: `${clampedProgress}%`,
|
|
452
|
+
height: "100%",
|
|
453
|
+
backgroundColor: theme.colors.primary,
|
|
454
|
+
borderRadius: height / 2
|
|
455
|
+
},
|
|
456
|
+
fillStyle
|
|
457
|
+
]
|
|
458
|
+
}
|
|
459
|
+
)
|
|
460
|
+
), showLabel && /* @__PURE__ */ React5.createElement(Text5, { style: [styles5.label, { color: theme.colors.foreground }] }, Math.round(clampedProgress), "%"));
|
|
461
|
+
};
|
|
462
|
+
var styles5 = StyleSheet5.create({
|
|
463
|
+
container: {
|
|
464
|
+
width: "100%"
|
|
465
|
+
},
|
|
466
|
+
track: {
|
|
467
|
+
width: "100%",
|
|
468
|
+
overflow: "hidden"
|
|
469
|
+
},
|
|
470
|
+
fill: {
|
|
471
|
+
// Animated fill
|
|
472
|
+
},
|
|
473
|
+
label: {
|
|
474
|
+
marginTop: 4,
|
|
475
|
+
fontSize: 12,
|
|
476
|
+
fontWeight: "500",
|
|
477
|
+
textAlign: "right"
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
ProgressBar.displayName = "ProgressBar";
|
|
481
|
+
|
|
482
|
+
// src/components/atoms/Divider.tsx
|
|
483
|
+
import React6 from "react";
|
|
484
|
+
import { View as View6, StyleSheet as StyleSheet6 } from "react-native";
|
|
485
|
+
var Divider = ({
|
|
486
|
+
orientation = "horizontal",
|
|
487
|
+
thickness = 1,
|
|
488
|
+
style
|
|
489
|
+
}) => {
|
|
490
|
+
const theme = useTheme();
|
|
491
|
+
return /* @__PURE__ */ React6.createElement(
|
|
492
|
+
View6,
|
|
493
|
+
{
|
|
494
|
+
style: [
|
|
495
|
+
orientation === "horizontal" ? styles6.horizontal : styles6.vertical,
|
|
496
|
+
{
|
|
497
|
+
backgroundColor: theme.colors.border,
|
|
498
|
+
...orientation === "horizontal" ? { height: thickness } : { width: thickness }
|
|
499
|
+
},
|
|
500
|
+
style
|
|
501
|
+
]
|
|
502
|
+
}
|
|
503
|
+
);
|
|
504
|
+
};
|
|
505
|
+
var styles6 = StyleSheet6.create({
|
|
506
|
+
horizontal: {
|
|
507
|
+
width: "100%",
|
|
508
|
+
marginVertical: 8
|
|
509
|
+
},
|
|
510
|
+
vertical: {
|
|
511
|
+
height: "100%",
|
|
512
|
+
marginHorizontal: 8
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
Divider.displayName = "Divider";
|
|
516
|
+
|
|
517
|
+
export {
|
|
518
|
+
Input,
|
|
519
|
+
Select,
|
|
520
|
+
Badge,
|
|
521
|
+
Icon,
|
|
522
|
+
ProgressBar,
|
|
523
|
+
Divider
|
|
524
|
+
};
|
|
525
|
+
//# sourceMappingURL=chunk-BUN5QD6C.js.map
|