@gaozh1024/rn-kit 0.2.0-beta.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/README.md +363 -0
- package/TAILWIND_SETUP.md +307 -0
- package/dist/index.d.mts +3465 -0
- package/dist/index.d.ts +3465 -0
- package/dist/index.js +4627 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4504 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/cn.ts","../src/utils/color.ts","../src/utils/platform.ts","../src/utils/date/index.ts","../src/utils/string/index.ts","../src/utils/number/index.ts","../src/utils/object/index.ts","../src/utils/validation/index.ts","../src/theme/create-theme.ts","../src/theme/provider.tsx","../src/theme/tokens.ts","../src/core/index.ts","../src/core/error/types.ts","../src/core/error/helpers.ts","../src/core/hooks/useAsyncState.ts","../src/core/api/create-api.ts","../src/core/storage/memory-storage.ts","../src/core/hooks/useRequest.ts","../src/core/hooks/usePagination.ts","../src/core/hooks/usePrevious.ts","../src/core/hooks/useSetState.ts","../src/core/hooks/useMemoizedFn.ts","../src/core/hooks/useUpdateEffect.ts","../src/core/hooks/useStorage.ts","../src/core/hooks/useRefresh.ts","../src/core/hooks/useInfinite.ts","../src/ui/primitives/AppView.tsx","../src/ui/utils/theme-color.ts","../src/ui/primitives/AppScrollView.tsx","../src/ui/primitives/AppText.tsx","../src/ui/primitives/AppPressable.tsx","../src/ui/layout/Row.tsx","../src/ui/layout/Col.tsx","../src/ui/layout/Center.tsx","../src/ui/layout/SafeScreen.tsx","../src/ui/actions/AppButton.tsx","../src/ui/feedback/Toast.tsx","../src/ui/feedback/Alert.tsx","../src/ui/feedback/Loading.tsx","../src/ui/display/Progress.tsx","../src/ui/display/Card.tsx","../src/ui/display/Icon.tsx","../src/ui/display/AppImage.tsx","../src/ui/display/AppList.tsx","../src/ui/form/AppInput.tsx","../src/ui/form/Checkbox.tsx","../src/ui/form/CheckboxGroup.tsx","../src/ui/form/Radio.tsx","../src/ui/form/RadioGroup.tsx","../src/ui/form/Switch.tsx","../src/ui/form/Slider.tsx","../src/ui/form/useFormTheme.ts","../src/ui/form/Select.tsx","../src/ui/form/DatePicker.tsx","../src/ui/form/FormItem.tsx","../src/ui/form/useForm.ts","../src/ui/hooks/useToggle.ts","../src/ui/hooks/useDebounce.ts","../src/ui/hooks/useThrottle.ts","../src/ui/hooks/useKeyboard.ts","../src/ui/hooks/useDimensions.ts","../src/ui/hooks/useOrientation.ts","../src/navigation/provider.tsx","../src/navigation/utils/navigation-theme.ts","../src/navigation/vendor/stack.ts","../src/navigation/navigators/StackNavigator.tsx","../src/navigation/navigators/TabNavigator.tsx","../src/navigation/components/BottomTabBar.tsx","../src/navigation/navigators/DrawerNavigator.tsx","../src/navigation/components/AppHeader.tsx","../src/navigation/components/DrawerContent.tsx","../src/navigation/hooks/useNavigation.ts","../src/navigation/hooks/useRoute.ts","../src/navigation/hooks/useNavigationState.ts","../src/navigation/index.ts","../src/overlay/AppProvider.tsx","../src/overlay/AppStatusBar.tsx","../src/overlay/loading/provider.tsx","../src/overlay/loading/context.ts","../src/overlay/loading/component.tsx","../src/overlay/toast/provider.tsx","../src/overlay/toast/context.ts","../src/overlay/toast/component.tsx","../src/overlay/alert/provider.tsx","../src/overlay/alert/context.ts","../src/overlay/alert/component.tsx","../src/overlay/provider.tsx","../src/overlay/loading/hooks.ts","../src/overlay/toast/hooks.ts","../src/overlay/alert/hooks.ts"],"sourcesContent":["// Utils\nexport * from '@/utils';\n\n// Theme - 重命名冲突的类型\nexport type { Theme, ThemeConfig, ColorPalette as ThemeColorPalette, ColorToken } from '@/theme';\nexport { createTheme, ThemeProvider, useTheme, useThemeColors, getThemeColors } from '@/theme';\n\n// Core\nexport * from '@/core';\n\n// UI\nexport * from '@/ui';\n\n// Navigation\nexport * from '@/navigation';\n\n// Overlay (AppProvider + Global UI)\nexport * from '@/overlay';\n\n// External Providers - 方便用户自定义包裹\nexport { SafeAreaProvider } from 'react-native-safe-area-context';\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * 合并 Tailwind CSS 类名,自动处理类名冲突\n *\n * 使用 clsx 进行条件类名合并,使用 tailwind-merge 解决 Tailwind 类名冲突\n *\n * @param inputs - 要合并的类名数组,支持字符串、对象、数组等多种格式\n * @returns 合并后的类名字符串\n * @example\n * ```ts\n * cn('px-4 py-2', 'bg-blue-500', { 'text-white': true })\n * // => 'px-4 py-2 bg-blue-500 text-white'\n *\n * cn('px-4', 'px-6') // 后者覆盖前者\n * // => 'px-6'\n * ```\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport { clsx, type ClassValue, twMerge };\n","/**\n * RGB 颜色对象\n */\nexport interface RgbObject {\n /** 红色通道值 (0-255) */\n r: number;\n /** 绿色通道值 (0-255) */\n g: number;\n /** 蓝色通道值 (0-255) */\n b: number;\n}\n\n/**\n * 调色板对象,包含从 0 到 950 的色阶\n * 兼容 Record<string, string> 类型\n */\nexport interface ColorPalette {\n /** 最亮色 */\n 0: string;\n /** 50 色阶 */\n 50: string;\n /** 100 色阶 */\n 100: string;\n /** 200 色阶 */\n 200: string;\n /** 300 色阶 */\n 300: string;\n /** 400 色阶 */\n 400: string;\n /** 500 色阶(基准色) */\n 500: string;\n /** 600 色阶 */\n 600: string;\n /** 700 色阶 */\n 700: string;\n /** 800 色阶 */\n 800: string;\n /** 900 色阶 */\n 900: string;\n /** 最暗色 */\n 950: string;\n /** 索引签名,兼容 Record<string, string> */\n [key: string]: string;\n}\n\n/**\n * 将十六进制颜色转换为 RGB 对象\n *\n * @param hex - 十六进制颜色字符串(如 '#FF5733' 或 'FF5733')\n * @returns RGB 颜色对象\n * @example\n * ```ts\n * hexToRgb('#FF5733')\n * // => { r: 255, g: 87, b: 51 }\n * ```\n */\nexport function hexToRgb(hex: string): RgbObject {\n const clean = hex.replace('#', '');\n const bigint = parseInt(clean, 16);\n return {\n r: (bigint >> 16) & 255,\n g: (bigint >> 8) & 255,\n b: bigint & 255,\n };\n}\n\n/**\n * 将 RGB 对象转换为十六进制颜色字符串\n *\n * @param rgb - RGB 颜色对象\n * @returns 十六进制颜色字符串(如 '#FF5733')\n * @example\n * ```ts\n * rgbToHex({ r: 255, g: 87, b: 51 })\n * // => '#ff5733'\n * ```\n */\nexport function rgbToHex(rgb: RgbObject): string {\n return '#' + [rgb.r, rgb.g, rgb.b].map(x => x.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * 调整 RGB 颜色的亮度\n *\n * @param rgb - RGB 颜色对象\n * @param factor - 亮度调整因子,正数变亮,负数变暗,范围建议在 -1 到 1 之间\n * @returns 调整后的 RGB 颜色对象\n * @example\n * ```ts\n * adjustBrightness({ r: 128, g: 128, b: 128 }, 0.5)\n * // => { r: 191, g: 191, b: 191 }\n *\n * adjustBrightness({ r: 128, g: 128, b: 128 }, -0.5)\n * // => { r: 64, g: 64, b: 64 }\n * ```\n */\nexport function adjustBrightness(rgb: RgbObject, factor: number): RgbObject {\n const adjust = (c: number) =>\n Math.max(0, Math.min(255, c + (factor > 0 ? (255 - c) * factor : c * factor)));\n return { r: adjust(rgb.r), g: adjust(rgb.g), b: adjust(rgb.b) };\n}\n\n/**\n * 基于基准色生成完整的调色板\n *\n * 生成包含 12 个色阶(0-950)的调色板,其中 500 为基准色\n *\n * @param baseHex - 基准十六进制颜色字符串\n * @returns 完整的调色板对象\n * @example\n * ```ts\n * generateColorPalette('#3B82F6')\n * // => {\n * // 0: '#e6f0fe',\n * // 50: '#dbeafe',\n * // 100: '#bfdbfe',\n * // ...\n * // 500: '#3b82f6',\n * // ...\n * // 950: '#172554'\n * // }\n * ```\n */\nexport function generateColorPalette(baseHex: string): ColorPalette {\n const rgb = hexToRgb(baseHex);\n const factors: Record<number, number> = {\n 0: 0.95,\n 50: 0.9,\n 100: 0.75,\n 200: 0.5,\n 300: 0.3,\n 400: 0.1,\n 500: 0,\n 600: -0.1,\n 700: -0.25,\n 800: -0.4,\n 900: -0.55,\n 950: -0.7,\n };\n const result = {} as ColorPalette;\n for (const [level, factor] of Object.entries(factors)) {\n result[parseInt(level) as keyof ColorPalette] = rgbToHex(adjustBrightness(rgb, factor));\n }\n return result;\n}\n","/**\n * 检查当前是否为开发环境\n *\n * 通过检查 process.env.NODE_ENV 是否为 'development' 来判断\n *\n * @returns 如果当前是开发环境返回 true,否则返回 false\n * @example\n * ```ts\n * if (isDevelopment()) {\n * console.log('Running in development mode');\n * }\n * ```\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n","/**\n * 日期格式化选项\n */\nexport interface DateFormatOptions {\n /** 年份格式,如 'yyyy' */\n year?: string;\n /** 月份格式,如 'MM' */\n month?: string;\n /** 日期格式,如 'dd' */\n day?: string;\n}\n\n/**\n * 将日期格式化为指定格式的字符串\n *\n * @param date - 要格式化的日期对象\n * @param format - 格式化模板,支持 'yyyy'(年)、'MM'(月)、'dd'(日),默认为 'yyyy-MM-dd'\n * @returns 格式化后的日期字符串\n * @example\n * ```ts\n * formatDate(new Date('2024-01-15'))\n * // => '2024-01-15'\n *\n * formatDate(new Date('2024-01-15'), 'yyyy年MM月dd日')\n * // => '2024年01月15日'\n * ```\n */\nexport function formatDate(date: Date, format: string = 'yyyy-MM-dd'): string {\n const d = new Date(date);\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n\n return format.replace('yyyy', String(year)).replace('MM', month).replace('dd', day);\n}\n\n/**\n * 格式化日期为相对时间(如\"刚刚\"、\"5分钟前\"等)\n *\n * @param date - 要格式化的日期对象\n * @returns 相对时间字符串\n * @example\n * ```ts\n * formatRelativeTime(new Date()) // => '刚刚'\n * formatRelativeTime(new Date(Date.now() - 5 * 60000)) // => '5分钟前'\n * formatRelativeTime(new Date(Date.now() - 2 * 3600000)) // => '2小时前'\n * formatRelativeTime(new Date(Date.now() - 3 * 86400000)) // => '3天前'\n * formatRelativeTime(new Date('2023-01-01')) // => '2023-01-01'\n * ```\n */\nexport function formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(diff / 3600000);\n const days = Math.floor(diff / 86400000);\n\n if (minutes < 1) return '刚刚';\n if (minutes < 60) return `${minutes}分钟前`;\n if (hours < 24) return `${hours}小时前`;\n if (days < 30) return `${days}天前`;\n return formatDate(date);\n}\n","/**\n * 截断字符串,超出指定长度时添加后缀\n *\n * @param str - 要截断的字符串\n * @param length - 目标长度(包含后缀长度)\n * @param suffix - 截断后添加的后缀,默认为 '...'\n * @returns 截断后的字符串\n * @example\n * ```ts\n * truncate('Hello World', 8)\n * // => 'Hello...'\n *\n * truncate('Hello World', 8, '>>')\n * // => 'Hello >>'\n *\n * truncate('Hi', 8)\n * // => 'Hi'\n * ```\n */\nexport function truncate(str: string, length: number, suffix: string = '...'): string {\n if (str.length <= length) return str;\n return str.slice(0, length - suffix.length) + suffix;\n}\n\n/**\n * 将字符串转换为 URL 友好的 slug 格式\n *\n * 移除特殊字符,将空格转换为连字符,合并多个连字符\n *\n * @param str - 要转换的字符串\n * @returns slug 格式的字符串\n * @example\n * ```ts\n * slugify('Hello World!')\n * // => 'hello-world'\n *\n * slugify('This is a -- test!!!')\n * // => 'this-is-a-test'\n * ```\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-');\n}\n\n/**\n * 将字符串首字母大写\n *\n * @param str - 要转换的字符串\n * @returns 首字母大写的字符串\n * @example\n * ```ts\n * capitalize('hello world')\n * // => 'Hello world'\n *\n * capitalize('HELLO')\n * // => 'HELLO'\n * ```\n */\nexport function capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * 将数字格式化为中文地区的字符串表示\n *\n * 使用千分位分隔符格式化数字\n *\n * @param num - 要格式化的数字\n * @returns 格式化后的字符串\n * @example\n * ```ts\n * formatNumber(1234567.89)\n * // => '1,234,567.89'\n *\n * formatNumber(1000)\n * // => '1,000'\n * ```\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString('zh-CN');\n}\n\n/**\n * 将数字格式化为货币字符串\n *\n * @param num - 要格式化的数字\n * @param currency - 货币符号,默认为 '¥'\n * @returns 格式化后的货币字符串\n * @example\n * ```ts\n * formatCurrency(1234.5)\n * // => '¥1,234.5'\n *\n * formatCurrency(1234.5, '$')\n * // => '$1,234.5'\n * ```\n */\nexport function formatCurrency(num: number, currency: string = '¥'): string {\n return `${currency}${formatNumber(num)}`;\n}\n\n/**\n * 将小数格式化为百分比字符串\n *\n * @param num - 要格式化的小数(如 0.25 表示 25%)\n * @param decimals - 小数位数,默认为 2\n * @returns 格式化后的百分比字符串\n * @example\n * ```ts\n * formatPercent(0.25)\n * // => '25.00%'\n *\n * formatPercent(0.25, 0)\n * // => '25%'\n *\n * formatPercent(0.1234, 1)\n * // => '12.3%'\n * ```\n */\nexport function formatPercent(num: number, decimals: number = 2): string {\n return `${(num * 100).toFixed(decimals)}%`;\n}\n\n/**\n * 将数字限制在指定的最小值和最大值之间\n *\n * @param num - 要限制的数字\n * @param min - 最小值\n * @param max - 最大值\n * @returns 限制后的数字\n * @example\n * ```ts\n * clamp(50, 0, 100) // => 50\n * clamp(150, 0, 100) // => 100\n * clamp(-10, 0, 100) // => 0\n * ```\n */\nexport function clamp(num: number, min: number, max: number): number {\n return Math.min(Math.max(num, min), max);\n}\n","/**\n * 深度合并两个对象\n *\n * 递归合并 source 对象的属性到 target 对象,嵌套对象也会被合并\n *\n * @param target - 目标对象\n * @param source - 源对象\n * @returns 合并后的新对象\n * @example\n * ```ts\n * deepMerge({ a: 1, b: { x: 1 } }, { b: { y: 2 }, c: 3 })\n * // => { a: 1, b: { x: 1, y: 2 }, c: 3 }\n * ```\n */\nexport function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n for (const key in source) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n (result as any)[key] = deepMerge(result[key] || {}, source[key] as any);\n } else {\n (result as any)[key] = source[key];\n }\n }\n return result;\n}\n\n/**\n * 从对象中选取指定的属性\n *\n * @param obj - 源对象\n * @param keys - 要选取的属性键数组\n * @returns 仅包含指定属性的新对象\n * @example\n * ```ts\n * pick({ a: 1, b: 2, c: 3 }, ['a', 'c'])\n * // => { a: 1, c: 3 }\n * ```\n */\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) result[key] = obj[key];\n }\n return result;\n}\n\n/**\n * 从对象中排除指定的属性\n *\n * @param obj - 源对象\n * @param keys - 要排除的属性键数组\n * @returns 不包含指定属性的新对象\n * @example\n * ```ts\n * omit({ a: 1, b: 2, c: 3 }, ['b'])\n * // => { a: 1, c: 3 }\n * ```\n */\nexport function omit<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) delete (result as any)[key];\n return result;\n}\n","import { ZodError } from 'zod';\n\n/**\n * 将 Zod 验证错误转换为字段错误映射对象\n *\n * @param error - ZodError 实例\n * @returns 字段路径到错误消息的映射对象\n * @example\n * ```ts\n * const schema = z.object({\n * email: z.string().email(),\n * age: z.number().min(18)\n * });\n *\n * const result = schema.safeParse({ email: 'invalid', age: 16 });\n * if (!result.success) {\n * getValidationErrors(result.error)\n * // => { email: 'Invalid email', age: 'Number must be greater than or equal to 18' }\n * }\n * ```\n */\nexport function getValidationErrors(error: ZodError): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const issue of error.issues) {\n const path = issue.path.join('.');\n errors[path] = issue.message;\n }\n return errors;\n}\n\n/**\n * 验证邮箱地址格式是否有效\n *\n * @param email - 要验证的邮箱地址\n * @returns 是否为有效的邮箱格式\n * @example\n * ```ts\n * isValidEmail('user@example.com') // => true\n * isValidEmail('invalid-email') // => false\n * ```\n */\nexport function isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n}\n\n/**\n * 验证中国手机号码格式是否有效\n *\n * 支持以 1 开头,第二位为 3-9 的 11 位手机号码\n *\n * @param phone - 要验证的手机号码\n * @returns 是否为有效的手机号码格式\n * @example\n * ```ts\n * isValidPhone('13800138000') // => true\n * isValidPhone('12345678901') // => false\n * ```\n */\nexport function isValidPhone(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n","import { generateColorPalette, type ColorPalette } from '@/utils';\nimport type { ColorToken } from './types';\nimport type { Theme, ThemeConfig } from './types';\n\nconst defaultSpacing = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n};\n\nconst defaultBorderRadius = {\n none: 0,\n sm: 2,\n md: 6,\n lg: 8,\n xl: 12,\n '2xl': 16,\n '3xl': 24,\n full: 9999,\n};\n\n// 默认颜色,用于导航等组件\nconst defaultColors = {\n background: '#ffffff',\n card: '#ffffff',\n text: '#1f2937',\n border: '#e5e7eb',\n error: '#ef4444',\n success: '#22c55e',\n warning: '#f59e0b',\n info: '#3b82f6',\n};\n\nfunction resolveColor(token: ColorToken): ColorPalette {\n return typeof token === 'string' ? generateColorPalette(token) : token;\n}\n\nexport function createTheme(config: ThemeConfig): Theme {\n const colors: Record<string, ColorPalette> = {};\n\n // 先生成默认颜色\n for (const [name, value] of Object.entries(defaultColors)) {\n colors[name] = resolveColor(value);\n }\n\n // 用户配置覆盖默认颜色\n for (const [name, token] of Object.entries(config.colors)) {\n colors[name] = resolveColor(token);\n }\n\n return {\n colors,\n spacing: config.spacing ?? defaultSpacing,\n borderRadius: config.borderRadius ?? defaultBorderRadius,\n };\n}\n","import React, { createContext, useContext, useState, useMemo } from 'react';\nimport type { Theme, ThemeConfig } from './types';\nimport { createTheme } from './create-theme';\n\ninterface ThemeContextValue {\n theme: Theme;\n isDark: boolean;\n toggleTheme: () => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nconst fallbackTheme = createTheme({\n colors: {\n primary: '#f38b32',\n secondary: '#3b82f6',\n background: '#ffffff',\n card: '#ffffff',\n text: '#1f2937',\n border: '#e5e7eb',\n error: '#ef4444',\n success: '#22c55e',\n warning: '#f59e0b',\n info: '#3b82f6',\n },\n});\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n light: ThemeConfig;\n dark?: ThemeConfig;\n defaultDark?: boolean;\n /**\n * 受控暗色模式。\n * 传入后会以该值为准,不再依赖内部 state。\n */\n isDark?: boolean;\n /**\n * 主题切换回调。\n * 受控/非受控模式下都会在 toggleTheme 时触发。\n */\n onThemeChange?: (isDark: boolean) => void;\n}\n\nexport function ThemeProvider({\n children,\n light,\n dark,\n defaultDark = false,\n isDark: controlledIsDark,\n onThemeChange,\n}: ThemeProviderProps) {\n const [internalIsDark, setInternalIsDark] = useState(defaultDark);\n const isDark = controlledIsDark ?? internalIsDark;\n const theme = useMemo(() => {\n const config = isDark && dark ? dark : light;\n return createTheme(config);\n }, [isDark, light, dark]);\n\n const toggleTheme = () => {\n const nextIsDark = !isDark;\n if (controlledIsDark === undefined) {\n setInternalIsDark(nextIsDark);\n }\n onThemeChange?.(nextIsDark);\n };\n\n return (\n <ThemeContext.Provider value={{ theme, isDark, toggleTheme }}>{children}</ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n if (!context) throw new Error('useTheme must be used within ThemeProvider');\n return context;\n}\n\nexport function useOptionalTheme(): ThemeContextValue {\n const context = useContext(ThemeContext);\n return (\n context || {\n theme: fallbackTheme,\n isDark: false,\n toggleTheme: () => {},\n }\n );\n}\n","import { useMemo } from 'react';\nimport { useOptionalTheme } from './provider';\nimport type { Theme } from './types';\n\nexport interface ThemeColorTokens {\n primary: string;\n primarySurface: string;\n background: string;\n card: string;\n cardElevated: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n textInverse: string;\n border: string;\n divider: string;\n iconMuted: string;\n}\n\nexport function getThemeColors(theme: Theme, isDark: boolean): ThemeColorTokens {\n return {\n primary: theme.colors.primary?.[500] || '#f38b32',\n primarySurface: isDark\n ? theme.colors.primary?.[900] || '#7c2d12'\n : theme.colors.primary?.[50] || '#fff7ed',\n background: theme.colors.background?.[500] || (isDark ? '#0a0a0a' : '#ffffff'),\n card: theme.colors.card?.[500] || (isDark ? '#1f2937' : '#ffffff'),\n cardElevated:\n (isDark ? theme.colors.card?.[800] || theme.colors.card?.[700] : theme.colors.card?.[500]) ||\n (isDark ? '#1f2937' : '#ffffff'),\n text: theme.colors.text?.[500] || (isDark ? '#ffffff' : '#1f2937'),\n textSecondary: isDark ? '#d1d5db' : '#374151',\n textMuted: isDark ? '#9ca3af' : '#6b7280',\n textInverse: '#ffffff',\n border: isDark\n ? theme.colors.border?.[600] || theme.colors.border?.[500] || '#4b5563'\n : theme.colors.border?.[500] || '#d1d5db',\n divider: isDark\n ? theme.colors.border?.[700] || theme.colors.border?.[500] || '#374151'\n : theme.colors.border?.[500] || '#e5e7eb',\n iconMuted: isDark ? '#9ca3af' : '#6b7280',\n };\n}\n\nexport function useThemeColors(): ThemeColorTokens {\n const { theme, isDark } = useOptionalTheme();\n\n return useMemo(() => getThemeColors(theme, isDark), [theme, isDark]);\n}\n","/**\n * @deprecated 将在后续大版本移除,请直接从 `zod` 导入。\n * `import { z } from 'zod'`\n */\nexport { z } from 'zod';\n\n/**\n * @deprecated 将在后续大版本移除,请直接从 `@tanstack/react-query` 导入。\n * `import { useQuery, useMutation } from '@tanstack/react-query'`\n */\nexport { useQuery, useMutation } from '@tanstack/react-query';\n\nexport * from './error';\nexport * from './api';\nexport * from './storage';\nexport * from './hooks';\n","/**\n * @fileoverview 错误类型定义模块\n * @module core/error/types\n * @description 定义应用错误码枚举和错误对象接口\n */\n\n/**\n * 应用错误码枚举\n * @enum {string}\n * @example\n * ```typescript\n * if (error.code === ErrorCode.UNAUTHORIZED) {\n * redirectToLogin();\n * }\n * ```\n */\nexport enum ErrorCode {\n /** 数据校验错误 */\n VALIDATION = 'VALIDATION',\n /** 网络连接错误 */\n NETWORK = 'NETWORK',\n /** 未授权访问 */\n UNAUTHORIZED = 'UNAUTHORIZED',\n /** 禁止访问 */\n FORBIDDEN = 'FORBIDDEN',\n /** 服务器内部错误 */\n SERVER = 'SERVER',\n /** 业务逻辑错误 */\n BUSINESS = 'BUSINESS',\n /** 未知错误 */\n UNKNOWN = 'UNKNOWN',\n}\n\n/**\n * 应用错误对象接口\n * @example\n * ```typescript\n * const error: AppError = {\n * code: ErrorCode.VALIDATION,\n * message: 'Email format is invalid',\n * field: 'email',\n * retryable: false\n * };\n * ```\n */\nexport interface AppError {\n /** 错误码 */\n code: ErrorCode;\n /** 错误消息 */\n message: string;\n /** HTTP 状态码(如适用) */\n statusCode?: number;\n /** 相关字段(如校验错误) */\n field?: string;\n /** 是否可重试 */\n retryable?: boolean;\n /** 原始错误对象 */\n original?: any;\n}\n","/**\n * @fileoverview 错误处理辅助函数模块\n * @module core/error/helpers\n * @description 提供 HTTP 状态码映射和错误对象增强功能\n */\n\nimport { ErrorCode, type AppError } from './types';\n\n/**\n * 将 HTTP 状态码映射为应用错误码\n * @param status - HTTP 状态码\n * @returns 对应的 ErrorCode 枚举值\n * @example\n * ```typescript\n * const errorCode = mapHttpStatus(404); // ErrorCode.VALIDATION\n * const errorCode = mapHttpStatus(500); // ErrorCode.SERVER\n * const errorCode = mapHttpStatus(401); // ErrorCode.UNAUTHORIZED\n * ```\n */\nexport function mapHttpStatus(status: number): ErrorCode {\n if (status === 401) return ErrorCode.UNAUTHORIZED;\n if (status === 403) return ErrorCode.FORBIDDEN;\n if (status >= 400 && status < 500) return ErrorCode.VALIDATION;\n if (status >= 500) return ErrorCode.SERVER;\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * 增强错误对象,添加便捷的判断属性\n * @param error - 基础应用错误对象\n * @returns 增强后的错误对象,包含 isValidation、isNetwork、isAuth、isRetryable 等属性\n * @example\n * ```typescript\n * const enhanced = enhanceError({\n * code: ErrorCode.NETWORK,\n * message: 'Connection timeout'\n * });\n *\n * if (enhanced.isNetwork) {\n * showRetryButton();\n * }\n *\n * if (enhanced.isRetryable) {\n * await retryRequest();\n * }\n * ```\n */\nexport function enhanceError(error: AppError): AppError & {\n isValidation: boolean;\n isNetwork: boolean;\n isAuth: boolean;\n isRetryable: boolean;\n} {\n return {\n ...error,\n get isValidation() {\n return error.code === ErrorCode.VALIDATION;\n },\n get isNetwork() {\n return error.code === ErrorCode.NETWORK;\n },\n get isAuth() {\n return error.code === ErrorCode.UNAUTHORIZED || error.code === ErrorCode.FORBIDDEN;\n },\n get isRetryable() {\n return error.retryable ?? error.code === ErrorCode.NETWORK;\n },\n } as any;\n}\n","/**\n * @fileoverview 异步状态管理 Hook\n * @module core/hooks/useAsyncState\n * @description 提供用于异步操作状态管理的 React Hook\n */\n\nimport { useState, useCallback } from 'react';\nimport type { AppError } from '@/core/error/types';\nimport { enhanceError } from '@/core/error/helpers';\n\n/**\n * useAsyncState Hook 返回的状态接口\n * @template T - 数据的类型\n * @example\n * ```typescript\n * const { data, error, loading, execute, reset } = useAsyncState<User>();\n * ```\n */\nexport interface UseAsyncState<T> {\n /** 异步操作返回的数据 */\n data: T | null;\n /** 错误对象(如果发生错误) */\n error:\n | (AppError & {\n isValidation: boolean;\n isNetwork: boolean;\n isAuth: boolean;\n isRetryable: boolean;\n })\n | null;\n /** 是否正在加载 */\n loading: boolean;\n}\n\n/**\n * 管理异步操作状态的 React Hook\n * @template T - 异步操作返回数据的类型,默认为 any\n * @returns 包含数据、错误、加载状态和操作方法的对象\n * @example\n * ```typescript\n * function UserProfile({ userId }: { userId: number }) {\n * const { data: user, error, loading, execute } = useAsyncState<User>();\n *\n * useEffect(() => {\n * execute(fetchUser(userId));\n * }, [userId, execute]);\n *\n * if (loading) return <Loading />;\n * if (error?.isAuth) return <RedirectToLogin />;\n * if (error) return <ErrorMessage error={error} />;\n *\n * return <UserCard user={user} />;\n * }\n * ```\n */\nexport function useAsyncState<T = any>() {\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<UseAsyncState<T>['error']>(null);\n const [loading, setLoading] = useState(false);\n\n /**\n * 执行异步操作\n * @param promise - 要执行的 Promise\n * @returns Promise 的解析结果\n * @throws 增强后的错误对象\n */\n const execute = useCallback(async (promise: Promise<T>) => {\n setLoading(true);\n setError(null);\n try {\n const result = await promise;\n setData(result);\n return result;\n } catch (err: any) {\n const appError: AppError = {\n code: err.code || 'UNKNOWN',\n message: err.message || 'Unknown error',\n ...err,\n };\n const enhanced = enhanceError(appError);\n setError(enhanced);\n throw enhanced;\n } finally {\n setLoading(false);\n }\n }, []);\n\n /**\n * 重置所有状态到初始值\n */\n const reset = useCallback(() => {\n setData(null);\n setError(null);\n setLoading(false);\n }, []);\n\n return { data, error, loading, execute, reset };\n}\n","/**\n * @fileoverview API 创建模块\n * @module core/api/create-api\n * @description 提供类型安全的 API 客户端创建功能,支持请求/响应数据的 Zod 校验\n */\n\nimport type { ApiConfig, ApiEndpointConfig, ApiErrorContext } from './types';\nimport { ZodError } from 'zod';\nimport { ErrorCode, enhanceError, mapHttpStatus, type AppError } from '../error';\n\n/**\n * 将 Zod 校验错误转换为应用错误对象\n * @param error - Zod 校验错误实例\n * @returns 标准化的应用错误对象,包含错误码、消息和相关字段信息\n * @internal\n */\nfunction parseZodError(error: ZodError): AppError {\n const first = error.errors[0];\n return {\n code: ErrorCode.VALIDATION,\n message: first?.message || 'Validation failed',\n field: first?.path.join('.'),\n };\n}\n\nfunction isAppError(error: unknown): error is AppError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as { code?: unknown }).code === 'string' &&\n 'message' in error &&\n typeof (error as { message?: unknown }).message === 'string'\n );\n}\n\nfunction parseNetworkError(error: unknown): AppError {\n return {\n code: ErrorCode.NETWORK,\n message: error instanceof Error ? error.message : 'Network request failed',\n retryable: true,\n original: error,\n };\n}\n\nfunction parseHttpError(response: Response, data?: unknown): AppError {\n const fallbackMessage = response.statusText || `Request failed with status ${response.status}`;\n const message =\n typeof data === 'object' &&\n data !== null &&\n 'message' in data &&\n typeof data.message === 'string'\n ? data.message\n : fallbackMessage;\n\n return {\n code: mapHttpStatus(response.status),\n message,\n statusCode: response.status,\n retryable: response.status >= 500,\n original: data,\n };\n}\n\nfunction parseUnknownError(error: unknown): AppError {\n if (error instanceof ZodError) {\n return parseZodError(error);\n }\n\n if (isAppError(error)) {\n return error;\n }\n\n return {\n code: ErrorCode.UNKNOWN,\n message: error instanceof Error ? error.message : 'Unknown error',\n original: error,\n };\n}\n\nasync function notifyError(\n error: AppError,\n context: ApiErrorContext,\n endpoint: ApiEndpointConfig<any, any>,\n config: ApiConfig<Record<string, ApiEndpointConfig<any, any>>>\n) {\n const enhanced = enhanceError(error);\n\n await endpoint.onError?.(enhanced, context);\n await config.onError?.(enhanced, context);\n\n return enhanced;\n}\n\n/**\n * 创建类型安全的 API 客户端\n * @template TEndpoints - 端点配置映射类型\n * @param config - API 配置对象,包含基础 URL 和端点定义\n * @returns 代理对象,其方法对应配置的各个 API 端点\n * @example\n * ```typescript\n * const api = createAPI({\n * baseURL: 'https://api.example.com',\n * endpoints: {\n * getUser: {\n * method: 'GET',\n * path: '/users/:id',\n * output: z.object({ id: z.number(), name: z.string() })\n * },\n * createUser: {\n * method: 'POST',\n * path: '/users',\n * input: z.object({ name: z.string(), email: z.string().email() }),\n * output: z.object({ id: z.number(), name: z.string(), email: z.string() })\n * }\n * }\n * });\n *\n * // 调用会自动进行类型检查和数据校验\n * const user = await api.getUser({ id: 1 });\n * const newUser = await api.createUser({ name: 'John', email: 'john@example.com' });\n * ```\n */\nexport function createAPI<TEndpoints extends Record<string, ApiEndpointConfig<any, any>>>(\n config: ApiConfig<TEndpoints>\n): { [K in keyof TEndpoints]: (input?: any) => Promise<any> } {\n const endpoints = {} as any;\n const fetcher = config.fetcher ?? fetch;\n\n for (const [name, ep] of Object.entries(config.endpoints)) {\n endpoints[name] = async (input?: any) => {\n const context: ApiErrorContext = {\n endpointName: name,\n path: ep.path,\n method: ep.method,\n input,\n };\n\n if (ep.input) {\n const result = ep.input.safeParse(input);\n if (!result.success) {\n throw await notifyError(parseZodError(result.error), context, ep, config as any);\n }\n }\n\n const url = config.baseURL + ep.path;\n\n let response: Response;\n try {\n response = await fetcher(url, { method: ep.method });\n } catch (error) {\n throw await notifyError(parseNetworkError(error), context, ep, config as any);\n }\n\n context.response = response;\n\n let data: unknown = undefined;\n const contentType = response.headers.get('content-type') || '';\n const canParseJson = contentType.includes('application/json');\n\n if (canParseJson) {\n try {\n data = await response.json();\n } catch {\n data = undefined;\n }\n }\n\n context.responseData = data;\n\n if (!response.ok) {\n throw await notifyError(parseHttpError(response, data), context, ep, config as any);\n }\n\n const businessError =\n ep.parseBusinessError?.(data, response) ?? config.parseBusinessError?.(data, response);\n\n if (businessError) {\n throw await notifyError(businessError, context, ep, config as any);\n }\n\n try {\n if (ep.output) {\n return ep.output.parse(data);\n }\n } catch (error) {\n throw await notifyError(parseUnknownError(error), context, ep, config as any);\n }\n\n return data;\n };\n }\n\n return endpoints;\n}\n","/**\n * @fileoverview 内存存储实现模块\n * @module core/storage/memory-storage\n * @description 提供基于内存的键值存储实现,适用于测试环境或不需要持久化的场景\n */\n\n/**\n * 内存存储类\n * @description 使用 Map 实现的异步键值存储,数据仅在内存中保存,应用重启后丢失\n * @example\n * ```typescript\n * const storage = new MemoryStorage();\n *\n * // 存储数据\n * await storage.setItem('user', JSON.stringify({ id: 1, name: 'John' }));\n *\n * // 读取数据\n * const userData = await storage.getItem('user');\n * console.log(userData); // '{\"id\":1,\"name\":\"John\"}'\n *\n * // 删除数据\n * await storage.removeItem('user');\n *\n * // 检查数据是否存在\n * const exists = await storage.getItem('user'); // null\n * ```\n */\nexport class MemoryStorage {\n /** 内部存储的 Map 实例 */\n private memory = new Map<string, string>();\n\n /**\n * 存储键值对\n * @param key - 存储键名\n * @param value - 要存储的字符串值\n * @returns 解析为 void 的 Promise\n */\n async setItem(key: string, value: string): Promise<void> {\n this.memory.set(key, value);\n }\n\n /**\n * 根据键名获取值\n * @param key - 存储键名\n * @returns 存储的字符串值,如果不存在则返回 null\n */\n async getItem(key: string): Promise<string | null> {\n return this.memory.get(key) ?? null;\n }\n\n /**\n * 删除指定键名的存储项\n * @param key - 要删除的键名\n * @returns 解析为 void 的 Promise\n */\n async removeItem(key: string): Promise<void> {\n this.memory.delete(key);\n }\n}\n\n/**\n * 默认的内存存储实例\n * @description 全局共享的内存存储单例,可用于跨模块的简单数据共享\n * @example\n * ```typescript\n * import { storage } from './memory-storage';\n *\n * // 模块 A\n * await storage.setItem('session', 'abc123');\n *\n * // 模块 B\n * const session = await storage.getItem('session');\n * console.log(session); // 'abc123'\n * ```\n */\nexport const storage = new MemoryStorage();\n","import { useState, useCallback, useRef, useEffect } from 'react';\n\ninterface UseRequestOptions<T, P extends any[]> {\n manual?: boolean;\n deps?: any[];\n defaultParams?: P;\n onSuccess?: (data: T, params: P) => void;\n onError?: (error: Error, params: P) => void;\n onFinally?: (params: P) => void;\n retryCount?: number;\n retryDelay?: number;\n}\n\nexport function useRequest<T, P extends any[] = any[]>(\n service: (...params: P) => Promise<T>,\n options: UseRequestOptions<T, P> = {}\n) {\n const {\n manual = false,\n deps = [],\n defaultParams,\n onSuccess,\n onError,\n onFinally,\n retryCount = 0,\n retryDelay = 1000,\n } = options;\n\n const [data, setData] = useState<T | undefined>(undefined);\n const [loading, setLoading] = useState(!manual);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n const serviceRef = useRef(service);\n const paramsRef = useRef<P | undefined>(defaultParams as P);\n const retryCountRef = useRef(0);\n const canceledRef = useRef(false);\n\n serviceRef.current = service;\n\n const run = useCallback(\n async (...params: P) => {\n paramsRef.current = params;\n\n setLoading(true);\n setError(undefined);\n\n try {\n const result = await serviceRef.current(...params);\n\n if (!canceledRef.current) {\n setData(result);\n retryCountRef.current = 0;\n onSuccess?.(result, params);\n }\n\n return result;\n } catch (err) {\n if (!canceledRef.current) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error, params);\n\n if (retryCountRef.current < retryCount) {\n retryCountRef.current++;\n setTimeout(() => {\n if (!canceledRef.current) {\n run(...params);\n }\n }, retryDelay * retryCountRef.current);\n }\n }\n\n throw err;\n } finally {\n if (!canceledRef.current) {\n setLoading(false);\n onFinally?.(params);\n }\n }\n },\n [onSuccess, onError, onFinally, retryCount, retryDelay]\n );\n\n const refresh = useCallback(() => {\n if (paramsRef.current) {\n return run(...paramsRef.current);\n }\n throw new Error('No params to refresh');\n }, [run]);\n\n const cancel = useCallback(() => {\n canceledRef.current = true;\n }, []);\n\n const mutate = useCallback((newData: T | ((prev: T | undefined) => T)) => {\n setData(prev => {\n if (typeof newData === 'function') {\n return (newData as Function)(prev);\n }\n return newData;\n });\n }, []);\n\n useEffect(() => {\n if (!manual) {\n run(...(defaultParams || ([] as unknown as P)));\n }\n\n return () => {\n canceledRef.current = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n\n return {\n data,\n loading,\n error,\n run,\n refresh,\n cancel,\n mutate,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\n\n/**\n * 分页参数\n */\nexport interface PaginationParams {\n /** 当前页码 */\n current: number;\n /** 每页数量 */\n pageSize: number;\n /** 其他自定义参数 */\n [key: string]: any;\n}\n\n/**\n * 分页结果\n * 支持 data 或 list 作为数据字段\n */\nexport interface PaginationResult<T> {\n /** 数据列表(推荐) */\n data?: T[];\n /** 数据列表(兼容旧版本) */\n list?: T[];\n /** 总数据条数 */\n total: number;\n}\n\n/**\n * 分页选项\n */\nexport interface UsePaginationOptions {\n /** 默认当前页码 */\n defaultCurrent?: number;\n /** 默认每页数量 */\n defaultPageSize?: number;\n /** 依赖数组 */\n deps?: any[];\n}\n\n/**\n * 分页返回值\n */\nexport interface UsePaginationReturn<T> {\n /** 数据列表 */\n data: T[];\n /** 当前页码 */\n current: number;\n /** 每页数量 */\n pageSize: number;\n /** 总数据条数 */\n total: number;\n /** 是否还有更多数据 */\n hasMore: boolean;\n /** 是否加载中 */\n loading: boolean;\n /** 是否刷新中 */\n refreshing: boolean;\n /** 是否加载更多中 */\n loadingMore: boolean;\n /** 错误信息 */\n error: Error | null;\n /** 刷新数据 */\n refresh: () => Promise<void>;\n /** 加载更多数据 */\n loadMore: () => Promise<void>;\n /** 切换页码 */\n changePage: (page: number) => Promise<void>;\n}\n\n/**\n * 分页逻辑 Hook\n * @param service - 分页数据请求函数\n * @param options - 配置选项\n * @returns 分页状态和控制方法\n *\n * @example\n * ```tsx\n * const {\n * data,\n * current,\n * total,\n * hasMore,\n * loading,\n * refreshing,\n * loadingMore,\n * refresh,\n * loadMore,\n * } = usePagination(\n * async ({ current, pageSize, keyword }) => {\n * const res = await api.getList({ page: current, size: pageSize, keyword });\n * return { data: res.items, total: res.total };\n * },\n * { defaultPageSize: 20 }\n * );\n * ```\n */\nexport function usePagination<T>(\n service: (params: PaginationParams) => Promise<PaginationResult<T>>,\n options: UsePaginationOptions = {}\n): UsePaginationReturn<T> {\n const { defaultCurrent = 1, defaultPageSize = 10 } = options;\n\n const [data, setData] = useState<T[]>([]);\n const [current, setCurrent] = useState(defaultCurrent);\n const [pageSize] = useState(defaultPageSize);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(false);\n const [refreshing, setRefreshing] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const serviceRef = useRef(service);\n serviceRef.current = service;\n\n const hasMore = data.length < total;\n\n const fetch = useCallback(async (params: PaginationParams, isRefresh = false) => {\n try {\n const result = await serviceRef.current(params);\n\n // 支持 data 或 list 字段\n const items = result.data ?? result.list ?? [];\n\n if (isRefresh) {\n setData(items);\n } else {\n setData(prev => [...prev, ...items]);\n }\n setTotal(result.total);\n setError(null);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw err;\n }\n }, []);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n try {\n await fetch({ current: 1, pageSize }, true);\n setCurrent(1);\n } finally {\n setRefreshing(false);\n }\n }, [fetch, pageSize]);\n\n const loadMore = useCallback(async () => {\n if (loadingMore || !hasMore) return;\n\n setLoadingMore(true);\n try {\n const nextPage = current + 1;\n await fetch({ current: nextPage, pageSize }, false);\n setCurrent(nextPage);\n } finally {\n setLoadingMore(false);\n }\n }, [fetch, current, pageSize, loadingMore, hasMore]);\n\n const changePage = useCallback(\n async (page: number) => {\n setLoading(true);\n try {\n await fetch({ current: page, pageSize }, true);\n setCurrent(page);\n } finally {\n setLoading(false);\n }\n },\n [fetch, pageSize]\n );\n\n return {\n data,\n current,\n pageSize,\n total,\n hasMore,\n loading,\n refreshing,\n loadingMore,\n error,\n refresh,\n loadMore,\n changePage,\n };\n}\n","import { useRef, useEffect } from 'react';\n\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n","import { useState, useCallback } from 'react';\n\nexport function useSetState<T extends Record<string, any>>(\n initialState: T\n): [T, (patch: Partial<T> | ((prev: T) => Partial<T>)) => void, () => void] {\n const [state, setState] = useState<T>(initialState);\n\n const setMergeState = useCallback((patch: Partial<T> | ((prev: T) => Partial<T>)) => {\n setState(prev => ({\n ...prev,\n ...(typeof patch === 'function' ? patch(prev) : patch),\n }));\n }, []);\n\n const resetState = useCallback(() => {\n setState(initialState);\n }, [initialState]);\n\n return [state, setMergeState, resetState];\n}\n","import { useRef, useCallback } from 'react';\n\nexport function useMemoizedFn<T extends (...args: any[]) => any>(fn: T): T {\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n const memoizedFn = useCallback(\n ((...args: any[]) => {\n return fnRef.current(...args);\n }) as T,\n []\n );\n\n return memoizedFn;\n}\n","import { useEffect, useRef } from 'react';\n\nexport function useUpdateEffect(effect: React.EffectCallback, deps?: React.DependencyList) {\n const isFirstRender = useRef(true);\n\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n return effect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { storage } from '../storage';\n\n/**\n * 本地存储同步 Hook\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [值, 设置值, 删除值]\n *\n * @example\n * ```tsx\n * const [darkMode, setDarkMode] = useStorage('settings.darkMode', false);\n *\n * <Switch value={darkMode} onValueChange={setDarkMode} />\n * ```\n */\nexport function useStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n const [value, setValue] = useState<T>(defaultValue);\n const [, setIsLoaded] = useState(false);\n\n // 初始加载\n useEffect(() => {\n const loadValue = async () => {\n try {\n const stored = await storage.getItem(key);\n if (stored !== null) {\n setValue(JSON.parse(stored));\n }\n } catch (error) {\n console.warn(`Failed to load storage key \"${key}\":`, error);\n } finally {\n setIsLoaded(true);\n }\n };\n\n loadValue();\n }, [key]);\n\n // 设置值\n const setStoredValue = useCallback(\n async (newValue: T | ((prev: T) => T)) => {\n try {\n const valueToStore = newValue instanceof Function ? newValue(value) : newValue;\n setValue(valueToStore);\n await storage.setItem(key, JSON.stringify(valueToStore));\n } catch (error) {\n console.warn(`Failed to save storage key \"${key}\":`, error);\n }\n },\n [key, value]\n );\n\n // 删除值\n const removeValue = useCallback(async () => {\n try {\n setValue(defaultValue);\n await storage.removeItem(key);\n } catch (error) {\n console.warn(`Failed to remove storage key \"${key}\":`, error);\n }\n }, [key, defaultValue]);\n\n return [value, setStoredValue, removeValue];\n}\n","import { useState, useCallback } from 'react';\n\nexport interface UseRefreshReturn<T> {\n /** 数据 */\n data: T | undefined;\n /** 是否刷新中 */\n refreshing: boolean;\n /** 错误信息 */\n error: Error | undefined;\n /** 触发刷新 */\n refresh: () => Promise<void>;\n}\n\n/**\n * 下拉刷新逻辑 Hook\n * @param fetcher - 数据获取函数\n * @returns 刷新状态和触发方法\n *\n * @example\n * ```tsx\n * const { data, refreshing, refresh } = useRefresh(() => fetchUserList());\n *\n * <FlatList\n * refreshing={refreshing}\n * onRefresh={refresh}\n * data={data}\n * />\n * ```\n */\nexport function useRefresh<T>(fetcher: () => Promise<T>): UseRefreshReturn<T> {\n const [data, setData] = useState<T | undefined>(undefined);\n const [refreshing, setRefreshing] = useState(false);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n setError(undefined);\n\n try {\n const result = await fetcher();\n setData(result);\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n } finally {\n setRefreshing(false);\n }\n }, [fetcher]);\n\n return {\n data,\n refreshing,\n error,\n refresh,\n };\n}\n","import { useState, useCallback } from 'react';\n\nexport interface UseInfiniteOptions {\n /** 默认页码 */\n defaultPage?: number;\n /** 每页数量 */\n pageSize?: number;\n /** 是否自动加载 */\n autoLoad?: boolean;\n}\n\nexport interface UseInfiniteReturn<T> {\n /** 累积的数据列表 */\n data: T[];\n /** 当前页码 */\n page: number;\n /** 是否初始加载中 */\n loading: boolean;\n /** 是否加载更多中 */\n loadingMore: boolean;\n /** 是否还有更多数据 */\n hasMore: boolean;\n /** 错误信息 */\n error: Error | undefined;\n /** 加载数据 */\n load: () => Promise<void>;\n /** 加载更多 */\n loadMore: () => Promise<void>;\n /** 刷新(重置到第一页) */\n refresh: () => Promise<void>;\n /** 重置 */\n reset: () => void;\n}\n\n/**\n * 无限滚动获取参数\n * 支持扩展自定义参数\n */\nexport interface InfiniteFetchParams {\n /** 当前页码 */\n page: number;\n /** 每页数量 */\n pageSize: number;\n /** 其他自定义参数 */\n [key: string]: any;\n}\n\n/**\n * 无限滚动获取结果\n * 支持 data 或 list 作为数据字段\n */\nexport interface InfiniteFetchResult<T> {\n /** 数据列表(推荐) */\n data?: T[];\n /** 数据列表(兼容旧版本) */\n list?: T[];\n /** 是否还有更多数据 */\n hasMore: boolean;\n}\n\n/**\n * 无限滚动逻辑 Hook\n * @param fetcher - 数据获取函数,接收 { page, pageSize, ...其他参数 } 参数\n * @param options - 配置选项\n * @returns 无限滚动状态和控制方法\n *\n * @example\n * ```tsx\n * const { data, loading, loadingMore, hasMore, loadMore, refresh } = useInfinite(\n * async ({ page, pageSize, keyword }) => {\n * const res = await api.getList({ page, size: pageSize, keyword });\n * return { data: res.items, hasMore: res.hasMore };\n * },\n * { pageSize: 20 }\n * );\n *\n * <FlatList\n * data={data}\n * onEndReached={hasMore && !loadingMore ? loadMore : null}\n * refreshing={loading}\n * onRefresh={refresh}\n * />\n * ```\n */\nexport function useInfinite<T>(\n fetcher: (params: InfiniteFetchParams) => Promise<InfiniteFetchResult<T>>,\n options: UseInfiniteOptions = {}\n): UseInfiniteReturn<T> {\n const { defaultPage = 1, pageSize = 10 } = options;\n\n const [data, setData] = useState<T[]>([]);\n const [page, setPage] = useState(defaultPage);\n const [loading, setLoading] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n const [hasMore, setHasMore] = useState(true);\n const [error, setError] = useState<Error | undefined>(undefined);\n\n const fetchData = useCallback(\n async (targetPage: number, isLoadMore: boolean) => {\n if (isLoadMore) {\n setLoadingMore(true);\n } else {\n setLoading(true);\n }\n setError(undefined);\n\n try {\n const result = await fetcher({ page: targetPage, pageSize });\n\n // 支持 data 或 list 字段\n const items = result.data ?? result.list ?? [];\n\n if (isLoadMore) {\n setData(prev => [...prev, ...items]);\n } else {\n setData(items);\n }\n\n setHasMore(result.hasMore);\n setPage(targetPage);\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n } finally {\n setLoading(false);\n setLoadingMore(false);\n }\n },\n [fetcher, pageSize]\n );\n\n const load = useCallback(async () => {\n await fetchData(defaultPage, false);\n }, [fetchData, defaultPage]);\n\n const loadMore = useCallback(async () => {\n if (loadingMore || !hasMore) return;\n await fetchData(page + 1, true);\n }, [fetchData, page, loadingMore, hasMore]);\n\n const refresh = useCallback(async () => {\n await fetchData(defaultPage, false);\n }, [fetchData, defaultPage]);\n\n const reset = useCallback(() => {\n setData([]);\n setPage(defaultPage);\n setLoading(false);\n setLoadingMore(false);\n setHasMore(true);\n setError(undefined);\n }, [defaultPage]);\n\n return {\n data,\n page,\n loading,\n loadingMore,\n hasMore,\n error,\n load,\n loadMore,\n refresh,\n reset,\n };\n}\n","import { View, ViewProps } from 'react-native';\nimport { useOptionalTheme } from '@/theme';\nimport { cn } from '@/utils';\nimport { resolveNamedColor, resolveSurfaceColor } from '../utils/theme-color';\n\n/**\n * AppView 组件属性接口\n */\nexport interface AppViewProps extends ViewProps {\n /** 是否使用 flex 布局,设为 true 使用 flex-1,设为数字使用 flex-${number} */\n flex?: boolean | number;\n /** 是否使用水平排列(flex-direction: row) */\n row?: boolean;\n /** 是否居中显示(items-center justify-center) */\n center?: boolean;\n /** 是否两端对齐(justify-between) */\n between?: boolean;\n /** 交叉轴对齐方式(align-items) */\n items?: 'start' | 'center' | 'end' | 'stretch';\n /** 主轴对齐方式(justify-content) */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around';\n /** 内边距 */\n p?: number;\n /** 水平内边距 */\n px?: number;\n /** 垂直内边距 */\n py?: number;\n /** 子元素间距 */\n gap?: number;\n /** 背景颜色 */\n bg?: string;\n /** 语义化背景 */\n surface?: 'background' | 'card' | 'muted';\n /** 圆角大小 */\n rounded?: string;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * AppView - 基础视图容器组件\n *\n * 基于 React Native 的 View 组件封装,提供便捷的 Flexbox 布局属性\n * 和 Tailwind CSS 类名支持,简化日常布局开发\n *\n * @example\n * ```tsx\n * // 基础使用\n * <AppView>\n * <Text>内容</Text>\n * </AppView>\n *\n * // Flex 布局\n * <AppView flex row>\n * <Text>左侧</Text>\n * <Text>右侧</Text>\n * </AppView>\n *\n * // 居中对齐\n * <AppView center className=\"h-full\">\n * <Text>居中内容</Text>\n * </AppView>\n *\n * // 带间距和背景\n * <AppView p={4} gap={2} bg=\"gray-100\" rounded=\"lg\">\n * <Text>带样式的容器</Text>\n * </AppView>\n * ```\n */\nexport function AppView({\n flex,\n row,\n center,\n between,\n items,\n justify,\n p,\n px,\n py,\n gap,\n bg,\n surface,\n rounded,\n className,\n children,\n style,\n ...props\n}: AppViewProps) {\n const { theme, isDark } = useOptionalTheme();\n const resolvedBgColor = resolveSurfaceColor(surface, theme, isDark) ?? resolveNamedColor(bg, theme, isDark);\n const shouldUseClassBg = !!bg && !resolvedBgColor;\n\n return (\n <View\n className={cn(\n flex === true && 'flex-1',\n typeof flex === 'number' && `flex-${flex}`,\n row ? 'flex-row' : 'flex-col',\n center && 'items-center justify-center',\n between && 'justify-between',\n items && `items-${items}`,\n justify && `justify-${justify}`,\n p !== undefined && `p-${p}`,\n px !== undefined && `px-${px}`,\n py !== undefined && `py-${py}`,\n gap !== undefined && `gap-${gap}`,\n shouldUseClassBg && `bg-${bg}`,\n rounded && `rounded-${rounded}`,\n className\n )}\n style={[resolvedBgColor ? { backgroundColor: resolvedBgColor } : undefined, style]}\n {...props}\n >\n {children}\n </View>\n );\n}\n","import type { Theme } from '@/theme';\n\nconst grayPalette = {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n} as const;\n\nconst staticPalettes: Record<string, Record<string, string>> = {\n gray: grayPalette,\n white: { 500: '#ffffff' },\n black: { 500: '#000000' },\n};\n\nfunction resolvePaletteColor(name: string, shade: string, theme: Theme) {\n const palette = theme.colors[name] ?? staticPalettes[name];\n if (!palette) return undefined;\n\n return palette[shade] ?? palette[500] ?? palette['500'];\n}\n\nexport function resolveNamedColor(color: string | undefined, theme: Theme, isDark: boolean) {\n if (!color) return undefined;\n\n switch (color) {\n case 'text':\n case 'foreground':\n case 'default':\n return theme.colors.text?.[500] ?? (isDark ? '#ffffff' : '#1f2937');\n case 'muted':\n case 'text-muted':\n case 'secondary-text':\n return isDark ? '#9ca3af' : '#6b7280';\n case 'inverse':\n case 'on-primary':\n return '#ffffff';\n case 'background':\n case 'screen':\n case 'page':\n return theme.colors.background?.[500] ?? (isDark ? '#0a0a0a' : '#ffffff');\n case 'card':\n case 'surface':\n return theme.colors.card?.[500] ?? (isDark ? '#1f2937' : '#ffffff');\n case 'border':\n return theme.colors.border?.[500] ?? (isDark ? '#404040' : '#e5e5e5');\n case 'danger':\n return theme.colors.error?.[500] ?? '#ef4444';\n case 'success':\n case 'warning':\n case 'error':\n case 'info':\n case 'primary':\n case 'secondary':\n return theme.colors[color]?.[500];\n case 'transparent':\n return 'transparent';\n }\n\n if (color.startsWith('#') || color.startsWith('rgb(') || color.startsWith('rgba(')) {\n return color;\n }\n\n if (theme.colors[color]?.[500]) {\n return theme.colors[color][500];\n }\n\n if (color.includes('-')) {\n const [name, shade] = color.split('-');\n if (name === 'danger') {\n return theme.colors.error?.[shade] ?? theme.colors.error?.[500] ?? '#ef4444';\n }\n\n return resolvePaletteColor(name, shade, theme);\n }\n\n return undefined;\n}\n\nexport function resolveSurfaceColor(\n surface: 'background' | 'card' | 'muted' | undefined,\n theme: Theme,\n isDark: boolean\n) {\n switch (surface) {\n case 'background':\n return theme.colors.background?.[500] ?? (isDark ? '#0a0a0a' : '#ffffff');\n case 'card':\n return theme.colors.card?.[500] ?? (isDark ? '#1f2937' : '#ffffff');\n case 'muted':\n return isDark ? '#111827' : '#f3f4f6';\n default:\n return undefined;\n }\n}\n\nexport function resolveTextTone(\n tone:\n | 'default'\n | 'muted'\n | 'inverse'\n | 'primary'\n | 'secondary'\n | 'success'\n | 'warning'\n | 'error'\n | undefined,\n theme: Theme,\n isDark: boolean\n) {\n switch (tone) {\n case 'default':\n return theme.colors.text?.[500] ?? (isDark ? '#ffffff' : '#1f2937');\n case 'muted':\n return isDark ? '#9ca3af' : '#6b7280';\n case 'inverse':\n return '#ffffff';\n case 'primary':\n case 'secondary':\n case 'success':\n case 'warning':\n case 'error':\n return resolveNamedColor(tone, theme, isDark);\n default:\n return undefined;\n }\n}\n","import { ScrollView, type ScrollViewProps } from 'react-native';\nimport { useOptionalTheme } from '@/theme';\nimport { cn } from '@/utils';\nimport { resolveNamedColor, resolveSurfaceColor } from '../utils/theme-color';\n\nexport interface AppScrollViewProps extends ScrollViewProps {\n /** 是否使用 flex 布局 */\n flex?: boolean;\n /** 背景颜色 */\n bg?: string;\n /** 语义化背景 */\n surface?: 'background' | 'card' | 'muted';\n /** 内边距 */\n p?: number;\n /** 水平内边距 */\n px?: number;\n /** 垂直内边距 */\n py?: number;\n /** 子元素间距 */\n gap?: number;\n /** 圆角大小 */\n rounded?: string;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * AppScrollView - 带 Tailwind/快捷布局能力的滚动容器\n */\nexport function AppScrollView({\n flex,\n bg,\n p,\n px,\n py,\n gap,\n surface,\n rounded,\n className,\n children,\n style,\n ...props\n}: AppScrollViewProps) {\n const { theme, isDark } = useOptionalTheme();\n const resolvedBgColor = resolveSurfaceColor(surface, theme, isDark) ?? resolveNamedColor(bg, theme, isDark);\n const shouldUseClassBg = !!bg && !resolvedBgColor;\n\n return (\n <ScrollView\n className={cn(\n flex && 'flex-1',\n shouldUseClassBg && `bg-${bg}`,\n p !== undefined && `p-${p}`,\n px !== undefined && `px-${px}`,\n py !== undefined && `py-${py}`,\n gap !== undefined && `gap-${gap}`,\n rounded && `rounded-${rounded}`,\n className\n )}\n style={[resolvedBgColor ? { backgroundColor: resolvedBgColor } : undefined, style]}\n {...props}\n >\n {children}\n </ScrollView>\n );\n}\n","import { Text, TextProps } from 'react-native';\nimport { useOptionalTheme } from '@/theme';\nimport { cn } from '@/utils';\nimport { resolveNamedColor, resolveTextTone } from '../utils/theme-color';\n\n/**\n * AppText 组件属性接口\n */\nexport interface AppTextProps extends TextProps {\n /** 字体大小:xs(12px)、sm(14px)、md(16px)、lg(18px)、xl(20px)、2xl(24px)、3xl(30px) */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';\n /** 字重:normal(400)、medium(500)、semibold(600)、bold(700) */\n weight?: 'normal' | 'medium' | 'semibold' | 'bold';\n /** 文字颜色,支持 Tailwind 颜色类名 */\n color?: string;\n /** 语义化文字色 */\n tone?: 'default' | 'muted' | 'inverse' | 'primary' | 'secondary' | 'success' | 'warning' | 'error';\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * AppText - 基础文本组件\n *\n * 基于 React Native 的 Text 组件封装,提供预设的字体大小、字重和颜色选项\n * 支持 Tailwind CSS 类名,简化文本样式定义\n *\n * @example\n * ```tsx\n * // 基础使用\n * <AppText>默认文本</AppText>\n *\n * // 不同大小\n * <AppText size=\"xs\">超小文本</AppText>\n * <AppText size=\"lg\">大文本</AppText>\n * <AppText size=\"2xl\">超大文本</AppText>\n *\n * // 不同字重\n * <AppText weight=\"bold\">粗体文本</AppText>\n * <AppText weight=\"semibold\">半粗文本</AppText>\n *\n * // 自定义颜色\n * <AppText color=\"primary-500\">主题色文本</AppText>\n * <AppText color=\"red-500\">红色文本</AppText>\n *\n * // 组合使用\n * <AppText size=\"xl\" weight=\"bold\" color=\"gray-800\">\n * 标题文本\n * </AppText>\n * ```\n */\nexport function AppText({\n size = 'md',\n weight = 'normal',\n color,\n tone,\n className,\n children,\n style,\n ...props\n}: AppTextProps) {\n const { theme, isDark } = useOptionalTheme();\n const sizeMap: Record<string, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n };\n const weightMap: Record<string, string> = {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n };\n const resolvedColor = resolveTextTone(tone, theme, isDark) ?? resolveNamedColor(color, theme, isDark);\n const shouldUseClassColor = !!color && !resolvedColor;\n\n return (\n <Text\n className={cn(sizeMap[size], weightMap[weight], shouldUseClassColor && `text-${color}`, className)}\n style={[resolvedColor ? { color: resolvedColor } : undefined, style]}\n {...props}\n >\n {children}\n </Text>\n );\n}\n","import * as React from 'react';\nimport { Pressable, PressableProps } from 'react-native';\nimport { cn } from '@/utils';\n\n/**\n * AppPressable 组件属性接口\n */\nexport interface AppPressableProps extends PressableProps {\n /** 自定义类名 */\n className?: string;\n /** 按下状态时的类名 */\n pressedClassName?: string;\n}\n\n/**\n * AppPressable - 可按压组件\n *\n * 基于 React Native 的 Pressable 组件封装,支持按下状态样式切换\n * 自动管理按下状态,支持自定义普通状态和按下状态的样式\n *\n * @example\n * ```tsx\n * // 基础使用\n * <AppPressable onPress={() => console.log('pressed')}>\n * <Text>点击我</Text>\n * </AppPressable>\n *\n * // 带按下效果\n * <AppPressable\n * className=\"p-4 bg-blue-500\"\n * pressedClassName=\"bg-blue-600\"\n * onPress={handlePress}\n * >\n * <Text className=\"text-white\">按钮</Text>\n * </AppPressable>\n *\n * // 带透明度变化\n * <AppPressable\n * className=\"p-3 rounded-lg\"\n * pressedClassName=\"opacity-70\"\n * onPress={handlePress}\n * >\n * <Icon name=\"arrow-forward\" />\n * </AppPressable>\n * ```\n */\nexport function AppPressable({\n className,\n pressedClassName,\n children,\n ...props\n}: AppPressableProps) {\n const [isPressed, setIsPressed] = React.useState(false);\n\n return (\n <Pressable\n className={cn(className, isPressed && pressedClassName)}\n onPressIn={e => {\n setIsPressed(true);\n props.onPressIn?.(e);\n }}\n onPressOut={e => {\n setIsPressed(false);\n props.onPressOut?.(e);\n }}\n {...props}\n >\n {children}\n </Pressable>\n );\n}\n","import { AppView, type AppViewProps } from '@/ui/primitives';\nimport { cn } from '@/utils';\n\n/**\n * Row 组件属性接口\n */\nexport interface RowProps extends AppViewProps {\n /** 主轴对齐方式(justify-content) */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around';\n /** 交叉轴对齐方式(align-items) */\n items?: 'start' | 'center' | 'end' | 'stretch';\n}\n\n/** 主轴对齐映射表 */\nconst justifyMap: Record<string, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n};\n\n/** 交叉轴对齐映射表 */\nconst itemsMap: Record<string, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n};\n\n/**\n * Row - 水平布局组件\n *\n * 基于 AppView 封装的水平排列布局组件,默认使用 flex-row\n * 提供便捷的 justify 和 items 属性控制对齐方式\n *\n * @example\n * ```tsx\n * // 基础使用\n * <Row>\n * <Text>左侧</Text>\n * <Text>右侧</Text>\n * </Row>\n *\n * // 两端对齐\n * <Row justify=\"between\">\n * <Text>标题</Text>\n * <Icon name=\"arrow-forward\" />\n * </Row>\n *\n * // 居中对齐\n * <Row justify=\"center\" items=\"center\" gap={4}>\n * <Icon name=\"star\" />\n * <Text>评分</Text>\n * </Row>\n *\n * // 带间距\n * <Row gap={3}>\n * <Button>取消</Button>\n * <Button>确认</Button>\n * </Row>\n *\n * // 组合使用\n * <Row justify=\"between\" items=\"center\" className=\"p-4\">\n * <AppView row gap={2}>\n * <Avatar source={avatar} />\n * <AppView>\n * <AppText weight=\"bold\">用户名</AppText>\n * <AppText size=\"sm\" color=\"gray-500\">描述信息</AppText>\n * </AppView>\n * </AppView>\n * <Icon name=\"more-vert\" />\n * </Row>\n * ```\n */\nexport function Row({ justify = 'start', items = 'center', className, ...props }: RowProps) {\n return <AppView row className={cn(justifyMap[justify], itemsMap[items], className)} {...props} />;\n}\n","import { AppView, type AppViewProps } from '@/ui/primitives';\nimport { cn } from '@/utils';\n\n/**\n * Col 组件属性接口\n */\nexport interface ColProps extends AppViewProps {\n /** 主轴对齐方式(justify-content) */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around';\n /** 交叉轴对齐方式(align-items) */\n items?: 'start' | 'center' | 'end' | 'stretch';\n}\n\n/** 主轴对齐映射表 */\nconst justifyMap: Record<string, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n};\n\n/** 交叉轴对齐映射表 */\nconst itemsMap: Record<string, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n};\n\n/**\n * Col - 垂直布局组件\n *\n * 基于 AppView 封装的垂直排列布局组件,默认使用 flex-col\n * 提供便捷的 justify 和 items 属性控制对齐方式\n *\n * @example\n * ```tsx\n * // 基础使用\n * <Col>\n * <Text>第一行</Text>\n * <Text>第二行</Text>\n * </Col>\n *\n * // 两端对齐\n * <Col justify=\"between\" flex>\n * <Text>顶部内容</Text>\n * <Text>底部内容</Text>\n * </Col>\n *\n * // 水平居中\n * <Col items=\"center\" gap={3}>\n * <Icon name=\"check-circle\" size=\"xl\" color=\"success-500\" />\n * <AppText weight=\"bold\">操作成功</AppText>\n * <AppText color=\"gray-500\">您的订单已提交</AppText>\n * </Col>\n *\n * // 带间距\n * <Col gap={4}>\n * <Input placeholder=\"用户名\" />\n * <Input placeholder=\"密码\" secureTextEntry />\n * <Button>登录</Button>\n * </Col>\n *\n * // 组合使用\n * <Col className=\"p-4 bg-white rounded-lg\">\n * <AppText size=\"lg\" weight=\"bold\">订单详情</AppText>\n * <Row justify=\"between\" className=\"mt-2\">\n * <AppText color=\"gray-500\">订单号</AppText>\n * <AppText>12345678</AppText>\n * </Row>\n * <Row justify=\"between\" className=\"mt-2\">\n * <AppText color=\"gray-500\">金额</AppText>\n * <AppText color=\"danger-500\" weight=\"bold\">¥99.00</AppText>\n * </Row>\n * </Col>\n * ```\n */\nexport function Col({ justify = 'start', items = 'stretch', className, ...props }: ColProps) {\n return <AppView className={cn(justifyMap[justify], itemsMap[items], className)} {...props} />;\n}\n","import { AppView, type AppViewProps } from '@/ui/primitives';\n\n/**\n * Center 组件属性接口\n */\nexport interface CenterProps extends Omit<AppViewProps, 'center'> {\n /** 是否使用 flex 布局,默认为 true */\n flex?: boolean | number;\n}\n\n/**\n * Center - 居中布局组件\n *\n * 基于 AppView 封装的居中布局组件,内容在水平和垂直方向都居中\n * 常用于空状态、加载状态等需要居中对齐的场景\n *\n * @example\n * ```tsx\n * // 基础使用\n * <Center>\n * <Text>居中内容</Text>\n * </Center>\n *\n * // 全屏居中\n * <Center flex>\n * <Icon name=\"inbox\" size=\"xl\" />\n * <Text>暂无数据</Text>\n * </Center>\n *\n * // 指定 flex 值\n * <Center flex={2}>\n * <Text>占据更多空间</Text>\n * </Center>\n *\n * // 组合使用\n * <Center flex className=\"bg-gray-50\">\n * <AppImage source={emptyImage} width={120} height={120} />\n * <AppText size=\"lg\" weight=\"bold\" className=\"mt-4\">暂无订单</AppText>\n * <AppText color=\"gray-500\" className=\"mt-2\">快去选购商品吧</AppText>\n * <AppButton className=\"mt-6\" onPress={goShopping}>去购物</AppButton>\n * </Center>\n * ```\n */\nexport function Center({ flex = true, ...props }: CenterProps) {\n return <AppView center flex={flex} {...props} />;\n}\n","import React from 'react';\nimport { View, ViewProps, StyleSheet } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { useOptionalTheme } from '@/theme';\nimport { cn } from '@/utils';\nimport { resolveNamedColor } from '../utils/theme-color';\n\nexport interface SafeScreenProps extends ViewProps {\n /** 是否包含顶部安全区域 */\n top?: boolean;\n /** 是否包含底部安全区域 */\n bottom?: boolean;\n /** 是否包含左侧安全区域 */\n left?: boolean;\n /** 是否包含右侧安全区域 */\n right?: boolean;\n /** 背景颜色 */\n bg?: string;\n /** 是否使用 flex: 1 */\n flex?: boolean;\n /** 自定义样式类 */\n className?: string;\n /** 子元素 */\n children: React.ReactNode;\n}\n\n/**\n * 安全屏幕组件 - 自动适配刘海屏/全面屏的安全区域\n *\n * @example\n * ```tsx\n * <SafeScreen flex bg=\"white\">\n * <AppText>内容在安全区域内</AppText>\n * </SafeScreen>\n * ```\n */\nexport function SafeScreen({\n top = true,\n bottom = true,\n left = false,\n right = false,\n bg,\n flex = true,\n className,\n children,\n style,\n ...props\n}: SafeScreenProps) {\n const insets = useSafeAreaInsets();\n const { theme, isDark } = useOptionalTheme();\n const resolvedBgColor = resolveNamedColor(bg, theme, isDark);\n const shouldUseClassBg = !!bg && !resolvedBgColor;\n\n return (\n <View\n className={cn(flex && 'flex-1', shouldUseClassBg && `bg-${bg}`, className)}\n style={[\n flex && styles.flex,\n resolvedBgColor ? { backgroundColor: resolvedBgColor } : undefined,\n {\n paddingTop: top ? insets.top : 0,\n paddingBottom: bottom ? insets.bottom : 0,\n paddingLeft: left ? insets.left : 0,\n paddingRight: right ? insets.right : 0,\n },\n style,\n ]}\n {...props}\n >\n {children}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n flex: {\n flex: 1,\n },\n});\n\n/**\n * 页面容器组件 - 包含安全区域和基础布局\n *\n * @example\n * ```tsx\n * <Page>\n * <AppHeader title=\"首页\" />\n * <AppView flex p={4}>\n * <AppText>页面内容</AppText>\n * </AppView>\n * </Page>\n * ```\n */\nexport function Page({\n children,\n className,\n ...props\n}: Omit<SafeScreenProps, 'top' | 'bottom' | 'left' | 'right'>) {\n return (\n <SafeScreen flex bg=\"background\" {...props} className={className}>\n {children}\n </SafeScreen>\n );\n}\n\n/**\n * 底部安全区域组件 - 只在底部添加安全距离\n * 注意:此组件不会铺满全屏,只占据内容高度\n *\n * @example\n * ```tsx\n * <SafeBottom>\n * <AppButton>底部按钮</AppButton>\n * </SafeBottom>\n * ```\n */\nexport function SafeBottom({\n children,\n className,\n ...props\n}: Omit<SafeScreenProps, 'top' | 'bottom' | 'left' | 'right'>) {\n return (\n <SafeScreen bottom left right flex={false} {...props} className={className}>\n {children}\n </SafeScreen>\n );\n}\n","import { ActivityIndicator } from 'react-native';\nimport { useOptionalTheme } from '@/theme';\nimport { AppPressable, AppText } from '@/ui/primitives';\nimport { cn } from '@/utils';\n\n/**\n * AppButton 组件属性接口\n */\nexport interface AppButtonProps {\n /** 按钮样式变体:solid(实心)、outline(描边)、ghost(透明) */\n variant?: 'solid' | 'outline' | 'ghost';\n /** 按钮尺寸:sm(小)、md(中)、lg(大) */\n size?: 'sm' | 'md' | 'lg';\n /** 按钮颜色主题 */\n color?: 'primary' | 'secondary' | 'danger';\n /** 是否显示加载状态 */\n loading?: boolean;\n /** 是否禁用 */\n disabled?: boolean;\n /** 点击回调 */\n onPress?: () => void;\n /** 按钮内容 */\n children: React.ReactNode;\n /** 自定义类名 */\n className?: string;\n}\n\n/**\n * AppButton - 按钮组件\n *\n * 功能完善的按钮组件,支持多种样式变体、尺寸和颜色主题\n * 内置加载状态和禁用状态处理,提供统一的用户交互体验\n *\n * @example\n * ```tsx\n * // 基础使用\n * <AppButton onPress={handlePress}>确定</AppButton>\n *\n * // 不同变体\n * <AppButton variant=\"solid\">实心按钮</AppButton>\n * <AppButton variant=\"outline\">描边按钮</AppButton>\n * <AppButton variant=\"ghost\">透明按钮</AppButton>\n *\n * // 不同尺寸\n * <AppButton size=\"sm\">小按钮</AppButton>\n * <AppButton size=\"md\">中按钮</AppButton>\n * <AppButton size=\"lg\">大按钮</AppButton>\n *\n * // 不同颜色\n * <AppButton color=\"primary\">主题色</AppButton>\n * <AppButton color=\"secondary\">次要色</AppButton>\n * <AppButton color=\"danger\">危险操作</AppButton>\n *\n * // 加载状态\n * <AppButton loading>加载中</AppButton>\n *\n * // 禁用状态\n * <AppButton disabled>不可用</AppButton>\n *\n * // 组合使用\n * <AppButton\n * variant=\"outline\"\n * color=\"danger\"\n * size=\"lg\"\n * onPress={handleDelete}\n * >\n * 删除账号\n * </AppButton>\n * ```\n */\nexport function AppButton({\n variant = 'solid',\n size = 'md',\n color = 'primary',\n loading,\n disabled,\n onPress,\n children,\n className,\n}: AppButtonProps) {\n const { theme, isDark } = useOptionalTheme();\n const isDisabled = disabled || loading;\n\n const sizeClasses = { sm: 'px-3 py-2', md: 'px-4 py-3', lg: 'px-6 py-4' };\n const buttonColors = {\n primary: theme.colors.primary?.[500] || '#f38b32',\n secondary: theme.colors.secondary?.[500] || '#3b82f6',\n danger: theme.colors.error?.[500] || '#ef4444',\n };\n const ghostTextColor = isDark ? '#ffffff' : theme.colors.text?.[500] || '#1f2937';\n const ghostBackgroundColor = isDark ? 'rgba(255,255,255,0.04)' : 'transparent';\n\n // 根据变体设置 loading 指示器颜色\n // solid: 白色(因为背景是彩色的)\n // outline/ghost: 对应主题色(因为背景是透明的)\n const loadingColor = variant === 'solid' ? 'white' : buttonColors[color];\n const textColor =\n variant === 'solid' ? '#ffffff' : variant === 'ghost' ? ghostTextColor : buttonColors[color];\n\n const buttonStyle =\n variant === 'solid'\n ? { backgroundColor: buttonColors[color] }\n : variant === 'outline'\n ? { borderWidth: 0.5, borderColor: buttonColors[color], backgroundColor: 'transparent' }\n : { backgroundColor: ghostBackgroundColor };\n\n return (\n <AppPressable\n onPress={onPress}\n disabled={isDisabled}\n className={cn(\n 'flex-row items-center justify-center rounded-lg',\n sizeClasses[size],\n isDisabled && 'opacity-50',\n className\n )}\n style={buttonStyle}\n >\n {loading ? (\n <ActivityIndicator size=\"small\" color={loadingColor} />\n ) : (\n <AppText weight=\"semibold\" style={{ color: textColor }}>\n {children}\n </AppText>\n )}\n </AppPressable>\n );\n}\n","import { AppView, AppText } from '../primitives';\nimport { cn } from '@/utils';\n\n/**\n * Toast 组件属性接口\n */\nexport interface ToastProps {\n /** 提示消息内容 */\n message: string;\n /** 提示类型,决定背景颜色 */\n type?: 'success' | 'error' | 'warning' | 'info';\n /** 是否显示 */\n visible?: boolean;\n}\n\n/** 类型样式映射表 */\nconst typeStyles = {\n success: 'bg-green-500',\n error: 'bg-red-500',\n warning: 'bg-yellow-500',\n info: 'bg-blue-500',\n};\n\n/**\n * Toast - 轻提示组件\n *\n * 用于显示简短的操作反馈信息,自动根据类型显示不同颜色\n * 通常配合 Toast 管理器使用,支持自动消失\n *\n * @example\n * ```tsx\n * // 基础使用\n * <Toast message=\"操作成功\" />\n *\n * // 不同类型\n * <Toast message=\"保存成功\" type=\"success\" />\n * <Toast message=\"网络错误\" type=\"error\" />\n * <Toast message=\"请注意\" type=\"warning\" />\n * <Toast message=\"提示信息\" type=\"info\" />\n *\n * // 控制显示\n * <Toast\n * message=\"正在加载...\"\n * type=\"info\"\n * visible={isLoading}\n * />\n *\n * // 配合管理器使用\n * const { showToast } = useToast();\n * showToast({ message: '操作成功', type: 'success' });\n * ```\n */\nexport function Toast({ message, type = 'info', visible = true }: ToastProps) {\n if (!visible) return null;\n return (\n <AppView className={cn('px-4 py-3 rounded-lg', typeStyles[type])}>\n <AppText color=\"white\">{message}</AppText>\n </AppView>\n );\n}\n","import { useCallback } from 'react';\nimport { Modal, TouchableOpacity, StyleSheet, GestureResponderEvent } from 'react-native';\nimport { AppView, AppText } from '@/ui/primitives';\nimport { useTheme } from '@/theme';\nimport { cn } from '@/utils';\n\n/**\n * Alert 按钮配置\n */\nexport interface AlertButton {\n text: string;\n onPress?: () => void;\n style?: 'default' | 'cancel' | 'destructive';\n}\n\n/**\n * Alert 组件属性接口\n */\nexport interface AlertProps {\n /** 是否显示 */\n visible: boolean;\n /** 标题 */\n title: string;\n /** 消息内容 */\n message?: string;\n /** 按钮配置 */\n buttons: AlertButton[];\n /** 关闭回调 */\n onClose?: () => void;\n}\n\n/**\n * Alert - 对话框组件,支持浅色/深色主题\n */\nexport function Alert({ visible, title, message, buttons, onClose }: AlertProps) {\n const { theme, isDark } = useTheme();\n\n // 主题颜色\n const modalBgColor = isDark ? '#1f2937' : '#ffffff';\n const textColor = isDark ? '#ffffff' : '#1f2937';\n const messageColor = isDark ? '#9ca3af' : '#6b7280';\n const borderColor = isDark ? '#374151' : '#e5e7eb';\n const cancelButtonBg = isDark ? '#374151' : '#f3f4f6';\n const cancelButtonText = isDark ? '#ffffff' : '#374151';\n const destructiveColor = theme.colors.error?.[500] || '#ef4444';\n\n const handleButtonPress = useCallback(\n (button: AlertButton) => (e: GestureResponderEvent) => {\n e.stopPropagation();\n button.onPress?.();\n onClose?.();\n },\n [onClose]\n );\n\n // 获取按钮样式\n const getButtonStyle = (button: AlertButton) => {\n if (button.style === 'destructive') {\n return {\n backgroundColor: 'transparent',\n borderWidth: 0.5,\n borderColor: destructiveColor,\n };\n }\n if (button.style === 'cancel') {\n return {\n backgroundColor: cancelButtonBg,\n borderWidth: 0.5,\n borderColor: isDark ? '#4b5563' : '#d1d5db',\n };\n }\n return {\n backgroundColor: theme.colors.primary?.[500] || '#f38b32',\n borderWidth: 0,\n };\n };\n\n // 获取按钮文字颜色\n const getButtonTextColor = (button: AlertButton) => {\n if (button.style === 'destructive') {\n return destructiveColor;\n }\n if (button.style === 'cancel') {\n return cancelButtonText;\n }\n return '#ffffff';\n };\n\n return (\n <Modal\n visible={visible}\n transparent\n animationType=\"fade\"\n onRequestClose={onClose}\n statusBarTranslucent\n >\n <AppView className=\"flex-1\" style={{ backgroundColor: 'rgba(0,0,0,0.5)' }} center>\n <AppView\n className=\"rounded-xl mx-8 min-w-[280px]\"\n style={{ backgroundColor: modalBgColor }}\n >\n {/* 内容区域 */}\n <AppView className=\"px-6 py-5\">\n <AppText\n size=\"lg\"\n weight=\"semibold\"\n className=\"text-center mb-2\"\n style={{ color: textColor }}\n >\n {title}\n </AppText>\n {message && (\n <AppText size=\"sm\" style={{ color: messageColor }} className=\"text-center leading-5\">\n {message}\n </AppText>\n )}\n </AppView>\n\n {/* 按钮区域 */}\n <AppView className=\"border-t\" style={{ borderTopColor: borderColor }}>\n {buttons.length === 1 ? (\n // 单个按钮\n <TouchableOpacity\n onPress={handleButtonPress(buttons[0])}\n className=\"py-3 rounded-b-xl\"\n style={[styles.singleButton, getButtonStyle(buttons[0])]}\n >\n <AppText\n weight=\"medium\"\n className=\"text-center\"\n style={{ color: getButtonTextColor(buttons[0]) }}\n >\n {buttons[0].text}\n </AppText>\n </TouchableOpacity>\n ) : buttons.length === 2 ? (\n // 两个按钮横向排列\n <AppView row style={styles.twoButtonContainer}>\n {buttons.map((button, index) => (\n <TouchableOpacity\n key={index}\n onPress={handleButtonPress(button)}\n className={cn(\n 'py-3 flex-1',\n index === 0 && 'rounded-bl-xl',\n index === 1 && 'rounded-br-xl'\n )}\n style={[\n styles.twoButton,\n index > 0 && { borderLeftColor: borderColor },\n getButtonStyle(button),\n ]}\n >\n <AppText\n weight=\"medium\"\n className=\"text-center\"\n style={{ color: getButtonTextColor(button) }}\n >\n {button.text}\n </AppText>\n </TouchableOpacity>\n ))}\n </AppView>\n ) : (\n // 多个按钮纵向排列\n <AppView className=\"gap-2 pb-4 px-4\">\n {buttons.map((button, index) => (\n <TouchableOpacity\n key={index}\n onPress={handleButtonPress(button)}\n className=\"py-3 rounded-lg\"\n style={getButtonStyle(button)}\n >\n <AppText\n weight=\"medium\"\n className=\"text-center\"\n style={{ color: getButtonTextColor(button) }}\n >\n {button.text}\n </AppText>\n </TouchableOpacity>\n ))}\n </AppView>\n )}\n </AppView>\n </AppView>\n </AppView>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n singleButton: {\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n },\n twoButtonContainer: {\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n },\n twoButton: {\n borderLeftWidth: 0.5,\n },\n});\n","import { ActivityIndicator } from 'react-native';\nimport { AppView, AppText } from '../primitives';\n\n/**\n * Loading 组件属性接口\n */\nexport interface LoadingProps {\n /** 加载提示文字 */\n text?: string;\n /** 指示器颜色 */\n color?: string;\n /** 是否显示遮罩层 */\n overlay?: boolean;\n /** 是否显示 */\n visible?: boolean;\n /** 测试 ID */\n testID?: string;\n}\n\n/**\n * Loading - 加载指示器组件\n *\n * 用于显示操作正在进行的视觉反馈,支持内联和遮罩两种模式\n * 遮罩模式会覆盖整个屏幕,阻止用户操作\n *\n * @example\n * ```tsx\n * // 基础使用\n * <Loading />\n *\n * // 带提示文字\n * <Loading text=\"正在加载...\" />\n *\n * // 遮罩模式(全屏)\n * <Loading overlay text=\"保存中...\" />\n *\n * // 条件显示\n * {isLoading && <Loading text=\"加载中\" />}\n *\n * // 配合请求使用\n * const [loading, setLoading] = useState(false);\n *\n * const fetchData = async () => {\n * setLoading(true);\n * try {\n * const data = await api.getData();\n * setData(data);\n * } finally {\n * setLoading(false);\n * }\n * };\n *\n * return (\n * <>\n * <FlatList data={data} renderItem={renderItem} />\n * <Loading overlay visible={loading} text=\"加载中...\" />\n * </>\n * );\n * ```\n */\nexport function Loading({\n text,\n color,\n overlay = false,\n visible = true,\n testID,\n}: LoadingProps) {\n if (!visible) return null;\n const content = (\n <AppView center gap={3} testID={testID}>\n <ActivityIndicator size=\"large\" color={color} />\n {text && <AppText style={color ? { color } : undefined}>{text}</AppText>}\n </AppView>\n );\n if (overlay) {\n return (\n <AppView center flex className=\"absolute inset-0 bg-black/30\" testID={testID}>\n {content}\n </AppView>\n );\n }\n return content;\n}\n","import { AppView } from '@/ui/primitives';\nimport { useTheme } from '@/theme';\nimport { cn } from '@/utils';\n\n/**\n * Progress 组件属性接口\n */\nexport interface ProgressProps {\n /** 当前进度值 */\n value: number;\n /** 最大值,默认为 100 */\n max?: number;\n /** 进度条高度:xs(4px)、sm(6px)、md(8px)、lg(12px)、xl(16px) */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /** 进度条颜色 */\n color?: 'primary' | 'secondary' | 'success' | 'warning' | 'error';\n /** 测试 ID */\n testID?: string;\n /** 自定义容器样式 */\n className?: string;\n /** 自定义进度条样式 */\n barClassName?: string;\n}\n\n/** 尺寸映射表 */\nconst sizeMap = { xs: 'h-1', sm: 'h-1.5', md: 'h-2', lg: 'h-3', xl: 'h-4' };\n\n/** 颜色映射表 */\nconst colorMap = {\n primary: 'bg-primary-500',\n secondary: 'bg-secondary-500',\n success: 'bg-success-500',\n warning: 'bg-warning-500',\n error: 'bg-error-500',\n};\n\n/**\n * Progress - 进度条组件\n *\n * 用于展示操作进度的可视化组件,支持浅色/深色主题\n *\n * @example\n * ```tsx\n * // 基础使用\n * <Progress value={50} />\n *\n * // 不同尺寸\n * <Progress value={30} size=\"sm\" />\n * <Progress value={60} size=\"lg\" />\n *\n * // 不同颜色\n * <Progress value={75} color=\"success\" />\n * <Progress value={90} color=\"warning\" />\n * ```\n */\nexport function Progress({\n value,\n max = 100,\n size = 'md',\n color = 'primary',\n testID,\n className,\n barClassName,\n}: ProgressProps) {\n const { theme, isDark } = useTheme();\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n\n // 深色主题下使用更深的背景色\n const trackBgColor = isDark ? theme.colors.border?.[700] || '#374151' : '#e5e7eb';\n\n return (\n <AppView\n className={cn('w-full rounded-full', sizeMap[size], className)}\n style={{ backgroundColor: trackBgColor }}\n testID={testID}\n >\n <AppView\n className={cn('rounded-full', sizeMap[size], colorMap[color], barClassName)}\n style={{ width: `${percentage}%` }}\n />\n </AppView>\n );\n}\n","import { View, ViewProps } from 'react-native';\nimport { useThemeColors } from '@/theme';\nimport { cn } from '@/utils';\n\n/**\n * Card 组件属性接口\n */\nexport interface CardProps extends ViewProps {\n /** Tailwind / NativeWind 类名 */\n className?: string;\n /** 是否禁用阴影 */\n noShadow?: boolean;\n /** 是否禁用边框 */\n noBorder?: boolean;\n /** 是否禁用圆角 */\n noRadius?: boolean;\n}\n\n/**\n * Card - 卡片容器组件,支持浅色/深色主题\n */\nexport function Card({\n children,\n className,\n style,\n noShadow = false,\n noBorder = false,\n noRadius = false,\n ...props\n}: CardProps) {\n const colors = useThemeColors();\n\n return (\n <View\n className={cn(\n !noRadius && 'rounded-lg',\n !noShadow && 'shadow-sm',\n 'overflow-hidden',\n className\n )}\n style={[\n {\n backgroundColor: colors.card,\n ...(noBorder ? {} : { borderWidth: 0.5, borderColor: colors.divider }),\n },\n style,\n ]}\n {...props}\n >\n {children}\n </View>\n );\n}\n","import { StyleProp, TextStyle } from 'react-native';\nimport MaterialIcons from 'react-native-vector-icons/MaterialIcons';\nimport { useOptionalTheme } from '@/theme';\nimport { AppPressable } from '@/ui/primitives';\nimport { resolveNamedColor } from '../utils/theme-color';\n\n/** 图标尺寸类型 */\nexport type IconSize = number | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Icon 组件属性接口\n */\nexport interface IconProps {\n /** 图标名称,参考 MaterialIcons 图标库 */\n name: string;\n /** 图标尺寸:预设值 xs(16px)、sm(20px)、md(24px)、lg(32px)、xl(48px) 或直接指定数字 */\n size?: IconSize;\n /** 图标颜色,支持 Tailwind 颜色格式(如 'primary-500'、'gray-600')或十六进制值 */\n color?: string;\n /** 自定义样式 */\n style?: StyleProp<TextStyle>;\n /** 点击回调,设置了此属性后图标将变为可点击 */\n onPress?: () => void;\n /** 测试 ID */\n testID?: string;\n}\n\n/**\n * 预设尺寸映射表\n */\nconst sizeMap: Record<string, number> = {\n xs: 16,\n sm: 20,\n md: 24,\n lg: 32,\n xl: 48,\n};\n\n/**\n * 解析图标尺寸\n * @param size - 图标尺寸\n * @returns 解析后的数字尺寸\n */\nfunction resolveSize(size: IconSize = 'md'): number {\n if (typeof size === 'number') return size;\n return sizeMap[size] || 24;\n}\n\n/**\n * 解析图标颜色\n * @param color - 颜色值\n * @param theme - 主题对象\n * @returns 解析后的颜色值\n */\n/**\n * Icon - 图标组件\n *\n * 基于 MaterialIcons 的图标组件,支持主题颜色、多种尺寸和点击交互\n * 提供了常用的图标常量集合,方便开发使用\n *\n * @example\n * ```tsx\n * // 基础使用\n * <Icon name=\"home\" />\n *\n * // 指定尺寸\n * <Icon name=\"search\" size=\"lg\" />\n * <Icon name=\"settings\" size={32} />\n *\n * // 指定颜色\n * <Icon name=\"check-circle\" color=\"success-500\" />\n * <Icon name=\"error\" color=\"red-500\" />\n *\n * // 可点击图标\n * <Icon name=\"close\" onPress={() => setVisible(false)} />\n *\n * // 使用预设常量\n * <Icon name={NavigationIcons.home} />\n * <Icon name={ActionIcons.delete} color=\"danger-500\" />\n * ```\n */\nexport function Icon({ name, size = 'md', color = 'gray-600', style, onPress, testID }: IconProps) {\n const { theme, isDark } = useOptionalTheme();\n const resolvedSize = resolveSize(size);\n const resolvedColor = resolveNamedColor(color, theme, isDark) ?? color;\n\n if (onPress) {\n return (\n <AppPressable onPress={onPress} testID={testID}>\n <MaterialIcons name={name as any} size={resolvedSize} color={resolvedColor} style={style} />\n </AppPressable>\n );\n }\n\n return (\n <MaterialIcons\n name={name as any}\n size={resolvedSize}\n color={resolvedColor}\n style={style}\n testID={testID}\n />\n );\n}\n\n/**\n * 导航图标常量\n */\nexport const NavigationIcons = {\n home: 'home',\n explore: 'explore',\n profile: 'person',\n settings: 'settings',\n back: 'arrow-back',\n forward: 'arrow-forward',\n close: 'close',\n menu: 'menu',\n more: 'more-vert',\n} as const;\n\n/**\n * 操作图标常量\n */\nexport const ActionIcons = {\n add: 'add',\n edit: 'edit',\n delete: 'delete',\n search: 'search',\n share: 'share',\n favorite: 'favorite',\n favoriteBorder: 'favorite-border',\n check: 'check',\n checkCircle: 'check-circle',\n close: 'close',\n closeCircle: 'cancel',\n copy: 'content-copy',\n download: 'download',\n upload: 'upload',\n} as const;\n\n/**\n * 状态图标常量\n */\nexport const StatusIcons = {\n info: 'info',\n success: 'check-circle',\n warning: 'warning',\n error: 'error',\n help: 'help',\n loading: 'refresh',\n} as const;\n\n/**\n * 文件图标常量\n */\nexport const FileIcons = {\n file: 'insert-drive-file',\n image: 'image',\n video: 'videocam',\n audio: 'audiotrack',\n folder: 'folder',\n folderOpen: 'folder-open',\n} as const;\n","import React, { useState, useCallback } from 'react';\nimport {\n Image,\n ActivityIndicator,\n ImageSourcePropType,\n StyleProp,\n ImageStyle,\n View,\n} from 'react-native';\nimport { useTheme } from '@/theme';\nimport { cn } from '@/utils';\nimport { AppPressable, AppView } from '@/ui/primitives';\nimport { Icon } from './Icon';\n\n/** 图片缩放模式 */\nexport type ImageResizeMode = 'cover' | 'contain' | 'stretch' | 'center';\n\n/**\n * AppImage 组件属性接口\n */\nexport interface AppImageProps {\n /** 图片资源,可以是本地资源或远程 URL */\n source: ImageSourcePropType | { uri: string };\n /** 宽度,数字表示像素,字符串表示百分比 */\n width?: number | string;\n /** 高度,数字表示像素,'auto' 表示自适应,或使用 'aspect-16/9' 等比例格式 */\n height?: number | string;\n /** 圆角大小,支持预设值或数字 */\n borderRadius?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | number;\n /** 加载时的占位图 */\n placeholder?: ImageSourcePropType;\n /** 加载失败时的占位图 */\n errorPlaceholder?: ImageSourcePropType;\n /** 是否显示加载指示器,设为 true 显示默认指示器,或传入自定义节点 */\n loadingIndicator?: boolean | React.ReactNode;\n /** 是否在加载失败时显示错误图标 */\n showError?: boolean;\n /** 图片缩放模式 */\n resizeMode?: ImageResizeMode;\n /** 图片加载成功回调 */\n onLoad?: () => void;\n /** 图片加载失败回调 */\n onError?: (error: any) => void;\n /** 点击回调 */\n onPress?: () => void;\n /** 长按回调 */\n onLongPress?: () => void;\n /** 自定义类名 */\n className?: string;\n /** 自定义样式 */\n style?: StyleProp<ImageStyle>;\n}\n\n/**\n * 圆角映射表\n */\nconst radiusMap: Record<string, number> = {\n none: 0,\n sm: 2,\n md: 6,\n lg: 8,\n xl: 12,\n '2xl': 16,\n full: 9999,\n};\n\n/**\n * 解析圆角值\n * @param radius - 圆角值\n * @returns 解析后的数字\n */\nfunction resolveRadius(radius: AppImageProps['borderRadius']): number {\n if (typeof radius === 'number') return radius;\n return radiusMap[radius || 'none'];\n}\n\n/**\n * 骨架屏加载效果\n */\nfunction SkeletonItem() {\n return <AppView flex className=\"bg-gray-200 animate-pulse\" />;\n}\n\n/**\n * AppImage - 图片组件\n *\n * 功能丰富的图片组件,支持加载状态、错误处理、圆角、点击交互等\n * 自动处理图片加载过程中的各种状态,提供良好的用户体验\n *\n * @example\n * ```tsx\n * // 基础使用\n * <AppImage source={{ uri: 'https://example.com/image.jpg' }} />\n *\n * // 指定尺寸和圆角\n * <AppImage\n * source={require('./photo.png')}\n * width={200}\n * height={150}\n * borderRadius=\"lg\"\n * />\n *\n * // 显示加载指示器\n * <AppImage\n * source={{ uri: 'https://example.com/large-image.jpg' }}\n * loadingIndicator={true}\n * showError={true}\n * />\n *\n * // 可点击图片\n * <AppImage\n * source={{ uri: 'https://example.com/photo.jpg' }}\n * onPress={() => navigation.navigate('Detail')}\n * onLongPress={() => showContextMenu()}\n * />\n *\n * // 使用占位图\n * <AppImage\n * source={{ uri: user.avatar }}\n * placeholder={require('./default-avatar.png')}\n * errorPlaceholder={require('./error-avatar.png')}\n * borderRadius=\"full\"\n * />\n * ```\n */\nexport function AppImage({\n source,\n width = '100%',\n height = 'auto',\n borderRadius = 'none',\n placeholder,\n errorPlaceholder,\n loadingIndicator = false,\n showError = false,\n resizeMode = 'cover',\n onLoad,\n onError,\n onPress,\n onLongPress,\n className,\n style,\n}: AppImageProps) {\n const [isLoading, setIsLoading] = useState(true);\n const [hasError, setHasError] = useState(false);\n const { theme } = useTheme();\n\n const resolvedRadius = resolveRadius(borderRadius);\n\n const handleLoad = useCallback(() => {\n setIsLoading(false);\n onLoad?.();\n }, [onLoad]);\n\n const handleError = useCallback(\n (error: any) => {\n setIsLoading(false);\n setHasError(true);\n onError?.(error);\n },\n [onError]\n );\n\n const imageStyle: any = [\n {\n width: '100%',\n height: '100%',\n borderRadius: resolvedRadius,\n },\n style,\n ];\n\n const renderLoading = () => {\n if (!isLoading) return null;\n if (placeholder) {\n return (\n <Image\n source={placeholder}\n style={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n borderRadius: resolvedRadius,\n }}\n resizeMode={resizeMode}\n />\n );\n }\n if (loadingIndicator) {\n if (typeof loadingIndicator === 'boolean') {\n return (\n <AppView\n center\n className=\"absolute inset-0 bg-gray-100\"\n style={{ borderRadius: resolvedRadius }}\n >\n <ActivityIndicator color={theme.colors.primary?.[500]} />\n </AppView>\n );\n }\n return (\n <AppView center className=\"absolute inset-0\" style={{ borderRadius: resolvedRadius }}>\n {loadingIndicator}\n </AppView>\n );\n }\n return <SkeletonItem />;\n };\n\n const renderError = () => {\n if (!hasError) return null;\n if (errorPlaceholder) {\n return (\n <Image\n source={errorPlaceholder}\n style={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n borderRadius: resolvedRadius,\n }}\n resizeMode={resizeMode}\n />\n );\n }\n if (showError) {\n return (\n <AppView\n center\n className=\"absolute inset-0 bg-gray-100\"\n style={{ borderRadius: resolvedRadius }}\n >\n <Icon name=\"error\" size=\"lg\" color=\"error-500\" />\n </AppView>\n );\n }\n return null;\n };\n\n const isNumberWidth = typeof width === 'number';\n const isNumberHeight = typeof height === 'number';\n\n const content = (\n <View\n className={cn('overflow-hidden', className)}\n style={{\n width: isNumberWidth ? width : '100%',\n height: isNumberHeight ? height : undefined,\n aspectRatio:\n typeof height === 'string' && height.startsWith('aspect-')\n ? Number(height.replace('aspect-', '').split('/')[0]) /\n Number(height.replace('aspect-', '').split('/')[1] || 1)\n : undefined,\n borderRadius: resolvedRadius,\n }}\n >\n {renderLoading()}\n <Image\n source={source as any}\n style={imageStyle}\n resizeMode={resizeMode}\n onLoad={handleLoad}\n onError={handleError}\n />\n {renderError()}\n </View>\n );\n\n if (onPress || onLongPress) {\n return (\n <AppPressable onPress={onPress} onLongPress={onLongPress}>\n {content}\n </AppPressable>\n );\n }\n\n return content;\n}\n","import React, { useState, useCallback, useMemo } from 'react';\nimport {\n FlatList,\n ListRenderItem,\n RefreshControl,\n ActivityIndicator,\n StyleProp,\n ViewStyle,\n StyleSheet,\n} from 'react-native';\nimport { useTheme, useThemeColors } from '@/theme';\nimport { AppView, AppText, AppPressable } from '@/ui/primitives';\nimport { Icon } from './Icon';\nimport { Center } from '@/ui/layout';\n\nexport interface AppListProps<T = any> {\n data: T[];\n renderItem: ListRenderItem<T>;\n keyExtractor?: (item: T, index: number) => string;\n\n loading?: boolean;\n refreshing?: boolean;\n onRefresh?: () => void | Promise<void>;\n\n hasMore?: boolean;\n onEndReached?: () => void | Promise<void>;\n onEndReachedThreshold?: number;\n\n error?: Error | null;\n onRetry?: () => void;\n\n emptyTitle?: string;\n emptyDescription?: string;\n emptyIcon?: string;\n EmptyComponent?: React.ComponentType;\n\n divider?: boolean;\n dividerStyle?: StyleProp<ViewStyle>;\n\n skeletonCount?: number;\n skeletonRender?: () => React.ReactElement;\n\n ListHeaderComponent?: React.ComponentType | React.ReactElement | null;\n ListFooterComponent?: React.ComponentType | React.ReactElement | null;\n contentContainerStyle?: StyleProp<ViewStyle>;\n style?: StyleProp<ViewStyle>;\n numColumns?: number;\n columnWrapperStyle?: StyleProp<ViewStyle>;\n horizontal?: boolean;\n showsVerticalScrollIndicator?: boolean;\n showsHorizontalScrollIndicator?: boolean;\n}\n\nfunction SkeletonItem({ render }: { render?: () => React.ReactElement }) {\n const colors = useThemeColors();\n\n if (render) {\n return render();\n }\n\n return (\n <AppView p={4} gap={3} testID=\"skeleton\">\n <AppView row gap={3}>\n <AppView className=\"w-16 h-16 rounded-lg\" style={{ backgroundColor: colors.divider }} />\n <AppView flex gap={2}>\n <AppView className=\"h-4 w-3/4 rounded\" style={{ backgroundColor: colors.divider }} />\n <AppView className=\"h-3 w-1/2 rounded\" style={{ backgroundColor: colors.divider }} />\n </AppView>\n </AppView>\n </AppView>\n );\n}\n\nfunction EmptyState({\n title,\n description,\n icon,\n}: {\n title?: string;\n description?: string;\n icon?: string;\n}) {\n const colors = useThemeColors();\n\n return (\n <Center py={20}>\n <Icon name={icon || 'inbox'} size={64} color={colors.textMuted} />\n <AppText size=\"lg\" weight=\"medium\" className=\"mt-4\" style={{ color: colors.text }}>\n {title || '暂无数据'}\n </AppText>\n {description && (\n <AppText size=\"sm\" className=\"mt-2\" style={{ color: colors.textMuted }}>\n {description}\n </AppText>\n )}\n </Center>\n );\n}\n\nfunction ErrorState({ error, onRetry }: { error: Error; onRetry?: () => void }) {\n const colors = useThemeColors();\n\n return (\n <Center py={20}>\n <Icon name=\"error-outline\" size={64} color=\"error-300\" />\n <AppText size=\"lg\" weight=\"medium\" color=\"error-500\" className=\"mt-4\">\n 加载失败\n </AppText>\n <AppText size=\"sm\" style={{ color: colors.textMuted }} className=\"mt-2 text-center px-8\">\n {error.message || '请检查网络后重试'}\n </AppText>\n {onRetry && (\n <AppPressable\n onPress={onRetry}\n className=\"mt-6 px-4 py-2 rounded-lg\"\n style={[\n styles.retryButton,\n { backgroundColor: colors.cardElevated, borderColor: colors.border },\n ]}\n >\n <AppText style={{ color: colors.textSecondary }} className=\"text-center\">\n 重新加载\n </AppText>\n </AppPressable>\n )}\n </Center>\n );\n}\n\nfunction LoadMoreFooter({ loading }: { loading: boolean }) {\n if (!loading) return null;\n return (\n <Center py={4}>\n <ActivityIndicator size=\"small\" />\n </Center>\n );\n}\n\nfunction Divider({ style }: { style?: StyleProp<ViewStyle> }) {\n const colors = useThemeColors();\n return (\n <AppView\n className=\"h-px\"\n style={[{ marginVertical: 0 }, { backgroundColor: colors.divider }, style]}\n />\n );\n}\n\nexport function AppList<T = any>({\n data,\n renderItem,\n keyExtractor,\n\n loading = false,\n refreshing = false,\n onRefresh,\n\n hasMore = false,\n onEndReached,\n onEndReachedThreshold = 0.5,\n\n error,\n onRetry,\n\n emptyTitle,\n emptyDescription,\n emptyIcon,\n EmptyComponent,\n\n divider = false,\n dividerStyle,\n\n skeletonCount = 6,\n skeletonRender,\n\n ListHeaderComponent,\n ListFooterComponent,\n contentContainerStyle,\n style,\n numColumns,\n columnWrapperStyle,\n horizontal,\n showsVerticalScrollIndicator,\n showsHorizontalScrollIndicator,\n}: AppListProps<T>) {\n const { theme } = useTheme();\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n\n const handleEndReached = useCallback(async () => {\n if (isLoadingMore || !hasMore || !onEndReached) return;\n\n setIsLoadingMore(true);\n try {\n await onEndReached();\n } finally {\n setIsLoadingMore(false);\n }\n }, [isLoadingMore, hasMore, onEndReached]);\n\n const defaultKeyExtractor = useCallback(\n (item: T, index: number) => {\n if (keyExtractor) return keyExtractor(item, index);\n return `item-${index}`;\n },\n [keyExtractor]\n );\n\n const wrappedRenderItem = useCallback(\n (info: any) => {\n return (\n <>\n {divider && info.index > 0 && <Divider style={dividerStyle} />}\n {renderItem(info)}\n </>\n );\n },\n [renderItem, divider, dividerStyle]\n );\n\n const skeletonData = useMemo(\n () => new Array(skeletonCount).fill(null).map((_, i) => ({ _skeletonId: i })),\n [skeletonCount]\n );\n\n const skeletonRenderItem = useCallback(\n () => <SkeletonItem render={skeletonRender} />,\n [skeletonRender]\n );\n\n if (loading && data.length === 0) {\n return (\n <FlatList\n data={skeletonData}\n renderItem={skeletonRenderItem}\n keyExtractor={(_, index) => `skeleton-${index}`}\n contentContainerStyle={contentContainerStyle}\n style={style}\n showsVerticalScrollIndicator={showsVerticalScrollIndicator}\n showsHorizontalScrollIndicator={showsHorizontalScrollIndicator}\n />\n );\n }\n\n if (error && data.length === 0) {\n return (\n <Center style={style}>\n <ErrorState error={error} onRetry={onRetry} />\n </Center>\n );\n }\n\n const ListEmptyComponent = useMemo(() => {\n if (EmptyComponent) return <EmptyComponent />;\n return <EmptyState title={emptyTitle} description={emptyDescription} icon={emptyIcon} />;\n }, [EmptyComponent, emptyTitle, emptyDescription, emptyIcon]);\n\n const FooterComponent = useMemo(() => {\n return (\n <>\n <LoadMoreFooter loading={isLoadingMore} />\n {ListFooterComponent}\n </>\n );\n }, [isLoadingMore, ListFooterComponent]);\n\n return (\n <FlatList\n data={data}\n renderItem={wrappedRenderItem}\n keyExtractor={defaultKeyExtractor}\n refreshControl={\n onRefresh ? (\n <RefreshControl\n refreshing={refreshing}\n onRefresh={onRefresh}\n tintColor={theme.colors.primary?.[500]}\n colors={[theme.colors.primary?.[500]]}\n />\n ) : undefined\n }\n onEndReached={onEndReached ? handleEndReached : undefined}\n onEndReachedThreshold={onEndReachedThreshold}\n ListEmptyComponent={ListEmptyComponent}\n ListHeaderComponent={ListHeaderComponent}\n ListFooterComponent={FooterComponent}\n contentContainerStyle={contentContainerStyle}\n style={style}\n numColumns={numColumns}\n columnWrapperStyle={columnWrapperStyle}\n horizontal={horizontal}\n showsVerticalScrollIndicator={showsVerticalScrollIndicator}\n showsHorizontalScrollIndicator={showsHorizontalScrollIndicator}\n removeClippedSubviews={true}\n maxToRenderPerBatch={10}\n windowSize={10}\n initialNumToRender={10}\n />\n );\n}\n\nconst styles = StyleSheet.create({\n retryButton: {\n borderWidth: 0.5,\n },\n});\n","import { forwardRef, useState } from 'react';\nimport { TextInput, TextInputProps, View, StyleSheet } from 'react-native';\nimport { AppView, AppText } from '@/ui/primitives';\nimport { useThemeColors } from '@/theme';\nimport { cn } from '@/utils';\n\n/**\n * AppInput 组件属性接口\n */\nexport interface AppInputProps extends Omit<TextInputProps, 'editable'> {\n /** 标签文本 */\n label?: string;\n /** 错误信息 */\n error?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 左侧图标 */\n leftIcon?: React.ReactNode;\n /** 右侧图标 */\n rightIcon?: React.ReactNode;\n /** 自定义样式 */\n className?: string;\n}\n\n/**\n * AppInput - 输入框组件,支持浅色/深色主题\n */\nexport const AppInput = forwardRef<TextInput, AppInputProps>(\n ({ label, error, disabled = false, leftIcon, rightIcon, className, style, ...props }, ref) => {\n const colors = useThemeColors();\n const [isFocused, setIsFocused] = useState(false);\n\n const errorColor = '#ef4444';\n\n // 边框颜色\n const getBorderColor = () => {\n if (error) return errorColor;\n if (isFocused) return colors.primary;\n return colors.border;\n };\n\n return (\n <AppView className={cn('flex-col gap-1', className)}>\n {label && (\n <AppText size=\"sm\" weight=\"medium\" style={{ color: colors.textSecondary }}>\n {label}\n </AppText>\n )}\n <AppView\n row\n items=\"center\"\n className=\"rounded-lg px-3\"\n style={[\n styles.inputContainer,\n {\n backgroundColor: colors.card,\n borderColor: getBorderColor(),\n opacity: disabled ? 0.6 : 1,\n },\n ]}\n >\n {leftIcon && <View style={styles.icon}>{leftIcon}</View>}\n <TextInput\n ref={ref}\n className=\"flex-1 py-3 text-base\"\n style={[styles.input, { color: colors.text }, style]}\n placeholderTextColor={colors.textMuted}\n editable={!disabled}\n onFocus={e => {\n setIsFocused(true);\n props.onFocus?.(e);\n }}\n onBlur={e => {\n setIsFocused(false);\n props.onBlur?.(e);\n }}\n {...props}\n />\n {rightIcon && <View style={styles.icon}>{rightIcon}</View>}\n </AppView>\n {error && (\n <AppText size=\"xs\" style={{ color: errorColor }}>\n {error}\n </AppText>\n )}\n </AppView>\n );\n }\n);\n\nAppInput.displayName = 'AppInput';\n\nconst styles = StyleSheet.create({\n inputContainer: {\n borderWidth: 0.5,\n minHeight: 48,\n },\n input: {\n padding: 0,\n margin: 0,\n },\n icon: {\n marginHorizontal: 4,\n },\n});\n","import { useState } from 'react';\nimport { TouchableOpacity, StyleSheet } from 'react-native';\nimport { AppView, AppText } from '@/ui/primitives';\nimport { Icon } from '@/ui/display';\nimport { useThemeColors } from '@/theme';\nimport { cn } from '@/utils';\n\n/**\n * Checkbox 组件属性接口\n */\nexport interface CheckboxProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n testID?: string;\n}\n\n/**\n * Checkbox - 复选框组件,支持浅色/深色主题\n */\nexport function Checkbox({\n checked,\n defaultChecked,\n onChange,\n disabled = false,\n children,\n className,\n testID,\n}: CheckboxProps) {\n const colors = useThemeColors();\n const [internalChecked, setInternalChecked] = useState(defaultChecked || false);\n\n const isChecked = checked !== undefined ? checked : internalChecked;\n\n const toggle = () => {\n if (disabled) return;\n const newChecked = !isChecked;\n if (checked === undefined) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked);\n };\n\n // 主题颜色\n const disabledOpacity = 0.4;\n\n return (\n <TouchableOpacity\n onPress={toggle}\n disabled={disabled}\n className={cn('flex-row items-center gap-2', className)}\n style={disabled ? { opacity: disabledOpacity } : undefined}\n testID={testID}\n activeOpacity={0.7}\n >\n <AppView\n className={cn(\n 'w-5 h-5 rounded items-center justify-center',\n isChecked ? 'bg-primary-500' : 'bg-white border'\n )}\n style={[\n styles.checkbox,\n {\n backgroundColor: isChecked ? colors.primary : colors.cardElevated,\n borderColor: isChecked ? colors.primary : colors.border,\n },\n ]}\n >\n {isChecked && (\n <AppView testID={`${testID}-icon`}>\n <Icon name=\"check\" size=\"sm\" color=\"white\" />\n </AppView>\n )}\n </AppView>\n {children && (\n <AppText size=\"sm\" style={{ color: colors.text }}>\n {children}\n </AppText>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n checkbox: {\n borderWidth: 0.5,\n },\n});\n","import { AppView } from '@/ui/primitives';\nimport { Checkbox } from './Checkbox';\n\nexport interface Option {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface CheckboxGroupProps {\n value?: string[];\n onChange?: (value: string[]) => void;\n options?: Option[];\n direction?: 'row' | 'column';\n disabled?: boolean;\n}\n\nexport function CheckboxGroup({\n value = [],\n onChange,\n options = [],\n direction = 'column',\n disabled = false,\n}: CheckboxGroupProps) {\n const handleChange = (optionValue: string, checked: boolean) => {\n if (!onChange) return;\n\n if (checked) {\n onChange([...value, optionValue]);\n } else {\n onChange(value.filter(v => v !== optionValue));\n }\n };\n\n return (\n <AppView row={direction === 'row'} flex={direction === 'row'} gap={4}>\n {options.map(option => (\n <Checkbox\n key={option.value}\n checked={value.includes(option.value)}\n onChange={checked => handleChange(option.value, checked)}\n disabled={disabled || option.disabled}\n >\n {option.label}\n </Checkbox>\n ))}\n </AppView>\n );\n}\n","import { useState } from 'react';\nimport { TouchableOpacity, StyleSheet } from 'react-native';\nimport { AppView, AppText } from '@/ui/primitives';\nimport { useThemeColors } from '@/theme';\nimport { cn } from '@/utils';\n\n/**\n * Radio 组件属性接口\n */\nexport interface RadioProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n testID?: string;\n}\n\n/**\n * Radio - 单选框组件,支持浅色/深色主题\n */\nexport function Radio({\n checked,\n defaultChecked,\n onChange,\n disabled = false,\n children,\n className,\n testID,\n}: RadioProps) {\n const colors = useThemeColors();\n const [internalChecked, setInternalChecked] = useState(defaultChecked || false);\n\n const isChecked = checked !== undefined ? checked : internalChecked;\n\n const toggle = () => {\n if (disabled) return;\n const newChecked = !isChecked;\n if (checked === undefined) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked);\n };\n\n // 主题颜色\n const disabledOpacity = 0.4;\n\n return (\n <TouchableOpacity\n onPress={toggle}\n disabled={disabled}\n className={cn('flex-row items-center gap-2', className)}\n style={disabled ? { opacity: disabledOpacity } : undefined}\n testID={testID}\n activeOpacity={0.7}\n >\n <AppView\n className={cn('w-5 h-5 rounded-full items-center justify-center', isChecked && 'border-2')}\n style={[\n styles.radio,\n {\n backgroundColor: colors.card,\n borderColor: isChecked ? colors.primary : colors.border,\n borderWidth: isChecked ? 0.5 : 0.5,\n },\n ]}\n >\n {isChecked && (\n <AppView\n className=\"rounded-full\"\n style={[styles.inner, { backgroundColor: colors.primary }]}\n />\n )}\n </AppView>\n {children && (\n <AppText size=\"sm\" style={{ color: colors.text }}>\n {children}\n </AppText>\n )}\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n radio: {\n borderWidth: 0.5,\n },\n inner: {\n width: 10,\n height: 10,\n },\n});\n","import { AppView } from '@/ui/primitives';\nimport { Radio } from './Radio';\n\nexport interface Option {\n label: string;\n value: string;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n value?: string;\n onChange?: (value: string) => void;\n options?: Option[];\n direction?: 'row' | 'column';\n disabled?: boolean;\n}\n\nexport function RadioGroup({\n value,\n onChange,\n options = [],\n direction = 'column',\n disabled = false,\n}: RadioGroupProps) {\n return (\n <AppView row={direction === 'row'} flex={direction === 'row'} gap={4}>\n {options.map(option => (\n <Radio\n key={option.value}\n checked={value === option.value}\n onChange={() => onChange?.(option.value)}\n disabled={disabled || option.disabled}\n >\n {option.label}\n </Radio>\n ))}\n </AppView>\n );\n}\n","import { useState } from 'react';\nimport { TouchableOpacity, StyleSheet, ViewStyle } from 'react-native';\nimport { AppView } from '@/ui/primitives';\nimport { useThemeColors } from '@/theme';\nimport { cn } from '@/utils';\n\n/**\n * Switch 组件属性接口\n */\nexport interface SwitchProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n testID?: string;\n style?: ViewStyle;\n}\n\n/**\n * Switch - 开关组件,支持浅色/深色主题\n */\nexport function Switch({\n checked,\n defaultChecked,\n onChange,\n disabled = false,\n size = 'md',\n className,\n testID,\n style,\n}: SwitchProps) {\n const colors = useThemeColors();\n const [internalChecked, setInternalChecked] = useState(defaultChecked || false);\n\n const isChecked = checked !== undefined ? checked : internalChecked;\n\n const toggle = () => {\n if (disabled) return;\n const newChecked = !isChecked;\n if (checked === undefined) {\n setInternalChecked(newChecked);\n }\n onChange?.(newChecked);\n };\n\n // 主题颜色\n const uncheckedTrackColor = colors.divider;\n const checkedTrackColor = colors.primary;\n const disabledOpacity = 0.4;\n\n // 尺寸配置\n const sizes = {\n sm: { width: 36, height: 20, thumb: 16, padding: 2 },\n md: { width: 48, height: 26, thumb: 22, padding: 2 },\n lg: { width: 60, height: 32, thumb: 28, padding: 2 },\n };\n\n const config = sizes[size];\n\n const thumbPosition = isChecked ? config.width - config.thumb - config.padding : config.padding;\n\n return (\n <TouchableOpacity\n onPress={toggle}\n disabled={disabled}\n className={cn(className)}\n testID={testID}\n activeOpacity={disabled ? 1 : 0.8}\n >\n <AppView\n className=\"rounded-full\"\n style={[\n styles.track,\n {\n width: config.width,\n height: config.height,\n backgroundColor: isChecked ? checkedTrackColor : uncheckedTrackColor,\n opacity: disabled ? disabledOpacity : 1,\n },\n style,\n ]}\n >\n <AppView\n className=\"rounded-full\"\n style={[\n styles.thumb,\n {\n width: config.thumb,\n height: config.thumb,\n backgroundColor: colors.textInverse,\n transform: [{ translateX: thumbPosition }],\n shadowColor: '#000000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.25,\n shadowRadius: 1,\n },\n ]}\n />\n </AppView>\n </TouchableOpacity>\n );\n}\n\nconst styles = StyleSheet.create({\n track: {\n justifyContent: 'center',\n padding: 2,\n },\n thumb: {\n elevation: 2,\n shadowColor: '#000000',\n shadowOffset: { width: 0, height: 1 },\n shadowOpacity: 0.2,\n shadowRadius: 1,\n },\n});\n","import { useState, useCallback, useRef } from 'react';\nimport {\n View,\n PanResponder,\n GestureResponderEvent,\n PanResponderGestureState,\n StyleSheet,\n LayoutChangeEvent,\n} from 'react-native';\nimport { AppView, AppText } from '@/ui/primitives';\nimport { cn } from '@/utils';\nimport { useFormThemeColors } from './useFormTheme';\n\n/**\n * Slider 组件属性接口\n */\nexport interface SliderProps {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n showTooltip?: boolean;\n onChange?: (value: number) => void;\n onChangeEnd?: (value: number) => void;\n className?: string;\n}\n\n/**\n * Slider - 滑块组件,支持浅色/深色主题\n */\nexport function Slider({\n value,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n showTooltip = false,\n onChange,\n onChangeEnd,\n className,\n}: SliderProps) {\n const colors = useFormThemeColors();\n const [internalValue, setInternalValue] = useState(defaultValue);\n const [trackWidth, setTrackWidth] = useState(0);\n const [isDragging, setIsDragging] = useState(false);\n\n const currentValue = value !== undefined ? value : internalValue;\n\n // 主题颜色\n const disabledOpacity = 0.4;\n\n // 计算进度百分比\n const progress = ((currentValue - min) / (max - min)) * 100;\n\n // 根据位置计算值\n const getValueFromPosition = useCallback(\n (position: number) => {\n const percentage = Math.max(0, Math.min(1, position / trackWidth));\n const rawValue = min + percentage * (max - min);\n // 对齐到 step\n const steppedValue = Math.round(rawValue / step) * step;\n return Math.min(max, Math.max(min, steppedValue));\n },\n [trackWidth, min, max, step]\n );\n\n // 设置值\n const setValue = useCallback(\n (newValue: number) => {\n const clampedValue = Math.min(max, Math.max(min, newValue));\n if (value === undefined) {\n setInternalValue(clampedValue);\n }\n onChange?.(clampedValue);\n },\n [value, min, max, onChange]\n );\n\n // PanResponder 处理手势\n const panResponder = useRef(\n PanResponder.create({\n onStartShouldSetPanResponder: () => !disabled,\n onMoveShouldSetPanResponder: () => !disabled,\n onPanResponderGrant: () => {\n setIsDragging(true);\n },\n onPanResponderMove: (_: GestureResponderEvent, gestureState: PanResponderGestureState) => {\n const position = (progress / 100) * trackWidth + gestureState.dx;\n const newValue = getValueFromPosition(position);\n setValue(newValue);\n },\n onPanResponderRelease: (_: GestureResponderEvent, gestureState: PanResponderGestureState) => {\n const position = (progress / 100) * trackWidth + gestureState.dx;\n const newValue = getValueFromPosition(position);\n setValue(newValue);\n setIsDragging(false);\n onChangeEnd?.(newValue);\n },\n })\n ).current;\n\n // 处理点击轨道\n const handleTrackPress = useCallback(\n (event: GestureResponderEvent) => {\n if (disabled) return;\n const { locationX } = event.nativeEvent;\n const newValue = getValueFromPosition(locationX);\n setValue(newValue);\n onChangeEnd?.(newValue);\n },\n [disabled, getValueFromPosition, setValue, onChangeEnd]\n );\n\n // 测量轨道宽度\n const onLayout = useCallback((event: LayoutChangeEvent) => {\n setTrackWidth(event.nativeEvent.layout.width);\n }, []);\n\n return (\n <AppView className={cn('py-2', className)}>\n {/* Tooltip */}\n {showTooltip && isDragging && (\n <AppView\n className=\"absolute rounded px-2 py-1 -top-8\"\n style={[\n styles.tooltip,\n {\n backgroundColor: colors.surfaceMuted,\n left: `${progress}%`,\n transform: [{ translateX: -16 }],\n },\n ]}\n >\n <AppText size=\"xs\" style={{ color: colors.text }}>\n {Math.round(currentValue)}\n </AppText>\n {/* Tooltip arrow */}\n <AppView\n style={[\n styles.tooltipArrow,\n {\n borderTopColor: colors.surfaceMuted,\n },\n ]}\n />\n </AppView>\n )}\n\n {/* Track */}\n <View\n onLayout={onLayout}\n className=\"rounded-full\"\n style={[\n styles.track,\n { backgroundColor: colors.divider, opacity: disabled ? disabledOpacity : 1 },\n ]}\n onTouchEnd={handleTrackPress}\n >\n {/* Filled track */}\n <AppView\n className=\"rounded-full\"\n style={[\n styles.filledTrack,\n {\n backgroundColor: colors.primary,\n width: `${progress}%`,\n },\n ]}\n />\n\n {/* Thumb */}\n <AppView\n className=\"absolute rounded-full items-center justify-center\"\n style={[\n styles.thumb,\n {\n backgroundColor: colors.textInverse,\n left: `${progress}%`,\n transform: [{ translateX: -12 }],\n shadowColor: '#000000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 2,\n },\n ]}\n {...panResponder.panHandlers}\n >\n {/* Thumb inner dot */}\n <AppView\n className=\"rounded-full\"\n style={[\n styles.thumbDot,\n {\n backgroundColor: colors.primary,\n },\n ]}\n />\n </AppView>\n </View>\n </AppView>\n );\n}\n\nconst styles = StyleSheet.create({\n track: {\n height: 6,\n width: '100%',\n },\n filledTrack: {\n height: 6,\n },\n thumb: {\n width: 24,\n height: 24,\n top: -9,\n elevation: 3,\n shadowColor: '#000000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.2,\n shadowRadius: 2,\n },\n thumbDot: {\n width: 8,\n height: 8,\n },\n tooltip: {\n minWidth: 32,\n alignItems: 'center',\n elevation: 4,\n },\n tooltipArrow: {\n position: 'absolute',\n bottom: -4,\n width: 0,\n height: 0,\n borderLeftWidth: 4,\n borderRightWidth: 4,\n borderTopWidth: 4,\n borderLeftColor: 'transparent',\n borderRightColor: 'transparent',\n },\n});\n","import { useMemo } from 'react';\nimport { useOptionalTheme, useThemeColors } from '@/theme';\n\nexport interface FormThemeColors {\n primary: string;\n primarySurface: string;\n surface: string;\n surfaceMuted: string;\n headerSurface: string;\n text: string;\n textSecondary: string;\n textMuted: string;\n textInverse: string;\n border: string;\n divider: string;\n icon: string;\n overlay: string;\n}\n\nexport function useFormThemeColors(): FormThemeColors {\n const { isDark } = useOptionalTheme();\n const colors = useThemeColors();\n\n return useMemo(\n () => ({\n primary: colors.primary,\n primarySurface: colors.primarySurface,\n surface: colors.cardElevated,\n surfaceMuted: isDark ? colors.divider : '#f3f4f6',\n headerSurface: isDark ? '#111827' : '#f3f4f6',\n text: colors.text,\n textSecondary: colors.textSecondary,\n textMuted: colors.textMuted,\n textInverse: colors.textInverse,\n border: colors.border,\n divider: colors.divider,\n icon: colors.textMuted,\n overlay: 'rgba(0,0,0,0.5)',\n }),\n [colors, isDark]\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport {\n Modal,\n View,\n TouchableOpacity,\n FlatList,\n TextInput,\n GestureResponderEvent,\n StyleSheet,\n} from 'react-native';\nimport { AppView, AppText, AppPressable } from '@/ui/primitives';\nimport { Icon } from '@/ui/display';\nimport { cn } from '@/utils';\nimport { useFormThemeColors } from './useFormTheme';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\nexport interface SelectProps {\n /** 选中值 */\n value?: string | string[];\n /** 变化回调 */\n onChange?: (value: string | string[]) => void;\n /** 选项列表 */\n options: SelectOption[];\n /** 占位文字 */\n placeholder?: string;\n /** 是否多选 */\n multiple?: boolean;\n /** 是否可搜索 */\n searchable?: boolean;\n /** 搜索回调(异步搜索时使用) */\n onSearch?: (keyword: string) => void;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否可清空 */\n clearable?: boolean;\n /** 自定义样式 */\n className?: string;\n}\n\n/**\n * 底部弹出选择器组件,支持浅色/深色主题\n */\nexport function Select({\n value,\n onChange,\n options,\n placeholder = '请选择',\n multiple = false,\n searchable = false,\n onSearch,\n disabled = false,\n clearable = true,\n className,\n}: SelectProps) {\n const colors = useFormThemeColors();\n const [visible, setVisible] = useState(false);\n const [searchKeyword, setSearchKeyword] = useState('');\n\n // 处理值格式\n const selectedValues = useMemo(() => {\n if (multiple) {\n return Array.isArray(value) ? value : [];\n }\n return value ? [value] : [];\n }, [value, multiple]);\n\n // 显示文本\n const displayText = useMemo(() => {\n if (selectedValues.length === 0) return placeholder;\n const selectedLabels = options\n .filter(opt => selectedValues.includes(opt.value))\n .map(opt => opt.label);\n return selectedLabels.join(', ') || placeholder;\n }, [selectedValues, options, placeholder]);\n\n // 过滤选项\n const filteredOptions = useMemo(() => {\n if (!searchable || !searchKeyword) return options;\n return options.filter(opt => opt.label.toLowerCase().includes(searchKeyword.toLowerCase()));\n }, [options, searchable, searchKeyword]);\n\n // 选择处理\n const handleSelect = useCallback(\n (optionValue: string) => {\n if (multiple) {\n const currentValues = Array.isArray(value) ? value : [];\n const newValues = currentValues.includes(optionValue)\n ? currentValues.filter(v => v !== optionValue)\n : [...currentValues, optionValue];\n onChange?.(newValues);\n } else {\n onChange?.(optionValue);\n setVisible(false);\n }\n },\n [multiple, value, onChange]\n );\n\n // 清空\n const handleClear = useCallback(\n (e: GestureResponderEvent) => {\n e.stopPropagation();\n onChange?.(multiple ? [] : '');\n },\n [multiple, onChange]\n );\n\n // 搜索处理\n const handleSearch = useCallback(\n (text: string) => {\n setSearchKeyword(text);\n onSearch?.(text);\n },\n [onSearch]\n );\n\n // 渲染选项\n const renderOption = useCallback(\n ({ item }: { item: SelectOption }) => {\n const isSelected = selectedValues.includes(item.value);\n return (\n <AppPressable\n className={cn(\n 'flex-row items-center justify-between px-4 py-3',\n isSelected && 'bg-primary-50'\n )}\n style={[\n styles.optionItem,\n { borderBottomColor: colors.divider },\n isSelected && { backgroundColor: colors.primarySurface },\n ]}\n onPress={() => handleSelect(item.value)}\n >\n <AppText style={{ color: isSelected ? colors.primary : colors.text }}>\n {item.label}\n </AppText>\n {isSelected && <Icon name=\"check\" size=\"sm\" color=\"primary-500\" />}\n </AppPressable>\n );\n },\n [selectedValues, handleSelect, colors]\n );\n\n return (\n <>\n {/* 触发区域 */}\n <AppPressable\n className={cn(\n 'flex-row items-center justify-between px-4 py-3 rounded-lg',\n disabled ? 'opacity-60' : '',\n className\n )}\n style={[styles.trigger, { backgroundColor: colors.surface, borderColor: colors.border }]}\n disabled={disabled}\n onPress={() => setVisible(true)}\n >\n <AppText\n className=\"flex-1\"\n style={{ color: selectedValues.length === 0 ? colors.textMuted : colors.text }}\n numberOfLines={1}\n >\n {displayText}\n </AppText>\n <View className=\"flex-row items-center\">\n {clearable && selectedValues.length > 0 && !disabled && (\n <TouchableOpacity onPress={handleClear} className=\"mr-2 p-1\">\n <Icon name=\"close\" size=\"sm\" color={colors.icon} />\n </TouchableOpacity>\n )}\n <Icon name=\"keyboard-arrow-down\" size=\"md\" color={colors.icon} />\n </View>\n </AppPressable>\n\n {/* 选择弹窗 */}\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={() => setVisible(false)}\n >\n <AppView className=\"flex-1\" style={{ backgroundColor: colors.overlay }} justify=\"end\">\n <AppView\n className=\"rounded-t-2xl max-h-[70%]\"\n style={{ backgroundColor: colors.surface }}\n >\n {/* 头部 */}\n <AppView\n row\n between\n items=\"center\"\n className=\"px-4 py-3\"\n style={[styles.header, { borderBottomColor: colors.divider }]}\n >\n <AppText className=\"text-lg font-semibold\" style={{ color: colors.text }}>\n {multiple ? '选择选项' : '请选择'}\n </AppText>\n <TouchableOpacity onPress={() => setVisible(false)}>\n <Icon name=\"close\" size=\"md\" color={colors.icon} />\n </TouchableOpacity>\n </AppView>\n\n {/* 搜索框 */}\n {searchable && (\n <AppView\n className=\"px-4 py-3\"\n style={[styles.searchBox, { borderBottomColor: colors.divider }]}\n >\n <AppView\n row\n items=\"center\"\n className=\"px-3 py-2 rounded-lg\"\n style={{ backgroundColor: colors.surfaceMuted }}\n >\n <View style={{ marginRight: 8 }}>\n <Icon name=\"search\" size=\"sm\" color={colors.icon} />\n </View>\n <TextInput\n className=\"flex-1 text-base\"\n style={{ color: colors.text }}\n placeholder=\"搜索...\"\n placeholderTextColor={colors.textMuted}\n value={searchKeyword}\n onChangeText={handleSearch}\n autoFocus\n />\n {searchKeyword.length > 0 && (\n <TouchableOpacity onPress={() => setSearchKeyword('')}>\n <Icon name=\"close\" size=\"sm\" color={colors.icon} />\n </TouchableOpacity>\n )}\n </AppView>\n </AppView>\n )}\n\n {/* 选项列表 */}\n <FlatList\n data={filteredOptions}\n keyExtractor={item => item.value}\n renderItem={renderOption}\n ListEmptyComponent={\n <AppView center className=\"py-8\">\n <AppText style={{ color: colors.textMuted }}>暂无选项</AppText>\n </AppView>\n }\n />\n\n {/* 多选底部操作栏 */}\n {multiple && (\n <AppView\n row\n between\n items=\"center\"\n className=\"px-4 py-3\"\n style={[styles.footer, { borderTopColor: colors.divider }]}\n >\n <AppText style={{ color: colors.textMuted }}>\n 已选择 {selectedValues.length} 项\n </AppText>\n <TouchableOpacity\n className=\"px-4 py-2 rounded-lg\"\n style={{ backgroundColor: colors.primary }}\n onPress={() => setVisible(false)}\n >\n <AppText className=\"font-medium\" style={{ color: colors.textInverse }}>\n 确定\n </AppText>\n </TouchableOpacity>\n </AppView>\n )}\n </AppView>\n </AppView>\n </Modal>\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n trigger: {\n borderWidth: 0.5,\n },\n header: {\n borderBottomWidth: 0.5,\n },\n searchBox: {\n borderBottomWidth: 0.5,\n },\n optionItem: {\n borderBottomWidth: 0.5,\n },\n footer: {\n borderTopWidth: 0.5,\n },\n});\n","import { useState, useCallback, useMemo } from 'react';\nimport { Modal, TouchableOpacity, StyleSheet } from 'react-native';\nimport { AppView, AppText, AppPressable } from '@/ui/primitives';\nimport { Icon } from '@/ui/display';\nimport { cn, formatDate } from '@/utils';\nimport { useFormThemeColors, type FormThemeColors } from './useFormTheme';\n\n/**\n * DatePicker 组件属性接口\n */\nexport interface DatePickerProps {\n /** 选中日期 */\n value?: Date;\n /** 变化回调 */\n onChange?: (date: Date) => void;\n /** 占位文字 */\n placeholder?: string;\n /** 是否禁用 */\n disabled?: boolean;\n /** 日期格式 */\n format?: string;\n /** 最小日期 */\n minDate?: Date;\n /** 最大日期 */\n maxDate?: Date;\n /** 自定义样式 */\n className?: string;\n}\n\ninterface PickerColumnProps {\n title: string;\n values: number[];\n selectedValue: number;\n onSelect: (value: number) => void;\n isDisabled: (value: number) => boolean;\n formatLabel?: (value: number) => string;\n showDivider?: boolean;\n colors: FormThemeColors;\n}\n\nfunction PickerColumn({\n title,\n values,\n selectedValue,\n onSelect,\n isDisabled,\n formatLabel = value => String(value),\n showDivider = false,\n colors,\n}: PickerColumnProps) {\n return (\n <AppView\n flex\n style={[\n showDivider && styles.column,\n showDivider ? { borderRightColor: colors.divider } : undefined,\n ]}\n >\n <AppView center className=\"py-2\" style={{ backgroundColor: colors.headerSurface }}>\n <AppText className=\"text-sm font-medium\" style={{ color: colors.textMuted }}>\n {title}\n </AppText>\n </AppView>\n <AppView className=\"flex-1\">\n {values.map(value => {\n const selected = selectedValue === value;\n const disabled = isDisabled(value);\n\n return (\n <TouchableOpacity\n key={value}\n className={cn('py-2 items-center', selected && 'bg-primary-50')}\n style={selected ? { backgroundColor: colors.primarySurface } : undefined}\n disabled={disabled}\n onPress={() => onSelect(value)}\n >\n <AppText\n className={cn(selected ? 'font-semibold' : undefined, disabled && 'opacity-30')}\n style={{\n color: selected ? colors.primary : colors.textSecondary,\n }}\n >\n {formatLabel(value)}\n </AppText>\n </TouchableOpacity>\n );\n })}\n </AppView>\n </AppView>\n );\n}\n\n/**\n * DatePicker - 日期选择器组件,支持浅色/深色主题\n */\nexport function DatePicker({\n value,\n onChange,\n placeholder = '请选择日期',\n disabled = false,\n format = 'yyyy-MM-dd',\n minDate,\n maxDate,\n className,\n}: DatePickerProps) {\n const colors = useFormThemeColors();\n const [visible, setVisible] = useState(false);\n const [tempDate, setTempDate] = useState<Date>(value || new Date());\n\n // 显示文本\n const displayText = useMemo(() => {\n return value ? formatDate(value, format) : placeholder;\n }, [value, format, placeholder]);\n\n // 确认选择\n const handleConfirm = useCallback(() => {\n onChange?.(tempDate);\n setVisible(false);\n }, [tempDate, onChange]);\n\n // 生成年份选项(前后50年)\n const years = useMemo(() => {\n const currentYear = new Date().getFullYear();\n const arr: number[] = [];\n for (let i = currentYear - 50; i <= currentYear + 50; i++) {\n arr.push(i);\n }\n return arr;\n }, []);\n\n // 生成月份选项\n const months = useMemo(() => {\n return Array.from({ length: 12 }, (_, i) => i + 1);\n }, []);\n\n // 生成日期选项\n const days = useMemo(() => {\n const year = tempDate.getFullYear();\n const month = tempDate.getMonth();\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n return Array.from({ length: daysInMonth }, (_, i) => i + 1);\n }, [tempDate]);\n\n // 检查日期是否可用\n const isDateDisabled = useCallback(\n (year: number, month: number, day: number) => {\n const date = new Date(year, month - 1, day);\n if (minDate && date < minDate) return true;\n if (maxDate && date > maxDate) return true;\n return false;\n },\n [minDate, maxDate]\n );\n\n // 更新临时日期\n const updateTempDate = useCallback(\n (year?: number, month?: number, day?: number) => {\n const newDate = new Date(tempDate);\n if (year !== undefined) newDate.setFullYear(year);\n if (month !== undefined) newDate.setMonth(month - 1);\n if (day !== undefined) newDate.setDate(day);\n setTempDate(newDate);\n },\n [tempDate]\n );\n\n return (\n <>\n {/* 触发区域 */}\n <AppPressable\n className={cn(\n 'flex-row items-center justify-between px-4 py-3 rounded-lg',\n disabled ? 'opacity-60' : '',\n className\n )}\n style={[styles.trigger, { backgroundColor: colors.surface, borderColor: colors.border }]}\n disabled={disabled}\n onPress={() => {\n setTempDate(value || new Date());\n setVisible(true);\n }}\n >\n <AppText\n className=\"flex-1\"\n style={{ color: value ? colors.text : colors.textMuted }}\n numberOfLines={1}\n >\n {displayText}\n </AppText>\n <Icon name=\"calendar-today\" size=\"md\" color={colors.icon} />\n </AppPressable>\n\n {/* 日期选择弹窗 */}\n <Modal\n visible={visible}\n transparent\n animationType=\"slide\"\n onRequestClose={() => setVisible(false)}\n >\n <AppView className=\"flex-1\" style={{ backgroundColor: colors.overlay }} justify=\"end\">\n <AppView className=\"rounded-t-2xl\" style={{ backgroundColor: colors.surface }}>\n {/* 头部 */}\n <AppView\n row\n between\n items=\"center\"\n className=\"px-4 py-3\"\n style={[styles.header, { borderBottomColor: colors.divider }]}\n >\n <TouchableOpacity onPress={() => setVisible(false)}>\n <AppText style={{ color: colors.textMuted }}>取消</AppText>\n </TouchableOpacity>\n <AppText className=\"text-lg font-semibold\" style={{ color: colors.text }}>\n 选择日期\n </AppText>\n <TouchableOpacity onPress={handleConfirm}>\n <AppText style={{ color: colors.primary }} className=\"font-medium\">\n 确定\n </AppText>\n </TouchableOpacity>\n </AppView>\n\n {/* 日期显示 */}\n <AppView center className=\"py-4\" style={{ backgroundColor: colors.headerSurface }}>\n <AppText className=\"text-2xl font-semibold\" style={{ color: colors.text }}>\n {formatDate(tempDate, 'yyyy年MM月dd日')}\n </AppText>\n </AppView>\n\n {/* 选择器区域 */}\n <AppView row className=\"h-48\">\n <PickerColumn\n title=\"年\"\n values={years}\n selectedValue={tempDate.getFullYear()}\n onSelect={year => updateTempDate(year)}\n isDisabled={year =>\n isDateDisabled(year, tempDate.getMonth() + 1, tempDate.getDate())\n }\n colors={colors}\n showDivider\n />\n <PickerColumn\n title=\"月\"\n values={months}\n selectedValue={tempDate.getMonth() + 1}\n onSelect={month => updateTempDate(undefined, month)}\n isDisabled={month =>\n isDateDisabled(tempDate.getFullYear(), month, tempDate.getDate())\n }\n formatLabel={month => `${month}月`}\n colors={colors}\n showDivider\n />\n <PickerColumn\n title=\"日\"\n values={days}\n selectedValue={tempDate.getDate()}\n onSelect={day => updateTempDate(undefined, undefined, day)}\n isDisabled={day =>\n isDateDisabled(tempDate.getFullYear(), tempDate.getMonth() + 1, day)\n }\n colors={colors}\n />\n </AppView>\n\n {/* 快捷操作 */}\n <AppView\n row\n className=\"px-4 py-3 gap-2\"\n style={[styles.footer, { borderTopColor: colors.divider }]}\n >\n <TouchableOpacity\n className=\"flex-1 py-2 items-center rounded-lg\"\n style={{ backgroundColor: colors.surfaceMuted }}\n onPress={() => setTempDate(new Date())}\n >\n <AppText style={{ color: colors.text }}>今天</AppText>\n </TouchableOpacity>\n {minDate && (\n <TouchableOpacity\n className=\"flex-1 py-2 items-center rounded-lg\"\n style={{ backgroundColor: colors.surfaceMuted }}\n onPress={() => setTempDate(minDate)}\n >\n <AppText style={{ color: colors.text }}>最早</AppText>\n </TouchableOpacity>\n )}\n {maxDate && (\n <TouchableOpacity\n className=\"flex-1 py-2 items-center rounded-lg\"\n style={{ backgroundColor: colors.surfaceMuted }}\n onPress={() => setTempDate(maxDate)}\n >\n <AppText style={{ color: colors.text }}>最晚</AppText>\n </TouchableOpacity>\n )}\n </AppView>\n </AppView>\n </AppView>\n </Modal>\n </>\n );\n}\n\nconst styles = StyleSheet.create({\n trigger: {\n borderWidth: 0.5,\n },\n header: {\n borderBottomWidth: 0.5,\n },\n column: {\n borderRightWidth: 0.5,\n },\n footer: {\n borderTopWidth: 0.5,\n },\n});\n","import { AppView, AppText } from '@/ui/primitives';\nimport { useThemeColors } from '@/theme';\nimport { cn } from '@/utils';\n\nexport interface FormItemProps {\n name: string;\n label?: string;\n error?: string;\n help?: string;\n required?: boolean;\n children: React.ReactNode;\n /** 自定义样式 */\n className?: string;\n /** 标签样式 */\n labelClassName?: string;\n}\n\nexport function FormItem({\n name: _name,\n label,\n error,\n help,\n required,\n children,\n className,\n labelClassName,\n}: FormItemProps) {\n const colors = useThemeColors();\n\n return (\n <AppView className={cn('mb-4', className)}>\n {label && (\n <AppView row items=\"center\" gap={1} className={cn('mb-2', labelClassName)}>\n <AppText size=\"sm\" weight=\"medium\" style={{ color: colors.textSecondary }}>\n {label}\n </AppText>\n {required && <AppText color=\"error-500\">*</AppText>}\n </AppView>\n )}\n {children}\n {error && (\n <AppText size=\"sm\" color=\"error-500\" className=\"mt-1\">\n {error}\n </AppText>\n )}\n {help && !error && (\n <AppText size=\"sm\" className=\"mt-1\" style={{ color: colors.textMuted }}>\n {help}\n </AppText>\n )}\n </AppView>\n );\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport type { ZodSchema } from 'zod';\n\ninterface UseFormOptions<T extends Record<string, any>> {\n schema: ZodSchema<T>;\n defaultValues: T;\n}\n\ninterface FormErrors {\n [key: string]: string;\n}\n\nexport function useForm<T extends Record<string, any>>({\n schema,\n defaultValues,\n}: UseFormOptions<T>) {\n const [values, setValues] = useState<T>(defaultValues);\n const [errors, setErrors] = useState<FormErrors>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const isDirty = useMemo(() => {\n return JSON.stringify(values) !== JSON.stringify(defaultValues);\n }, [values, defaultValues]);\n\n const isValid = useMemo(() => {\n return Object.keys(errors).length === 0;\n }, [errors]);\n\n const setValue = useCallback((name: keyof T, value: any) => {\n setValues(prev => ({ ...prev, [name]: value }));\n setErrors(prev => {\n const next = { ...prev };\n delete next[name as string];\n return next;\n });\n }, []);\n\n const getValue = useCallback(\n (name: keyof T) => {\n return values[name];\n },\n [values]\n );\n\n const validateField = useCallback(\n async (name: keyof T) => {\n try {\n const shape = (schema as any).shape;\n if (shape && shape[name as string]) {\n await shape[name as string].parseAsync(values[name]);\n setErrors(prev => {\n const next = { ...prev };\n delete next[name as string];\n return next;\n });\n return true;\n }\n return true;\n } catch (error: any) {\n setErrors(prev => ({\n ...prev,\n [name]: error.errors?.[0]?.message || '验证失败',\n }));\n return false;\n }\n },\n [schema, values]\n );\n\n const validate = useCallback(async () => {\n try {\n await schema.parseAsync(values);\n setErrors({});\n return true;\n } catch (error: any) {\n const formErrors: FormErrors = {};\n error.errors?.forEach((err: any) => {\n const path = err.path.join('.');\n formErrors[path] = err.message;\n });\n setErrors(formErrors);\n return false;\n }\n }, [schema, values]);\n\n const reset = useCallback(() => {\n setValues(defaultValues);\n setErrors({});\n setIsSubmitting(false);\n }, [defaultValues]);\n\n const handleSubmit = useCallback(\n async (onSubmit?: (values: T) => void | Promise<void>) => {\n const valid = await validate();\n if (!valid) return;\n\n setIsSubmitting(true);\n try {\n await onSubmit?.(values);\n } finally {\n setIsSubmitting(false);\n }\n },\n [validate, values]\n );\n\n return {\n values,\n errors,\n isValid,\n isDirty,\n isSubmitting,\n setValue,\n getValue,\n validate,\n validateField,\n reset,\n handleSubmit,\n };\n}\n","import { useCallback, useState } from 'react';\n\nexport interface UseToggleActions {\n /** 切换布尔值 */\n toggle: () => void;\n /** 设置为指定值 */\n set: (value: boolean) => void;\n /** 设置为 true */\n setTrue: () => void;\n /** 设置为 false */\n setFalse: () => void;\n}\n\n/**\n * 布尔值切换 Hook\n * @param defaultValue - 默认值\n * @returns [当前值, 操作集合]\n *\n * @example\n * ```tsx\n * const [visible, { toggle, setTrue, setFalse }] = useToggle(false);\n *\n * <Button onPress={toggle}>{visible ? '隐藏' : '显示'}</Button>\n * {visible && <Modal onClose={setFalse} />}\n * ```\n */\nexport function useToggle(defaultValue = false): [boolean, UseToggleActions] {\n const [value, setValue] = useState(defaultValue);\n\n const toggle = useCallback(() => {\n setValue(v => !v);\n }, []);\n\n const set = useCallback((newValue: boolean) => {\n setValue(newValue);\n }, []);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, { toggle, set, setTrue, setFalse }];\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * 防抖 Hook\n * @param value - 需要防抖的值\n * @param delay - 延迟时间(毫秒),默认 500ms\n * @returns 防抖后的值\n *\n * @example\n * ```tsx\n * const [keyword, setKeyword] = useState('');\n * const debouncedKeyword = useDebounce(keyword, 500);\n *\n * // 使用 debouncedKeyword 进行搜索\n * useEffect(() => {\n * search(debouncedKeyword);\n * }, [debouncedKeyword]);\n * ```\n */\nexport function useDebounce<T>(value: T, delay = 500): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * 节流 Hook\n * @param value - 需要节流的值\n * @param delay - 节流间隔(毫秒),默认 200ms\n * @returns 节流后的值\n *\n * @example\n * ```tsx\n * const [scrollY, setScrollY] = useState(0);\n * const throttledScrollY = useThrottle(scrollY, 200);\n *\n * // 使用 throttledScrollY 更新 UI(如头部透明度)\n * const headerOpacity = Math.min(throttledScrollY / 200, 1);\n * ```\n */\nexport function useThrottle<T>(value: T, delay = 200): T {\n const [throttledValue, setThrottledValue] = useState(value);\n const lastUpdatedRef = useRef(Date.now());\n\n useEffect(() => {\n const now = Date.now();\n const timeElapsed = now - lastUpdatedRef.current;\n\n if (timeElapsed >= delay) {\n lastUpdatedRef.current = now;\n setThrottledValue(value);\n return undefined;\n } else {\n const timer = setTimeout(() => {\n lastUpdatedRef.current = Date.now();\n setThrottledValue(value);\n }, delay - timeElapsed);\n\n return () => {\n clearTimeout(timer);\n };\n }\n }, [value, delay]);\n\n return throttledValue;\n}\n","import { useEffect, useState, useCallback } from 'react';\nimport { Keyboard, KeyboardEvent, Platform } from 'react-native';\n\nexport interface UseKeyboardReturn {\n /** 键盘是否显示 */\n visible: boolean;\n /** 键盘高度 */\n height: number;\n /** 关闭键盘 */\n dismiss: () => void;\n}\n\n/**\n * 键盘状态监听 Hook\n * @returns 键盘状态和控制方法\n *\n * @example\n * ```tsx\n * const { visible, height, dismiss } = useKeyboard();\n *\n * <ScrollView contentContainerStyle={{ paddingBottom: visible ? height : 0 }}>\n * {\\/* 内容 *\\/}\n * </ScrollView>\n * ```\n */\nexport function useKeyboard(): UseKeyboardReturn {\n const [visible, setVisible] = useState(false);\n const [height, setHeight] = useState(0);\n\n useEffect(() => {\n const handleKeyboardWillShow = (event: KeyboardEvent) => {\n setVisible(true);\n setHeight(event.endCoordinates.height);\n };\n\n const handleKeyboardDidShow = (event: KeyboardEvent) => {\n setVisible(true);\n setHeight(event.endCoordinates.height);\n };\n\n const handleKeyboardWillHide = () => {\n setVisible(false);\n setHeight(0);\n };\n\n const handleKeyboardDidHide = () => {\n setVisible(false);\n setHeight(0);\n };\n\n // iOS 使用 will 事件获得更流畅的动画\n const willShowSub = Keyboard.addListener(\n Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow',\n Platform.OS === 'ios' ? handleKeyboardWillShow : handleKeyboardDidShow\n );\n const willHideSub = Keyboard.addListener(\n Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide',\n Platform.OS === 'ios' ? handleKeyboardWillHide : handleKeyboardDidHide\n );\n\n return () => {\n willShowSub.remove();\n willHideSub.remove();\n };\n }, []);\n\n const dismiss = useCallback(() => {\n Keyboard.dismiss();\n }, []);\n\n return { visible, height, dismiss };\n}\n","import { useEffect, useState } from 'react';\nimport { Dimensions, ScaledSize } from 'react-native';\n\nexport interface UseDimensionsReturn {\n /** 屏幕宽度 */\n width: number;\n /** 屏幕高度 */\n height: number;\n /** 屏幕像素密度 */\n scale: number;\n /** 字体缩放比例 */\n fontScale: number;\n}\n\n/**\n * 屏幕尺寸变化监听 Hook\n * @returns 屏幕尺寸信息\n *\n * @example\n * ```tsx\n * const { width, height } = useDimensions();\n *\n * // 根据宽度决定列数\n * const numColumns = width > 600 ? 3 : 2;\n * ```\n */\nexport function useDimensions(): UseDimensionsReturn {\n const [dimensions, setDimensions] = useState(() => {\n const window = Dimensions.get('window');\n return {\n width: window.width,\n height: window.height,\n scale: window.scale,\n fontScale: window.fontScale,\n };\n });\n\n useEffect(() => {\n const handleChange = ({ window }: { window: ScaledSize }) => {\n setDimensions({\n width: window.width,\n height: window.height,\n scale: window.scale,\n fontScale: window.fontScale,\n });\n };\n\n const subscription = Dimensions.addEventListener('change', handleChange);\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return dimensions;\n}\n","import { useEffect, useState } from 'react';\nimport { Dimensions, ScaledSize } from 'react-native';\n\nexport type Orientation = 'portrait' | 'landscape';\n\nexport interface UseOrientationReturn {\n /** 当前方向 */\n orientation: Orientation;\n /** 是否为竖屏 */\n isPortrait: boolean;\n /** 是否为横屏 */\n isLandscape: boolean;\n}\n\n/**\n * 横竖屏切换监听 Hook\n * @returns 方向状态\n *\n * @example\n * ```tsx\n * const { orientation, isPortrait } = useOrientation();\n *\n * <View style={{ flexDirection: isPortrait ? 'column' : 'row' }}>\n * {\\/* 内容 *\\/}\n * </View>\n * ```\n */\nexport function useOrientation(): UseOrientationReturn {\n const getOrientation = (): Orientation => {\n const { width, height } = Dimensions.get('window');\n return width > height ? 'landscape' : 'portrait';\n };\n\n const [orientation, setOrientation] = useState<Orientation>(getOrientation);\n\n useEffect(() => {\n const handleChange = ({ window }: { window: ScaledSize }) => {\n const newOrientation = window.width > window.height ? 'landscape' : 'portrait';\n setOrientation(newOrientation);\n };\n\n const subscription = Dimensions.addEventListener('change', handleChange);\n\n return () => {\n subscription.remove();\n };\n }, []);\n\n return {\n orientation,\n isPortrait: orientation === 'portrait',\n isLandscape: orientation === 'landscape',\n };\n}\n","/**\n * 导航提供者组件\n *\n * @module navigation/provider\n * @description 提供 NavigationContainer 配置,管理导航状态和主题\n */\n\nimport React from 'react';\nimport {\n NavigationContainer,\n type LinkingOptions,\n type Theme as NavigationTheme,\n} from '@react-navigation/native';\nimport { useTheme } from '@/theme';\nimport { createNavigationTheme } from './utils/navigation-theme';\n\n/**\n * 导航提供者组件 Props\n */\nexport interface NavigationProviderProps {\n /** 子元素(导航器组件) */\n children: React.ReactNode;\n /** 深度链接配置(可选) */\n linking?: LinkingOptions<any>;\n /** 加载时的回退组件 */\n fallback?: React.ReactNode;\n /** 导航准备就绪时的回调 */\n onReady?: () => void;\n /** 状态变化时的回调 */\n onStateChange?: (state: any) => void;\n /** 未处理动作时的回调 */\n onUnhandledAction?: (action: any) => void;\n /** 自定义导航主题(覆盖默认主题) */\n theme?: NavigationTheme;\n}\n\n/**\n * 导航提供者组件\n *\n * 封装 NavigationContainer,自动集成应用主题。\n * 所有导航器必须包裹在 NavigationProvider 内。\n *\n * @example\n * ```tsx\n * // 基础使用\n * export default function App() {\n * return (\n * <NavigationProvider>\n * <StackNavigator>\n * <StackNavigator.Screen name=\"Home\" component={HomeScreen} />\n * </StackNavigator>\n * </NavigationProvider>\n * );\n * }\n *\n * // 带深度链接\n * export default function App() {\n * return (\n * <NavigationProvider\n * linking={{\n * prefixes: ['myapp://', 'https://myapp.com'],\n * config: {\n * screens: {\n * Home: 'home',\n * Detail: 'detail/:id',\n * },\n * },\n * }}\n * fallback={<LoadingScreen />}\n * >\n * <RootNavigator />\n * </NavigationProvider>\n * );\n * }\n * ```\n */\nexport function NavigationProvider({\n children,\n linking,\n fallback,\n onReady,\n onStateChange,\n onUnhandledAction,\n theme: customTheme,\n}: NavigationProviderProps) {\n const { theme, isDark } = useTheme();\n\n // 生成导航主题\n const navigationTheme = React.useMemo(\n () => customTheme || createNavigationTheme(theme, isDark),\n [customTheme, theme, isDark]\n );\n\n return (\n <NavigationContainer\n theme={navigationTheme}\n linking={linking}\n fallback={fallback}\n onReady={onReady}\n onStateChange={onStateChange}\n onUnhandledAction={onUnhandledAction}\n >\n {children}\n </NavigationContainer>\n );\n}\n","import type { Theme } from '@react-navigation/native';\nimport { getThemeColors, type Theme as PantherTheme } from '@/theme';\n\nexport function createNavigationTheme(pantherTheme: PantherTheme, isDark: boolean): Theme {\n const { primary, background, card, text, divider } = getThemeColors(pantherTheme, isDark);\n\n return {\n dark: isDark,\n colors: {\n primary,\n background,\n card,\n text,\n border: divider,\n notification: pantherTheme.colors.error?.[500] || '#ef4444',\n },\n fonts: {\n regular: { fontFamily: 'System', fontWeight: '400' },\n medium: { fontFamily: 'System', fontWeight: '500' },\n bold: { fontFamily: 'System', fontWeight: '700' },\n heavy: { fontFamily: 'System', fontWeight: '900' },\n },\n };\n}\n","export { createStackNavigator, TransitionPresets } from '@react-navigation/stack';\n\nexport type {\n StackNavigationProp as NativeStackNavigationProp,\n StackScreenProps as NativeStackScreenProps,\n} from '@react-navigation/stack';\n","/**\n * 堆栈导航器组件\n *\n * @module navigation/navigators/StackNavigator\n * @description 基于 @react-navigation/stack 的堆栈导航器封装\n */\n\nimport React from 'react';\nimport { createStackNavigator, TransitionPresets } from '../vendor/stack';\nimport type { StackParamList, StackNavigatorProps, StackRouteConfig } from '../types';\n\nconst NativeStack = createStackNavigator<StackParamList>();\n\n/** 默认屏幕选项 */\nconst defaultScreenOptions = {\n headerShown: false,\n ...TransitionPresets.SlideFromRightIOS,\n};\n\n/**\n * 堆栈导航器组件\n *\n * 封装 React Navigation 的 JS Stack Navigator,默认使用 iOS 风格的右滑推进转场。\n * 如需覆盖默认转场,请在 screenOptions 或单个 Screen options 中显式传入。\n *\n * @example\n * ```tsx\n * // JSX 方式\n * <StackNavigator initialRouteName=\"Home\">\n * <StackNavigator.Screen\n * name=\"Home\"\n * component={HomeScreen}\n * options={{ title: '首页' }}\n * />\n * <StackNavigator.Screen\n * name=\"Detail\"\n * component={DetailScreen}\n * options={{ title: '详情', headerShown: true }}\n * />\n * </StackNavigator>\n * ```\n */\nexport function StackNavigator({ initialRouteName, screenOptions, children }: StackNavigatorProps) {\n return (\n <NativeStack.Navigator\n initialRouteName={initialRouteName}\n screenOptions={{ ...defaultScreenOptions, ...screenOptions }}\n >\n {children}\n </NativeStack.Navigator>\n );\n}\n\n/**\n * 堆栈屏幕组件\n * 直接使用原生 Screen 以确保 React Navigation v7 兼容性\n */\nStackNavigator.Screen = NativeStack.Screen;\n\n/**\n * 堆栈分组组件\n * 用于对屏幕进行分组配置\n */\nStackNavigator.Group = NativeStack.Group;\n\n/**\n * 基于配置创建堆栈导航器\n * 支持更灵活的路由配置方式\n *\n * @example\n * ```tsx\n * const stackConfig: StackRouteConfig[] = [\n * { name: 'Home', component: HomeScreen, options: { title: '首页' } },\n * { name: 'Detail', component: DetailScreen },\n * ];\n *\n * <StackNavigator initialRouteName=\"Home\">\n * {createStackScreens(stackConfig)}\n * </StackNavigator>\n * ```\n */\nexport function createStackScreens(routes: StackRouteConfig[]): React.ReactNode[] {\n return routes.map(route => (\n <StackNavigator.Screen\n key={route.name}\n name={route.name as keyof StackParamList}\n component={route.component}\n options={route.options}\n initialParams={route.initialParams}\n />\n ));\n}\n","/**\n * 标签导航器组件\n *\n * @module navigation/navigators/TabNavigator\n * @description 基于 @react-navigation/bottom-tabs 的标签导航器封装\n */\n\nimport React from 'react';\nimport { createBottomTabNavigator } from '@react-navigation/bottom-tabs';\nimport { BottomTabBar } from '../components/BottomTabBar';\nimport type { TabParamList, TabNavigatorProps, TabRouteConfig } from '../types';\n\nconst NativeTab = createBottomTabNavigator<TabParamList>();\n\n/** 默认屏幕选项 */\nconst defaultScreenOptions = {\n headerShown: false,\n tabBarShowLabel: true,\n};\n\n/**\n * 标签导航器组件\n *\n * 封装 React Navigation 的 Bottom Tab Navigator\n *\n * @example\n * ```tsx\n * // JSX 方式\n * <TabNavigator\n * initialRouteName=\"Home\"\n * tabBarOptions={{ activeTintColor: '#f38b32' }}\n * >\n * <TabNavigator.Screen\n * name=\"Home\"\n * component={HomeScreen}\n * options={{\n * tabBarLabel: '首页',\n * tabBarIcon: ({ color, size }) => <Icon name=\"home\" color={color} size={size} />\n * }}\n * />\n * <TabNavigator.Screen\n * name=\"Profile\"\n * component={ProfileScreen}\n * options={{ tabBarLabel: '我的' }}\n * />\n * </TabNavigator>\n * ```\n */\nexport function TabNavigator({\n initialRouteName,\n tabBarOptions,\n tabBar,\n screenOptions,\n children,\n}: TabNavigatorProps) {\n // 合并标签栏选项到屏幕选项\n const mergedScreenOptions = React.useMemo(() => {\n const options: any = { ...defaultScreenOptions, ...screenOptions };\n\n if (tabBarOptions) {\n if (tabBarOptions.showLabel !== undefined) {\n options.tabBarShowLabel = tabBarOptions.showLabel;\n }\n if (tabBarOptions.activeTintColor) {\n options.tabBarActiveTintColor = tabBarOptions.activeTintColor;\n }\n if (tabBarOptions.inactiveTintColor) {\n options.tabBarInactiveTintColor = tabBarOptions.inactiveTintColor;\n }\n if (tabBarOptions.activeBackgroundColor) {\n options.tabBarActiveBackgroundColor = tabBarOptions.activeBackgroundColor;\n }\n if (tabBarOptions.inactiveBackgroundColor) {\n options.tabBarInactiveBackgroundColor = tabBarOptions.inactiveBackgroundColor;\n }\n if (tabBarOptions.hideOnKeyboard !== undefined) {\n options.tabBarHideOnKeyboard = tabBarOptions.hideOnKeyboard;\n }\n if (tabBarOptions.labelPosition) {\n options.tabBarLabelPosition = tabBarOptions.labelPosition;\n }\n if (tabBarOptions.labelStyle) {\n options.tabBarLabelStyle = tabBarOptions.labelStyle;\n }\n if (tabBarOptions.style) {\n options.tabBarStyle = tabBarOptions.style;\n }\n }\n\n return options;\n }, [tabBarOptions, screenOptions]);\n\n const resolvedTabBar = React.useMemo(() => {\n if (tabBar) return tabBar;\n\n return (props: Parameters<typeof BottomTabBar>[0]) => (\n <BottomTabBar\n {...props}\n showLabel={tabBarOptions?.showLabel}\n activeTintColor={tabBarOptions?.activeTintColor}\n inactiveTintColor={tabBarOptions?.inactiveTintColor}\n activeBackgroundColor={tabBarOptions?.activeBackgroundColor}\n inactiveBackgroundColor={tabBarOptions?.inactiveBackgroundColor}\n iconStyle={tabBarOptions?.iconStyle}\n labelStyle={tabBarOptions?.labelStyle}\n style={tabBarOptions?.style}\n height={tabBarOptions?.height}\n />\n );\n }, [\n tabBar,\n tabBarOptions?.showLabel,\n tabBarOptions?.activeTintColor,\n tabBarOptions?.inactiveTintColor,\n tabBarOptions?.activeBackgroundColor,\n tabBarOptions?.inactiveBackgroundColor,\n tabBarOptions?.iconStyle,\n tabBarOptions?.labelStyle,\n tabBarOptions?.style,\n tabBarOptions?.height,\n ]);\n\n return (\n <NativeTab.Navigator\n initialRouteName={initialRouteName}\n screenOptions={mergedScreenOptions}\n tabBar={resolvedTabBar}\n >\n {children}\n </NativeTab.Navigator>\n );\n}\n\n/**\n * 标签屏幕组件\n * 直接使用原生 Screen 以确保 React Navigation v7 兼容性\n */\nTabNavigator.Screen = NativeTab.Screen;\n\n/**\n * 基于配置创建标签屏幕\n *\n * @example\n * ```tsx\n * const tabConfig: TabRouteConfig[] = [\n * {\n * name: 'Home',\n * component: HomeScreen,\n * options: { tabBarLabel: '首页', tabBarIcon: HomeIcon }\n * },\n * {\n * name: 'Profile',\n * component: ProfileScreen,\n * options: { tabBarLabel: '我的' }\n * },\n * ];\n *\n * <TabNavigator>\n * {createTabScreens(tabConfig)}\n * </TabNavigator>\n * ```\n */\nexport function createTabScreens(routes: TabRouteConfig[]): React.ReactNode[] {\n return routes.map(route => (\n <TabNavigator.Screen\n key={route.name}\n name={route.name as keyof TabParamList}\n component={route.component}\n options={route.options}\n initialParams={route.initialParams}\n />\n ));\n}\n","import { View, TouchableOpacity, StyleSheet, type TextStyle, type ViewStyle } from 'react-native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { BottomTabBarProps } from '@react-navigation/bottom-tabs';\nimport { useThemeColors } from '@/theme';\nimport { AppText } from '@/ui';\n\n/**\n * 自定义底部标签栏组件 Props\n * 继承自 @react-navigation/bottom-tabs 的 BottomTabBarProps\n */\nexport interface CustomBottomTabBarProps extends BottomTabBarProps {\n /** 是否显示标签 */\n showLabel?: boolean;\n /** 激活颜色 */\n activeTintColor?: string;\n /** 未激活颜色 */\n inactiveTintColor?: string;\n /** TabBar 高度(默认 65) */\n height?: number;\n /** 激活背景色 */\n activeBackgroundColor?: string;\n /** 非激活背景色 */\n inactiveBackgroundColor?: string;\n /** 图标容器样式 */\n iconStyle?: ViewStyle;\n /** 标签样式 */\n labelStyle?: TextStyle;\n /** 标签栏样式 */\n style?: ViewStyle;\n}\n\n/** 默认 TabBar 高度 */\nconst DEFAULT_TAB_BAR_HEIGHT = 65;\n\n/**\n * 自定义底部标签栏组件\n *\n * 自定义样式的底部标签栏,支持徽标、图标、标签等\n *\n * @example\n * ```tsx\n * <TabNavigator\n * tabBar={props => <BottomTabBar {...props} showLabel={true} activeTintColor=\"#f38b32\" />}\n * >\n * <TabNavigator.Screen name=\"Home\" component={HomeScreen} />\n * <TabNavigator.Screen name=\"Profile\" component={ProfileScreen} />\n * </TabNavigator>\n * ```\n */\nexport function BottomTabBar({\n state,\n descriptors,\n navigation,\n showLabel = true,\n activeTintColor,\n inactiveTintColor,\n height = DEFAULT_TAB_BAR_HEIGHT,\n activeBackgroundColor,\n inactiveBackgroundColor,\n iconStyle,\n labelStyle,\n style,\n}: CustomBottomTabBarProps) {\n const colors = useThemeColors();\n const insets = useSafeAreaInsets();\n\n const activeColor = activeTintColor || colors.primary;\n const inactiveColor = inactiveTintColor || colors.textMuted;\n const backgroundColor = style?.backgroundColor || colors.card;\n const borderTopColor = colors.divider;\n\n return (\n <View\n style={[\n styles.container,\n { borderTopColor },\n { backgroundColor, height: height + insets.bottom, paddingBottom: insets.bottom },\n style,\n ]}\n >\n {state.routes.map((route, index) => {\n const { options } = descriptors[route.key];\n const isFocused = state.index === index;\n\n const onPress = () => {\n const event = navigation.emit({\n type: 'tabPress',\n target: route.key,\n canPreventDefault: true,\n });\n\n if (!isFocused && !event.defaultPrevented) {\n navigation.navigate(route.name);\n }\n };\n\n const onLongPress = () => {\n navigation.emit({\n type: 'tabLongPress',\n target: route.key,\n });\n };\n\n // 获取标签和图标\n const label =\n options.tabBarLabel !== undefined\n ? options.tabBarLabel\n : options.title !== undefined\n ? options.title\n : route.name;\n\n const iconName = options.tabBarIcon\n ? (options.tabBarIcon as Function)({\n focused: isFocused,\n color: isFocused ? activeColor : inactiveColor,\n size: 24,\n })\n : null;\n\n // 徽标\n const badge = options.tabBarBadge;\n\n return (\n <TouchableOpacity\n key={route.key}\n accessibilityRole=\"button\"\n accessibilityState={isFocused ? { selected: true } : {}}\n accessibilityLabel={options.tabBarAccessibilityLabel}\n testID={(options as any).tabBarTestID}\n onPress={onPress}\n onLongPress={onLongPress}\n style={[\n styles.tab,\n {\n backgroundColor: isFocused ? activeBackgroundColor : inactiveBackgroundColor,\n },\n ]}\n >\n <View style={[styles.iconContainer, iconStyle]}>\n {iconName}\n {badge != null && (\n <View style={[styles.badge, { backgroundColor: activeColor }]}>\n <AppText style={styles.badgeText}>\n {typeof badge === 'number' && badge > 99 ? '99+' : badge}\n </AppText>\n </View>\n )}\n </View>\n {showLabel && (\n <AppText\n style={[\n styles.label,\n { color: isFocused ? activeColor : inactiveColor },\n labelStyle,\n ]}\n numberOfLines={1}\n >\n {label as string}\n </AppText>\n )}\n </TouchableOpacity>\n );\n })}\n </View>\n );\n}\n\n/** 组件样式 */\nconst styles = StyleSheet.create({\n container: {\n flexDirection: 'row',\n borderTopWidth: 0.5,\n elevation: 8,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: -2 },\n shadowOpacity: 0.1,\n shadowRadius: 3,\n },\n tab: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 6,\n },\n iconContainer: {\n position: 'relative',\n marginBottom: 2,\n },\n badge: {\n position: 'absolute',\n top: -6,\n right: -10,\n minWidth: 18,\n height: 18,\n borderRadius: 9,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 4,\n },\n badgeText: {\n color: '#fff',\n fontSize: 10,\n fontWeight: 'bold',\n },\n label: {\n fontSize: 12,\n marginTop: 2,\n },\n});\n","/**\n * 抽屉导航器组件\n *\n * @module navigation/navigators/DrawerNavigator\n * @description 基于 @react-navigation/drawer 的抽屉导航器封装\n */\n\nimport React from 'react';\nimport { createDrawerNavigator } from '@react-navigation/drawer';\nimport { useTheme } from '@/theme';\nimport { createNavigationTheme } from '../utils/navigation-theme';\nimport type { DrawerParamList, DrawerNavigatorProps, DrawerRouteConfig } from '../types';\n\nconst NativeDrawer = createDrawerNavigator<DrawerParamList>();\n\n/**\n * 抽屉导航器组件\n *\n * 封装 React Navigation 的 Drawer Navigator,自动集成主题\n *\n * @example\n * ```tsx\n * // 基础使用\n * <DrawerNavigator>\n * <DrawerNavigator.Screen name=\"Home\" component={HomeScreen} />\n * <DrawerNavigator.Screen name=\"Settings\" component={SettingsScreen} />\n * </DrawerNavigator>\n *\n * // 自定义抽屉内容\n * <DrawerNavigator drawerContent={props => <CustomDrawerContent {...props} />}>\n * <DrawerNavigator.Screen name=\"Home\" component={HomeScreen} />\n * </DrawerNavigator>\n * ```\n */\nexport function DrawerNavigator({\n initialRouteName,\n screenOptions,\n drawerContent,\n drawerOptions,\n children,\n}: DrawerNavigatorProps) {\n const { theme, isDark } = useTheme();\n const navigationTheme = createNavigationTheme(theme, isDark);\n\n // 合并屏幕选项\n const mergedScreenOptions = React.useMemo(() => {\n return {\n headerShown: false,\n drawerStyle: {\n backgroundColor: navigationTheme.colors.card,\n width: drawerOptions?.drawerWidth || 280,\n },\n drawerActiveTintColor: theme.colors.primary?.[500] || '#f38b32',\n drawerInactiveTintColor: navigationTheme.colors.text,\n drawerLabelStyle: {\n fontSize: 16,\n },\n drawerType: drawerOptions?.drawerType,\n overlayColor: drawerOptions?.overlayColor,\n edgeWidth: drawerOptions?.edgeWidth,\n minSwipeDistance: drawerOptions?.minSwipeDistance,\n ...screenOptions,\n };\n }, [screenOptions, drawerOptions, navigationTheme, theme]);\n\n return (\n <NativeDrawer.Navigator\n initialRouteName={initialRouteName}\n screenOptions={mergedScreenOptions}\n drawerContent={drawerContent}\n >\n {children}\n </NativeDrawer.Navigator>\n );\n}\n\n/**\n * 抽屉屏幕组件\n * 直接使用原生 Screen 以确保 React Navigation v7 兼容性\n */\nDrawerNavigator.Screen = NativeDrawer.Screen;\n\n/**\n * 基于配置创建抽屉屏幕\n *\n * @example\n * ```tsx\n * const drawerConfig: DrawerRouteConfig[] = [\n * { name: 'Home', component: HomeScreen, options: { drawerLabel: '首页' } },\n * { name: 'Settings', component: SettingsScreen },\n * ];\n *\n * <DrawerNavigator>\n * {createDrawerScreens(drawerConfig)}\n * </DrawerNavigator>\n * ```\n */\nexport function createDrawerScreens(routes: DrawerRouteConfig[]): React.ReactNode[] {\n return routes.map(route => (\n <DrawerNavigator.Screen\n key={route.name}\n name={route.name as keyof DrawerParamList}\n component={route.component}\n options={route.options}\n initialParams={route.initialParams}\n />\n ));\n}\n","import { type ViewStyle, StyleSheet } from 'react-native';\nimport { useThemeColors } from '@/theme';\nimport { AppView, AppText, AppPressable, Icon } from '@/ui';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\n\n/**\n * 右侧图标配置\n */\nexport interface RightIcon {\n /** 图标名称 */\n icon: string;\n /** 点击回调 */\n onPress: () => void;\n /** 徽标数量(可选) */\n badge?: number;\n}\n\n/**\n * 应用头部组件 Props\n */\nexport interface AppHeaderProps {\n /** 标题 */\n title?: string;\n /** 副标题 */\n subtitle?: string;\n /** 左侧图标名称(默认为 'chevron-left' iOS风格) */\n leftIcon?: string | null;\n /** 左侧图标点击回调 */\n onLeftPress?: () => void;\n /** 右侧图标列表 */\n rightIcons?: RightIcon[];\n /** 是否透明背景 */\n transparent?: boolean;\n /** 是否启用模糊效果(暂未实现) */\n blur?: boolean;\n /** 是否包含安全区域(默认为 true) */\n safeArea?: boolean;\n /** 自定义样式 */\n style?: ViewStyle;\n}\n\n/**\n * 应用头部组件\n *\n * iOS 风格的顶部导航栏,标题始终居中,不受左右按钮影响\n *\n * @example\n * ```tsx\n * // 基本用法\n * <AppHeader title=\"首页\" />\n *\n * // 带右侧按钮\n * <AppHeader\n * title=\"消息\"\n * rightIcons={[\n * { icon: 'search', onPress: () => {} },\n * { icon: 'notifications', onPress: () => {}, badge: 5 }\n * ]}\n * />\n *\n * // 透明背景\n * <AppHeader title=\"详情\" transparent onLeftPress={() => navigation.goBack()} />\n *\n * // 无左侧按钮\n * <AppHeader title=\"首页\" leftIcon={null} />\n * ```\n */\nexport function AppHeader({\n title,\n subtitle,\n leftIcon = 'chevron-left',\n onLeftPress,\n rightIcons = [],\n transparent = false,\n safeArea = true,\n style,\n}: AppHeaderProps) {\n const colors = useThemeColors();\n const insets = useSafeAreaInsets();\n\n const backgroundColor = transparent ? 'transparent' : colors.card;\n\n return (\n <AppView\n style={[\n {\n backgroundColor,\n paddingTop: safeArea ? insets.top : 0,\n },\n style,\n ]}\n >\n {/* iOS 风格导航栏:标题始终居中 */}\n <AppView row items=\"center\" px={4} style={styles.container}>\n {/* 左侧按钮区域 - 固定宽度 70,左对齐 */}\n <AppView style={[styles.sideContainer, styles.leftContainer]}>\n {leftIcon && (\n <AppPressable onPress={onLeftPress} style={styles.iconButton}>\n <Icon name={leftIcon} size={24} color={colors.text} />\n </AppPressable>\n )}\n </AppView>\n\n {/* 中间标题区域 - 绝对居中 */}\n <AppView style={styles.centerContainer}>\n {title && (\n <AppText\n size=\"lg\"\n weight=\"semibold\"\n style={[styles.title, { color: colors.text }]}\n numberOfLines={1}\n >\n {title}\n </AppText>\n )}\n {subtitle && (\n <AppText\n size=\"xs\"\n style={[styles.subtitle, { color: colors.textMuted }]}\n numberOfLines={1}\n >\n {subtitle}\n </AppText>\n )}\n </AppView>\n\n {/* 右侧按钮区域 - 固定宽度 70,右对齐 */}\n <AppView row items=\"center\" style={[styles.sideContainer, styles.rightContainer]}>\n {rightIcons.map((icon, index) => (\n <AppPressable key={index} onPress={icon.onPress} style={styles.iconButton}>\n <AppView>\n <Icon name={icon.icon} size={24} color={colors.text} />\n {icon.badge ? (\n <AppView style={styles.badge}>\n <AppText size=\"xs\" color=\"white\" style={styles.badgeText}>\n {icon.badge > 99 ? '99+' : icon.badge}\n </AppText>\n </AppView>\n ) : null}\n </AppView>\n </AppPressable>\n ))}\n </AppView>\n </AppView>\n </AppView>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n height: 44, // iOS 标准导航栏高度\n },\n sideContainer: {\n width: 70, // 固定宽度,确保标题居中\n flexDirection: 'row',\n alignItems: 'center',\n },\n leftContainer: {\n justifyContent: 'flex-start',\n },\n rightContainer: {\n justifyContent: 'flex-end',\n },\n centerContainer: {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n title: {\n textAlign: 'center',\n },\n subtitle: {\n textAlign: 'center',\n marginTop: 2,\n },\n iconButton: {\n padding: 8,\n },\n badge: {\n position: 'absolute',\n top: -4,\n right: -4,\n minWidth: 16,\n height: 16,\n borderRadius: 8,\n backgroundColor: '#ef4444',\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 4,\n },\n badgeText: {\n fontSize: 10,\n fontWeight: 'bold',\n },\n});\n","import React from 'react';\nimport { View, TouchableOpacity, StyleSheet } from 'react-native';\nimport { DrawerContentComponentProps, DrawerContentScrollView } from '@react-navigation/drawer';\nimport { useTheme, useThemeColors } from '@/theme';\nimport { AppText, AppView, Icon } from '@/ui';\n\n/**\n * 抽屉菜单项配置\n */\nexport interface DrawerItem {\n /** 路由名称 */\n name: string;\n /** 显示标签 */\n label: string;\n /** 图标名称 */\n icon?: string;\n /** 徽标 */\n badge?: number | string;\n}\n\n/**\n * 抽屉内容组件 Props\n */\nexport interface DrawerContentProps extends DrawerContentComponentProps {\n /** 头部内容(如用户信息) */\n header?: React.ReactNode;\n /** 底部内容(如退出按钮) */\n footer?: React.ReactNode;\n /** 自定义项目列表(如果不提供则使用路由列表) */\n items?: DrawerItem[];\n /** 激活背景色 */\n activeBackgroundColor?: string;\n /** 激活文字颜色 */\n activeTintColor?: string;\n /** 未激活文字颜色 */\n inactiveTintColor?: string;\n}\n\n/**\n * 抽屉内容组件\n *\n * 自定义抽屉导航的内容模板,支持头部、底部、自定义菜单项等\n *\n * @example\n * ```tsx\n * <DrawerNavigator\n * drawerContent={props => (\n * <DrawerContent\n * {...props}\n * header={<UserInfo name=\"张三\" email=\"zhangsan@example.com\" />}\n * footer={<LogoutButton />}\n * items={[\n * { name: 'Home', label: '首页', icon: 'home' },\n * { name: 'Settings', label: '设置', icon: 'settings' }\n * ]}\n * />\n * )}\n * >\n * <DrawerNavigator.Screen name=\"Home\" component={HomeScreen} />\n * <DrawerNavigator.Screen name=\"Settings\" component={SettingsScreen} />\n * </DrawerNavigator>\n * ```\n */\nexport function DrawerContent({\n state,\n descriptors,\n navigation,\n header,\n footer,\n items,\n activeBackgroundColor,\n activeTintColor,\n inactiveTintColor,\n}: DrawerContentProps) {\n const { theme, isDark } = useTheme();\n const colors = useThemeColors();\n\n const activeBgColor =\n activeBackgroundColor ||\n (isDark ? colors.primarySurface : theme.colors.primary?.[50] || '#fff7ed');\n const activeColor = activeTintColor || colors.primary;\n const inactiveColor = inactiveTintColor || (isDark ? '#d1d5db' : '#4b5563');\n const backgroundColor = colors.card;\n const dividerColor = colors.divider;\n\n // 使用自定义项目或从路由生成\n const drawerItems: DrawerItem[] =\n items ||\n state.routes.map(route => {\n const descriptor = descriptors[route.key];\n const options = descriptor.options;\n return {\n name: route.name,\n label: (options.drawerLabel as string) || options.title || route.name,\n icon: (options.drawerIcon as any)?.({ size: 24, color: inactiveColor })?.props?.name,\n badge: (options as any).tabBarBadge as number | string,\n };\n });\n\n return (\n <DrawerContentScrollView style={[styles.container, { backgroundColor }]}>\n {/* 头部 */}\n {header && <View style={[styles.header, { borderBottomColor: dividerColor }]}>{header}</View>}\n\n {/* 菜单列表 */}\n <AppView className=\"py-2\">\n {drawerItems.map(item => {\n const isFocused = state.routes[state.index].name === item.name;\n\n const onPress = () => {\n navigation.navigate(item.name);\n };\n\n return (\n <TouchableOpacity\n key={item.name}\n onPress={onPress}\n style={[styles.item, isFocused && { backgroundColor: activeBgColor }]}\n >\n {item.icon && (\n <View style={styles.iconContainer}>\n <Icon\n name={item.icon}\n size=\"md\"\n color={isFocused ? activeColor : inactiveColor}\n />\n </View>\n )}\n <AppText\n style={[\n styles.label,\n { color: isFocused ? activeColor : inactiveColor },\n isFocused && styles.activeLabel,\n ]}\n numberOfLines={1}\n >\n {item.label}\n </AppText>\n {item.badge != null && (\n <View style={[styles.badge, { backgroundColor: activeColor }]}>\n <AppText style={styles.badgeText}>\n {typeof item.badge === 'number' && item.badge > 99 ? '99+' : item.badge}\n </AppText>\n </View>\n )}\n </TouchableOpacity>\n );\n })}\n </AppView>\n\n {/* 底部 */}\n {footer && <View style={[styles.footer, { borderTopColor: dividerColor }]}>{footer}</View>}\n </DrawerContentScrollView>\n );\n}\n\n/** 组件样式 */\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n },\n header: {\n padding: 16,\n borderBottomWidth: 0.5,\n },\n item: {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 16,\n paddingVertical: 12,\n marginHorizontal: 8,\n marginVertical: 2,\n borderRadius: 8,\n },\n iconContainer: {\n width: 32,\n alignItems: 'center',\n marginRight: 8,\n },\n label: {\n flex: 1,\n fontSize: 16,\n },\n activeLabel: {\n fontWeight: '600',\n },\n badge: {\n minWidth: 20,\n height: 20,\n borderRadius: 10,\n justifyContent: 'center',\n alignItems: 'center',\n paddingHorizontal: 6,\n },\n badgeText: {\n color: '#fff',\n fontSize: 12,\n fontWeight: 'bold',\n },\n footer: {\n marginTop: 'auto',\n padding: 16,\n borderTopWidth: 0.5,\n },\n});\n","/**\n * 导航 Hooks\n *\n * @module navigation/hooks/useNavigation\n * @description 提供导航相关的 React Hooks\n */\n\nimport { useEffect } from 'react';\nimport { useNavigation as useRNNavigation } from '@react-navigation/native';\nimport type { NativeStackNavigationProp, NativeStackScreenProps } from '../vendor/stack';\nimport type { BottomTabNavigationProp, BottomTabScreenProps } from '@react-navigation/bottom-tabs';\nimport type { DrawerNavigationProp, DrawerScreenProps } from '@react-navigation/drawer';\nimport type { NavigationProp, ParamListBase, RouteProp } from '@react-navigation/native';\nimport type {\n StackParamList,\n TabParamList,\n DrawerParamList,\n StackNavigation,\n TabNavigation,\n DrawerNavigation,\n} from '../types';\n\n// ============================================================================\n// 基础导航 Hooks\n// ============================================================================\n\n/**\n * 获取 React Navigation 原始导航实例\n *\n * 适合业务应用在需要自定义导航参数类型时直接使用。\n *\n * @example\n * ```tsx\n * type AuthNavigation = NativeStackNavigationProp<AuthStackParamList>;\n *\n * function LoginScreen() {\n * const navigation = useNavigation<AuthNavigation>();\n * return <Button onPress={() => navigation.navigate('Register')} title=\"注册\" />;\n * }\n * ```\n */\nexport function useNavigation<T extends NavigationProp<ParamListBase> = NavigationProp<ParamListBase>>() {\n return useRNNavigation<T>();\n}\n\n/**\n * 获取堆栈导航实例\n *\n * @returns 堆栈导航对象,包含 navigate、goBack、push 等方法\n *\n * @example\n * ```tsx\n * function HomeScreen() {\n * const navigation = useStackNavigation();\n *\n * const goToDetail = () => {\n * navigation.navigate('Detail', { id: '123' });\n * };\n *\n * return <Button onPress={goToDetail} title=\"查看详情\" />;\n * }\n * ```\n */\nexport function useStackNavigation(): StackNavigation {\n return useRNNavigation<NativeStackNavigationProp<StackParamList>>();\n}\n\n/**\n * 获取标签导航实例\n *\n * @returns 标签导航对象\n *\n * @example\n * ```tsx\n * function ProfileScreen() {\n * const navigation = useTabNavigation();\n *\n * const switchToHome = () => {\n * navigation.navigate('Home');\n * };\n *\n * return <Button onPress={switchToHome} title=\"返回首页\" />;\n * }\n * ```\n */\nexport function useTabNavigation(): TabNavigation {\n return useRNNavigation<BottomTabNavigationProp<TabParamList>>();\n}\n\n/**\n * 获取抽屉导航实例\n *\n * @returns 抽屉导航对象\n *\n * @example\n * ```tsx\n * function SettingsScreen() {\n * const navigation = useDrawerNavigation();\n *\n * const openDrawer = () => {\n * navigation.openDrawer();\n * };\n *\n * return <Button onPress={openDrawer} title=\"打开菜单\" />;\n * }\n * ```\n */\nexport function useDrawerNavigation(): DrawerNavigation {\n return useRNNavigation<DrawerNavigationProp<DrawerParamList>>();\n}\n\n// ============================================================================\n// 特殊功能 Hooks\n// ============================================================================\n\n/**\n * 处理安卓返回键\n *\n * 仅在安卓设备上有效,iOS 无效果\n *\n * @param handler - 返回 true 阻止默认返回行为,返回 false 允许默认行为\n *\n * @example\n * ```tsx\n * function ConfirmExitScreen() {\n * const navigation = useStackNavigation();\n *\n * useBackHandler(() => {\n * // 显示确认对话框\n * if (hasUnsavedChanges) {\n * showConfirmDialog();\n * return true; // 阻止默认返回\n * }\n * return false; // 允许默认返回\n * });\n *\n * return <ScreenContent />;\n * }\n * ```\n */\nexport function useBackHandler(handler: () => boolean): void {\n const navigation = useRNNavigation();\n\n useEffect(() => {\n const unsubscribe = navigation.addListener('beforeRemove', (e: any) => {\n if (!handler()) {\n e.preventDefault();\n }\n });\n\n return unsubscribe;\n }, [navigation, handler]);\n}\n\n// ============================================================================\n// 类型导出\n// ============================================================================\n\nexport type {\n NativeStackNavigationProp,\n NativeStackScreenProps,\n BottomTabNavigationProp,\n BottomTabScreenProps,\n DrawerNavigationProp,\n DrawerScreenProps,\n RouteProp,\n NavigationProp,\n};\n","/**\n * 路由相关 Hooks\n * @module navigation/hooks/useRoute\n */\n\nimport { useRoute as useRNRoute } from '@react-navigation/native';\nimport type { RouteProp } from '@react-navigation/native';\nimport type { StackParamList } from '../types';\n\n/**\n * 获取当前路由信息\n *\n * @returns 当前路由对象,包含 name、params、key 等\n *\n * @example\n * ```tsx\n * function DetailScreen() {\n * const route = useRoute<'Detail'>();\n * const { id } = route.params;\n *\n * return <Text>详情 ID: {id}</Text>;\n * }\n * ```\n */\nexport function useRoute<T extends keyof StackParamList>(): RouteProp<StackParamList, T> {\n return useRNRoute<RouteProp<StackParamList, T>>();\n}\n","/**\n * 导航状态 Hooks\n * @module navigation/hooks/useNavigationState\n */\n\nimport {\n useNavigationState as useRNNavigationState,\n useIsFocused,\n useFocusEffect,\n useScrollToTop,\n} from '@react-navigation/native';\nimport type { NavigationState } from '@react-navigation/native';\n\n/**\n * 获取导航状态\n *\n * @param selector - 状态选择器函数\n * @returns 选中的状态值\n *\n * @example\n * ```tsx\n * // 获取当前路由名称\n * const routeName = useNavigationState(state => state.routes[state.index].name);\n *\n * // 获取路由历史\n * const routes = useNavigationState(state => state.routes);\n * ```\n */\nexport function useNavigationState<T>(selector: (state: NavigationState) => T): T {\n return useRNNavigationState(selector);\n}\n\n/**\n * 监听屏幕聚焦状态\n *\n * @returns 屏幕是否处于聚焦状态\n *\n * @example\n * ```tsx\n * function ProfileScreen() {\n * const isFocused = useIsFocused();\n *\n * useEffect(() => {\n * if (isFocused) {\n * // 刷新数据\n * refreshData();\n * }\n * }, [isFocused]);\n *\n * return <ProfileView />;\n * }\n * ```\n */\nexport { useIsFocused };\n\n/**\n * 屏幕聚焦时执行副作用\n *\n * 每次屏幕获得焦点时都会执行回调函数\n *\n * @param callback - 回调函数,可以返回清理函数\n *\n * @example\n * ```tsx\n * function HomeScreen() {\n * useFocusEffect(\n * useCallback(() => {\n * // 获取最新数据\n * fetchData();\n *\n * // 可选:返回清理函数\n * return () => {\n * // 取消请求等清理操作\n * };\n * }, [])\n * );\n *\n * return <HomeView />;\n * }\n * ```\n */\nexport { useFocusEffect };\n\n/**\n * 滚动到顶部\n *\n * 当用户点击标签栏已激活的 Tab 时,自动滚动到顶部\n *\n * @param ref - 可滚动组件的 ref(ScrollView、FlatList 等)\n *\n * @example\n * ```tsx\n * function HomeScreen() {\n * const scrollViewRef = useRef<ScrollView>(null);\n *\n * useScrollToTop(scrollViewRef);\n *\n * return (\n * <ScrollView ref={scrollViewRef}>\n * <LongContent />\n * </ScrollView>\n * );\n * }\n * ```\n */\nexport { useScrollToTop };\n","/**\n * 导航模块\n *\n * @module navigation\n * @description 基于 React Navigation 的导航解决方案\n *\n * 本模块提供完整的导航功能,包括:\n * - 导航提供者(NavigationProvider)\n * - 堆栈导航器(StackNavigator)\n * - 标签导航器(TabNavigator)\n * - 抽屉导航器(DrawerNavigator)\n * - 导航 Hooks(useStackNavigation、useRoute 等)\n * - 导航组件(AppHeader、BottomTabBar、DrawerContent)\n * - 工具函数(createNavigationTheme)\n *\n * @example\n * ```tsx\n * // App.tsx\n * import { AppProvider } from '@gaozh1024/rn-kit';\n * import { RootNavigator } from './navigation';\n *\n * export default function App() {\n * return (\n * <AppProvider>\n * <RootNavigator />\n * </AppProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // navigation/index.tsx\n * import { StackNavigator, NavigationProvider } from '@gaozh1024/rn-kit';\n * import { HomeScreen, DetailScreen } from './screens';\n *\n * export function RootNavigator() {\n * return (\n * <StackNavigator initialRouteName=\"Home\">\n * <StackNavigator.Screen name=\"Home\" component={HomeScreen} />\n * <StackNavigator.Screen name=\"Detail\" component={DetailScreen} />\n * </StackNavigator>\n * );\n * }\n * ```\n */\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport { NavigationProvider } from './provider';\nexport type { NavigationProviderProps } from './provider';\n\n// ============================================================================\n// Navigators\n// ============================================================================\n\nexport {\n // 导航器组件\n StackNavigator,\n TabNavigator,\n DrawerNavigator,\n // 辅助函数\n createStackScreens,\n createTabScreens,\n createDrawerScreens,\n} from './navigators';\n\nexport type {\n // 导航器 Props\n StackNavigatorProps,\n TabNavigatorProps,\n DrawerNavigatorProps,\n // React Navigation 原始类型\n NativeStackScreenProps,\n BottomTabScreenProps,\n NativeDrawerScreenProps,\n} from './navigators';\n\n// ============================================================================\n// Components\n// ============================================================================\n\nexport { AppHeader } from './components/AppHeader';\nexport type { AppHeaderProps } from './components/AppHeader';\n\nexport { BottomTabBar } from './components/BottomTabBar';\nexport type { CustomBottomTabBarProps } from './components/BottomTabBar';\n\nexport { DrawerContent } from './components/DrawerContent';\nexport type { DrawerContentProps, DrawerItem } from './components/DrawerContent';\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\nexport {\n // 导航 Hooks\n useNavigation,\n useStackNavigation,\n useTabNavigation,\n useDrawerNavigation,\n // 路由 Hooks\n useRoute,\n useNavigationState,\n useBackHandler,\n // React Navigation 官方 Hooks\n useIsFocused,\n useFocusEffect,\n useScrollToTop,\n // 类型导出\n type NativeStackNavigationProp,\n type BottomTabNavigationProp,\n type DrawerNavigationProp,\n type RouteProp,\n type NavigationProp,\n} from './hooks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n // 参数列表\n StackParamList,\n TabParamList,\n DrawerParamList,\n ParamListBase,\n // 路由配置\n RouteConfig,\n StackRouteConfig,\n TabRouteConfig,\n DrawerRouteConfig,\n // 屏幕选项\n StackScreenOptions,\n TabScreenOptions,\n TabBarOptions,\n DrawerScreenOptions,\n DrawerOptions,\n // 屏幕 Props\n StackScreenProps,\n TabScreenProps,\n DrawerScreenProps,\n // 导航类型\n StackNavigation,\n TabNavigation,\n DrawerNavigation,\n AppNavigation,\n // 深度链接\n LinkingConfig,\n PathConfig,\n} from './types';\n\n// ============================================================================\n// Utils\n// ============================================================================\n\nexport { createNavigationTheme } from './utils/navigation-theme';\n\n// ============================================================================\n// Re-exports from @react-navigation/native\n// ============================================================================\n\nexport {\n // 导航器工具\n NavigationContainer,\n // 类型\n type NavigationState,\n type NavigationContainerRef,\n} from '@react-navigation/native';\n","/**\n * 统一应用 Provider\n *\n * @module overlay/AppProvider\n * @description 整合所有必要的 Provider,简化应用初始化\n */\n\nimport React from 'react';\nimport { SafeAreaProvider } from 'react-native-safe-area-context';\nimport { ThemeProvider, type ThemeConfig } from '@/theme';\nimport { NavigationProvider, type NavigationProviderProps } from '@/navigation';\nimport { AppStatusBar, type AppStatusBarProps } from './AppStatusBar';\nimport { OverlayProvider } from './provider';\n\n// ============================================================================\n// 默认主题配置\n// ============================================================================\n\n/** 默认亮色主题 */\nconst defaultLightTheme: ThemeConfig = {\n colors: {\n primary: '#f38b32',\n secondary: '#3b82f6',\n success: '#22c55e',\n warning: '#f59e0b',\n error: '#ef4444',\n info: '#3b82f6',\n },\n};\n\n/** 默认暗色主题 */\nconst defaultDarkTheme: ThemeConfig = {\n colors: {\n primary: '#f38b32',\n secondary: '#60a5fa',\n success: '#4ade80',\n warning: '#fbbf24',\n error: '#f87171',\n info: '#60a5fa',\n },\n};\n\n// ============================================================================\n// 组件 Props\n// ============================================================================\n\n/**\n * AppProvider Props\n */\nexport interface AppProviderProps extends Omit<NavigationProviderProps, 'children'> {\n /** 子元素 */\n children: React.ReactNode;\n /**\n * 是否启用导航(默认 true)\n * 如果已在其他地方提供 NavigationContainer,请设为 false\n */\n enableNavigation?: boolean;\n /** 是否启用全局 Overlay(Loading/Toast/Alert,默认 true) */\n enableOverlay?: boolean;\n /** 是否启用主题(默认 true) */\n enableTheme?: boolean;\n /** 是否启用全局状态栏管理(默认 true) */\n enableStatusBar?: boolean;\n /** 是否启用安全区域(默认 true) */\n enableSafeArea?: boolean;\n /** 自定义亮色主题 */\n lightTheme?: ThemeConfig;\n /** 自定义暗色主题 */\n darkTheme?: ThemeConfig;\n /** 默认使用暗色模式 */\n defaultDark?: boolean;\n /** 受控暗色模式 */\n isDark?: boolean;\n /** 全局状态栏配置 */\n statusBarProps?: AppStatusBarProps;\n}\n\n// ============================================================================\n// 主组件\n// ============================================================================\n\n/**\n * 统一应用 Provider\n *\n * 整合:SafeAreaProvider + ThemeProvider + NavigationProvider + OverlayProvider\n * 提供一键式应用初始化方案\n *\n * @example\n * ```tsx\n * // 基础使用\n * import { AppProvider } from '@gaozh1024/rn-kit';\n * import { RootNavigator } from './navigation';\n *\n * export default function App() {\n * return (\n * <AppProvider>\n * <RootNavigator />\n * </AppProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // 带深度链接\n * import { AppProvider } from '@gaozh1024/rn-kit';\n *\n * export default function App() {\n * return (\n * <AppProvider\n * linking={{\n * prefixes: ['myapp://', 'https://myapp.com'],\n * config: {\n * screens: {\n * Home: 'home',\n * Detail: 'detail/:id',\n * },\n * },\n * }}\n * fallback={<LoadingScreen />}\n * >\n * <RootNavigator />\n * </AppProvider>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // 禁用部分功能\n * <AppProvider\n * enableNavigation={true}\n * enableOverlay={true}\n * enableTheme={true}\n * enableSafeArea={true}\n * >\n * <YourApp />\n * </AppProvider>\n * ```\n *\n * @example\n * ```tsx\n * // 自定义主题\n * <AppProvider\n * lightTheme={{\n * colors: {\n * primary: '#1890ff',\n * success: '#52c41a',\n * // ... 其他颜色\n * },\n * }}\n * darkTheme={{\n * colors: {\n * primary: '#40a9ff',\n * // ... 其他颜色\n * },\n * }}\n * >\n * <App />\n * </AppProvider>\n * ```\n *\n * @example\n * ```tsx\n * // 使用外部 NavigationContainer\n * import { NavigationContainer } from '@react-navigation/native';\n *\n * export default function App() {\n * return (\n * <NavigationContainer>\n * <AppProvider enableNavigation={false}>\n * <RootNavigator />\n * </AppProvider>\n * </NavigationContainer>\n * );\n * }\n * ```\n */\nexport function AppProvider({\n children,\n enableNavigation = true,\n enableOverlay = true,\n enableTheme = true,\n enableStatusBar = true,\n enableSafeArea = true,\n lightTheme = defaultLightTheme,\n darkTheme = defaultDarkTheme,\n defaultDark = false,\n isDark,\n statusBarProps,\n ...navigationProps\n}: AppProviderProps) {\n // 从外到内套娃(外层包裹内层)\n // 正确的顺序: SafeArea → Theme → Navigation → Overlay\n // Overlay 在最内层,可以访问所有其他 Provider 的上下文\n // SafeArea 在最外层,确保所有内容都在安全区域内\n\n let content = children;\n\n // 1. Overlay (Loading/Toast/Alert) - 最内层\n // 需要访问 Navigation 和 Theme 上下文\n if (enableOverlay) {\n content = <OverlayProvider>{content}</OverlayProvider>;\n }\n\n // 2. Navigation - 需要 Theme 上下文来创建导航主题\n if (enableNavigation) {\n content = <NavigationProvider {...navigationProps}>{content}</NavigationProvider>;\n }\n\n // 3. Theme - 需要被 SafeArea 包裹\n if (enableTheme) {\n content = (\n <ThemeProvider light={lightTheme} dark={darkTheme} defaultDark={defaultDark} isDark={isDark}>\n <>\n {enableStatusBar && <AppStatusBar testID=\"status-bar\" {...statusBarProps} />}\n {content}\n </>\n </ThemeProvider>\n );\n }\n\n // 4. SafeArea - 最外层\n if (enableSafeArea) {\n content = <SafeAreaProvider>{content}</SafeAreaProvider>;\n }\n\n return <>{content}</>;\n}\n","import { StatusBar, type StatusBarProps, type StatusBarStyle } from 'react-native';\nimport { useTheme } from '@/theme';\n\nexport interface AppStatusBarProps\n extends Omit<StatusBarProps, 'barStyle' | 'backgroundColor' | 'translucent'> {\n /** 状态栏文字样式,auto 表示跟随当前主题 */\n barStyle?: StatusBarStyle | 'auto';\n /** Android 状态栏背景色,默认跟随主题背景色 */\n backgroundColor?: string;\n /** 是否启用沉浸式状态栏,默认 false */\n translucent?: boolean;\n /** 测试标识 */\n testID?: string;\n}\n\n/**\n * 全局状态栏组件\n *\n * - 默认根据当前主题自动切换明暗文字\n * - 默认跟随主题背景色\n * - 页面可通过手动渲染该组件进行局部覆盖\n */\nexport function AppStatusBar({\n barStyle = 'auto',\n backgroundColor,\n translucent = false,\n ...props\n}: AppStatusBarProps) {\n const { theme, isDark } = useTheme();\n\n const resolvedBarStyle =\n barStyle === 'auto' ? (isDark ? 'light-content' : 'dark-content') : barStyle;\n const resolvedBackgroundColor =\n backgroundColor ?? (translucent ? 'transparent' : theme.colors.background?.[500] || '#ffffff');\n\n return (\n <StatusBar\n barStyle={resolvedBarStyle}\n backgroundColor={resolvedBackgroundColor}\n translucent={translucent}\n {...props}\n />\n );\n}\n","/**\n * Loading 子系统 Provider\n * @module overlay/loading/provider\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { LoadingContext } from './context';\nimport { LoadingModal } from './component';\nimport type { LoadingState } from './types';\n\n/**\n * Loading Provider\n */\nexport function LoadingProvider({ children }: { children: React.ReactNode }) {\n const [state, setState] = useState<LoadingState>({ visible: false });\n\n const show = useCallback((text?: string) => {\n setState({ visible: true, text });\n }, []);\n\n const hide = useCallback(() => {\n setState({ visible: false });\n }, []);\n\n return (\n <LoadingContext.Provider value={{ show, hide }}>\n {children}\n <LoadingModal {...state} />\n </LoadingContext.Provider>\n );\n}\n","/**\n * Loading 子系统上下文\n * @module overlay/loading/context\n */\n\nimport { createContext, useContext } from 'react';\nimport type { LoadingContextType } from './types';\n\n/**\n * Loading 上下文\n */\nexport const LoadingContext = createContext<LoadingContextType | null>(null);\n\n/**\n * Loading 上下文 Hook\n * @throws 如果不在 LoadingProvider 内会抛出错误\n */\nexport function useLoadingContext(): LoadingContextType {\n const ctx = useContext(LoadingContext);\n if (!ctx) throw new Error('useLoading must be used within OverlayProvider');\n return ctx;\n}\n","/**\n * Loading 弹窗组件\n * @module overlay/loading/component\n */\n\nimport { View, Modal, ActivityIndicator, StyleSheet } from 'react-native';\nimport { AppText } from '@/ui';\nimport type { LoadingState } from './types';\n\n/**\n * Loading 弹窗组件\n */\nexport function LoadingModal({ visible, text }: LoadingState) {\n return (\n <Modal transparent visible={visible} animationType=\"fade\">\n <View style={styles.overlay}>\n <View style={[styles.loadingBox, { backgroundColor: 'rgba(0,0,0,0.8)' }]}>\n <ActivityIndicator size=\"large\" color=\"#fff\" />\n {text && <AppText className=\"text-white mt-3 text-sm\">{text}</AppText>}\n </View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n loadingBox: {\n padding: 24,\n borderRadius: 12,\n alignItems: 'center',\n minWidth: 120,\n },\n});\n","/**\n * Toast 子系统 Provider\n * @module overlay/toast/provider\n */\n\nimport React, { useState, useCallback, useRef } from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport { ToastContext } from './context';\nimport { ToastItemView } from './component';\nimport type { ToastItem, ToastType } from './types';\n\n/**\n * Toast Provider\n */\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n\n const remove = useCallback((id: string) => {\n setToasts(prev => prev.filter(t => t.id !== id));\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n }, []);\n\n const show = useCallback(\n (message: string, type: ToastType = 'info', duration = 3000) => {\n const id = Math.random().toString(36).substring(7);\n const toast: ToastItem = { id, message, type, duration };\n\n setToasts(prev => [...prev, toast]);\n\n const timer = setTimeout(() => remove(id), duration);\n timersRef.current.set(id, timer);\n },\n [remove]\n );\n\n const success = useCallback(\n (message: string, duration?: number) => show(message, 'success', duration),\n [show]\n );\n const error = useCallback(\n (message: string, duration?: number) => show(message, 'error', duration),\n [show]\n );\n const info = useCallback(\n (message: string, duration?: number) => show(message, 'info', duration),\n [show]\n );\n const warning = useCallback(\n (message: string, duration?: number) => show(message, 'warning', duration),\n [show]\n );\n\n return (\n <ToastContext.Provider value={{ show, success, error, info, warning }}>\n {children}\n <View style={styles.toastContainer} pointerEvents=\"none\">\n {toasts.map(toast => (\n <ToastItemView key={toast.id} {...toast} onHide={() => remove(toast.id)} />\n ))}\n </View>\n </ToastContext.Provider>\n );\n}\n\nconst styles = StyleSheet.create({\n toastContainer: {\n position: 'absolute',\n top: 60,\n left: 0,\n right: 0,\n zIndex: 9999,\n },\n});\n","/**\n * Toast 子系统上下文\n * @module overlay/toast/context\n */\n\nimport { createContext, useContext } from 'react';\nimport type { ToastContextType } from './types';\n\n/**\n * Toast 上下文\n */\nexport const ToastContext = createContext<ToastContextType | null>(null);\n\n/**\n * Toast 上下文 Hook\n * @throws 如果不在 ToastProvider 内会抛出错误\n */\nexport function useToastContext(): ToastContextType {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used within OverlayProvider');\n return ctx;\n}\n","/**\n * Toast 项组件\n * @module overlay/toast/component\n */\n\nimport { useRef, useEffect } from 'react';\nimport { Animated } from 'react-native';\nimport { AppView, AppText } from '@/ui';\nimport type { ToastItem } from './types';\n\ninterface ToastItemViewProps extends ToastItem {\n onHide: () => void;\n}\n\n/**\n * Toast 项组件\n */\nexport function ToastItemView({ message, type, onHide }: ToastItemViewProps) {\n const fadeAnim = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n Animated.sequence([\n Animated.timing(fadeAnim, { toValue: 1, duration: 200, useNativeDriver: true }),\n Animated.delay(2500),\n Animated.timing(fadeAnim, { toValue: 0, duration: 200, useNativeDriver: true }),\n ]).start(onHide);\n }, []);\n\n const bgColors: Record<string, string> = {\n success: 'bg-success-500',\n error: 'bg-error-500',\n warning: 'bg-warning-500',\n info: 'bg-primary-500',\n };\n\n return (\n <Animated.View\n style={{\n opacity: fadeAnim,\n transform: [\n {\n translateY: fadeAnim.interpolate({\n inputRange: [0, 1],\n outputRange: [-20, 0],\n }),\n },\n ],\n }}\n >\n <AppView className={`${bgColors[type]} px-4 py-3 rounded-lg mb-2 mx-4 shadow-lg`}>\n <AppText className=\"text-white text-center\">{message}</AppText>\n </AppView>\n </Animated.View>\n );\n}\n","/**\n * Alert 子系统 Provider\n * @module overlay/alert/provider\n */\n\nimport React, { useState, useCallback } from 'react';\nimport { AlertContext } from './context';\nimport { AlertModal } from './component';\nimport type { AlertOptions } from './types';\n\ntype AlertState = (AlertOptions & { visible: boolean }) | null;\n\n/**\n * Alert Provider\n */\nexport function AlertProvider({ children }: { children: React.ReactNode }) {\n const [alert, setAlert] = useState<AlertState>(null);\n\n const showAlert = useCallback((options: AlertOptions) => {\n setAlert({ ...options, visible: true });\n }, []);\n\n const confirm = useCallback(\n (options: Omit<AlertOptions, 'showCancel'>) => {\n showAlert({ ...options, showCancel: true });\n },\n [showAlert]\n );\n\n const hide = useCallback(() => {\n setAlert(null);\n }, []);\n\n const handleConfirm = useCallback(() => {\n alert?.onConfirm?.();\n hide();\n }, [alert, hide]);\n\n const handleCancel = useCallback(() => {\n alert?.onCancel?.();\n hide();\n }, [alert, hide]);\n\n return (\n <AlertContext.Provider value={{ alert: showAlert, confirm }}>\n {children}\n <AlertModal\n visible={alert?.visible ?? false}\n title={alert?.title}\n message={alert?.message}\n confirmText={alert?.confirmText}\n cancelText={alert?.cancelText}\n showCancel={alert?.showCancel}\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n </AlertContext.Provider>\n );\n}\n","/**\n * Alert 子系统上下文\n * @module overlay/alert/context\n */\n\nimport { createContext, useContext } from 'react';\nimport type { AlertContextType } from './types';\n\n/**\n * Alert 上下文\n */\nexport const AlertContext = createContext<AlertContextType | null>(null);\n\n/**\n * Alert 上下文 Hook\n * @throws 如果不在 AlertProvider 内会抛出错误\n */\nexport function useAlertContext(): AlertContextType {\n const ctx = useContext(AlertContext);\n if (!ctx) throw new Error('useAlert must be used within OverlayProvider');\n return ctx;\n}\n","/**\n * Alert 弹窗组件\n * @module overlay/alert/component\n */\n\nimport { View, Modal, StyleSheet } from 'react-native';\nimport { AppView, AppText, AppPressable } from '@/ui';\nimport type { AlertOptions } from './types';\n\ntype AlertModalProps = AlertOptions & {\n visible: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n};\n\n/**\n * Alert 弹窗组件\n */\nexport function AlertModal({\n visible,\n title,\n message,\n confirmText,\n cancelText,\n showCancel,\n onConfirm,\n onCancel,\n}: AlertModalProps) {\n if (!visible) return null;\n\n return (\n <Modal transparent visible animationType=\"fade\">\n <View style={styles.overlay}>\n <View style={styles.alertBox}>\n {title && <AppText className=\"text-lg font-semibold text-center mb-2\">{title}</AppText>}\n {message && <AppText className=\"text-gray-600 text-center mb-4\">{message}</AppText>}\n <AppView row gap={3} className=\"mt-2\">\n {showCancel && (\n <AppPressable onPress={onCancel} className=\"flex-1 py-3 bg-gray-100 rounded-lg\">\n <AppText className=\"text-center text-gray-700\">{cancelText || '取消'}</AppText>\n </AppPressable>\n )}\n <AppPressable onPress={onConfirm} className=\"flex-1 py-3 bg-primary-500 rounded-lg\">\n <AppText className=\"text-center text-white\">{confirmText || '确定'}</AppText>\n </AppPressable>\n </AppView>\n </View>\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0,0,0,0.5)',\n justifyContent: 'center',\n alignItems: 'center',\n },\n alertBox: {\n backgroundColor: 'white',\n borderRadius: 12,\n padding: 24,\n margin: 32,\n minWidth: 280,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.25,\n shadowRadius: 4,\n elevation: 5,\n },\n});\n","/**\n * 统一 Overlay Provider\n * @module overlay/provider\n * @description 整合 Loading、Toast、Alert 三个子系统\n */\n\nimport React from 'react';\nimport { LoadingProvider } from './loading/provider';\nimport { ToastProvider } from './toast/provider';\nimport { AlertProvider } from './alert/provider';\n\n/**\n * Overlay Provider Props\n */\nexport interface OverlayProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * 统一 Overlay Provider\n *\n * 整合:LoadingProvider + ToastProvider + AlertProvider\n * 提供全局 Loading、Toast、Alert 功能\n */\nexport function OverlayProvider({ children }: OverlayProviderProps) {\n return (\n <LoadingProvider>\n <ToastProvider>\n <AlertProvider>{children}</AlertProvider>\n </ToastProvider>\n </LoadingProvider>\n );\n}\n","/**\n * Loading 子系统 Hooks\n * @module overlay/loading/hooks\n */\n\nimport { useLoadingContext } from './context';\nimport type { LoadingContextType } from './types';\n\n/**\n * 使用 Loading 控制\n * @returns Loading 控制方法\n * @example\n * ```tsx\n * function MyComponent() {\n * const { show, hide } = useLoading();\n *\n * const handleSubmit = async () => {\n * show('提交中...');\n * await submitData();\n * hide();\n * };\n * }\n * ```\n */\nexport function useLoading(): LoadingContextType {\n return useLoadingContext();\n}\n","/**\n * Toast 子系统 Hooks\n * @module overlay/toast/hooks\n */\n\nimport { useToastContext } from './context';\nimport type { ToastContextType } from './types';\n\n/**\n * 使用 Toast 控制\n * @returns Toast 控制方法\n * @example\n * ```tsx\n * function MyComponent() {\n * const { success, error } = useToast();\n *\n * const handleSubmit = async () => {\n * try {\n * await submitData();\n * success('提交成功!');\n * } catch (e) {\n * error('提交失败');\n * }\n * };\n * }\n * ```\n */\nexport function useToast(): ToastContextType {\n return useToastContext();\n}\n","/**\n * Alert 子系统 Hooks\n * @module overlay/alert/hooks\n */\n\nimport { useAlertContext } from './context';\nimport type { AlertContextType } from './types';\n\n/**\n * 使用 Alert 控制\n * @returns Alert 控制方法\n * @example\n * ```tsx\n * function MyComponent() {\n * const { alert, confirm } = useAlert();\n *\n * const handleDelete = () => {\n * confirm({\n * title: '确认删除',\n * message: '此操作不可撤销',\n * onConfirm: () => deleteItem(),\n * });\n * };\n *\n * const handleNotify = () => {\n * alert({\n * title: '提示',\n * message: '操作成功',\n * });\n * };\n * }\n * ```\n */\nexport function useAlert(): AlertContextType {\n return useAlertContext();\n}\n"],"mappings":"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","names":["import_react","import_zod","ErrorCode","import_react","import_react","error","import_react","fetch","error","import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","sizeMap","React","import_react_native","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","justifyMap","itemsMap","import_jsx_runtime","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","styles","import_react_native","import_jsx_runtime","import_jsx_runtime","import_react_native","import_jsx_runtime","import_jsx_runtime","sizeMap","MaterialIcons","import_react","import_react_native","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","SkeletonItem","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_react","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_react","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","import_react","import_react","import_react","import_react","import_react","import_react_native","import_react","import_react_native","import_react","import_react_native","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_react_native","import_react_native_safe_area_context","import_jsx_runtime","styles","import_jsx_runtime","defaultScreenOptions","React","import_react","import_jsx_runtime","React","import_react_native","import_react_native_safe_area_context","import_jsx_runtime","styles","import_react_native","import_drawer","import_jsx_runtime","styles","import_react","import_native","useRNNavigation","import_native","useRNRoute","import_native","useRNNavigationState","import_native","import_react_native_safe_area_context","import_react_native","import_jsx_runtime","import_react","import_react","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","import_react","import_react_native","import_react","import_react","import_react_native","import_jsx_runtime","import_jsx_runtime","styles","import_react","import_react","import_react_native","import_jsx_runtime","styles","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react_native_safe_area_context"]}
|