@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/templates/DashboardLayout.tsx","../src/components/templates/AuthLayout.tsx","../src/components/templates/GameShell.tsx","../src/components/templates/BattleTemplate.tsx","../src/components/templates/CastleTemplate.tsx","../src/components/templates/WorldMapTemplate.tsx","../src/components/templates/CounterTemplate.tsx","../src/components/templates/GameTemplate.tsx"],"sourcesContent":["import React from 'react';\nimport { \n View, \n StyleSheet, \n ViewStyle,\n ScrollView,\n SafeAreaView \n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { Header, HeaderAction } from '../organisms/Header';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\n\nexport interface DashboardLayoutProps {\n children: React.ReactNode;\n headerTitle?: string;\n headerActions?: HeaderAction[];\n showHeader?: boolean;\n style?: ViewStyle;\n contentStyle?: ViewStyle;\n scrollable?: boolean;\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 DashboardLayout: React.FC<DashboardLayoutProps> = ({\n children,\n headerTitle,\n headerActions = [],\n showHeader = true,\n style,\n contentStyle,\n scrollable = true,\n isLoading,\n error,\n}) => {\n const theme = useTheme();\n\n const Content = scrollable ? ScrollView : View;\n\n if (isLoading) {\n return (\n <SafeAreaView style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n {showHeader && (\n <Header title={headerTitle} rightActions={headerActions} />\n )}\n <LoadingState message=\"Loading...\" />\n </SafeAreaView>\n );\n }\n\n if (error) {\n return (\n <SafeAreaView style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n {showHeader && (\n <Header title={headerTitle} rightActions={headerActions} />\n )}\n <ErrorState message={error.message} />\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n {showHeader && (\n <Header title={headerTitle} rightActions={headerActions} />\n )}\n <Content \n style={[styles.content, contentStyle]}\n contentContainerStyle={scrollable ? styles.scrollContent : undefined}\n >\n {children}\n </Content>\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n content: {\n flex: 1,\n },\n scrollContent: {\n flexGrow: 1,\n padding: 16,\n },\n});\n\nDashboardLayout.displayName = 'DashboardLayout';\n","import React from 'react';\nimport { \n View, \n StyleSheet, \n ViewStyle,\n ScrollView,\n SafeAreaView,\n KeyboardAvoidingView,\n Platform,\n TouchableOpacity\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Typography } from '../atoms/Typography';\nimport { VStack } from '../atoms/Stack';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\n\nexport interface AuthLayoutProps {\n children: React.ReactNode;\n title: string;\n subtitle?: string;\n footer?: React.ReactNode;\n showBackButton?: boolean;\n onBack?: () => void;\n backAction?: string;\n style?: ViewStyle;\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 AuthLayout: React.FC<AuthLayoutProps> = ({\n children,\n title,\n subtitle,\n footer,\n showBackButton = false,\n onBack,\n backAction,\n style,\n isLoading,\n error,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handleBack = () => {\n if (backAction) {\n eventBus.emit(`UI:${backAction}`);\n }\n onBack?.();\n };\n\n if (isLoading) {\n return (\n <SafeAreaView style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <LoadingState message=\"Loading...\" />\n </SafeAreaView>\n );\n }\n\n if (error) {\n return (\n <SafeAreaView style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <ErrorState message={error.message} />\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <KeyboardAvoidingView \n behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n style={styles.keyboardView}\n >\n <ScrollView \n contentContainerStyle={styles.scrollContent}\n keyboardShouldPersistTaps=\"handled\"\n >\n <VStack spacing={24} style={styles.content}>\n {showBackButton && (\n <TouchableOpacity onPress={handleBack} style={styles.backButton}>\n <Typography variant=\"h4\" style={{ color: theme.colors.primary }}>\n ← Back\n </Typography>\n </TouchableOpacity>\n )}\n\n <VStack spacing={8} align=\"center\">\n <Typography variant=\"h1\" style={{ color: theme.colors.foreground, textAlign: 'center' }}>\n {title}\n </Typography>\n {subtitle && (\n <Typography variant=\"body\" style={{ color: theme.colors['muted-foreground'], textAlign: 'center' }}>\n {subtitle}\n </Typography>\n )}\n </VStack>\n\n <View style={styles.form}>\n {children}\n </View>\n\n {footer && (\n <View style={styles.footer}>\n {footer}\n </View>\n )}\n </VStack>\n </ScrollView>\n </KeyboardAvoidingView>\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n keyboardView: {\n flex: 1,\n },\n scrollContent: {\n flexGrow: 1,\n justifyContent: 'center',\n },\n content: {\n padding: 24,\n paddingTop: 40,\n paddingBottom: 40,\n },\n backButton: {\n alignSelf: 'flex-start',\n },\n form: {\n width: '100%',\n },\n footer: {\n marginTop: 16,\n },\n});\n\nAuthLayout.displayName = 'AuthLayout';\n","import React from 'react';\nimport {\n View,\n StyleSheet,\n ViewStyle,\n SafeAreaView,\n StatusBar,\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { GameHud, GameHudProps } from '../organisms/game/GameHud';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\n\nexport interface GameShellProps {\n /** Main game content */\n children: React.ReactNode;\n /** HUD configuration */\n hud?: GameHudProps;\n /** Show HUD */\n showHud?: boolean;\n /** Header component (optional) */\n header?: React.ReactNode;\n /** Footer component (optional) */\n footer?: React.ReactNode;\n /** Additional container styles */\n style?: ViewStyle;\n /** Game area styles */\n gameAreaStyle?: ViewStyle;\n /** Background color override */\n backgroundColor?: 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 GameShell: React.FC<GameShellProps> = ({\n children,\n hud,\n showHud = true,\n header,\n footer,\n style,\n gameAreaStyle,\n backgroundColor,\n isLoading,\n error,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n if (isLoading) {\n return (\n <SafeAreaView\n style={[\n styles.container,\n { backgroundColor: backgroundColor || theme.colors.background },\n style,\n ]}\n >\n <StatusBar barStyle=\"light-content\" />\n {header}\n <View style={styles.loadingContainer}>\n <LoadingState message=\"Loading game...\" />\n </View>\n </SafeAreaView>\n );\n }\n\n if (error) {\n return (\n <SafeAreaView\n style={[\n styles.container,\n { backgroundColor: backgroundColor || theme.colors.background },\n style,\n ]}\n >\n <StatusBar barStyle=\"light-content\" />\n {header}\n <View style={styles.loadingContainer}>\n <ErrorState\n message={error.message}\n onRetry={() => eventBus.emit('UI:GAME_RETRY', {})}\n />\n </View>\n </SafeAreaView>\n );\n }\n\n return (\n <SafeAreaView\n style={[\n styles.container,\n { backgroundColor: backgroundColor || theme.colors.background },\n style,\n ]}\n >\n <StatusBar barStyle=\"light-content\" />\n\n {/* Header */}\n {header && <View style={styles.header}>{header}</View>}\n\n {/* Game Area with HUD Overlay */}\n <View style={[styles.gameArea, gameAreaStyle]}>\n {children}\n\n {/* HUD Overlay */}\n {showHud && hud && (\n <View style={styles.hudContainer}>\n <GameHud\n {...hud}\n style={{ ...styles.hud, ...hud.style }}\n />\n </View>\n )}\n </View>\n\n {/* Footer */}\n {footer && <View style={styles.footer}>{footer}</View>}\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n header: {\n zIndex: 20,\n },\n gameArea: {\n flex: 1,\n position: 'relative',\n },\n hudContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'box-none',\n },\n hud: {\n pointerEvents: 'auto',\n },\n footer: {\n zIndex: 20,\n },\n loadingContainer: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n\nGameShell.displayName = 'GameShell';\n","import React from 'react';\nimport {\n View,\n StyleSheet,\n ViewStyle,\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport type { EventPayload } from '@almadar/core';\nimport { BattleBoard, BattleBoardProps } from '../organisms/game/BattleBoard';\nimport { GameHud, GameHudStat } from '../organisms/game/GameHud';\nimport { GameMenu, MenuOption } from '../organisms/game/GameMenu';\nimport { Button } from '../atoms/Button';\nimport { Typography } from '../atoms/Typography';\nimport { HStack } from '../atoms/Stack';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\nimport { EmptyState } from '../molecules/EmptyState';\n\nexport interface BattleTemplateProps {\n /** Battle board configuration */\n battleBoard: BattleBoardProps;\n /** HUD stats configuration */\n hudStats?: GameHudStat[];\n /** Menu options for battle menu */\n menuOptions?: MenuOption[];\n /** Battle title */\n title?: string;\n /** Show battle menu overlay */\n showMenu?: boolean;\n /** Additional container styles */\n style?: ViewStyle;\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 /** Event fired when battle action occurs */\n onBattleAction?: (action: string) => void;\n /** Event fired when battle ends */\n onBattleEnd?: (result: 'win' | 'lose' | 'flee') => void;\n}\n\nexport const BattleTemplate: React.FC<BattleTemplateProps> = ({\n battleBoard,\n hudStats,\n menuOptions,\n title,\n showMenu = false,\n style,\n isLoading,\n error,\n entity,\n onBattleAction,\n onBattleEnd,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handleBattleAction = (action: string) => {\n eventBus.emit('UI:BATTLE_ACTION', { action, entity } as EventPayload);\n onBattleAction?.(action);\n };\n\n const handleBattleEnd = (result: 'win' | 'lose' | 'flee') => {\n eventBus.emit('UI:BATTLE_END', { result, entity } as EventPayload);\n onBattleEnd?.(result);\n };\n\n const handleMenuSelect = (option: MenuOption) => {\n if (option.event) {\n eventBus.emit(`UI:${option.event}`, { option, entity } as unknown as EventPayload);\n }\n if (option.navigatesTo) {\n eventBus.emit('UI:navigate', { to: option.navigatesTo } as EventPayload);\n }\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <LoadingState message=\"Loading battle...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <ErrorState\n message={error.message}\n onRetry={() => eventBus.emit('UI:BATTLE_RETRY', { entity } as EventPayload)}\n />\n </View>\n );\n }\n\n const hasUnits = battleBoard.units && battleBoard.units.length > 0;\n\n return (\n <View style={[styles.container, { backgroundColor: '#0f172a' }, style]}>\n {/* Header */}\n {title && (\n <View style={styles.header}>\n <Typography variant=\"h2\" style={{ color: '#fff' }}>\n {title}\n </Typography>\n </View>\n )}\n\n {/* HUD */}\n {hudStats && hudStats.length > 0 && (\n <View style={styles.hudContainer}>\n <GameHud stats={hudStats} position=\"corners\" transparent />\n </View>\n )}\n\n {/* Battle Board */}\n <View style={styles.boardContainer}>\n {hasUnits ? (\n <BattleBoard\n {...battleBoard}\n onAction={handleBattleAction}\n />\n ) : (\n <EmptyState\n message=\"No battle units available\"\n icon={<Typography variant=\"h1\">⚔️</Typography>}\n />\n )}\n </View>\n\n {/* Battle Controls */}\n <View style={styles.controls}>\n <HStack spacing={8} justify=\"center\">\n <Button\n variant=\"primary\"\n action=\"BATTLE_ATTACK\"\n actionPayload={{ entity }}\n onPress={() => handleBattleAction('attack')}\n >\n Attack\n </Button>\n <Button\n variant=\"secondary\"\n action=\"BATTLE_DEFEND\"\n actionPayload={{ entity }}\n onPress={() => handleBattleAction('defend')}\n >\n Defend\n </Button>\n <Button\n variant=\"ghost\"\n action=\"BATTLE_FLEE\"\n actionPayload={{ entity }}\n onPress={() => handleBattleEnd('flee')}\n >\n Flee\n </Button>\n </HStack>\n </View>\n\n {/* Menu Overlay */}\n {showMenu && menuOptions && (\n <View style={styles.menuOverlay}>\n <GameMenu\n title=\"Battle Menu\"\n options={menuOptions}\n onSelect={handleMenuSelect}\n />\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n header: {\n padding: 16,\n alignItems: 'center',\n },\n hudContainer: {\n position: 'absolute',\n top: 60,\n left: 0,\n right: 0,\n height: 80,\n zIndex: 10,\n pointerEvents: 'none',\n },\n boardContainer: {\n flex: 1,\n padding: 16,\n justifyContent: 'center',\n },\n controls: {\n padding: 16,\n backgroundColor: 'rgba(0,0,0,0.5)',\n },\n menuOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 100,\n },\n});\n\nBattleTemplate.displayName = 'BattleTemplate';\n","import React from 'react';\nimport {\n View,\n StyleSheet,\n ViewStyle,\n ScrollView,\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { CastleBoard, CastleBoardProps } from '../organisms/game/CastleBoard';\nimport { GameHud, GameHudStat } from '../organisms/game/GameHud';\nimport { Button } from '../atoms/Button';\nimport { Typography } from '../atoms/Typography';\nimport { HStack } from '../atoms/Stack';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\nimport { EmptyState } from '../molecules/EmptyState';\n\nexport interface CastleTemplateProps {\n /** Castle board configuration */\n castleBoard: CastleBoardProps;\n /** HUD stats configuration */\n hudStats?: GameHudStat[];\n /** Quick action buttons */\n actions?: Array<{\n label: string;\n event: string;\n variant?: 'default' | 'primary' | 'secondary' | 'ghost';\n }>;\n /** Template title */\n title?: string;\n /** Additional container styles */\n style?: ViewStyle;\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 /** Event fired when room is entered */\n onEnterRoom?: (roomId: string) => void;\n /** Event fired when castle action occurs */\n onCastleAction?: (action: string) => void;\n}\n\nexport const CastleTemplate: React.FC<CastleTemplateProps> = ({\n castleBoard,\n hudStats,\n actions,\n title,\n style,\n isLoading,\n error,\n entity,\n onEnterRoom,\n onCastleAction,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handleEnterRoom = (roomId: string) => {\n eventBus.emit('UI:CASTLE_ENTER_ROOM', { roomId, entity });\n onEnterRoom?.(roomId);\n };\n\n const handleAction = (action: string) => {\n eventBus.emit('UI:CASTLE_ACTION', { action, entity });\n onCastleAction?.(action);\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <LoadingState message=\"Loading castle...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <ErrorState\n message={error.message}\n onRetry={() => eventBus.emit('UI:CASTLE_RETRY', { entity })}\n />\n </View>\n );\n }\n\n const hasRooms = castleBoard.rooms && castleBoard.rooms.length > 0;\n\n return (\n <View style={[styles.container, { backgroundColor: '#1e293b' }, style]}>\n {/* HUD */}\n {hudStats && hudStats.length > 0 && (\n <View style={styles.hudContainer}>\n <GameHud stats={hudStats} position=\"top\" transparent />\n </View>\n )}\n\n <ScrollView\n style={styles.scrollView}\n contentContainerStyle={styles.scrollContent}\n showsVerticalScrollIndicator={false}\n >\n {/* Title */}\n {title && (\n <View style={styles.header}>\n <Typography variant=\"h2\" style={{ color: '#fbbf24' }}>\n {title}\n </Typography>\n </View>\n )}\n\n {/* Castle Board */}\n <View style={styles.boardContainer}>\n {hasRooms ? (\n <CastleBoard\n {...castleBoard}\n onSelectRoom={handleEnterRoom}\n />\n ) : (\n <EmptyState\n message=\"No castle rooms available\"\n icon={<Typography variant=\"h1\">🏰</Typography>}\n />\n )}\n </View>\n\n {/* Action Buttons */}\n {actions && actions.length > 0 && (\n <View style={styles.actionsContainer}>\n <HStack spacing={8} justify=\"center\" style={styles.actions}>\n {actions.map((action, index) => (\n <Button\n key={index}\n variant={action.variant || 'default'}\n action={action.event}\n actionPayload={{ entity }}\n onPress={() => handleAction(action.event)}\n >\n {action.label}\n </Button>\n ))}\n </HStack>\n </View>\n )}\n </ScrollView>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n hudContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n zIndex: 10,\n },\n scrollView: {\n flex: 1,\n },\n scrollContent: {\n paddingTop: 80,\n paddingBottom: 24,\n },\n header: {\n padding: 16,\n alignItems: 'center',\n },\n boardContainer: {\n padding: 16,\n },\n actionsContainer: {\n padding: 16,\n },\n actions: {\n flexWrap: 'wrap',\n },\n});\n\nCastleTemplate.displayName = 'CastleTemplate';\n","import React from 'react';\nimport {\n View,\n StyleSheet,\n ViewStyle,\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { WorldMapBoard, WorldMapBoardProps } from '../organisms/game/WorldMapBoard';\nimport { GameHud, GameHudStat } from '../organisms/game/GameHud';\nimport { Button } from '../atoms/Button';\nimport { Typography } from '../atoms/Typography';\nimport { HStack } from '../atoms/Stack';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\nimport { EmptyState } from '../molecules/EmptyState';\n\nexport interface WorldMapTemplateProps {\n /** World map board configuration */\n worldMapBoard: WorldMapBoardProps;\n /** HUD stats configuration */\n hudStats?: GameHudStat[];\n /** Quick navigation buttons */\n navigationActions?: Array<{\n label: string;\n event: string;\n targetNodeId?: string;\n variant?: 'default' | 'primary' | 'secondary' | 'ghost';\n }>;\n /** Template title */\n title?: string;\n /** Current region/act */\n act?: string;\n /** Additional container styles */\n style?: ViewStyle;\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 /** Event fired when node is selected */\n onSelectNode?: (nodeId: string) => void;\n /** Event fired when map action occurs */\n onMapAction?: (action: string, targetNodeId?: string) => void;\n}\n\nexport const WorldMapTemplate: React.FC<WorldMapTemplateProps> = ({\n worldMapBoard,\n hudStats,\n navigationActions,\n title,\n act,\n style,\n isLoading,\n error,\n entity,\n onSelectNode,\n onMapAction,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handleSelectNode = (nodeId: string) => {\n eventBus.emit('UI:MAP_SELECT_NODE', { nodeId, entity });\n onSelectNode?.(nodeId);\n };\n\n const handleMapAction = (action: string, targetNodeId?: string) => {\n eventBus.emit('UI:MAP_ACTION', { action, targetNodeId, entity });\n onMapAction?.(action, targetNodeId);\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <LoadingState message=\"Loading world map...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <ErrorState\n message={error.message}\n onRetry={() => eventBus.emit('UI:MAP_RETRY', { entity })}\n />\n </View>\n );\n }\n\n const hasNodes = worldMapBoard.nodes && worldMapBoard.nodes.length > 0;\n\n return (\n <View style={[styles.container, { backgroundColor: '#0f172a' }, style]}>\n {/* HUD */}\n {hudStats && hudStats.length > 0 && (\n <View style={styles.hudContainer}>\n <GameHud stats={hudStats} position=\"corners\" transparent />\n </View>\n )}\n\n {/* Header */}\n {(title || act) && (\n <View style={styles.header}>\n {title && (\n <Typography variant=\"h2\" style={{ color: '#fff' }}>\n {title}\n </Typography>\n )}\n {act && (\n <Typography variant=\"caption\" style={{ color: '#9ca3af' }}>\n {act}\n </Typography>\n )}\n </View>\n )}\n\n {/* Map Board */}\n <View style={styles.mapContainer}>\n {hasNodes ? (\n <WorldMapBoard\n {...worldMapBoard}\n title={worldMapBoard.title || title}\n act={worldMapBoard.act || act}\n onSelectNode={handleSelectNode}\n />\n ) : (\n <EmptyState\n message=\"No map locations available\"\n icon={<Typography variant=\"h1\">🗺️</Typography>}\n />\n )}\n </View>\n\n {/* Navigation Actions */}\n {navigationActions && navigationActions.length > 0 && (\n <View style={styles.actionsContainer}>\n <HStack spacing={8} justify=\"center\" style={styles.actions}>\n {navigationActions.map((action, index) => (\n <Button\n key={index}\n variant={action.variant || 'default'}\n action={action.event}\n actionPayload={{ entity, targetNodeId: action.targetNodeId }}\n onPress={() => handleMapAction(action.event, action.targetNodeId)}\n >\n {action.label}\n </Button>\n ))}\n </HStack>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n hudContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'none',\n zIndex: 10,\n },\n header: {\n padding: 16,\n alignItems: 'center',\n zIndex: 20,\n },\n mapContainer: {\n flex: 1,\n padding: 16,\n },\n actionsContainer: {\n padding: 16,\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: 20,\n },\n actions: {\n flexWrap: 'wrap',\n },\n});\n\nWorldMapTemplate.displayName = 'WorldMapTemplate';\n","import React, { useState, useCallback } from 'react';\nimport {\n View,\n StyleSheet,\n ViewStyle,\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Button } from '../atoms/Button';\nimport { Typography } from '../atoms/Typography';\nimport { Card } from '../atoms/Card';\nimport { VStack, HStack } from '../atoms/Stack';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\n\nexport interface CounterTemplateProps {\n /** Initial count value */\n initialCount?: number;\n /** Count step size */\n step?: number;\n /** Minimum count value */\n min?: number;\n /** Maximum count value */\n max?: number;\n /** Counter title */\n title?: string;\n /** Show reset button */\n showReset?: boolean;\n /** Additional container styles */\n style?: ViewStyle;\n /** Card style */\n cardStyle?: ViewStyle;\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 /** Event fired when count changes */\n onCountChange?: (count: number) => void;\n /** Event fired when count is reset */\n onReset?: () => void;\n}\n\nexport const CounterTemplate: React.FC<CounterTemplateProps> = ({\n initialCount = 0,\n step = 1,\n min = Number.MIN_SAFE_INTEGER,\n max = Number.MAX_SAFE_INTEGER,\n title = 'Counter',\n showReset = true,\n style,\n cardStyle,\n isLoading,\n error,\n entity,\n onCountChange,\n onReset,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n const [count, setCount] = useState<number>(initialCount);\n\n const handleIncrement = useCallback(() => {\n setCount((prev) => {\n const newCount = Math.min(prev + step, max);\n eventBus.emit('UI:COUNTER_INCREMENT', { count: newCount, entity });\n onCountChange?.(newCount);\n return newCount;\n });\n }, [step, max, entity, onCountChange, eventBus]);\n\n const handleDecrement = useCallback(() => {\n setCount((prev) => {\n const newCount = Math.max(prev - step, min);\n eventBus.emit('UI:COUNTER_DECREMENT', { count: newCount, entity });\n onCountChange?.(newCount);\n return newCount;\n });\n }, [step, min, entity, onCountChange, eventBus]);\n\n const handleReset = useCallback(() => {\n setCount(initialCount);\n eventBus.emit('UI:COUNTER_RESET', { count: initialCount, entity });\n onReset?.();\n onCountChange?.(initialCount);\n }, [initialCount, entity, onReset, onCountChange, eventBus]);\n\n if (isLoading) {\n return (\n <View style={[styles.container, style]}>\n <LoadingState message=\"Loading counter...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, style]}>\n <ErrorState\n message={error.message}\n onRetry={() => eventBus.emit('UI:COUNTER_RETRY', { entity })}\n />\n </View>\n );\n }\n\n const isAtMin = count <= min;\n const isAtMax = count >= max;\n\n return (\n <View style={[styles.container, { backgroundColor: theme.colors.background }, style]}>\n <Card style={[styles.card, cardStyle || {}]}>\n <VStack spacing={24} align=\"center\">\n {/* Title */}\n <Typography variant=\"h3\">{title}</Typography>\n\n {/* Count Display */}\n <View style={styles.countDisplay}>\n <Typography\n variant=\"h1\"\n style={[\n styles.countText,\n { color: count > 0 ? theme.colors.success : count < 0 ? theme.colors.error : theme.colors.foreground },\n ]}\n >\n {count}\n </Typography>\n </View>\n\n {/* Controls */}\n <HStack spacing={16} align=\"center\">\n <Button\n variant=\"secondary\"\n action=\"COUNTER_DECREMENT\"\n actionPayload={{ entity, step }}\n onPress={handleDecrement}\n disabled={isAtMin}\n >\n -{step}\n </Button>\n\n {showReset && (\n <Button\n variant=\"ghost\"\n action=\"COUNTER_RESET\"\n actionPayload={{ entity }}\n onPress={handleReset}\n disabled={count === initialCount}\n >\n Reset\n </Button>\n )}\n\n <Button\n variant=\"primary\"\n action=\"COUNTER_INCREMENT\"\n actionPayload={{ entity, step }}\n onPress={handleIncrement}\n disabled={isAtMax}\n >\n +{step}\n </Button>\n </HStack>\n\n {/* Status */}\n <Typography variant=\"caption\" color={theme.colors['muted-foreground']}>\n Min: {min} | Max: {max} | Step: {step}\n </Typography>\n </VStack>\n </Card>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n padding: 16,\n },\n card: {\n padding: 32,\n minWidth: 280,\n maxWidth: 400,\n width: '100%',\n },\n countDisplay: {\n paddingVertical: 24,\n paddingHorizontal: 48,\n backgroundColor: 'rgba(0,0,0,0.05)',\n borderRadius: 12,\n },\n countText: {\n fontSize: 64,\n fontWeight: '700',\n },\n});\n\nCounterTemplate.displayName = 'CounterTemplate';\n","import React from 'react';\nimport {\n View,\n StyleSheet,\n ViewStyle,\n SafeAreaView,\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { GameHud, GameHudProps } from '../organisms/game/GameHud';\nimport { GameMenu, GameMenuProps } from '../organisms/game/GameMenu';\nimport { Button } from '../atoms/Button';\nimport { Typography } from '../atoms/Typography';\nimport { Card } from '../atoms/Card';\nimport { HStack } from '../atoms/Stack';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\nimport { EmptyState } from '../molecules/EmptyState';\n\nexport interface GameAction {\n /** Button label */\n label: string;\n /** Event name to emit */\n event: string;\n /** Button variant */\n variant?: 'default' | 'primary' | 'secondary' | 'ghost' | 'destructive';\n /** Whether the action is disabled */\n disabled?: boolean;\n /** Optional payload to include with the event */\n payload?: Record<string, unknown>;\n}\n\nexport interface GameTemplateProps {\n /** Main game content */\n children?: React.ReactNode;\n /** Game title displayed in header */\n title?: string;\n /** Game subtitle */\n subtitle?: string;\n /** HUD configuration */\n hud?: GameHudProps;\n /** Show HUD overlay */\n showHud?: boolean;\n /** Menu configuration (renders menu instead of game content if provided) */\n menu?: Omit<GameMenuProps, 'title' | 'subtitle'> & { title?: string; subtitle?: string };\n /** Show menu overlay */\n showMenu?: boolean;\n /** Quick action buttons displayed at bottom */\n actions?: GameAction[];\n /** Additional container styles */\n style?: ViewStyle;\n /** Content container styles */\n contentStyle?: ViewStyle;\n /** Background color override */\n backgroundColor?: 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 /** Empty state message */\n emptyMessage?: string;\n /** Event fired when template action occurs */\n onAction?: (action: string, payload?: Record<string, unknown>) => void;\n}\n\nexport const GameTemplate: React.FC<GameTemplateProps> = ({\n children,\n title,\n subtitle,\n hud,\n showHud = true,\n menu,\n showMenu = false,\n actions,\n style,\n contentStyle,\n backgroundColor,\n isLoading,\n error,\n entity,\n emptyMessage = 'No game content available',\n onAction,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handleAction = (action: string, payload?: Record<string, unknown>) => {\n eventBus.emit(`UI:${action}`, { ...payload, entity });\n onAction?.(action, payload);\n };\n\n if (isLoading) {\n return (\n <SafeAreaView\n style={[\n styles.container,\n { backgroundColor: backgroundColor || theme.colors.background },\n style,\n ]}\n >\n <LoadingState message=\"Loading game...\" />\n </SafeAreaView>\n );\n }\n\n if (error) {\n return (\n <SafeAreaView\n style={[\n styles.container,\n { backgroundColor: backgroundColor || theme.colors.background },\n style,\n ]}\n >\n <ErrorState\n message={error.message}\n onRetry={() => handleAction('GAME_RETRY')}\n />\n </SafeAreaView>\n );\n }\n\n // Render menu if showMenu is true or no children provided\n const shouldShowMenu = showMenu || (!children && menu);\n\n if (shouldShowMenu && menu) {\n return (\n <SafeAreaView\n style={[\n styles.container,\n { backgroundColor: backgroundColor || '#0f172a' },\n style,\n ]}\n >\n <GameMenu\n title={menu.title || title || 'Game Menu'}\n subtitle={menu.subtitle || subtitle}\n options={menu.options || menu.menuItems || []}\n onSelect={(option) => {\n if (option.event) {\n handleAction(option.event, { option });\n }\n if (option.navigatesTo) {\n handleAction('navigate', { to: option.navigatesTo });\n }\n menu.onSelect?.(option);\n }}\n background={menu.background}\n logo={menu.logo}\n style={menu.style}\n />\n </SafeAreaView>\n );\n }\n\n const hasContent = React.Children.count(children) > 0;\n\n return (\n <SafeAreaView\n style={[\n styles.container,\n { backgroundColor: backgroundColor || theme.colors.background },\n style,\n ]}\n >\n {/* HUD Overlay */}\n {showHud && hud && (\n <View style={styles.hudOverlay}>\n <GameHud {...hud} />\n </View>\n )}\n\n {/* Header */}\n {(title || subtitle) && (\n <View style={styles.header}>\n {title && (\n <Typography variant=\"h2\" style={styles.title}>\n {title}\n </Typography>\n )}\n {subtitle && (\n <Typography variant=\"body\" color={theme.colors['muted-foreground']}>\n {subtitle}\n </Typography>\n )}\n </View>\n )}\n\n {/* Main Content */}\n <View style={[styles.content, contentStyle]}>\n {hasContent ? (\n children\n ) : (\n <EmptyState\n message={emptyMessage}\n icon={<Typography variant=\"h1\">🎮</Typography>}\n />\n )}\n </View>\n\n {/* Action Bar */}\n {actions && actions.length > 0 && (\n <View style={styles.actionBar}>\n <Card variant=\"elevated\" style={styles.actionCard}>\n <HStack spacing={8} justify=\"center\" style={styles.actions}>\n {actions.map((action, index) => (\n <Button\n key={index}\n variant={action.variant || 'default'}\n action={action.event}\n actionPayload={{ ...action.payload, entity }}\n onPress={() => handleAction(action.event, action.payload)}\n disabled={action.disabled}\n >\n {action.label}\n </Button>\n ))}\n </HStack>\n </Card>\n </View>\n )}\n </SafeAreaView>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n hudOverlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: 'box-none',\n zIndex: 10,\n },\n header: {\n padding: 16,\n alignItems: 'center',\n zIndex: 20,\n },\n title: {\n fontWeight: '700',\n },\n content: {\n flex: 1,\n padding: 16,\n },\n actionBar: {\n padding: 16,\n zIndex: 20,\n },\n actionCard: {\n padding: 12,\n },\n actions: {\n flexWrap: 'wrap',\n },\n});\n\nGameTemplate.displayName = 'GameTemplate';\n"],"mappings":"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","names":["React","View","StyleSheet","ScrollView","SafeAreaView","React","SafeAreaView","styles","ScrollView","View","StyleSheet","React","View","StyleSheet","SafeAreaView","React","SafeAreaView","styles","View","StyleSheet","React","View","StyleSheet","React","View","styles","StyleSheet","React","View","StyleSheet","ScrollView","React","View","styles","ScrollView","StyleSheet","React","View","StyleSheet","React","View","styles","StyleSheet","React","View","StyleSheet","React","View","styles","StyleSheet","React","View","StyleSheet","SafeAreaView","React","SafeAreaView","styles","View","StyleSheet"]}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useThemeMode
|
|
3
3
|
} from "./chunk-A56SRZKI.js";
|
|
4
|
+
import {
|
|
5
|
+
Icon
|
|
6
|
+
} from "./chunk-BUN5QD6C.js";
|
|
4
7
|
import {
|
|
5
8
|
ErrorState,
|
|
6
9
|
HStack,
|
|
7
|
-
Icon,
|
|
8
10
|
LoadingState,
|
|
9
11
|
Typography,
|
|
10
12
|
VStack
|
|
11
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-A6AK75GP.js";
|
|
12
14
|
import {
|
|
13
15
|
useEventBus
|
|
14
16
|
} from "./chunk-YTVYMEKU.js";
|
|
@@ -1300,6 +1302,86 @@ var styles15 = StyleSheet15.create({
|
|
|
1300
1302
|
});
|
|
1301
1303
|
StateIndicator.displayName = "StateIndicator";
|
|
1302
1304
|
|
|
1305
|
+
// src/components/atoms/game/OrbitalGameCanvas.tsx
|
|
1306
|
+
import React18, { useEffect as useEffect4, useRef as useRef5 } from "react";
|
|
1307
|
+
import { Platform, View as View12, Text as Text4, StyleSheet as StyleSheet16, requireNativeComponent, UIManager, findNodeHandle } from "react-native";
|
|
1308
|
+
var NATIVE_VIEW_NAME = "OrbitalGameCanvasView";
|
|
1309
|
+
var NativeGameCanvas = null;
|
|
1310
|
+
var nativeAvailable = Platform.OS === "android" || Platform.OS === "ios";
|
|
1311
|
+
if (nativeAvailable) {
|
|
1312
|
+
try {
|
|
1313
|
+
NativeGameCanvas = requireNativeComponent(NATIVE_VIEW_NAME);
|
|
1314
|
+
} catch {
|
|
1315
|
+
NativeGameCanvas = null;
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
var COMMANDS = UIManager.getViewManagerConfig ? UIManager.getViewManagerConfig(NATIVE_VIEW_NAME)?.Commands : void 0;
|
|
1319
|
+
function nativeSubmitPacket(ref, jsonPacket) {
|
|
1320
|
+
if (!ref.current || !COMMANDS || typeof COMMANDS["submitPacket"] !== "number") {
|
|
1321
|
+
return;
|
|
1322
|
+
}
|
|
1323
|
+
UIManager.dispatchViewManagerCommand(
|
|
1324
|
+
findNodeHandle(ref.current),
|
|
1325
|
+
COMMANDS["submitPacket"],
|
|
1326
|
+
[jsonPacket]
|
|
1327
|
+
);
|
|
1328
|
+
}
|
|
1329
|
+
var OrbitalGameCanvas = ({
|
|
1330
|
+
jsonPacket,
|
|
1331
|
+
trait,
|
|
1332
|
+
props: _props,
|
|
1333
|
+
style,
|
|
1334
|
+
onReady,
|
|
1335
|
+
onError: _onError
|
|
1336
|
+
}) => {
|
|
1337
|
+
const ref = useRef5(null);
|
|
1338
|
+
useEffect4(() => {
|
|
1339
|
+
nativeSubmitPacket(ref, jsonPacket);
|
|
1340
|
+
}, [jsonPacket]);
|
|
1341
|
+
useEffect4(() => {
|
|
1342
|
+
if (onReady) {
|
|
1343
|
+
onReady();
|
|
1344
|
+
}
|
|
1345
|
+
}, [onReady]);
|
|
1346
|
+
if (NativeGameCanvas) {
|
|
1347
|
+
return /* @__PURE__ */ React18.createElement(
|
|
1348
|
+
NativeGameCanvas,
|
|
1349
|
+
{
|
|
1350
|
+
ref,
|
|
1351
|
+
jsonPacket,
|
|
1352
|
+
trait,
|
|
1353
|
+
style: [styles16.canvas, style]
|
|
1354
|
+
}
|
|
1355
|
+
);
|
|
1356
|
+
}
|
|
1357
|
+
return /* @__PURE__ */ React18.createElement(View12, { style: [styles16.fallback, style] }, /* @__PURE__ */ React18.createElement(Text4, { style: styles16.fallbackText }, "[OrbitalGameCanvas \u2014 native GPU unavailable]"), /* @__PURE__ */ React18.createElement(Text4, { style: styles16.fallbackSub }, trait));
|
|
1358
|
+
};
|
|
1359
|
+
OrbitalGameCanvas.displayName = "OrbitalGameCanvas";
|
|
1360
|
+
var styles16 = StyleSheet16.create({
|
|
1361
|
+
canvas: {
|
|
1362
|
+
flex: 1
|
|
1363
|
+
},
|
|
1364
|
+
fallback: {
|
|
1365
|
+
flex: 1,
|
|
1366
|
+
minHeight: 160,
|
|
1367
|
+
backgroundColor: "#111",
|
|
1368
|
+
alignItems: "center",
|
|
1369
|
+
justifyContent: "center",
|
|
1370
|
+
borderRadius: 8
|
|
1371
|
+
},
|
|
1372
|
+
fallbackText: {
|
|
1373
|
+
color: "#aaa",
|
|
1374
|
+
fontSize: 12,
|
|
1375
|
+
fontFamily: "monospace"
|
|
1376
|
+
},
|
|
1377
|
+
fallbackSub: {
|
|
1378
|
+
color: "#666",
|
|
1379
|
+
fontSize: 10,
|
|
1380
|
+
marginTop: 4,
|
|
1381
|
+
fontFamily: "monospace"
|
|
1382
|
+
}
|
|
1383
|
+
});
|
|
1384
|
+
|
|
1303
1385
|
export {
|
|
1304
1386
|
Center,
|
|
1305
1387
|
Radio,
|
|
@@ -1317,6 +1399,7 @@ export {
|
|
|
1317
1399
|
ThemeToggle,
|
|
1318
1400
|
RangeSlider,
|
|
1319
1401
|
Sprite,
|
|
1320
|
-
StateIndicator
|
|
1402
|
+
StateIndicator,
|
|
1403
|
+
OrbitalGameCanvas
|
|
1321
1404
|
};
|
|
1322
|
-
//# sourceMappingURL=chunk-
|
|
1405
|
+
//# sourceMappingURL=chunk-VNRKHWR7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/atoms/Center.tsx","../src/components/atoms/Radio.tsx","../src/components/atoms/Switch.tsx","../src/components/atoms/Textarea.tsx","../src/components/atoms/Avatar.tsx","../src/components/atoms/Overlay.tsx","../src/components/atoms/Spacer.tsx","../src/components/atoms/ConditionalWrapper.tsx","../src/components/atoms/StatusDot.tsx","../src/components/atoms/TrendIndicator.tsx","../src/components/atoms/TextHighlight.tsx","../src/components/atoms/AnimatedCounter.tsx","../src/components/atoms/TypewriterText.tsx","../src/components/atoms/ThemeToggle.tsx","../src/components/atoms/RangeSlider.tsx","../src/components/atoms/game/Sprite.tsx","../src/components/atoms/game/StateIndicator.tsx","../src/components/atoms/game/OrbitalGameCanvas.tsx"],"sourcesContent":["import React from 'react';\nimport { View, StyleSheet, ViewStyle } from 'react-native';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\n\nexport interface CenterProps {\n children: React.ReactNode;\n style?: ViewStyle;\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 Center: React.FC<CenterProps> = ({\n children,\n style,\n isLoading,\n error,\n}) => {\n if (isLoading) {\n return (\n <View style={[styles.container, style]}>\n <LoadingState message=\"Loading...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n return (\n <View style={[styles.container, style]}>\n {children}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nCenter.displayName = 'Center';\n","import React from 'react';\nimport { \n TouchableOpacity, \n View, \n StyleSheet, \n ViewStyle \n} 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 RadioProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n size?: 'sm' | 'md' | 'lg';\n style?: ViewStyle;\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 change event name - emits UI:${changeEvent} via eventBus */\n changeEvent?: EventKey;\n /** Payload to include with the change event */\n actionPayload?: EventPayload;\n}\n\nexport const Radio: React.FC<RadioProps> = ({\n checked = false,\n onChange,\n disabled = false,\n size = 'md',\n style,\n isLoading,\n error,\n changeEvent,\n actionPayload,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handlePress = () => {\n if (disabled || isLoading) return;\n \n const newValue = !checked;\n if (changeEvent) {\n eventBus.emit(`UI:${changeEvent}`, { ...actionPayload, checked: newValue });\n }\n onChange?.(newValue);\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, style]}>\n <LoadingState message=\"Loading...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const sizeStyles: Record<string, { outer: number; inner: number }> = {\n sm: { outer: 18, inner: 8 },\n md: { outer: 24, inner: 10 },\n lg: { outer: 32, inner: 14 },\n };\n\n const { outer, inner } = sizeStyles[size];\n\n return (\n <TouchableOpacity\n onPress={handlePress}\n disabled={disabled}\n activeOpacity={0.8}\n style={[\n styles.container,\n {\n width: outer,\n height: outer,\n borderRadius: outer / 2,\n borderWidth: 2,\n borderColor: checked \n ? theme.colors.primary \n : theme.colors.border,\n backgroundColor: theme.colors.card,\n opacity: disabled ? 0.5 : 1,\n },\n style,\n ]}\n >\n {checked && (\n <View\n style={{\n width: inner,\n height: inner,\n borderRadius: inner / 2,\n backgroundColor: theme.colors.primary,\n }}\n />\n )}\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nRadio.displayName = 'Radio';\n","import React from 'react';\nimport { \n TouchableOpacity, \n View, \n StyleSheet, \n ViewStyle,\n Animated \n} 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 SwitchProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n size?: 'sm' | 'md' | 'lg';\n style?: ViewStyle;\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 change event name - emits UI:${changeEvent} via eventBus */\n changeEvent?: EventKey;\n /** Payload to include with the change event */\n actionPayload?: EventPayload;\n}\n\nexport const Switch: React.FC<SwitchProps> = ({\n checked = false,\n onChange,\n disabled = false,\n size = 'md',\n style,\n isLoading,\n error,\n changeEvent,\n actionPayload,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n const translateX = React.useRef(new Animated.Value(checked ? 1 : 0)).current;\n\n React.useEffect(() => {\n const { width } = sizeStyles[size];\n const thumbWidth = width * 0.4;\n const travelDistance = width - thumbWidth - 4;\n \n Animated.timing(translateX, {\n toValue: checked ? travelDistance : 0,\n duration: 200,\n useNativeDriver: true,\n }).start();\n }, [checked, size]);\n\n const handlePress = () => {\n if (disabled || isLoading) return;\n \n const newValue = !checked;\n if (changeEvent) {\n eventBus.emit(`UI:${changeEvent}`, { ...actionPayload, checked: newValue });\n }\n onChange?.(newValue);\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, style]}>\n <LoadingState message=\"Loading...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const sizeStyles: Record<string, { width: number; height: number }> = {\n sm: { width: 36, height: 20 },\n md: { width: 48, height: 28 },\n lg: { width: 60, height: 36 },\n };\n\n const { width, height } = sizeStyles[size];\n const thumbSize = height - 4;\n\n return (\n <TouchableOpacity\n onPress={handlePress}\n disabled={disabled}\n activeOpacity={0.8}\n style={[\n styles.track,\n {\n width,\n height,\n borderRadius: height / 2,\n backgroundColor: checked \n ? theme.colors.primary \n : theme.colors['muted-foreground'],\n opacity: disabled ? 0.5 : 1,\n },\n style,\n ]}\n >\n <Animated.View\n style={[\n styles.thumb,\n {\n width: thumbSize,\n height: thumbSize,\n borderRadius: thumbSize / 2,\n backgroundColor: theme.colors['primary-foreground'],\n transform: [{ translateX }],\n },\n ]}\n />\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n track: {\n justifyContent: 'center',\n padding: 2,\n },\n thumb: {\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.2,\n shadowRadius: 2,\n elevation: 2,\n },\n});\n\nSwitch.displayName = 'Switch';\n","import React from 'react';\nimport { \n TextInput, \n TextInputProps, \n StyleSheet, \n View, \n Text,\n ViewStyle \n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { LoadingState } from '../molecules/LoadingState';\n\nexport interface TextareaProps extends Omit<TextInputProps, 'onChange' | 'multiline'> {\n label?: string;\n /** String error message for form validation */\n errorMessage?: string;\n helperText?: string;\n containerStyle?: ViewStyle;\n numberOfLines?: number;\n /** Loading state indicator */\n isLoading?: boolean;\n /** Error state object */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n /** Declarative change event name - emits UI:${changeEvent} via eventBus */\n changeEvent?: string;\n /** Declarative focus event name - emits UI:${focusEvent} via eventBus */\n focusEvent?: string;\n}\n\nexport const Textarea: React.FC<TextareaProps> = ({\n label,\n errorMessage,\n helperText,\n containerStyle,\n style,\n numberOfLines = 4,\n isLoading,\n error,\n changeEvent,\n focusEvent,\n onChangeText,\n onFocus,\n ...textInputProps\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handleChangeText = (text: string) => {\n if (changeEvent) {\n eventBus.emit(`UI:${changeEvent}`, { value: text });\n }\n onChangeText?.(text);\n };\n\n const handleFocus = () => {\n if (focusEvent) {\n eventBus.emit(`UI:${focusEvent}`);\n }\n onFocus?.({} as never);\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, containerStyle]}>\n {label && (\n <Text style={[styles.label, { color: theme.colors.foreground }]}>\n {label}\n </Text>\n )}\n <LoadingState message=\"Loading...\" />\n </View>\n );\n }\n\n const errorText = error?.message || errorMessage;\n\n return (\n <View style={[styles.container, containerStyle]}>\n {label && (\n <Text style={[styles.label, { color: theme.colors.foreground }]}>\n {label}\n </Text>\n )}\n <TextInput\n multiline\n numberOfLines={numberOfLines}\n textAlignVertical=\"top\"\n style={[\n styles.textarea,\n {\n borderColor: errorText ? theme.colors.error : theme.colors.border,\n backgroundColor: theme.colors.card,\n color: theme.colors.foreground,\n },\n style,\n ]}\n placeholderTextColor={theme.colors['muted-foreground']}\n onChangeText={handleChangeText}\n onFocus={handleFocus}\n {...textInputProps}\n />\n {errorText ? (\n <Text style={[styles.errorText, { color: theme.colors.error }]}>\n {errorText}\n </Text>\n ) : helperText ? (\n <Text style={[styles.helperText, { color: theme.colors['muted-foreground'] }]}>\n {helperText}\n </Text>\n ) : null}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n width: '100%',\n },\n label: {\n fontSize: 14,\n fontWeight: '500',\n marginBottom: 6,\n },\n textarea: {\n borderWidth: 1,\n borderRadius: 8,\n paddingHorizontal: 12,\n paddingVertical: 10,\n fontSize: 16,\n minHeight: 100,\n },\n errorText: {\n fontSize: 12,\n marginTop: 4,\n },\n helperText: {\n fontSize: 12,\n marginTop: 4,\n },\n});\n\nTextarea.displayName = 'Textarea';\n","import React from 'react';\nimport { \n View, \n Text, \n StyleSheet, \n ViewStyle,\n Image,\n ImageSourcePropType \n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { LoadingState } from '../molecules/LoadingState';\nimport { ErrorState } from '../molecules/ErrorState';\n\nexport interface AvatarProps {\n src?: ImageSourcePropType;\n alt?: string;\n initials?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n style?: ViewStyle;\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 Avatar: React.FC<AvatarProps> = ({\n src,\n alt,\n initials,\n size = 'md',\n style,\n isLoading,\n error,\n}) => {\n const theme = useTheme();\n\n const sizeMap: Record<string, { container: number; fontSize: number }> = {\n sm: { container: 32, fontSize: 12 },\n md: { container: 40, fontSize: 14 },\n lg: { container: 48, fontSize: 16 },\n xl: { container: 64, fontSize: 20 },\n };\n\n const { container, fontSize } = sizeMap[size];\n\n if (isLoading) {\n return (\n <View style={[styles.container, { width: container, height: container }, style]}>\n <LoadingState message=\"\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, { width: container, height: container }, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const getInitials = () => {\n if (initials) return initials;\n if (alt) {\n return alt\n .split(' ')\n .map(n => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n }\n return '?';\n };\n\n if (src) {\n return (\n <Image\n source={src}\n style={[\n styles.image,\n { \n width: container, \n height: container, \n borderRadius: container / 2 \n },\n style as never,\n ]}\n accessibilityLabel={alt}\n />\n );\n }\n\n return (\n <View\n style={[\n styles.container,\n {\n width: container,\n height: container,\n borderRadius: container / 2,\n backgroundColor: theme.colors.primary,\n },\n style,\n ]}\n >\n <Text\n style={[\n styles.initials,\n {\n fontSize,\n color: theme.colors['primary-foreground'],\n },\n ]}\n >\n {getInitials()}\n </Text>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n image: {\n resizeMode: 'cover',\n },\n initials: {\n fontWeight: '600',\n },\n});\n\nAvatar.displayName = 'Avatar';\n","import React from 'react';\nimport { \n TouchableWithoutFeedback, \n View,\n StyleSheet, \n ViewStyle \n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\n\nexport interface OverlayProps {\n /** Whether overlay is visible */\n isVisible?: boolean;\n /** Called when overlay is pressed */\n onPress?: () => void;\n /** Whether to apply blur effect (iOS only) */\n blur?: boolean;\n /** Declarative event name — emits UI:{action} via eventBus on press */\n action?: string;\n /** Additional styles */\n style?: ViewStyle;\n}\n\nexport const Overlay: React.FC<OverlayProps> = ({\n isVisible = true,\n onPress,\n blur = true,\n action,\n style,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n if (!isVisible) return null;\n\n const handlePress = () => {\n if (action) {\n eventBus.emit(`UI:${action}`, {});\n }\n onPress?.();\n };\n\n return (\n <TouchableWithoutFeedback onPress={handlePress}>\n <View \n style={[\n styles.overlay,\n { \n backgroundColor: theme.colors.background,\n opacity: 0.8,\n },\n blur && styles.blur,\n ...(style ? [style] : []),\n ]}\n pointerEvents=\"auto\"\n />\n </TouchableWithoutFeedback>\n );\n};\n\nconst styles = StyleSheet.create({\n overlay: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 40,\n },\n blur: {\n // Note: For actual blur effect on iOS, use @react-native-community/blur\n // This is a fallback opacity-based overlay\n },\n});\n\nOverlay.displayName = 'Overlay';\n","import React from 'react';\nimport { View, ViewStyle } from 'react-native';\n\nexport type SpacerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'auto';\n\nexport interface SpacerProps {\n /** Fixed size (auto = flex grow) */\n size?: SpacerSize;\n /** Orientation (for fixed sizes) */\n axis?: 'horizontal' | 'vertical';\n /** Custom style */\n style?: ViewStyle;\n}\n\nconst sizeValues: Record<Exclude<SpacerSize, 'auto'>, number> = {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 24,\n xl: 32,\n '2xl': 48,\n};\n\n/**\n * Spacer - Flexible spacing element for flex layouts\n * \n * Usage:\n * - size=\"auto\" (default): Expands to fill available space (flex: 1)\n * - size=\"md\": Fixed size spacing\n */\nexport const Spacer: React.FC<SpacerProps> = ({\n size = 'auto',\n axis = 'horizontal',\n style,\n}) => {\n if (size === 'auto') {\n return (\n <View \n style={[{ flex: 1 }, ...(style ? [style] : [])]} \n accessibilityElementsHidden\n />\n );\n }\n\n const sizeValue = sizeValues[size];\n const spacerStyle: ViewStyle = axis === 'horizontal' \n ? { width: sizeValue }\n : { height: sizeValue };\n\n return (\n <View \n style={[\n spacerStyle,\n ...(style ? [style] : []),\n ]} \n accessibilityElementsHidden\n />\n );\n};\n\nSpacer.displayName = 'Spacer';\n","/**\n * ConditionalWrapper Atom Component\n *\n * A wrapper component that conditionally renders its children based on\n * condition evaluation. Used for dynamic field visibility in forms.\n * \n * Note: S-expression evaluation requires @almadar/evaluator to be installed.\n * For now, this uses a simplified condition evaluator.\n */\n\nimport React from 'react';\nimport { Animated, ViewStyle } from 'react-native';\n\nexport interface ConditionalContext {\n formValues: Record<string, unknown>;\n globalVariables: Record<string, unknown>;\n localVariables?: Record<string, unknown>;\n entity?: Record<string, unknown>;\n}\n\nexport type Condition = \n | boolean \n | string \n | [string, string, unknown] // [operator, field, value]\n | ((context: ConditionalContext) => boolean);\n\nexport interface ConditionalWrapperProps {\n /** The condition to evaluate (boolean, expression tuple, or function) */\n condition?: Condition;\n /** Context for evaluating the condition */\n context?: ConditionalContext;\n /** Children to render when condition is true */\n children: React.ReactNode;\n /** Optional fallback to render when condition is false */\n fallback?: React.ReactNode;\n /** Whether to animate the transition */\n animate?: boolean;\n /** Additional styles */\n style?: ViewStyle;\n}\n\n/**\n * Simple condition evaluator\n * Supports: boolean, comparison tuples like [\"=\", \"fieldName\", \"value\"], or functions\n */\nfunction evaluateCondition(\n condition: Condition, \n context: ConditionalContext = { formValues: {}, globalVariables: {} }\n): boolean {\n // Boolean condition\n if (typeof condition === 'boolean') {\n return condition;\n }\n\n // Function condition\n if (typeof condition === 'function') {\n return condition(context);\n }\n\n // Expression tuple: [operator, field, value]\n if (Array.isArray(condition) && condition.length === 3) {\n const [operator, fieldPath, expectedValue] = condition;\n \n // Parse field path (e.g., \"formValues.myField\" or \"globalVariables.HG_VAR\")\n const parts = String(fieldPath).split('.');\n let actualValue: unknown;\n \n if (parts[0] === 'formValues' && parts[1]) {\n actualValue = context.formValues?.[parts[1]];\n } else if (parts[0] === 'globalVariables' && parts[1]) {\n actualValue = context.globalVariables?.[parts[1]];\n } else if (parts[0] === 'localVariables' && parts[1]) {\n actualValue = context.localVariables?.[parts[1]];\n } else if (parts[0] && context.entity?.[parts[0]]) {\n actualValue = context.entity[parts[0]];\n }\n\n switch (operator) {\n case '=':\n case '==':\n return actualValue === expectedValue;\n case '!=':\n return actualValue !== expectedValue;\n case '>':\n return Number(actualValue) > Number(expectedValue);\n case '>=':\n return Number(actualValue) >= Number(expectedValue);\n case '<':\n return Number(actualValue) < Number(expectedValue);\n case '<=':\n return Number(actualValue) <= Number(expectedValue);\n case 'includes':\n return Array.isArray(actualValue) && actualValue.includes(expectedValue);\n default:\n return false;\n }\n }\n\n // String truthiness\n return Boolean(condition);\n}\n\nexport const ConditionalWrapper: React.FC<ConditionalWrapperProps> = ({\n condition,\n context = { formValues: {}, globalVariables: {} },\n children,\n fallback = null,\n animate = false,\n style,\n}) => {\n const [isVisible, setIsVisible] = React.useState(!condition ? true : false);\n const fadeAnim = React.useRef(new Animated.Value(!condition ? 1 : 0)).current;\n\n React.useEffect(() => {\n if (!condition) {\n setIsVisible(true);\n return;\n }\n\n const visible = evaluateCondition(condition, context);\n \n setIsVisible(visible);\n\n if (animate) {\n Animated.timing(fadeAnim, {\n toValue: visible ? 1 : 0,\n duration: 200,\n useNativeDriver: true,\n }).start();\n } else {\n fadeAnim.setValue(visible ? 1 : 0);\n }\n }, [condition, context, animate, fadeAnim]);\n\n if (!condition) {\n return <>{children}</>;\n }\n\n if (animate) {\n return (\n <Animated.View\n style={[\n { opacity: fadeAnim, overflow: 'hidden' },\n ...(style ? [style] : []),\n ]}\n >\n {isVisible ? children : fallback}\n </Animated.View>\n );\n }\n\n return isVisible ? <>{children}</> : <>{fallback}</>;\n};\n\nConditionalWrapper.displayName = 'ConditionalWrapper';\n","import React, { useEffect, useRef } from 'react';\nimport { View, Animated, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { Typography } from './Typography';\nimport { HStack } from './Stack';\n\nexport type StatusDotStatus = 'online' | 'offline' | 'busy' | 'away' | 'error';\nexport type StatusDotSize = 'sm' | 'md' | 'lg';\n\nexport interface StatusDotProps {\n status?: StatusDotStatus;\n pulse?: boolean;\n size?: StatusDotSize;\n label?: string;\n style?: ViewStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nconst sizeMap: Record<StatusDotSize, number> = {\n sm: 8,\n md: 12,\n lg: 16,\n};\n\nexport const StatusDot: React.FC<StatusDotProps> = ({\n status = 'offline',\n pulse = false,\n size = 'md',\n label,\n style,\n}) => {\n const theme = useTheme();\n const pulseAnim = useRef(new Animated.Value(1)).current;\n\n const statusColors: Record<StatusDotStatus, string> = {\n online: theme.colors.success,\n offline: theme.colors['muted-foreground'],\n busy: theme.colors.error,\n away: theme.colors.warning,\n error: theme.colors.error,\n };\n\n useEffect(() => {\n if (pulse && (status === 'online' || status === 'busy')) {\n const animation = Animated.loop(\n Animated.sequence([\n Animated.timing(pulseAnim, {\n toValue: 0.3,\n duration: 1000,\n useNativeDriver: true,\n }),\n Animated.timing(pulseAnim, {\n toValue: 1,\n duration: 1000,\n useNativeDriver: true,\n }),\n ])\n );\n animation.start();\n return () => animation.stop();\n } else {\n pulseAnim.setValue(1);\n }\n }, [pulse, status, pulseAnim]);\n\n const dotSize = sizeMap[size];\n const color = statusColors[status];\n\n const dot = (\n <View style={[styles.wrapper, style]}>\n <Animated.View\n style={[\n styles.dot,\n {\n width: dotSize,\n height: dotSize,\n borderRadius: dotSize / 2,\n backgroundColor: color,\n opacity: pulseAnim,\n },\n ]}\n />\n </View>\n );\n\n if (label) {\n return (\n <HStack spacing={theme.spacing[2]} align=\"center\" style={style}>\n {dot}\n <Typography variant=\"caption\" style={{ color: theme.colors.foreground }}>\n {label}\n </Typography>\n </HStack>\n );\n }\n\n return dot;\n};\n\nconst styles = StyleSheet.create({\n wrapper: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n dot: {},\n});\n\nStatusDot.displayName = 'StatusDot';\n","import React from 'react';\nimport { StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { Typography } from './Typography';\nimport { Icon } from './Icon';\nimport { HStack } from './Stack';\n\nexport type TrendDirection = 'up' | 'down' | 'neutral';\nexport type TrendSize = 'sm' | 'md' | 'lg';\n\nexport interface TrendIndicatorProps {\n value?: number;\n direction?: TrendDirection;\n showValue?: boolean;\n size?: TrendSize;\n style?: ViewStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nconst sizeConfig: Record<TrendSize, { icon: number; font: 'xs' | 'sm' | 'base' }> = {\n sm: { icon: 14, font: 'xs' },\n md: { icon: 18, font: 'sm' },\n lg: { icon: 22, font: 'base' },\n};\n\nexport const TrendIndicator: React.FC<TrendIndicatorProps> = ({\n value,\n direction = 'neutral',\n showValue = true,\n size = 'md',\n style,\n}) => {\n const theme = useTheme();\n const config = sizeConfig[size];\n\n const directionColors: Record<TrendDirection, string> = {\n up: theme.colors.success,\n down: theme.colors.error,\n neutral: theme.colors['muted-foreground'],\n };\n\n const color = directionColors[direction];\n const iconName = direction === 'up' ? 'chevron-up' : direction === 'down' ? 'chevron-down' : 'minus';\n\n return (\n <HStack spacing={4} align=\"center\" style={style}>\n <Icon name={iconName} size={config.icon} color={color} />\n {showValue && value !== undefined && (\n <Typography\n variant=\"body\"\n style={[\n styles.value,\n { color, fontSize: theme.typography.sizes[config.font] },\n ]}\n >\n {Math.abs(value)}%\n </Typography>\n )}\n </HStack>\n );\n};\n\nconst styles = StyleSheet.create({\n value: {\n fontWeight: '500',\n },\n});\n\nTrendIndicator.displayName = 'TrendIndicator';\n","import React from 'react';\nimport { Pressable, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Typography } from './Typography';\nimport type { EventKey, EventPayload } from '../../types';\n\n\nexport type HighlightType = 'mark' | 'code' | 'emphasis' | 'custom';\n\nexport interface TextHighlightProps {\n children: React.ReactNode;\n highlightType?: HighlightType;\n isActive?: boolean;\n action?: EventKey;\n actionPayload?: EventPayload;\n color?: string;\n style?: ViewStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nexport const TextHighlight: React.FC<TextHighlightProps> = ({\n children,\n highlightType = 'mark',\n isActive = true,\n action,\n actionPayload,\n color,\n style,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handlePress = () => {\n if (action) {\n eventBus.emit(`UI:${action}`, actionPayload);\n }\n };\n\n const highlightColors: Record<HighlightType, { bg: string; fg: string }> = {\n mark: { bg: theme.colors.warning + '40', fg: theme.colors.foreground },\n code: { bg: theme.colors.muted, fg: theme.colors.foreground },\n emphasis: { bg: theme.colors.primary + '20', fg: theme.colors.primary },\n custom: { bg: (color || theme.colors.accent) + '30', fg: theme.colors.foreground },\n };\n\n const { bg, fg } = highlightColors[highlightType];\n\n const content = (\n <Typography\n variant=\"body\"\n style={[\n styles.text,\n isActive && {\n backgroundColor: bg,\n color: fg,\n },\n highlightType === 'code' && {\n fontFamily: 'monospace',\n fontSize: theme.typography.sizes.sm,\n },\n style,\n ]}\n >\n {children}\n </Typography>\n );\n\n if (action) {\n return (\n <Pressable onPress={handlePress} style={styles.pressable}>\n {content}\n </Pressable>\n );\n }\n\n return content;\n};\n\nconst styles = StyleSheet.create({\n text: {\n paddingHorizontal: 4,\n paddingVertical: 1,\n borderRadius: 4,\n },\n pressable: {\n alignSelf: 'flex-start',\n },\n});\n\nTextHighlight.displayName = 'TextHighlight';\n","import React, { useEffect, useRef } from 'react';\nimport { Animated, StyleSheet, ViewStyle, TextStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\n\nexport interface AnimatedCounterProps {\n value: number;\n duration?: number;\n prefix?: string;\n suffix?: string;\n style?: ViewStyle;\n textStyle?: TextStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nexport const AnimatedCounter: React.FC<AnimatedCounterProps> = ({\n value,\n duration = 800,\n prefix = '',\n suffix = '',\n style,\n textStyle,\n}) => {\n const theme = useTheme();\n const animatedValue = useRef(new Animated.Value(0)).current;\n const displayRef = useRef(0);\n const [displayValue, setDisplayValue] = React.useState(0);\n\n useEffect(() => {\n animatedValue.setValue(displayRef.current);\n\n Animated.timing(animatedValue, {\n toValue: value,\n duration,\n useNativeDriver: false,\n }).start();\n\n const listener = animatedValue.addListener(({ value: v }) => {\n const rounded = Math.round(v);\n if (rounded !== displayRef.current) {\n displayRef.current = rounded;\n setDisplayValue(rounded);\n }\n });\n\n return () => {\n animatedValue.removeListener(listener);\n };\n }, [value, duration, animatedValue]);\n\n return (\n <Animated.View style={[styles.container, style]}>\n <Animated.Text\n style={[\n styles.text,\n {\n color: theme.colors.foreground,\n fontSize: theme.typography.sizes['2xl'],\n fontWeight: theme.typography.fontWeight.bold as '600',\n },\n textStyle,\n ]}\n >\n {prefix}{displayValue}{suffix}\n </Animated.Text>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n text: {\n textAlign: 'center',\n },\n});\n\nAnimatedCounter.displayName = 'AnimatedCounter';\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Animated, StyleSheet, ViewStyle, TextStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { HStack } from './Stack';\n\nexport interface TypewriterTextProps {\n text: string;\n speed?: number;\n startDelay?: number;\n onComplete?: () => void;\n showCursor?: boolean;\n style?: ViewStyle;\n textStyle?: TextStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nexport const TypewriterText: React.FC<TypewriterTextProps> = ({\n text,\n speed = 50,\n startDelay = 0,\n onComplete,\n showCursor = true,\n style,\n textStyle,\n}) => {\n const theme = useTheme();\n const [displayedText, setDisplayedText] = useState('');\n const [isComplete, setIsComplete] = useState(false);\n const cursorOpacity = useRef(new Animated.Value(1)).current;\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setDisplayedText('');\n setIsComplete(false);\n let charIndex = 0;\n\n timeoutRef.current = setTimeout(() => {\n intervalRef.current = setInterval(() => {\n if (charIndex < text.length) {\n setDisplayedText(text.slice(0, charIndex + 1));\n charIndex++;\n } else {\n if (intervalRef.current) clearInterval(intervalRef.current);\n setIsComplete(true);\n onComplete?.();\n }\n }, speed);\n }, startDelay);\n\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [text, speed, startDelay, onComplete]);\n\n useEffect(() => {\n if (showCursor && !isComplete) {\n const blink = Animated.loop(\n Animated.sequence([\n Animated.timing(cursorOpacity, {\n toValue: 0,\n duration: 500,\n useNativeDriver: true,\n }),\n Animated.timing(cursorOpacity, {\n toValue: 1,\n duration: 500,\n useNativeDriver: true,\n }),\n ])\n );\n blink.start();\n return () => blink.stop();\n }\n }, [showCursor, isComplete, cursorOpacity]);\n\n return (\n <HStack spacing={0} align=\"flex-end\" style={style}>\n <Animated.Text\n style={[\n styles.text,\n {\n color: theme.colors.foreground,\n fontSize: theme.typography.sizes.base,\n },\n textStyle,\n ]}\n >\n {displayedText}\n </Animated.Text>\n {showCursor && !isComplete && (\n <Animated.Text\n style={[\n styles.cursor,\n {\n color: theme.colors.primary,\n fontSize: theme.typography.sizes.base,\n opacity: cursorOpacity,\n },\n ]}\n >\n |\n </Animated.Text>\n )}\n </HStack>\n );\n};\n\nconst styles = StyleSheet.create({\n text: {\n fontWeight: '400',\n },\n cursor: {\n fontWeight: '300',\n marginLeft: 1,\n },\n});\n\nTypewriterText.displayName = 'TypewriterText';\n","import React from 'react';\nimport { Pressable, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useThemeMode } from '../../providers/ThemeProvider';\nimport { Typography } from './Typography';\nimport { Icon } from './Icon';\nimport { HStack } from './Stack';\n\nexport type ThemeToggleSize = 'sm' | 'md' | 'lg';\n\nexport interface ThemeToggleProps {\n size?: ThemeToggleSize;\n showLabel?: boolean;\n style?: ViewStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nconst sizeConfig: Record<ThemeToggleSize, { icon: number; padding: number }> = {\n sm: { icon: 18, padding: 6 },\n md: { icon: 24, padding: 10 },\n lg: { icon: 30, padding: 14 },\n};\n\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({\n size = 'md',\n showLabel = false,\n style,\n}) => {\n const theme = useTheme();\n const { resolvedMode, toggleMode } = useThemeMode();\n const config = sizeConfig[size];\n\n const isDark = resolvedMode === 'dark';\n const iconText = isDark ? '☀' : '☾';\n const label = isDark ? 'Light mode' : 'Dark mode';\n\n return (\n <Pressable\n onPress={toggleMode}\n style={[\n styles.container,\n {\n padding: config.padding,\n borderRadius: theme.borderRadius.full,\n backgroundColor: theme.colors.secondary,\n },\n style,\n ]}\n >\n <HStack spacing={theme.spacing[2]} align=\"center\">\n <Icon name={isDark ? 'check' : 'settings'} size={config.icon} color={theme.colors.foreground} />\n <Typography variant=\"body\" style={{ color: theme.colors.foreground, fontSize: config.icon * 0.7 }}>\n {iconText}\n </Typography>\n {showLabel && (\n <Typography variant=\"caption\" style={{ color: theme.colors['muted-foreground'] }}>\n {label}\n </Typography>\n )}\n </HStack>\n </Pressable>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignSelf: 'flex-start',\n },\n});\n\nThemeToggle.displayName = 'ThemeToggle';\n","import React, { useRef, useState } from 'react';\nimport { View, PanResponder, StyleSheet, ViewStyle, LayoutChangeEvent } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Typography } from './Typography';\nimport { HStack } from './Stack';\nimport { VStack } from './Stack';\nimport type { EventKey, EventPayload } from '../../types';\n\n\nexport interface RangeSliderProps {\n min?: number;\n max?: number;\n value?: number;\n step?: number;\n action?: EventKey;\n actionPayload?: EventPayload;\n onChange?: (value: number) => void;\n showValue?: boolean;\n label?: string;\n disabled?: boolean;\n style?: ViewStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nconst THUMB_SIZE = 24;\nconst TRACK_HEIGHT = 4;\n\nexport const RangeSlider: React.FC<RangeSliderProps> = ({\n min = 0,\n max = 100,\n value: controlledValue,\n step = 1,\n action,\n actionPayload,\n onChange,\n showValue = false,\n label,\n disabled = false,\n style,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n const [internalValue, setInternalValue] = useState(controlledValue ?? min);\n const trackWidth = useRef(0);\n const currentValue = controlledValue ?? internalValue;\n\n const clamp = (v: number) => {\n const stepped = Math.round((v - min) / step) * step + min;\n return Math.max(min, Math.min(max, stepped));\n };\n\n const getFraction = () => (currentValue - min) / (max - min);\n\n const emitValue = (v: number) => {\n const clamped = clamp(v);\n setInternalValue(clamped);\n onChange?.(clamped);\n if (action) {\n eventBus.emit(`UI:${action}`, { ...actionPayload, value: clamped });\n }\n };\n\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => !disabled,\n onMoveShouldSetPanResponder: () => !disabled,\n onPanResponderGrant: (_, gestureState) => {\n const fraction = Math.max(0, Math.min(1, gestureState.x0 / (trackWidth.current || 1)));\n emitValue(fraction * (max - min) + min);\n },\n onPanResponderMove: (_, gestureState) => {\n const startFraction = getFraction();\n const deltaFraction = gestureState.dx / (trackWidth.current || 1);\n const newValue = (startFraction + deltaFraction) * (max - min) + min;\n emitValue(newValue);\n },\n })\n ).current;\n\n const handleLayout = (e: LayoutChangeEvent) => {\n trackWidth.current = e.nativeEvent.layout.width;\n };\n\n const fraction = getFraction();\n\n const content = (\n <View\n style={[styles.trackContainer, disabled && { opacity: 0.5 }, style]}\n onLayout={handleLayout}\n {...panResponder.panHandlers}\n >\n <View\n style={[\n styles.track,\n { backgroundColor: theme.colors.border },\n ]}\n />\n <View\n style={[\n styles.trackFill,\n {\n backgroundColor: theme.colors.primary,\n width: `${fraction * 100}%` as unknown as number,\n },\n ]}\n />\n <View\n style={[\n styles.thumb,\n {\n backgroundColor: theme.colors.primary,\n borderColor: theme.colors.card,\n left: `${fraction * 100}%` as unknown as number,\n marginLeft: -THUMB_SIZE / 2,\n ...theme.shadows.sm,\n },\n ]}\n />\n </View>\n );\n\n if (label || showValue) {\n return (\n <VStack spacing={theme.spacing[2]} style={style}>\n {(label || showValue) && (\n <HStack spacing={0} align=\"center\" style={styles.header}>\n {label && (\n <Typography variant=\"caption\" style={{ color: theme.colors['muted-foreground'], flex: 1 }}>\n {label}\n </Typography>\n )}\n {showValue && (\n <Typography variant=\"body\" style={{ color: theme.colors.foreground, fontWeight: '500' }}>\n {currentValue}\n </Typography>\n )}\n </HStack>\n )}\n {content}\n </VStack>\n );\n }\n\n return content;\n};\n\nconst styles = StyleSheet.create({\n trackContainer: {\n height: THUMB_SIZE + 8,\n justifyContent: 'center',\n paddingHorizontal: THUMB_SIZE / 2,\n },\n track: {\n height: TRACK_HEIGHT,\n borderRadius: TRACK_HEIGHT / 2,\n position: 'absolute',\n left: THUMB_SIZE / 2,\n right: THUMB_SIZE / 2,\n },\n trackFill: {\n height: TRACK_HEIGHT,\n borderRadius: TRACK_HEIGHT / 2,\n position: 'absolute',\n left: THUMB_SIZE / 2,\n },\n thumb: {\n width: THUMB_SIZE,\n height: THUMB_SIZE,\n borderRadius: THUMB_SIZE / 2,\n borderWidth: 3,\n position: 'absolute',\n },\n header: {\n justifyContent: 'space-between',\n },\n});\n\nRangeSlider.displayName = 'RangeSlider';\n","import React, { useMemo } from 'react';\nimport { \n View, \n Image, \n TouchableOpacity,\n StyleSheet, \n ViewStyle,\n ImageSourcePropType \n} from 'react-native';\nimport { useEventBus } from '../../../hooks/useEventBus';\n\nexport interface SpriteProps {\n /** Spritesheet image URL or require */\n spritesheet: ImageSourcePropType;\n /** Width of each frame in pixels */\n frameWidth: number;\n /** Height of each frame in pixels */\n frameHeight: number;\n /** Frame index to display (0-based, left-to-right, top-to-bottom) */\n frame: number;\n /** X position in pixels */\n x: number;\n /** Y position in pixels */\n y: number;\n /** Scale factor (default: 1) */\n scale?: number;\n /** Flip horizontally */\n flipX?: boolean;\n /** Flip vertically */\n flipY?: boolean;\n /** Rotation in degrees */\n rotation?: number;\n /** Opacity (0-1) */\n opacity?: number;\n /** Z-index for layering */\n zIndex?: number;\n /** Number of columns in spritesheet (for frame calculation) */\n columns?: number;\n /** Optional style */\n style?: ViewStyle;\n /** Optional onPress handler */\n onPress?: () => void;\n /** Declarative event name emitted on press via useEventBus */\n action?: string;\n}\n\n/**\n * Sprite component for rendering spritesheet frames\n */\nexport const Sprite: React.FC<SpriteProps> = ({\n spritesheet,\n frameWidth,\n frameHeight,\n frame,\n x,\n y,\n scale = 1,\n flipX = false,\n flipY = false,\n rotation = 0,\n opacity = 1,\n zIndex = 0,\n columns = 16,\n style,\n onPress,\n action,\n}) => {\n const eventBus = useEventBus();\n\n // Calculate source position in spritesheet\n const sourcePosition = useMemo(() => {\n const frameX = frame % columns;\n const frameY = Math.floor(frame / columns);\n return {\n x: frameX * frameWidth,\n y: frameY * frameHeight,\n };\n }, [frame, columns, frameWidth, frameHeight]);\n\n const handlePress = () => {\n if (action) eventBus.emit(`UI:${action}`, {});\n onPress?.();\n };\n\n const transform = [\n { translateX: x },\n { translateY: y },\n { scale: scale },\n { rotate: `${rotation}deg` },\n { scaleX: flipX ? -1 : 1 },\n { scaleY: flipY ? -1 : 1 },\n ];\n\n const Container = (action || onPress) ? TouchableOpacity : View;\n\n return (\n <Container\n onPress={(action || onPress) ? handlePress : undefined}\n style={[\n styles.container,\n {\n width: frameWidth,\n height: frameHeight,\n transform,\n opacity,\n zIndex,\n },\n style as never,\n ]}\n >\n <View\n style={{\n width: frameWidth * columns,\n height: frameHeight * Math.ceil((frame + 1) / columns),\n position: 'absolute',\n left: -sourcePosition.x,\n top: -sourcePosition.y,\n overflow: 'hidden',\n }}\n >\n <Image\n source={spritesheet}\n style={{\n width: frameWidth * columns,\n height: frameHeight * Math.ceil((frame + 1) / columns),\n resizeMode: 'stretch',\n }}\n />\n </View>\n </Container>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n position: 'absolute',\n overflow: 'hidden',\n },\n});\n\nSprite.displayName = 'Sprite';\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../../providers/ThemeContext';\n\nexport interface StateStyle {\n icon: string;\n backgroundColor: string;\n}\n\nexport interface StateIndicatorProps {\n /** The current state name */\n state: string;\n /** Optional label override (defaults to capitalized state name) */\n label?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Whether to show pulse animation on non-idle states */\n animated?: boolean;\n /** Custom state styles to extend/override defaults */\n stateStyles?: Record<string, StateStyle>;\n /** Additional styles */\n style?: ViewStyle;\n}\n\nconst DEFAULT_STATE_STYLES: Record<string, StateStyle> = {\n idle: { icon: '⏸', backgroundColor: '#6b7280' },\n active: { icon: '▶', backgroundColor: '#22c55e' },\n sleeping: { icon: '💤', backgroundColor: '#6b7280' },\n moving: { icon: '🚶', backgroundColor: '#3b82f6' },\n eating: { icon: '🍽', backgroundColor: '#22c55e' },\n waiting: { icon: '⏳', backgroundColor: '#eab308' },\n happy: { icon: '😊', backgroundColor: '#22c55e' },\n scared: { icon: '😨', backgroundColor: '#ef4444' },\n done: { icon: '✓', backgroundColor: '#22c55e' },\n error: { icon: '✗', backgroundColor: '#ef4444' },\n ready: { icon: '✓', backgroundColor: '#22c55e' },\n cooldown: { icon: '🔄', backgroundColor: '#eab308' },\n};\n\nconst DEFAULT_STYLE: StateStyle = { icon: '?', backgroundColor: '#6b7280' };\n\nconst SIZE_STYLES: Record<string, { padding: number; fontSize: number }> = {\n sm: { padding: 4, fontSize: 10 },\n md: { padding: 8, fontSize: 12 },\n lg: { padding: 12, fontSize: 14 },\n};\n\nexport const StateIndicator: React.FC<StateIndicatorProps> = ({\n state,\n label,\n size = 'md',\n animated = true,\n stateStyles,\n style,\n}) => {\n const theme = useTheme();\n const mergedStyles = stateStyles\n ? { ...DEFAULT_STATE_STYLES, ...stateStyles }\n : DEFAULT_STATE_STYLES;\n const config = mergedStyles[state.toLowerCase()] || DEFAULT_STYLE;\n const displayLabel = label || state.charAt(0).toUpperCase() + state.slice(1);\n const sizeStyles = SIZE_STYLES[size];\n const shouldAnimate = animated && \n state.toLowerCase() !== 'idle' && \n state.toLowerCase() !== 'done';\n\n return (\n <View\n style={[\n styles.container,\n {\n backgroundColor: config.backgroundColor,\n paddingHorizontal: sizeStyles.padding,\n paddingVertical: sizeStyles.padding * 0.5,\n opacity: shouldAnimate ? 0.8 : 1,\n },\n style as never,\n ]}\n >\n <Text style={{ fontSize: sizeStyles.fontSize, marginRight: 4 }}>\n {config.icon}\n </Text>\n <Text\n style={{\n fontSize: sizeStyles.fontSize,\n color: theme.colors['primary-foreground'],\n fontWeight: '500',\n }}\n >\n {displayLabel}\n </Text>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 9999,\n },\n});\n\nStateIndicator.displayName = 'StateIndicator';\n","import React, { useEffect, useRef } from 'react';\nimport { Platform, View, Text, ViewStyle, StyleSheet, requireNativeComponent, UIManager, findNodeHandle } from 'react-native';\n\n// ── Fabric/TurboModule spec ────────────────────────────────────────────────────\n//\n// The native view `OrbitalGameCanvasView` is registered by:\n// Android: OrbitalGameCanvasViewManager.kt (loads liborbital_shell_android.so,\n// wraps OrbitalGameSurfaceView, passes ANativeWindow* to JNI bridge)\n// iOS: OrbitalGameCanvasViewManager.swift (wraps MTKView backed by\n// OrbitalGameMTKCoordinator from bridge/OrbitalGameBridge.swift,\n// passes CAMetalLayer* to orbital_game_renderer_init)\n//\n// On-device native build (Kotlin/Swift compile + NDK/Xcode link) is CI-deferred;\n// see docs/Almadar_Compiler_Gaps.md MOBILE-GPU-NATIVE-BUILD.\n//\n// The JS component below is tsc-clean and runtime-safe: on platforms where the\n// native module is absent (e.g. web/simulator without the .so/.a) it renders a\n// clearly-labelled placeholder View so the app doesn't crash.\n\nexport interface OrbitalGameCanvasProps {\n /** JSON-encoded GameRenderPacket forwarded verbatim to orbital_game_renderer_submit. */\n jsonPacket: string;\n /** Trait name for dispatch wiring. */\n trait: string;\n /** Additional pattern config forwarded as part of the packet. */\n props?: Record<string, unknown>;\n style?: ViewStyle;\n onReady?: () => void;\n onError?: (error: string) => void;\n}\n\n// The native component name must match the return value of `getName()` in\n// OrbitalGameCanvasViewManager on both platforms.\nconst NATIVE_VIEW_NAME = 'OrbitalGameCanvasView';\n\n// `requireNativeComponent` throws in test/web environments where the native\n// module is not registered. Guard so tsc-clean JS can run in any context.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet NativeGameCanvas: React.ComponentType<any> | null = null;\nconst nativeAvailable = Platform.OS === 'android' || Platform.OS === 'ios';\nif (nativeAvailable) {\n try {\n NativeGameCanvas = requireNativeComponent(NATIVE_VIEW_NAME);\n } catch {\n // Native module absent: fall through to JS fallback below.\n NativeGameCanvas = null;\n }\n}\n\n// ── Native commands ────────────────────────────────────────────────────────────\n\nconst COMMANDS: Record<string, number> | undefined = UIManager.getViewManagerConfig\n ? (UIManager.getViewManagerConfig(NATIVE_VIEW_NAME)?.Commands as Record<string, number> | undefined)\n : undefined;\n\n/** Submit a new JSON GameRenderPacket to the already-mounted native renderer. */\nfunction nativeSubmitPacket(ref: React.RefObject<View | null>, jsonPacket: string): void {\n if (!ref.current || !COMMANDS || typeof COMMANDS['submitPacket'] !== 'number') {\n return;\n }\n UIManager.dispatchViewManagerCommand(\n findNodeHandle(ref.current),\n COMMANDS['submitPacket'],\n [jsonPacket],\n );\n}\n\n// ── OrbitalGameCanvas ──────────────────────────────────────────────────────────\n\n/**\n * React Native native view that renders game-canvas patterns via the\n * orbital-game-renderer GPU backend (Vulkan on Android, Metal on iOS).\n *\n * The component wraps:\n * - Android: OrbitalGameSurfaceView → JNI → orbital_game_renderer_init/render\n * - iOS: OrbitalGameMTKCoordinator → Swift bridge → orbital_game_renderer_init/render\n *\n * On simulators or web (no GPU adapter) a labelled placeholder is shown.\n */\nexport const OrbitalGameCanvas: React.FC<OrbitalGameCanvasProps> = ({\n jsonPacket,\n trait,\n props: _props,\n style,\n onReady,\n onError: _onError,\n}) => {\n // Ref typed as View so `findNodeHandle` works; the actual native component\n // instance shares the same handle.\n const ref = useRef<View>(null);\n\n // Re-submit the packet on prop change after the native renderer is mounted.\n useEffect(() => {\n nativeSubmitPacket(ref, jsonPacket);\n }, [jsonPacket]);\n\n useEffect(() => {\n if (onReady) {\n onReady();\n }\n }, [onReady]);\n\n if (NativeGameCanvas) {\n // Forward props to the native view; style is merged with the flex default.\n return (\n <NativeGameCanvas\n ref={ref}\n jsonPacket={jsonPacket}\n trait={trait}\n style={[styles.canvas, style]}\n />\n );\n }\n\n // Fallback: native module absent (web, bare simulator, test environment).\n return (\n <View style={[styles.fallback, style]}>\n <Text style={styles.fallbackText}>\n [OrbitalGameCanvas — native GPU unavailable]\n </Text>\n <Text style={styles.fallbackSub}>{trait}</Text>\n </View>\n );\n};\n\nOrbitalGameCanvas.displayName = 'OrbitalGameCanvas';\n\nconst styles = StyleSheet.create({\n canvas: {\n flex: 1,\n },\n fallback: {\n flex: 1,\n minHeight: 160,\n backgroundColor: '#111',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 8,\n },\n fallbackText: {\n color: '#aaa',\n fontSize: 12,\n fontFamily: 'monospace',\n },\n fallbackSub: {\n color: '#666',\n fontSize: 10,\n marginTop: 4,\n fontFamily: 'monospace',\n },\n});\n"],"mappings":"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","names":["React","View","StyleSheet","React","View","styles","StyleSheet","React","TouchableOpacity","View","StyleSheet","React","width","View","styles","TouchableOpacity","StyleSheet","React","StyleSheet","View","React","View","styles","StyleSheet","React","View","Text","StyleSheet","sizeMap","React","View","styles","Text","StyleSheet","React","View","StyleSheet","React","View","styles","StyleSheet","React","View","React","Animated","React","View","Animated","StyleSheet","Animated","React","View","styles","StyleSheet","React","StyleSheet","React","styles","StyleSheet","React","StyleSheet","React","styles","StyleSheet","React","useEffect","useRef","Animated","StyleSheet","useRef","Animated","React","useEffect","styles","StyleSheet","React","useEffect","useRef","Animated","StyleSheet","useRef","Animated","useEffect","React","styles","StyleSheet","React","Pressable","StyleSheet","sizeConfig","React","Pressable","styles","StyleSheet","React","useRef","useState","View","StyleSheet","useState","useRef","fraction","React","View","styles","StyleSheet","React","View","Image","TouchableOpacity","StyleSheet","TouchableOpacity","View","React","styles","Image","StyleSheet","React","View","Text","StyleSheet","React","View","styles","Text","StyleSheet","React","useEffect","useRef","View","Text","StyleSheet","styles"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useTraitState.ts","../src/hooks/useUIEvents.ts","../src/hooks/useNavigation.ts","../src/hooks/useKeyboard.ts","../src/hooks/useThemeStyles.ts","../src/hooks/useScrollHeader.ts","../src/hooks/useSafeAreaInsets.ts","../src/hooks/usePullToRefresh.ts","../src/hooks/useInfiniteScroll.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\n\nexport interface MobileTraitState {\n [key: string]: unknown;\n}\n\nexport interface UseTraitStateReturn<T extends MobileTraitState> {\n state: T;\n setState: (updates: Partial<T>) => void;\n getValue: <K extends keyof T>(key: K) => T[K];\n setValue: <K extends keyof T>(key: K, value: T[K]) => void;\n}\n\nexport function useTraitState<T extends MobileTraitState>(initialState: T): UseTraitStateReturn<T> {\n const [state, setStateRaw] = useState<T>(initialState);\n\n const setState = useCallback((updates: Partial<T>) => {\n setStateRaw(prev => ({ ...prev, ...updates }));\n }, []);\n\n const getValue = useCallback(<K extends keyof T>(key: K): T[K] => {\n return state[key];\n }, [state]);\n\n const setValue = useCallback(<K extends keyof T>(key: K, value: T[K]) => {\n setStateRaw(prev => ({ ...prev, [key]: value }));\n }, []);\n\n return {\n state,\n setState,\n getValue,\n setValue,\n };\n}\n","// Re-export from @almadar/ui - no code duplication\nexport { useUIEvents } from '@almadar/ui/hooks';\n","import { useCallback } from 'react';\nimport { useNavigation as useRNNavigation, useRoute } from '@react-navigation/native';\nimport type { NavigationProp, RouteProp, ParamListBase } from '@react-navigation/native';\n\nexport interface NavigationOptions {\n replace?: boolean;\n reset?: boolean;\n}\n\n/**\n * Hook for navigation in React Native apps.\n * \n * This hook wraps React Navigation's useNavigation and useRoute\n * with a simpler API for common navigation patterns.\n * \n * @example\n * // With typed navigation (recommended)\n * type RootStackParamList = {\n * Home: undefined;\n * Profile: { userId: string };\n * };\n * const navigation = useNavigation<RootStackParamList>();\n * \n * // Navigate to a screen\n * navigation.navigateTo('Profile', { userId: '123' });\n * \n * // Get a route param\n * const userId = navigation.getParam<string>('userId');\n */\nexport function useNavigation<T extends ParamListBase = ParamListBase>() {\n // Cast to NavigationProp<T> for generic type support\n // The actual React Navigation hook returns more specific types based on context\n const navigation = useRNNavigation<NavigationProp<T>>();\n const route = useRoute<RouteProp<T, keyof T>>();\n\n const navigateTo = useCallback(<K extends keyof T>(\n screenName: K,\n params?: T[K],\n options?: NavigationOptions\n ): void => {\n const screen = String(screenName);\n \n if (options?.replace) {\n // Stack navigator specific - cast for compatibility\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (navigation as any).replace(screen, params);\n } else if (options?.reset) {\n navigation.reset({\n index: 0,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routes: [{ name: screen, params } as any],\n });\n } else {\n // Use navigation.navigate with proper typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (navigation.navigate as any)(screen, params);\n }\n }, [navigation]);\n\n const goBack = useCallback((): void => {\n navigation.goBack();\n }, [navigation]);\n\n const getParam = useCallback(<V,>(key: string, defaultValue?: V): V | undefined => {\n // Route params come as unknown from React Navigation\n // Cast to Record for safe property access\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const params = route.params as Record<string, any> | undefined;\n return params?.[key] ?? defaultValue;\n }, [route.params]);\n\n return {\n navigateTo,\n goBack,\n getParam,\n currentRoute: String(route.name),\n // Route params come as unknown from React Navigation\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params: route.params as Record<string, any> | undefined,\n };\n}\n\n/**\n * Hook to access route params directly with type safety.\n * \n * @example\n * type ProfileParams = { userId: string; name?: string };\n * const { userId, name } = useParams<ProfileParams>();\n */\nexport function useParams<T extends Record<string, unknown>>(): T {\n const route = useRoute();\n // Route params from React Navigation are typed as object | undefined\n // Cast to consumer's expected type for type safety\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (route.params as any) || ({} as T);\n}\n","import { useEffect, useState, useCallback } from 'react';\nimport { Keyboard, KeyboardEvent, Platform } from 'react-native';\n\nexport interface KeyboardState {\n isVisible: boolean;\n height: number;\n}\n\nexport function useKeyboard() {\n const [keyboardState, setKeyboardState] = useState<KeyboardState>({\n isVisible: false,\n height: 0,\n });\n\n useEffect(() => {\n const showEvent = Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow';\n const hideEvent = Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide';\n\n const onKeyboardShow = (event: KeyboardEvent) => {\n setKeyboardState({\n isVisible: true,\n height: event.endCoordinates.height,\n });\n };\n\n const onKeyboardHide = () => {\n setKeyboardState({\n isVisible: false,\n height: 0,\n });\n };\n\n const showSubscription = Keyboard.addListener(showEvent, onKeyboardShow);\n const hideSubscription = Keyboard.addListener(hideEvent, onKeyboardHide);\n\n return () => {\n showSubscription.remove();\n hideSubscription.remove();\n };\n }, []);\n\n const dismissKeyboard = useCallback(() => {\n Keyboard.dismiss();\n }, []);\n\n return {\n ...keyboardState,\n dismissKeyboard,\n };\n}\n\nexport function useKeyboardHeight() {\n const [keyboardHeight, setKeyboardHeight] = useState(0);\n\n useEffect(() => {\n const showEvent = Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow';\n const hideEvent = Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide';\n\n const onKeyboardShow = (event: KeyboardEvent) => {\n setKeyboardHeight(event.endCoordinates.height);\n };\n\n const onKeyboardHide = () => {\n setKeyboardHeight(0);\n };\n\n const showSubscription = Keyboard.addListener(showEvent, onKeyboardShow);\n const hideSubscription = Keyboard.addListener(hideEvent, onKeyboardHide);\n\n return () => {\n showSubscription.remove();\n hideSubscription.remove();\n };\n }, []);\n\n return keyboardHeight;\n}\n","import { useMemo } from 'react';\nimport { StyleSheet, ViewStyle, TextStyle, ImageStyle } from 'react-native';\nimport { useTheme } from '../providers/ThemeContext';\n\n/**\n * Hook for creating theme-aware styles\n * \n * @example\n * const styles = useThemeStyles((theme) => ({\n * container: {\n * backgroundColor: theme.colors.background,\n * padding: theme.spacing[4],\n * },\n * text: {\n * color: theme.colors.foreground,\n * fontSize: theme.typography.sizes.base,\n * },\n * }));\n */\nexport function useThemeStyles<T extends Record<string, ViewStyle | TextStyle | ImageStyle>>(\n styleCreator: (theme: ReturnType<typeof useTheme>) => T\n): T {\n const theme = useTheme();\n \n return useMemo(() => {\n const styles = styleCreator(theme);\n return StyleSheet.create(styles) as T;\n }, [theme, styleCreator]);\n}\n\n/**\n * Get a single theme value\n * \n * @example\n * const bgColor = useThemeValue((t) => t.colors.background);\n */\nexport function useThemeValue<T>(selector: (theme: ReturnType<typeof useTheme>) => T): T {\n const theme = useTheme();\n return useMemo(() => selector(theme), [theme, selector]);\n}\n","import { useState, useCallback } from 'react';\nimport { NativeScrollEvent, NativeSyntheticEvent } from 'react-native';\n\nexport interface UseScrollHeaderOptions {\n threshold?: number;\n}\n\nexport interface UseScrollHeaderReturn {\n isCollapsed: boolean;\n onScroll: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;\n}\n\n/**\n * Hook for creating collapsible header behavior on scroll.\n * \n * @example\n * ```tsx\n * const { isCollapsed, onScroll } = useScrollHeader({ threshold: 50 });\n * \n * return (\n * <>\n * <Header \n * title=\"My Page\" \n * style={{ \n * height: isCollapsed ? 40 : 56,\n * opacity: isCollapsed ? 0.9 : 1\n * }} \n * />\n * <ScrollView onScroll={onScroll} scrollEventThrottle={16}>\n * {content}\n * </ScrollView>\n * </>\n * );\n * ```\n */\nexport function useScrollHeader(\n options: UseScrollHeaderOptions = {}\n): UseScrollHeaderReturn {\n const { threshold = 50 } = options;\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n const onScroll = useCallback(\n (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n const offsetY = event.nativeEvent.contentOffset.y;\n const shouldCollapse = offsetY > threshold;\n \n if (shouldCollapse !== isCollapsed) {\n setIsCollapsed(shouldCollapse);\n }\n },\n [threshold, isCollapsed]\n );\n\n return { isCollapsed, onScroll };\n}\n","import { useState, useEffect } from 'react';\nimport { Dimensions, ScaledSize } from 'react-native';\n\nexport interface SafeAreaInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\n/**\n * Hook to get safe area insets for handling notched devices.\n * Uses screen dimensions to estimate safe areas.\n * \n * Note: For production apps, consider using react-native-safe-area-context\n * which provides the actual safe area insets from the native platform.\n * \n * @example\n * ```tsx\n * const insets = useSafeAreaInsets();\n * \n * return (\n * <View style={{ \n * paddingTop: insets.top,\n * paddingBottom: insets.bottom \n * }}>\n * {children}\n * </View>\n * );\n * ```\n */\nexport function useSafeAreaInsets(): SafeAreaInsets {\n const [screen, setScreen] = useState<ScaledSize>(Dimensions.get('window'));\n\n useEffect(() => {\n const subscription = Dimensions.addEventListener('change', ({ window }) => {\n setScreen(window);\n });\n\n return () => subscription?.remove();\n }, []);\n\n // Estimate safe areas based on common device dimensions\n // iPhone X and later have 44pt top and 34pt bottom safe areas\n // Other devices typically have 20pt top (status bar) and 0 bottom\n const isIPhoneXOrLater = \n screen.height >= 812 || screen.width >= 812;\n\n return {\n top: isIPhoneXOrLater ? 44 : 20,\n bottom: isIPhoneXOrLater ? 34 : 0,\n left: 0,\n right: 0,\n };\n}\n","import { useState, useCallback } from 'react';\nimport { RefreshControlProps } from 'react-native';\n\nexport interface UsePullToRefreshOptions {\n onRefresh: () => Promise<void> | void;\n}\n\nexport interface UsePullToRefreshReturn {\n refreshing: boolean;\n onRefresh: () => void;\n refreshControlProps: Pick<RefreshControlProps, 'refreshing' | 'onRefresh'>;\n}\n\n/**\n * Hook for implementing pull-to-refresh functionality.\n * \n * @example\n * ```tsx\n * const { refreshControlProps } = usePullToRefresh({\n * onRefresh: async () => {\n * await refetchData();\n * }\n * });\n * \n * return (\n * <ScrollView refreshControl={<RefreshControl {...refreshControlProps} />}>\n * {content}\n * </ScrollView>\n * );\n * ```\n */\nexport function usePullToRefresh(\n options: UsePullToRefreshOptions\n): UsePullToRefreshReturn {\n const { onRefresh } = options;\n const [refreshing, setRefreshing] = useState(false);\n\n const handleRefresh = useCallback(async () => {\n setRefreshing(true);\n try {\n await onRefresh();\n } finally {\n setRefreshing(false);\n }\n }, [onRefresh]);\n\n return {\n refreshing,\n onRefresh: handleRefresh,\n refreshControlProps: {\n refreshing,\n onRefresh: handleRefresh,\n },\n };\n}\n","import { useState, useCallback } from 'react';\nimport { NativeScrollEvent, NativeSyntheticEvent } from 'react-native';\n\nexport interface UseInfiniteScrollOptions {\n onLoadMore: () => Promise<void> | void;\n hasMore: boolean;\n threshold?: number;\n}\n\nexport interface UseInfiniteScrollReturn {\n loadingMore: boolean;\n onScroll: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;\n}\n\n/**\n * Hook for implementing infinite scroll functionality.\n * \n * @example\n * ```tsx\n * const { loadingMore, onScroll } = useInfiniteScroll({\n * onLoadMore: async () => {\n * await loadNextPage();\n * },\n * hasMore: hasNextPage,\n * });\n * \n * return (\n * <ScrollView onScroll={onScroll} scrollEventThrottle={16}>\n * {items.map(renderItem)}\n * {loadingMore && <ActivityIndicator />}\n * </ScrollView>\n * );\n * ```\n */\nexport function useInfiniteScroll(\n options: UseInfiniteScrollOptions\n): UseInfiniteScrollReturn {\n const { onLoadMore, hasMore, threshold = 100 } = options;\n const [loadingMore, setLoadingMore] = useState(false);\n\n const onScroll = useCallback(\n async (event: NativeSyntheticEvent<NativeScrollEvent>) => {\n if (loadingMore || !hasMore) return;\n\n const { layoutMeasurement, contentOffset, contentSize } = event.nativeEvent;\n const isCloseToBottom = \n layoutMeasurement.height + contentOffset.y >= \n contentSize.height - threshold;\n\n if (isCloseToBottom) {\n setLoadingMore(true);\n try {\n await onLoadMore();\n } finally {\n setLoadingMore(false);\n }\n }\n },\n [loadingMore, hasMore, threshold, onLoadMore]\n );\n\n return {\n loadingMore,\n onScroll,\n };\n}\n"],"mappings":"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","names":["useCallback","useState","useCallback","useState","useCallback","useState","useEffect","useState","useCallback","useState","useCallback"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ErrorState,
|
|
3
3
|
LoadingState
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-A6AK75GP.js";
|
|
5
5
|
import {
|
|
6
6
|
useEventBus
|
|
7
7
|
} from "./chunk-YTVYMEKU.js";
|
|
@@ -93,4 +93,4 @@ Checkbox.displayName = "Checkbox";
|
|
|
93
93
|
export {
|
|
94
94
|
Checkbox
|
|
95
95
|
};
|
|
96
|
-
//# sourceMappingURL=chunk-
|
|
96
|
+
//# sourceMappingURL=chunk-XWPR5FXS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/atoms/Checkbox.tsx"],"sourcesContent":["import React from 'react';\nimport { \n TouchableOpacity, \n View, \n StyleSheet, \n ViewStyle \n} 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 CheckboxProps {\n checked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n size?: 'sm' | 'md' | 'lg';\n style?: ViewStyle;\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 change event name - emits UI:${changeEvent} via eventBus */\n changeEvent?: EventKey;\n /** Payload to include with the change event */\n actionPayload?: EventPayload;\n}\n\nexport const Checkbox: React.FC<CheckboxProps> = ({\n checked = false,\n onChange,\n disabled = false,\n size = 'md',\n style,\n isLoading,\n error,\n changeEvent,\n actionPayload,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handlePress = () => {\n if (disabled || isLoading) return;\n \n const newValue = !checked;\n if (changeEvent) {\n eventBus.emit(`UI:${changeEvent}`, { ...actionPayload, checked: newValue });\n }\n onChange?.(newValue);\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, style]}>\n <LoadingState message=\"Loading...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const sizeStyles: Record<string, { box: number; check: number }> = {\n sm: { box: 18, check: 10 },\n md: { box: 24, check: 14 },\n lg: { box: 32, check: 18 },\n };\n\n const { box, check } = sizeStyles[size];\n\n return (\n <TouchableOpacity\n onPress={handlePress}\n disabled={disabled}\n activeOpacity={0.8}\n style={[\n styles.container,\n {\n width: box,\n height: box,\n borderRadius: theme.borderRadius.sm,\n borderWidth: 2,\n borderColor: checked \n ? theme.colors.primary \n : theme.colors.border,\n backgroundColor: checked \n ? theme.colors.primary \n : theme.colors.card,\n opacity: disabled ? 0.5 : 1,\n },\n style,\n ]}\n >\n {checked && (\n <View\n style={{\n width: check,\n height: check,\n backgroundColor: theme.colors['primary-foreground'],\n transform: [{ rotate: '45deg' }],\n }}\n />\n )}\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nCheckbox.displayName = 'Checkbox';\n"],"mappings":";;;;;;;;;;;;AAAA,OAAO,WAAW;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AA0BA,IAAM,WAAoC,CAAC;AAAA,EAChD,UAAU;AAAA,EACV;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,WAAW,YAAY;AAE7B,QAAM,cAAc,MAAM;AACxB,QAAI,YAAY,UAAW;AAE3B,UAAM,WAAW,CAAC;AAClB,QAAI,aAAa;AACf,eAAS,KAAK,MAAM,WAAW,IAAI,EAAE,GAAG,eAAe,SAAS,SAAS,CAAC;AAAA,IAC5E;AACA,eAAW,QAAQ;AAAA,EACrB;AAEA,MAAI,WAAW;AACb,WACE,oCAAC,QAAK,OAAO,CAAC,OAAO,WAAW,KAAK,KACnC,oCAAC,gBAAa,SAAQ,cAAa,CACrC;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,oCAAC,QAAK,OAAO,CAAC,OAAO,WAAW,KAAK,KACnC,oCAAC,cAAW,SAAS,MAAM,SAAS,CACtC;AAAA,EAEJ;AAEA,QAAM,aAA6D;AAAA,IACjE,IAAI,EAAE,KAAK,IAAI,OAAO,GAAG;AAAA,IACzB,IAAI,EAAE,KAAK,IAAI,OAAO,GAAG;AAAA,IACzB,IAAI,EAAE,KAAK,IAAI,OAAO,GAAG;AAAA,EAC3B;AAEA,QAAM,EAAE,KAAK,MAAM,IAAI,WAAW,IAAI;AAEtC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT;AAAA,MACA,eAAe;AAAA,MACf,OAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc,MAAM,aAAa;AAAA,UACjC,aAAa;AAAA,UACb,aAAa,UACT,MAAM,OAAO,UACb,MAAM,OAAO;AAAA,UACjB,iBAAiB,UACb,MAAM,OAAO,UACb,MAAM,OAAO;AAAA,UACjB,SAAS,WAAW,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AAAA;AAAA,IAEC,WACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiB,MAAM,OAAO,oBAAoB;AAAA,UAClD,WAAW,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,QACjC;AAAA;AAAA,IACF;AAAA,EAEJ;AAEJ;AAEA,IAAM,SAAS,WAAW,OAAO;AAAA,EAC/B,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,EAClB;AACF,CAAC;AAED,SAAS,cAAc;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Typography
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-A6AK75GP.js";
|
|
4
4
|
import {
|
|
5
5
|
useEventBus
|
|
6
6
|
} from "./chunk-YTVYMEKU.js";
|
|
@@ -334,4 +334,4 @@ export {
|
|
|
334
334
|
InfiniteScrollSentinel,
|
|
335
335
|
ControlButton
|
|
336
336
|
};
|
|
337
|
-
//# sourceMappingURL=chunk-
|
|
337
|
+
//# sourceMappingURL=chunk-YWQRLHTP.js.map
|