@almadar/mobile 1.2.4 → 1.4.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 +40 -907
- 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 -7
- 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
|
@@ -1 +0,0 @@
|
|
|
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';\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?: string;\n /** Payload to include with the change event */\n actionPayload?: Record<string, unknown>;\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;AAwBA,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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/atoms/Label.tsx","../src/components/atoms/Spinner.tsx","../src/components/atoms/DayCell.tsx","../src/components/atoms/InfiniteScrollSentinel.tsx","../src/components/atoms/game/ControlButton.tsx"],"sourcesContent":["import React from 'react';\nimport { Text, StyleSheet, TextStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\n\nexport interface LabelProps {\n children: React.ReactNode;\n required?: boolean;\n disabled?: boolean;\n style?: TextStyle;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n}\n\nexport const Label: React.FC<LabelProps> = ({\n children,\n required = false,\n disabled = false,\n style,\n}) => {\n const theme = useTheme();\n\n return (\n <Text\n style={[\n styles.label,\n {\n color: disabled \n ? theme.colors['muted-foreground'] \n : theme.colors.foreground,\n },\n style,\n ]}\n >\n {children}\n {required && (\n <Text style={[styles.required, { color: theme.colors.error }]}>\n {' *'}\n </Text>\n )}\n </Text>\n );\n};\n\nconst styles = StyleSheet.create({\n label: {\n fontSize: 14,\n fontWeight: '500',\n marginBottom: 6,\n },\n required: {\n fontWeight: '400',\n },\n});\n\nLabel.displayName = 'Label';\n","import React from 'react';\nimport { ActivityIndicator, StyleSheet, View, ViewStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\n\nexport interface SpinnerProps {\n size?: 'sm' | 'md' | 'lg';\n color?: string;\n style?: ViewStyle;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n}\n\nexport const Spinner: React.FC<SpinnerProps> = ({\n size = 'md',\n color,\n style,\n}) => {\n const theme = useTheme();\n\n const sizeMap: Record<string, number> = {\n sm: 16,\n md: 24,\n lg: 32,\n };\n\n return (\n <View style={[styles.container, style]}>\n <ActivityIndicator\n size={sizeMap[size]}\n color={color || theme.colors.primary}\n />\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nSpinner.displayName = 'Spinner';\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';\n\nexport interface DayCellProps {\n date: number;\n isToday?: boolean;\n isSelected?: boolean;\n isDisabled?: boolean;\n hasEvents?: boolean;\n onClick?: () => void;\n action?: string;\n actionPayload?: Record<string, unknown>;\n style?: ViewStyle;\n isLoading?: boolean;\n error?: Error | null;\n entity?: string;\n}\n\nexport const DayCell: React.FC<DayCellProps> = ({\n date,\n isToday = false,\n isSelected = false,\n isDisabled = false,\n hasEvents = false,\n onClick,\n action,\n actionPayload,\n style,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handlePress = () => {\n if (isDisabled) return;\n if (action) {\n eventBus.emit(`UI:${action}`, actionPayload);\n }\n onClick?.();\n };\n\n return (\n <Pressable\n onPress={handlePress}\n disabled={isDisabled}\n style={[\n styles.cell,\n {\n borderRadius: theme.borderRadius.md,\n },\n isToday && {\n borderWidth: 2,\n borderColor: theme.colors.primary,\n },\n isSelected && {\n backgroundColor: theme.colors.primary,\n },\n isDisabled && {\n opacity: 0.3,\n },\n style,\n ]}\n >\n <Typography\n variant=\"body\"\n style={[\n styles.dateText,\n {\n color: isSelected\n ? theme.colors['primary-foreground']\n : isDisabled\n ? theme.colors['muted-foreground']\n : theme.colors.foreground,\n },\n ]}\n >\n {date}\n </Typography>\n {hasEvents && (\n <Pressable\n style={[\n styles.eventDot,\n {\n backgroundColor: isSelected\n ? theme.colors['primary-foreground']\n : theme.colors.primary,\n },\n ]}\n />\n )}\n </Pressable>\n );\n};\n\nconst styles = StyleSheet.create({\n cell: {\n width: 40,\n height: 40,\n alignItems: 'center',\n justifyContent: 'center',\n },\n dateText: {\n fontSize: 14,\n fontWeight: '400',\n },\n eventDot: {\n position: 'absolute',\n bottom: 4,\n width: 4,\n height: 4,\n borderRadius: 2,\n },\n});\n\nDayCell.displayName = 'DayCell';\n","import React, { useEffect } from 'react';\nimport { View, StyleSheet, ViewStyle } from 'react-native';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Spinner } from './Spinner';\nimport { Typography } from './Typography';\nimport { useTheme } from '../../providers/ThemeContext';\n\nexport interface InfiniteScrollSentinelProps {\n loadMoreEvent?: string;\n loadMorePayload?: Record<string, unknown>;\n isLoading?: boolean;\n hasMore?: boolean;\n onLoadMore?: () => void;\n style?: ViewStyle;\n error?: Error | null;\n entity?: string;\n}\n\nexport const InfiniteScrollSentinel: React.FC<InfiniteScrollSentinelProps> = ({\n loadMoreEvent,\n loadMorePayload,\n isLoading = false,\n hasMore = true,\n onLoadMore,\n style,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n useEffect(() => {\n if (hasMore && !isLoading) {\n if (loadMoreEvent) {\n eventBus.emit(`UI:${loadMoreEvent}`, loadMorePayload);\n }\n onLoadMore?.();\n }\n }, [hasMore, isLoading, loadMoreEvent, loadMorePayload, onLoadMore, eventBus]);\n\n if (!hasMore) {\n return (\n <View style={[styles.container, style]}>\n <Typography variant=\"caption\" style={{ color: theme.colors['muted-foreground'] }}>\n No more items\n </Typography>\n </View>\n );\n }\n\n if (isLoading) {\n return (\n <View style={[styles.container, style]}>\n <Spinner size=\"sm\" />\n </View>\n );\n }\n\n return <View style={[styles.sentinel, style]} />;\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 16,\n alignItems: 'center',\n justifyContent: 'center',\n },\n sentinel: {\n height: 1,\n },\n});\n\nInfiniteScrollSentinel.displayName = 'InfiniteScrollSentinel';\n","import React, { useState, useCallback } from 'react';\nimport { \n TouchableOpacity, \n Text, \n StyleSheet, \n GestureResponderEvent,\n ViewStyle \n} from 'react-native';\nimport { useTheme } from '../../../providers/ThemeContext';\nimport { useEventBus } from '../../../hooks/useEventBus';\n\nexport interface ControlButtonProps {\n /** Button label text */\n label?: string;\n /** Icon component or emoji */\n icon?: React.ReactNode;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg' | 'xl' | string;\n /** Shape variant */\n shape?: 'circle' | 'rounded' | 'square' | string;\n /** Visual variant */\n variant?: 'primary' | 'secondary' | 'ghost' | string;\n /** Called when button is pressed */\n onPress?: () => void;\n /** Called when button is released */\n onRelease?: () => void;\n /** Declarative event name emitted on press via useEventBus */\n pressEvent?: string;\n /** Declarative event name emitted on release via useEventBus */\n releaseEvent?: string;\n /** Whether the button is currently pressed */\n pressed?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n /** Additional styles */\n style?: ViewStyle;\n}\n\nconst sizeMap: Record<string, { width: number; height: number; fontSize: number }> = {\n sm: { width: 40, height: 40, fontSize: 14 },\n md: { width: 56, height: 56, fontSize: 16 },\n lg: { width: 72, height: 72, fontSize: 20 },\n xl: { width: 96, height: 96, fontSize: 24 },\n};\n\nconst shapeMap: Record<string, number> = {\n circle: 9999,\n rounded: 12,\n square: 4,\n};\n\nconst variantMap: Record<string, { backgroundColor: string; borderColor: string; textColor: string }> = {\n primary: { \n backgroundColor: '#2563eb', \n borderColor: '#60a5fa',\n textColor: '#ffffff',\n },\n secondary: { \n backgroundColor: '#374151', \n borderColor: '#6b7280',\n textColor: '#ffffff',\n },\n ghost: { \n backgroundColor: 'transparent', \n borderColor: 'rgba(255,255,255,0.3)',\n textColor: '#ffffff',\n },\n};\n\nexport const ControlButton: React.FC<ControlButtonProps> = ({\n label,\n icon,\n size = 'md',\n shape = 'circle',\n variant = 'secondary',\n onPress,\n onRelease,\n pressEvent,\n releaseEvent,\n pressed,\n disabled,\n style,\n}) => {\n useTheme(); // Theme hook required by pattern\n const eventBus = useEventBus();\n const [isPressed, setIsPressed] = useState(false);\n const actualPressed = pressed ?? isPressed;\n\n const sizeConfig = sizeMap[size] ?? sizeMap.md;\n const borderRadius = shapeMap[shape] ?? shapeMap.circle;\n const variantConfig = variantMap[variant] ?? variantMap.secondary;\n\n const handlePressIn = useCallback(\n (_e: GestureResponderEvent) => {\n if (disabled) return;\n setIsPressed(true);\n if (pressEvent) eventBus.emit(`UI:${pressEvent}`, {});\n onPress?.();\n },\n [disabled, pressEvent, eventBus, onPress]\n );\n\n const handlePressOut = useCallback(\n (_e: GestureResponderEvent) => {\n if (disabled) return;\n setIsPressed(false);\n if (releaseEvent) eventBus.emit(`UI:${releaseEvent}`, {});\n onRelease?.();\n },\n [disabled, releaseEvent, eventBus, onRelease]\n );\n\n return (\n <TouchableOpacity\n activeOpacity={0.8}\n disabled={disabled}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n style={[\n styles.button,\n {\n width: sizeConfig.width,\n height: sizeConfig.height,\n borderRadius,\n backgroundColor: variantConfig.backgroundColor,\n borderColor: variantConfig.borderColor,\n opacity: disabled ? 0.5 : 1,\n transform: [{ scale: actualPressed ? 0.95 : 1 }],\n },\n style as never,\n ]}\n >\n {icon ? (\n <Text style={{ fontSize: sizeConfig.fontSize * 1.5 }}>\n {icon as string}\n </Text>\n ) : label ? (\n <Text\n style={{\n fontSize: sizeConfig.fontSize,\n color: variantConfig.textColor,\n fontWeight: '700',\n }}\n >\n {label}\n </Text>\n ) : null}\n </TouchableOpacity>\n );\n};\n\nconst styles = StyleSheet.create({\n button: {\n justifyContent: 'center',\n alignItems: 'center',\n borderWidth: 2,\n userSelect: 'none',\n },\n});\n\nControlButton.displayName = 'ControlButton';\n"],"mappings":"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","names":["React","StyleSheet","sizeMap","React","styles","StyleSheet","React","StyleSheet","React","styles","StyleSheet","React","View","StyleSheet","React","View","styles","StyleSheet","React","Text","StyleSheet","React","styles","Text","StyleSheet"]}
|