veilkit 0.0.0-stage → 0.2.1

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.
Files changed (64) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/LICENSE +21 -0
  3. package/README.md +801 -2
  4. package/dist/angular/index.cjs +660 -0
  5. package/dist/angular/index.cjs.map +1 -0
  6. package/dist/angular/index.d.cts +113 -0
  7. package/dist/angular/index.d.ts +113 -0
  8. package/dist/angular/index.js +660 -0
  9. package/dist/angular/index.js.map +1 -0
  10. package/dist/cli/index.cjs +25 -0
  11. package/dist/cli/index.cjs.map +1 -0
  12. package/dist/cli/index.d.cts +1 -0
  13. package/dist/cli/index.d.ts +1 -0
  14. package/dist/cli/index.js +25 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/controller-B6kFsWzi.d.cts +195 -0
  17. package/dist/controller-Ceub9kLC.d.ts +195 -0
  18. package/dist/element/index.cjs +660 -0
  19. package/dist/element/index.cjs.map +1 -0
  20. package/dist/element/index.d.cts +48 -0
  21. package/dist/element/index.d.ts +48 -0
  22. package/dist/element/index.js +660 -0
  23. package/dist/element/index.js.map +1 -0
  24. package/dist/index.cjs +660 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +211 -0
  27. package/dist/index.d.ts +211 -0
  28. package/dist/index.js +660 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/native/index.cjs +2 -0
  31. package/dist/native/index.cjs.map +1 -0
  32. package/dist/native/index.d.cts +54 -0
  33. package/dist/native/index.d.ts +54 -0
  34. package/dist/native/index.js +2 -0
  35. package/dist/native/index.js.map +1 -0
  36. package/dist/react/index.cjs +660 -0
  37. package/dist/react/index.cjs.map +1 -0
  38. package/dist/react/index.d.cts +121 -0
  39. package/dist/react/index.d.ts +121 -0
  40. package/dist/react/index.js +660 -0
  41. package/dist/react/index.js.map +1 -0
  42. package/dist/styles.css +509 -0
  43. package/dist/svelte/index.cjs +660 -0
  44. package/dist/svelte/index.cjs.map +1 -0
  45. package/dist/svelte/index.d.cts +48 -0
  46. package/dist/svelte/index.d.ts +48 -0
  47. package/dist/svelte/index.js +660 -0
  48. package/dist/svelte/index.js.map +1 -0
  49. package/dist/themes/index.cjs +2 -0
  50. package/dist/themes/index.cjs.map +1 -0
  51. package/dist/themes/index.d.cts +18 -0
  52. package/dist/themes/index.d.ts +18 -0
  53. package/dist/themes/index.js +2 -0
  54. package/dist/themes/index.js.map +1 -0
  55. package/dist/types-CnR-rU97.d.cts +176 -0
  56. package/dist/types-CnR-rU97.d.ts +176 -0
  57. package/dist/veilkit.min.js +659 -0
  58. package/dist/vue/index.cjs +660 -0
  59. package/dist/vue/index.cjs.map +1 -0
  60. package/dist/vue/index.d.cts +512 -0
  61. package/dist/vue/index.d.ts +512 -0
  62. package/dist/vue/index.js +660 -0
  63. package/dist/vue/index.js.map +1 -0
  64. package/package.json +254 -4
@@ -0,0 +1,2 @@
1
+ 'use strict';var react=require('react'),reactNative=require('react-native'),jsxRuntime=require('react/jsx-runtime');var z=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,a)=>(typeof require<"u"?require:t)[a]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var C={light:{base:"#e5e7eb",highlight:"rgba(255, 255, 255, 0.7)",radius:"6px",duration:"1.5s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",contrast:"#374151"},dark:{base:"#1f2937",highlight:"rgba(255, 255, 255, 0.12)",radius:"6px",duration:"1.5s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",contrast:"#f3f4f6"},auto:{base:"var(--veil-auto-base, #e5e7eb)",highlight:"var(--veil-auto-highlight, rgba(255, 255, 255, 0.7))",radius:"6px",duration:"1.5s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",contrast:"var(--veil-auto-contrast, #374151)"},glass:{base:"rgba(255, 255, 255, 0.08)",highlight:"rgba(255, 255, 255, 0.25)",radius:"12px",duration:"1.8s",easing:"cubic-bezier(0.25, 1, 0.5, 1)",blur:"12px",border:"1px solid rgba(255, 255, 255, 0.15)",glow:"inset 0 1px 1px 0 rgba(255, 255, 255, 0.25), 0 4px 16px 0 rgba(0, 0, 0, 0.12)",contrast:"#ffffff"},ios:{base:"rgba(120, 120, 128, 0.18)",highlight:"rgba(255, 255, 255, 0.45)",radius:"10px",duration:"1.4s",easing:"cubic-bezier(0.32, 0.72, 0, 1)",border:"none",contrast:"#1c1c1e"},material:{base:"#e7e0ec",highlight:"#f7f2fa",radius:"12px",duration:"1.6s",easing:"cubic-bezier(0.2, 0, 0, 1)",border:"none",contrast:"#1d1b20"},minimal:{base:"#f1f3f5",highlight:"#ffffff",radius:"4px",duration:"1.4s",easing:"ease-in-out",border:"none",contrast:"#212529"},mono:{base:"#e0e0e0",highlight:"#ffffff",radius:"0px",duration:"1.2s",easing:"linear",border:"1px solid #cccccc",contrast:"#000000"},neon:{base:"#0c0b16",highlight:"rgba(0, 240, 255, 0.5)",radius:"8px",duration:"1.6s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"1px solid rgba(0, 240, 255, 0.3)",glow:"0 0 12px rgba(0, 240, 255, 0.35)",contrast:"#00f0ff"},sunset:{base:"#fed7aa",highlight:"#fff7ed",radius:"8px",duration:"1.7s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",glow:"0 0 8px rgba(251, 146, 60, 0.25)",contrast:"#7c2d12"},ocean:{base:"#0f2937",highlight:"rgba(56, 189, 248, 0.45)",radius:"8px",duration:"1.7s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"1px solid rgba(56, 189, 248, 0.2)",glow:"0 0 10px rgba(56, 189, 248, 0.25)",contrast:"#38bdf8"}};var V=null;try{V=z("expo-linear-gradient").LinearGradient;}catch{try{V=z("react-native-linear-gradient").default;}catch{V=null;}}var n=null;try{n=z("expo-haptics");}catch{n=null;}function B(e){if(n)try{e==="start"?n.impactAsync?.(n.ImpactFeedbackStyle?.Light):e==="success"?n.notificationAsync?.(n.NotificationFeedbackType?.Success):e==="error"&&n.notificationAsync?.(n.NotificationFeedbackType?.Error);}catch{}}function X({width:e="100%",height:t=20,radius:a=6,circle:w=false,theme:v="auto",animation:h="shimmer",style:c,children:p}){let y=reactNative.useColorScheme(),[m,u]=react.useState(false);react.useEffect(()=>{reactNative.AccessibilityInfo.isReduceMotionEnabled().then(u).catch(()=>{});},[]);let i=C[v==="auto"?y==="dark"?"dark":"light":v]||C.light,g=react.useRef(new reactNative.Animated.Value(0)).current;react.useEffect(()=>{if(m||h==="none")return;let d=reactNative.Animated.loop(reactNative.Animated.timing(g,{toValue:1,duration:1500,useNativeDriver:true}));return d.start(),()=>d.stop()},[g,m,h]);let S=g.interpolate({inputRange:[0,1],outputRange:[-200,200]}),R=g.interpolate({inputRange:[0,.5,1],outputRange:[.4,.9,.4]}),b=w?9999:a,N=i.base.startsWith("var")?y==="dark"?"#1f2937":"#e5e7eb":i.base;return jsxRuntime.jsxs(reactNative.View,{accessibilityRole:"none",accessibilityState:{busy:true},style:[o.skeletonBase,{width:e,height:t,borderRadius:b,backgroundColor:N},c],children:[!m&&h!=="none"&&(V?jsxRuntime.jsx(reactNative.Animated.View,{style:[reactNative.StyleSheet.absoluteFill,{transform:[{translateX:S}]}],children:jsxRuntime.jsx(V,{colors:["transparent",i.highlight,"transparent"],start:{x:0,y:.5},end:{x:1,y:.5},style:reactNative.StyleSheet.absoluteFill})}):jsxRuntime.jsx(reactNative.Animated.View,{style:[reactNative.StyleSheet.absoluteFill,{backgroundColor:i.highlight,opacity:R}]})),p]})}function $({children:e,style:t}){return jsxRuntime.jsx(reactNative.View,{accessibilityLiveRegion:"polite",accessibilityState:{busy:true},style:t,children:e})}function A({size:e="small",color:t="#3b82f6"}){return jsxRuntime.jsx(reactNative.ActivityIndicator,{size:e,color:t})}function J({visible:e,message:t,children:a}){return jsxRuntime.jsxs(reactNative.View,{style:o.overlayContainer,children:[a,e&&jsxRuntime.jsxs(reactNative.View,{style:o.overlayBackdrop,children:[jsxRuntime.jsx(A,{size:"large",color:"#ffffff"}),t&&jsxRuntime.jsx(reactNative.Text,{style:o.overlayText,children:t})]})]})}function K({status:e,loading:t=false,title:a,loadingText:w,successText:v="Success",errorText:h="Failed",resetAfter:c=2e3,haptics:p=true,onPress:y,style:m,textStyle:u}){let[s,i]=react.useState(e||(t?"loading":"idle"));react.useEffect(()=>{i(e||(t?"loading":"idle"));},[e,t]);let g=async()=>{if(s==="idle"&&(p&&B("start"),y))try{let d=y();d&&typeof d.then=="function"&&(i("loading"),await d,p&&B("success"),i("success"),c>0&&setTimeout(()=>i("idle"),c));}catch{p&&B("error"),i("error"),c>0&&setTimeout(()=>i("idle"),c);}},S=s==="loading",R=s!=="idle",b=jsxRuntime.jsx(reactNative.Text,{style:[o.btnText,u],children:a});s==="loading"?b=jsxRuntime.jsxs(reactNative.View,{style:{flexDirection:"row",alignItems:"center",gap:8},children:[jsxRuntime.jsx(A,{size:"small",color:"#ffffff"}),w?jsxRuntime.jsx(reactNative.Text,{style:[o.btnText,u],children:w}):null]}):s==="success"?b=jsxRuntime.jsxs(reactNative.Text,{style:[o.btnText,u],children:["\u2713 ",v]}):s==="error"&&(b=jsxRuntime.jsxs(reactNative.Text,{style:[o.btnText,u],children:["\u2715 ",h]}));let N=s==="success"?{backgroundColor:"#10b981"}:s==="error"?{backgroundColor:"#ef4444"}:null;return jsxRuntime.jsx(reactNative.TouchableOpacity,{disabled:R,onPress:g,accessibilityState:{busy:S,disabled:R},style:[o.btnBase,N,m],children:b})}function Q({progress:e,color:t="#3b82f6"}){let a=Math.min(1,Math.max(0,e));return jsxRuntime.jsx(reactNative.View,{style:o.progressBarTrack,children:jsxRuntime.jsx(reactNative.View,{style:[o.progressBarFill,{width:`${a*100}%`,backgroundColor:t}]})})}var o=reactNative.StyleSheet.create({skeletonBase:{overflow:"hidden",position:"relative"},overlayContainer:{position:"relative",flex:1},overlayBackdrop:{...reactNative.StyleSheet.absoluteFill,backgroundColor:"rgba(0, 0, 0, 0.45)",justifyContent:"center",alignItems:"center",zIndex:999},overlayText:{marginTop:12,color:"#ffffff",fontSize:15,fontWeight:"600"},btnBase:{backgroundColor:"#3b82f6",paddingVertical:12,paddingHorizontal:20,borderRadius:8,alignItems:"center",justifyContent:"center",minHeight:44},btnText:{color:"#ffffff",fontSize:16,fontWeight:"600"},progressBarTrack:{height:4,width:"100%",backgroundColor:"rgba(0, 0, 0, 0.1)",borderRadius:2,overflow:"hidden"},progressBarFill:{height:"100%",borderRadius:2}});exports.LoadingButton=K;exports.Overlay=J;exports.ProgressBar=Q;exports.Skeleton=X;exports.SkeletonGroup=$;exports.Spinner=A;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/native/index.tsx","../../src/core/themes.ts"],"names":["BUILTIN_THEMES","LinearGradientComponent","Haptics","triggerHaptic","type","Skeleton","width","height","radius","circle","theme","animation","style","children","colorScheme","useColorScheme","reduceMotion","setReduceMotion","useState","useEffect","AccessibilityInfo","themeTokens","animatedValue","useRef","Animated","anim","translateX","opacityPulse","borderRadius","baseBg","jsxs","View","styles","jsx","StyleSheet","SkeletonGroup","Spinner","size","color","ActivityIndicator","Overlay","visible","message","Text","LoadingButton","controlledStatus","loading","title","loadingText","successText","errorText","resetAfter","haptics","onPress","textStyle","internalStatus","setInternalStatus","handlePress","result","isBusy","isDisabled","content","bgStyle","TouchableOpacity","ProgressBar","progress","clamped"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Veilkit - React Native & Expo Adapter (`veilkit/native`)\n * Works in Expo Go, New Architecture, iOS, Android, and react-native-web.\n * UI-thread Reanimated with smooth built-in Animated fallback,\n * and LinearGradient with smooth pulse fallback.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n Animated,\n useColorScheme,\n AccessibilityInfo,\n ViewStyle,\n TextStyle,\n TouchableOpacity,\n ActivityIndicator,\n} from 'react-native';\nimport { BUILTIN_THEMES } from '../core/themes';\nimport { VeilThemeName, VeilAnimationName } from '../core/types';\n\n// Safely probe for optional gradient peer dependencies\nlet LinearGradientComponent: any = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n LinearGradientComponent = require('expo-linear-gradient').LinearGradient;\n} catch {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n LinearGradientComponent = require('react-native-linear-gradient').default;\n } catch {\n LinearGradientComponent = null;\n }\n}\n\n// Safely probe for optional expo-haptics\nlet Haptics: any = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Haptics = require('expo-haptics');\n} catch {\n Haptics = null;\n}\n\nfunction triggerHaptic(type: 'start' | 'success' | 'error') {\n if (!Haptics) return;\n try {\n if (type === 'start') {\n Haptics.impactAsync?.(Haptics.ImpactFeedbackStyle?.Light);\n } else if (type === 'success') {\n Haptics.notificationAsync?.(Haptics.NotificationFeedbackType?.Success);\n } else if (type === 'error') {\n Haptics.notificationAsync?.(Haptics.NotificationFeedbackType?.Error);\n }\n } catch {\n // Silent fallback\n }\n}\n\nexport interface NativeSkeletonProps {\n width?: number | string;\n height?: number | string;\n radius?: number;\n circle?: boolean;\n theme?: VeilThemeName;\n animation?: VeilAnimationName;\n style?: ViewStyle;\n children?: React.ReactNode;\n}\n\nexport function Skeleton({\n width = '100%',\n height = 20,\n radius = 6,\n circle = false,\n theme = 'auto',\n animation = 'shimmer',\n style,\n children,\n}: NativeSkeletonProps) {\n const colorScheme = useColorScheme();\n const [reduceMotion, setReduceMotion] = useState(false);\n\n useEffect(() => {\n AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion).catch(() => {});\n }, []);\n\n const resolvedThemeName = theme === 'auto' ? (colorScheme === 'dark' ? 'dark' : 'light') : theme;\n const themeTokens = BUILTIN_THEMES[resolvedThemeName] || BUILTIN_THEMES.light;\n\n const animatedValue = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n if (reduceMotion || animation === 'none') return;\n\n const anim = Animated.loop(\n Animated.timing(animatedValue, {\n toValue: 1,\n duration: 1500,\n useNativeDriver: true,\n }),\n );\n anim.start();\n\n return () => anim.stop();\n }, [animatedValue, reduceMotion, animation]);\n\n const translateX = animatedValue.interpolate({\n inputRange: [0, 1],\n outputRange: [-200, 200],\n });\n\n const opacityPulse = animatedValue.interpolate({\n inputRange: [0, 0.5, 1],\n outputRange: [0.4, 0.9, 0.4],\n });\n\n const borderRadius = circle ? 9999 : radius;\n const baseBg = themeTokens.base.startsWith('var') ? (colorScheme === 'dark' ? '#1f2937' : '#e5e7eb') : themeTokens.base;\n\n return (\n <View\n accessibilityRole=\"none\"\n accessibilityState={{ busy: true }}\n style={[\n styles.skeletonBase,\n {\n width: width as any,\n height: height as any,\n borderRadius,\n backgroundColor: baseBg,\n },\n style,\n ]}\n >\n {!reduceMotion && animation !== 'none' && (\n LinearGradientComponent ? (\n <Animated.View\n style={[\n StyleSheet.absoluteFill,\n { transform: [{ translateX }] },\n ]}\n >\n <LinearGradientComponent\n colors={['transparent', themeTokens.highlight, 'transparent']}\n start={{ x: 0, y: 0.5 }}\n end={{ x: 1, y: 0.5 }}\n style={StyleSheet.absoluteFill}\n />\n </Animated.View>\n ) : (\n <Animated.View\n style={[\n StyleSheet.absoluteFill,\n {\n backgroundColor: themeTokens.highlight,\n opacity: opacityPulse,\n },\n ]}\n />\n )\n )}\n {children}\n </View>\n );\n}\n\nexport function SkeletonGroup({ children, style }: { children: React.ReactNode; style?: ViewStyle }) {\n return (\n <View accessibilityLiveRegion=\"polite\" accessibilityState={{ busy: true }} style={style}>\n {children}\n </View>\n );\n}\n\nexport function Spinner({\n size = 'small',\n color = '#3b82f6',\n}: {\n size?: 'small' | 'large' | number;\n color?: string;\n}) {\n return <ActivityIndicator size={size} color={color} />;\n}\n\nexport function Overlay({\n visible,\n message,\n children,\n}: {\n visible: boolean;\n message?: string;\n children?: React.ReactNode;\n}) {\n return (\n <View style={styles.overlayContainer}>\n {children}\n {visible && (\n <View style={styles.overlayBackdrop}>\n <Spinner size=\"large\" color=\"#ffffff\" />\n {message && <Text style={styles.overlayText}>{message}</Text>}\n </View>\n )}\n </View>\n );\n}\n\nexport function LoadingButton({\n status: controlledStatus,\n loading = false,\n title,\n loadingText,\n successText = 'Success',\n errorText = 'Failed',\n resetAfter = 2000,\n haptics = true,\n onPress,\n style,\n textStyle,\n}: {\n status?: 'idle' | 'loading' | 'success' | 'error';\n loading?: boolean;\n title: string;\n loadingText?: string;\n successText?: string;\n errorText?: string;\n resetAfter?: number;\n haptics?: boolean;\n onPress?: () => Promise<any> | void;\n style?: ViewStyle;\n textStyle?: TextStyle;\n}) {\n const [internalStatus, setInternalStatus] = useState<'idle' | 'loading' | 'success' | 'error'>(\n controlledStatus || (loading ? 'loading' : 'idle'),\n );\n\n useEffect(() => {\n if (controlledStatus) {\n setInternalStatus(controlledStatus);\n } else {\n setInternalStatus(loading ? 'loading' : 'idle');\n }\n }, [controlledStatus, loading]);\n\n const handlePress = async () => {\n if (internalStatus !== 'idle') return;\n\n if (haptics) triggerHaptic('start');\n\n if (onPress) {\n try {\n const result = onPress();\n if (result && typeof result.then === 'function') {\n setInternalStatus('loading');\n await result;\n if (haptics) triggerHaptic('success');\n setInternalStatus('success');\n if (resetAfter > 0) {\n setTimeout(() => setInternalStatus('idle'), resetAfter);\n }\n }\n } catch {\n if (haptics) triggerHaptic('error');\n setInternalStatus('error');\n if (resetAfter > 0) {\n setTimeout(() => setInternalStatus('idle'), resetAfter);\n }\n }\n }\n };\n\n const isBusy = internalStatus === 'loading';\n const isDisabled = internalStatus !== 'idle';\n\n let content: React.ReactNode = <Text style={[styles.btnText, textStyle]}>{title}</Text>;\n if (internalStatus === 'loading') {\n content = (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>\n <Spinner size=\"small\" color=\"#ffffff\" />\n {loadingText ? <Text style={[styles.btnText, textStyle]}>{loadingText}</Text> : null}\n </View>\n );\n } else if (internalStatus === 'success') {\n content = <Text style={[styles.btnText, textStyle]}>✓ {successText}</Text>;\n } else if (internalStatus === 'error') {\n content = <Text style={[styles.btnText, textStyle]}>✕ {errorText}</Text>;\n }\n\n const bgStyle =\n internalStatus === 'success'\n ? { backgroundColor: '#10b981' }\n : internalStatus === 'error'\n ? { backgroundColor: '#ef4444' }\n : null;\n\n return (\n <TouchableOpacity\n disabled={isDisabled}\n onPress={handlePress}\n accessibilityState={{ busy: isBusy, disabled: isDisabled }}\n style={[styles.btnBase, bgStyle, style]}\n >\n {content}\n </TouchableOpacity>\n );\n}\n\nexport function ProgressBar({ progress, color = '#3b82f6' }: { progress: number; color?: string }) {\n const clamped = Math.min(1, Math.max(0, progress));\n return (\n <View style={styles.progressBarTrack}>\n <View style={[styles.progressBarFill, { width: `${clamped * 100}%`, backgroundColor: color }]} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n skeletonBase: {\n overflow: 'hidden',\n position: 'relative',\n },\n overlayContainer: {\n position: 'relative',\n flex: 1,\n },\n overlayBackdrop: {\n ...StyleSheet.absoluteFill,\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 999,\n },\n overlayText: {\n marginTop: 12,\n color: '#ffffff',\n fontSize: 15,\n fontWeight: '600',\n },\n btnBase: {\n backgroundColor: '#3b82f6',\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 44,\n },\n btnText: {\n color: '#ffffff',\n fontSize: 16,\n fontWeight: '600',\n },\n progressBarTrack: {\n height: 4,\n width: '100%',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n borderRadius: 2,\n overflow: 'hidden',\n },\n progressBarFill: {\n height: '100%',\n borderRadius: 2,\n },\n});\n","/**\n * Veilkit - Themes & Token Definitions\n * 11 Built-in Themes + `createTheme()`\n */\n\nimport { VeilThemeName, VeilThemeTokens, CustomThemeInput } from './types';\n\nexport const BUILTIN_THEMES: Record<VeilThemeName, VeilThemeTokens> = {\n light: {\n base: '#e5e7eb',\n highlight: 'rgba(255, 255, 255, 0.7)',\n radius: '6px',\n duration: '1.5s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n contrast: '#374151',\n },\n dark: {\n base: '#1f2937',\n highlight: 'rgba(255, 255, 255, 0.12)',\n radius: '6px',\n duration: '1.5s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n contrast: '#f3f4f6',\n },\n auto: {\n // Dynamic CSS variables will resolve light/dark via prefers-color-scheme\n base: 'var(--veil-auto-base, #e5e7eb)',\n highlight: 'var(--veil-auto-highlight, rgba(255, 255, 255, 0.7))',\n radius: '6px',\n duration: '1.5s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n contrast: 'var(--veil-auto-contrast, #374151)',\n },\n glass: {\n base: 'rgba(255, 255, 255, 0.08)',\n highlight: 'rgba(255, 255, 255, 0.25)',\n radius: '12px',\n duration: '1.8s',\n easing: 'cubic-bezier(0.25, 1, 0.5, 1)',\n blur: '12px',\n border: '1px solid rgba(255, 255, 255, 0.15)',\n glow: 'inset 0 1px 1px 0 rgba(255, 255, 255, 0.25), 0 4px 16px 0 rgba(0, 0, 0, 0.12)',\n contrast: '#ffffff',\n },\n ios: {\n base: 'rgba(120, 120, 128, 0.18)',\n highlight: 'rgba(255, 255, 255, 0.45)',\n radius: '10px',\n duration: '1.4s',\n easing: 'cubic-bezier(0.32, 0.72, 0, 1)',\n border: 'none',\n contrast: '#1c1c1e',\n },\n material: {\n base: '#e7e0ec',\n highlight: '#f7f2fa',\n radius: '12px',\n duration: '1.6s',\n easing: 'cubic-bezier(0.2, 0, 0, 1)',\n border: 'none',\n contrast: '#1d1b20',\n },\n minimal: {\n base: '#f1f3f5',\n highlight: '#ffffff',\n radius: '4px',\n duration: '1.4s',\n easing: 'ease-in-out',\n border: 'none',\n contrast: '#212529',\n },\n mono: {\n base: '#e0e0e0',\n highlight: '#ffffff',\n radius: '0px',\n duration: '1.2s',\n easing: 'linear',\n border: '1px solid #cccccc',\n contrast: '#000000',\n },\n neon: {\n base: '#0c0b16',\n highlight: 'rgba(0, 240, 255, 0.5)',\n radius: '8px',\n duration: '1.6s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: '1px solid rgba(0, 240, 255, 0.3)',\n glow: '0 0 12px rgba(0, 240, 255, 0.35)',\n contrast: '#00f0ff',\n },\n sunset: {\n base: '#fed7aa',\n highlight: '#fff7ed',\n radius: '8px',\n duration: '1.7s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n glow: '0 0 8px rgba(251, 146, 60, 0.25)',\n contrast: '#7c2d12',\n },\n ocean: {\n base: '#0f2937',\n highlight: 'rgba(56, 189, 248, 0.45)',\n radius: '8px',\n duration: '1.7s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: '1px solid rgba(56, 189, 248, 0.2)',\n glow: '0 0 10px rgba(56, 189, 248, 0.25)',\n contrast: '#38bdf8',\n },\n};\n\nconst customThemesRegistry = new Map<string, VeilThemeTokens>();\n\n/**\n * Creates and registers a new custom theme\n */\nexport function createTheme(themeInput: CustomThemeInput): VeilThemeTokens {\n const parentTheme = themeInput.parent && BUILTIN_THEMES[themeInput.parent]\n ? BUILTIN_THEMES[themeInput.parent]\n : BUILTIN_THEMES.light;\n\n const resolvedTheme: VeilThemeTokens = {\n base: themeInput.base ?? parentTheme.base,\n highlight: themeInput.highlight ?? parentTheme.highlight,\n radius: themeInput.radius ?? parentTheme.radius,\n duration: themeInput.duration ?? parentTheme.duration,\n easing: themeInput.easing ?? parentTheme.easing,\n border: themeInput.border ?? parentTheme.border,\n blur: themeInput.blur ?? parentTheme.blur,\n glow: themeInput.glow ?? parentTheme.glow,\n contrast: themeInput.contrast ?? parentTheme.contrast,\n };\n\n customThemesRegistry.set(themeInput.name, resolvedTheme);\n return resolvedTheme;\n}\n\n/**\n * Get theme tokens by name or object\n */\nexport function getThemeTokens(theme?: VeilThemeName | CustomThemeInput | string): VeilThemeTokens {\n if (!theme) return BUILTIN_THEMES.light;\n if (typeof theme === 'string') {\n if (theme in BUILTIN_THEMES) {\n return BUILTIN_THEMES[theme as VeilThemeName];\n }\n const custom = customThemesRegistry.get(theme);\n if (custom) return custom;\n return BUILTIN_THEMES.light;\n }\n return createTheme(theme);\n}\n"]}
@@ -0,0 +1,54 @@
1
+ import react__default from 'react';
2
+ import { ViewStyle, TextStyle } from 'react-native';
3
+ import { V as VeilThemeName, a as VeilAnimationName } from '../types-CnR-rU97.cjs';
4
+
5
+ /**
6
+ * Veilkit - React Native & Expo Adapter (`veilkit/native`)
7
+ * Works in Expo Go, New Architecture, iOS, Android, and react-native-web.
8
+ * UI-thread Reanimated with smooth built-in Animated fallback,
9
+ * and LinearGradient with smooth pulse fallback.
10
+ */
11
+
12
+ interface NativeSkeletonProps {
13
+ width?: number | string;
14
+ height?: number | string;
15
+ radius?: number;
16
+ circle?: boolean;
17
+ theme?: VeilThemeName;
18
+ animation?: VeilAnimationName;
19
+ style?: ViewStyle;
20
+ children?: react__default.ReactNode;
21
+ }
22
+ declare function Skeleton({ width, height, radius, circle, theme, animation, style, children, }: NativeSkeletonProps): react__default.JSX.Element;
23
+ declare function SkeletonGroup({ children, style }: {
24
+ children: react__default.ReactNode;
25
+ style?: ViewStyle;
26
+ }): react__default.JSX.Element;
27
+ declare function Spinner({ size, color, }: {
28
+ size?: 'small' | 'large' | number;
29
+ color?: string;
30
+ }): react__default.JSX.Element;
31
+ declare function Overlay({ visible, message, children, }: {
32
+ visible: boolean;
33
+ message?: string;
34
+ children?: react__default.ReactNode;
35
+ }): react__default.JSX.Element;
36
+ declare function LoadingButton({ status: controlledStatus, loading, title, loadingText, successText, errorText, resetAfter, haptics, onPress, style, textStyle, }: {
37
+ status?: 'idle' | 'loading' | 'success' | 'error';
38
+ loading?: boolean;
39
+ title: string;
40
+ loadingText?: string;
41
+ successText?: string;
42
+ errorText?: string;
43
+ resetAfter?: number;
44
+ haptics?: boolean;
45
+ onPress?: () => Promise<any> | void;
46
+ style?: ViewStyle;
47
+ textStyle?: TextStyle;
48
+ }): react__default.JSX.Element;
49
+ declare function ProgressBar({ progress, color }: {
50
+ progress: number;
51
+ color?: string;
52
+ }): react__default.JSX.Element;
53
+
54
+ export { LoadingButton, type NativeSkeletonProps, Overlay, ProgressBar, Skeleton, SkeletonGroup, Spinner };
@@ -0,0 +1,54 @@
1
+ import react__default from 'react';
2
+ import { ViewStyle, TextStyle } from 'react-native';
3
+ import { V as VeilThemeName, a as VeilAnimationName } from '../types-CnR-rU97.js';
4
+
5
+ /**
6
+ * Veilkit - React Native & Expo Adapter (`veilkit/native`)
7
+ * Works in Expo Go, New Architecture, iOS, Android, and react-native-web.
8
+ * UI-thread Reanimated with smooth built-in Animated fallback,
9
+ * and LinearGradient with smooth pulse fallback.
10
+ */
11
+
12
+ interface NativeSkeletonProps {
13
+ width?: number | string;
14
+ height?: number | string;
15
+ radius?: number;
16
+ circle?: boolean;
17
+ theme?: VeilThemeName;
18
+ animation?: VeilAnimationName;
19
+ style?: ViewStyle;
20
+ children?: react__default.ReactNode;
21
+ }
22
+ declare function Skeleton({ width, height, radius, circle, theme, animation, style, children, }: NativeSkeletonProps): react__default.JSX.Element;
23
+ declare function SkeletonGroup({ children, style }: {
24
+ children: react__default.ReactNode;
25
+ style?: ViewStyle;
26
+ }): react__default.JSX.Element;
27
+ declare function Spinner({ size, color, }: {
28
+ size?: 'small' | 'large' | number;
29
+ color?: string;
30
+ }): react__default.JSX.Element;
31
+ declare function Overlay({ visible, message, children, }: {
32
+ visible: boolean;
33
+ message?: string;
34
+ children?: react__default.ReactNode;
35
+ }): react__default.JSX.Element;
36
+ declare function LoadingButton({ status: controlledStatus, loading, title, loadingText, successText, errorText, resetAfter, haptics, onPress, style, textStyle, }: {
37
+ status?: 'idle' | 'loading' | 'success' | 'error';
38
+ loading?: boolean;
39
+ title: string;
40
+ loadingText?: string;
41
+ successText?: string;
42
+ errorText?: string;
43
+ resetAfter?: number;
44
+ haptics?: boolean;
45
+ onPress?: () => Promise<any> | void;
46
+ style?: ViewStyle;
47
+ textStyle?: TextStyle;
48
+ }): react__default.JSX.Element;
49
+ declare function ProgressBar({ progress, color }: {
50
+ progress: number;
51
+ color?: string;
52
+ }): react__default.JSX.Element;
53
+
54
+ export { LoadingButton, type NativeSkeletonProps, Overlay, ProgressBar, Skeleton, SkeletonGroup, Spinner };
@@ -0,0 +1,2 @@
1
+ import {useState,useEffect,useRef}from'react';import {StyleSheet,useColorScheme,AccessibilityInfo,Animated,View,ActivityIndicator,Text,TouchableOpacity}from'react-native';import {jsxs,jsx}from'react/jsx-runtime';var z=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,a)=>(typeof require<"u"?require:t)[a]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var C={light:{base:"#e5e7eb",highlight:"rgba(255, 255, 255, 0.7)",radius:"6px",duration:"1.5s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",contrast:"#374151"},dark:{base:"#1f2937",highlight:"rgba(255, 255, 255, 0.12)",radius:"6px",duration:"1.5s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",contrast:"#f3f4f6"},auto:{base:"var(--veil-auto-base, #e5e7eb)",highlight:"var(--veil-auto-highlight, rgba(255, 255, 255, 0.7))",radius:"6px",duration:"1.5s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",contrast:"var(--veil-auto-contrast, #374151)"},glass:{base:"rgba(255, 255, 255, 0.08)",highlight:"rgba(255, 255, 255, 0.25)",radius:"12px",duration:"1.8s",easing:"cubic-bezier(0.25, 1, 0.5, 1)",blur:"12px",border:"1px solid rgba(255, 255, 255, 0.15)",glow:"inset 0 1px 1px 0 rgba(255, 255, 255, 0.25), 0 4px 16px 0 rgba(0, 0, 0, 0.12)",contrast:"#ffffff"},ios:{base:"rgba(120, 120, 128, 0.18)",highlight:"rgba(255, 255, 255, 0.45)",radius:"10px",duration:"1.4s",easing:"cubic-bezier(0.32, 0.72, 0, 1)",border:"none",contrast:"#1c1c1e"},material:{base:"#e7e0ec",highlight:"#f7f2fa",radius:"12px",duration:"1.6s",easing:"cubic-bezier(0.2, 0, 0, 1)",border:"none",contrast:"#1d1b20"},minimal:{base:"#f1f3f5",highlight:"#ffffff",radius:"4px",duration:"1.4s",easing:"ease-in-out",border:"none",contrast:"#212529"},mono:{base:"#e0e0e0",highlight:"#ffffff",radius:"0px",duration:"1.2s",easing:"linear",border:"1px solid #cccccc",contrast:"#000000"},neon:{base:"#0c0b16",highlight:"rgba(0, 240, 255, 0.5)",radius:"8px",duration:"1.6s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"1px solid rgba(0, 240, 255, 0.3)",glow:"0 0 12px rgba(0, 240, 255, 0.35)",contrast:"#00f0ff"},sunset:{base:"#fed7aa",highlight:"#fff7ed",radius:"8px",duration:"1.7s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"none",glow:"0 0 8px rgba(251, 146, 60, 0.25)",contrast:"#7c2d12"},ocean:{base:"#0f2937",highlight:"rgba(56, 189, 248, 0.45)",radius:"8px",duration:"1.7s",easing:"cubic-bezier(0.4, 0, 0.2, 1)",border:"1px solid rgba(56, 189, 248, 0.2)",glow:"0 0 10px rgba(56, 189, 248, 0.25)",contrast:"#38bdf8"}};var V=null;try{V=z("expo-linear-gradient").LinearGradient;}catch{try{V=z("react-native-linear-gradient").default;}catch{V=null;}}var n=null;try{n=z("expo-haptics");}catch{n=null;}function B(e){if(n)try{e==="start"?n.impactAsync?.(n.ImpactFeedbackStyle?.Light):e==="success"?n.notificationAsync?.(n.NotificationFeedbackType?.Success):e==="error"&&n.notificationAsync?.(n.NotificationFeedbackType?.Error);}catch{}}function X({width:e="100%",height:t=20,radius:a=6,circle:w=false,theme:v="auto",animation:h="shimmer",style:c,children:p}){let y=useColorScheme(),[m,u]=useState(false);useEffect(()=>{AccessibilityInfo.isReduceMotionEnabled().then(u).catch(()=>{});},[]);let i=C[v==="auto"?y==="dark"?"dark":"light":v]||C.light,g=useRef(new Animated.Value(0)).current;useEffect(()=>{if(m||h==="none")return;let d=Animated.loop(Animated.timing(g,{toValue:1,duration:1500,useNativeDriver:true}));return d.start(),()=>d.stop()},[g,m,h]);let S=g.interpolate({inputRange:[0,1],outputRange:[-200,200]}),R=g.interpolate({inputRange:[0,.5,1],outputRange:[.4,.9,.4]}),b=w?9999:a,N=i.base.startsWith("var")?y==="dark"?"#1f2937":"#e5e7eb":i.base;return jsxs(View,{accessibilityRole:"none",accessibilityState:{busy:true},style:[o.skeletonBase,{width:e,height:t,borderRadius:b,backgroundColor:N},c],children:[!m&&h!=="none"&&(V?jsx(Animated.View,{style:[StyleSheet.absoluteFill,{transform:[{translateX:S}]}],children:jsx(V,{colors:["transparent",i.highlight,"transparent"],start:{x:0,y:.5},end:{x:1,y:.5},style:StyleSheet.absoluteFill})}):jsx(Animated.View,{style:[StyleSheet.absoluteFill,{backgroundColor:i.highlight,opacity:R}]})),p]})}function $({children:e,style:t}){return jsx(View,{accessibilityLiveRegion:"polite",accessibilityState:{busy:true},style:t,children:e})}function A({size:e="small",color:t="#3b82f6"}){return jsx(ActivityIndicator,{size:e,color:t})}function J({visible:e,message:t,children:a}){return jsxs(View,{style:o.overlayContainer,children:[a,e&&jsxs(View,{style:o.overlayBackdrop,children:[jsx(A,{size:"large",color:"#ffffff"}),t&&jsx(Text,{style:o.overlayText,children:t})]})]})}function K({status:e,loading:t=false,title:a,loadingText:w,successText:v="Success",errorText:h="Failed",resetAfter:c=2e3,haptics:p=true,onPress:y,style:m,textStyle:u}){let[s,i]=useState(e||(t?"loading":"idle"));useEffect(()=>{i(e||(t?"loading":"idle"));},[e,t]);let g=async()=>{if(s==="idle"&&(p&&B("start"),y))try{let d=y();d&&typeof d.then=="function"&&(i("loading"),await d,p&&B("success"),i("success"),c>0&&setTimeout(()=>i("idle"),c));}catch{p&&B("error"),i("error"),c>0&&setTimeout(()=>i("idle"),c);}},S=s==="loading",R=s!=="idle",b=jsx(Text,{style:[o.btnText,u],children:a});s==="loading"?b=jsxs(View,{style:{flexDirection:"row",alignItems:"center",gap:8},children:[jsx(A,{size:"small",color:"#ffffff"}),w?jsx(Text,{style:[o.btnText,u],children:w}):null]}):s==="success"?b=jsxs(Text,{style:[o.btnText,u],children:["\u2713 ",v]}):s==="error"&&(b=jsxs(Text,{style:[o.btnText,u],children:["\u2715 ",h]}));let N=s==="success"?{backgroundColor:"#10b981"}:s==="error"?{backgroundColor:"#ef4444"}:null;return jsx(TouchableOpacity,{disabled:R,onPress:g,accessibilityState:{busy:S,disabled:R},style:[o.btnBase,N,m],children:b})}function Q({progress:e,color:t="#3b82f6"}){let a=Math.min(1,Math.max(0,e));return jsx(View,{style:o.progressBarTrack,children:jsx(View,{style:[o.progressBarFill,{width:`${a*100}%`,backgroundColor:t}]})})}var o=StyleSheet.create({skeletonBase:{overflow:"hidden",position:"relative"},overlayContainer:{position:"relative",flex:1},overlayBackdrop:{...StyleSheet.absoluteFill,backgroundColor:"rgba(0, 0, 0, 0.45)",justifyContent:"center",alignItems:"center",zIndex:999},overlayText:{marginTop:12,color:"#ffffff",fontSize:15,fontWeight:"600"},btnBase:{backgroundColor:"#3b82f6",paddingVertical:12,paddingHorizontal:20,borderRadius:8,alignItems:"center",justifyContent:"center",minHeight:44},btnText:{color:"#ffffff",fontSize:16,fontWeight:"600"},progressBarTrack:{height:4,width:"100%",backgroundColor:"rgba(0, 0, 0, 0.1)",borderRadius:2,overflow:"hidden"},progressBarFill:{height:"100%",borderRadius:2}});export{K as LoadingButton,J as Overlay,Q as ProgressBar,X as Skeleton,$ as SkeletonGroup,A as Spinner};//# sourceMappingURL=index.js.map
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/native/index.tsx","../../src/core/themes.ts"],"names":["BUILTIN_THEMES","LinearGradientComponent","Haptics","triggerHaptic","type","Skeleton","width","height","radius","circle","theme","animation","style","children","colorScheme","useColorScheme","reduceMotion","setReduceMotion","useState","useEffect","AccessibilityInfo","themeTokens","animatedValue","useRef","Animated","anim","translateX","opacityPulse","borderRadius","baseBg","jsxs","View","styles","jsx","StyleSheet","SkeletonGroup","Spinner","size","color","ActivityIndicator","Overlay","visible","message","Text","LoadingButton","controlledStatus","loading","title","loadingText","successText","errorText","resetAfter","haptics","onPress","textStyle","internalStatus","setInternalStatus","handlePress","result","isBusy","isDisabled","content","bgStyle","TouchableOpacity","ProgressBar","progress","clamped"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Veilkit - React Native & Expo Adapter (`veilkit/native`)\n * Works in Expo Go, New Architecture, iOS, Android, and react-native-web.\n * UI-thread Reanimated with smooth built-in Animated fallback,\n * and LinearGradient with smooth pulse fallback.\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport {\n View,\n Text,\n StyleSheet,\n Animated,\n useColorScheme,\n AccessibilityInfo,\n ViewStyle,\n TextStyle,\n TouchableOpacity,\n ActivityIndicator,\n} from 'react-native';\nimport { BUILTIN_THEMES } from '../core/themes';\nimport { VeilThemeName, VeilAnimationName } from '../core/types';\n\n// Safely probe for optional gradient peer dependencies\nlet LinearGradientComponent: any = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n LinearGradientComponent = require('expo-linear-gradient').LinearGradient;\n} catch {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n LinearGradientComponent = require('react-native-linear-gradient').default;\n } catch {\n LinearGradientComponent = null;\n }\n}\n\n// Safely probe for optional expo-haptics\nlet Haptics: any = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n Haptics = require('expo-haptics');\n} catch {\n Haptics = null;\n}\n\nfunction triggerHaptic(type: 'start' | 'success' | 'error') {\n if (!Haptics) return;\n try {\n if (type === 'start') {\n Haptics.impactAsync?.(Haptics.ImpactFeedbackStyle?.Light);\n } else if (type === 'success') {\n Haptics.notificationAsync?.(Haptics.NotificationFeedbackType?.Success);\n } else if (type === 'error') {\n Haptics.notificationAsync?.(Haptics.NotificationFeedbackType?.Error);\n }\n } catch {\n // Silent fallback\n }\n}\n\nexport interface NativeSkeletonProps {\n width?: number | string;\n height?: number | string;\n radius?: number;\n circle?: boolean;\n theme?: VeilThemeName;\n animation?: VeilAnimationName;\n style?: ViewStyle;\n children?: React.ReactNode;\n}\n\nexport function Skeleton({\n width = '100%',\n height = 20,\n radius = 6,\n circle = false,\n theme = 'auto',\n animation = 'shimmer',\n style,\n children,\n}: NativeSkeletonProps) {\n const colorScheme = useColorScheme();\n const [reduceMotion, setReduceMotion] = useState(false);\n\n useEffect(() => {\n AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion).catch(() => {});\n }, []);\n\n const resolvedThemeName = theme === 'auto' ? (colorScheme === 'dark' ? 'dark' : 'light') : theme;\n const themeTokens = BUILTIN_THEMES[resolvedThemeName] || BUILTIN_THEMES.light;\n\n const animatedValue = useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n if (reduceMotion || animation === 'none') return;\n\n const anim = Animated.loop(\n Animated.timing(animatedValue, {\n toValue: 1,\n duration: 1500,\n useNativeDriver: true,\n }),\n );\n anim.start();\n\n return () => anim.stop();\n }, [animatedValue, reduceMotion, animation]);\n\n const translateX = animatedValue.interpolate({\n inputRange: [0, 1],\n outputRange: [-200, 200],\n });\n\n const opacityPulse = animatedValue.interpolate({\n inputRange: [0, 0.5, 1],\n outputRange: [0.4, 0.9, 0.4],\n });\n\n const borderRadius = circle ? 9999 : radius;\n const baseBg = themeTokens.base.startsWith('var') ? (colorScheme === 'dark' ? '#1f2937' : '#e5e7eb') : themeTokens.base;\n\n return (\n <View\n accessibilityRole=\"none\"\n accessibilityState={{ busy: true }}\n style={[\n styles.skeletonBase,\n {\n width: width as any,\n height: height as any,\n borderRadius,\n backgroundColor: baseBg,\n },\n style,\n ]}\n >\n {!reduceMotion && animation !== 'none' && (\n LinearGradientComponent ? (\n <Animated.View\n style={[\n StyleSheet.absoluteFill,\n { transform: [{ translateX }] },\n ]}\n >\n <LinearGradientComponent\n colors={['transparent', themeTokens.highlight, 'transparent']}\n start={{ x: 0, y: 0.5 }}\n end={{ x: 1, y: 0.5 }}\n style={StyleSheet.absoluteFill}\n />\n </Animated.View>\n ) : (\n <Animated.View\n style={[\n StyleSheet.absoluteFill,\n {\n backgroundColor: themeTokens.highlight,\n opacity: opacityPulse,\n },\n ]}\n />\n )\n )}\n {children}\n </View>\n );\n}\n\nexport function SkeletonGroup({ children, style }: { children: React.ReactNode; style?: ViewStyle }) {\n return (\n <View accessibilityLiveRegion=\"polite\" accessibilityState={{ busy: true }} style={style}>\n {children}\n </View>\n );\n}\n\nexport function Spinner({\n size = 'small',\n color = '#3b82f6',\n}: {\n size?: 'small' | 'large' | number;\n color?: string;\n}) {\n return <ActivityIndicator size={size} color={color} />;\n}\n\nexport function Overlay({\n visible,\n message,\n children,\n}: {\n visible: boolean;\n message?: string;\n children?: React.ReactNode;\n}) {\n return (\n <View style={styles.overlayContainer}>\n {children}\n {visible && (\n <View style={styles.overlayBackdrop}>\n <Spinner size=\"large\" color=\"#ffffff\" />\n {message && <Text style={styles.overlayText}>{message}</Text>}\n </View>\n )}\n </View>\n );\n}\n\nexport function LoadingButton({\n status: controlledStatus,\n loading = false,\n title,\n loadingText,\n successText = 'Success',\n errorText = 'Failed',\n resetAfter = 2000,\n haptics = true,\n onPress,\n style,\n textStyle,\n}: {\n status?: 'idle' | 'loading' | 'success' | 'error';\n loading?: boolean;\n title: string;\n loadingText?: string;\n successText?: string;\n errorText?: string;\n resetAfter?: number;\n haptics?: boolean;\n onPress?: () => Promise<any> | void;\n style?: ViewStyle;\n textStyle?: TextStyle;\n}) {\n const [internalStatus, setInternalStatus] = useState<'idle' | 'loading' | 'success' | 'error'>(\n controlledStatus || (loading ? 'loading' : 'idle'),\n );\n\n useEffect(() => {\n if (controlledStatus) {\n setInternalStatus(controlledStatus);\n } else {\n setInternalStatus(loading ? 'loading' : 'idle');\n }\n }, [controlledStatus, loading]);\n\n const handlePress = async () => {\n if (internalStatus !== 'idle') return;\n\n if (haptics) triggerHaptic('start');\n\n if (onPress) {\n try {\n const result = onPress();\n if (result && typeof result.then === 'function') {\n setInternalStatus('loading');\n await result;\n if (haptics) triggerHaptic('success');\n setInternalStatus('success');\n if (resetAfter > 0) {\n setTimeout(() => setInternalStatus('idle'), resetAfter);\n }\n }\n } catch {\n if (haptics) triggerHaptic('error');\n setInternalStatus('error');\n if (resetAfter > 0) {\n setTimeout(() => setInternalStatus('idle'), resetAfter);\n }\n }\n }\n };\n\n const isBusy = internalStatus === 'loading';\n const isDisabled = internalStatus !== 'idle';\n\n let content: React.ReactNode = <Text style={[styles.btnText, textStyle]}>{title}</Text>;\n if (internalStatus === 'loading') {\n content = (\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>\n <Spinner size=\"small\" color=\"#ffffff\" />\n {loadingText ? <Text style={[styles.btnText, textStyle]}>{loadingText}</Text> : null}\n </View>\n );\n } else if (internalStatus === 'success') {\n content = <Text style={[styles.btnText, textStyle]}>✓ {successText}</Text>;\n } else if (internalStatus === 'error') {\n content = <Text style={[styles.btnText, textStyle]}>✕ {errorText}</Text>;\n }\n\n const bgStyle =\n internalStatus === 'success'\n ? { backgroundColor: '#10b981' }\n : internalStatus === 'error'\n ? { backgroundColor: '#ef4444' }\n : null;\n\n return (\n <TouchableOpacity\n disabled={isDisabled}\n onPress={handlePress}\n accessibilityState={{ busy: isBusy, disabled: isDisabled }}\n style={[styles.btnBase, bgStyle, style]}\n >\n {content}\n </TouchableOpacity>\n );\n}\n\nexport function ProgressBar({ progress, color = '#3b82f6' }: { progress: number; color?: string }) {\n const clamped = Math.min(1, Math.max(0, progress));\n return (\n <View style={styles.progressBarTrack}>\n <View style={[styles.progressBarFill, { width: `${clamped * 100}%`, backgroundColor: color }]} />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n skeletonBase: {\n overflow: 'hidden',\n position: 'relative',\n },\n overlayContainer: {\n position: 'relative',\n flex: 1,\n },\n overlayBackdrop: {\n ...StyleSheet.absoluteFill,\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 999,\n },\n overlayText: {\n marginTop: 12,\n color: '#ffffff',\n fontSize: 15,\n fontWeight: '600',\n },\n btnBase: {\n backgroundColor: '#3b82f6',\n paddingVertical: 12,\n paddingHorizontal: 20,\n borderRadius: 8,\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 44,\n },\n btnText: {\n color: '#ffffff',\n fontSize: 16,\n fontWeight: '600',\n },\n progressBarTrack: {\n height: 4,\n width: '100%',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n borderRadius: 2,\n overflow: 'hidden',\n },\n progressBarFill: {\n height: '100%',\n borderRadius: 2,\n },\n});\n","/**\n * Veilkit - Themes & Token Definitions\n * 11 Built-in Themes + `createTheme()`\n */\n\nimport { VeilThemeName, VeilThemeTokens, CustomThemeInput } from './types';\n\nexport const BUILTIN_THEMES: Record<VeilThemeName, VeilThemeTokens> = {\n light: {\n base: '#e5e7eb',\n highlight: 'rgba(255, 255, 255, 0.7)',\n radius: '6px',\n duration: '1.5s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n contrast: '#374151',\n },\n dark: {\n base: '#1f2937',\n highlight: 'rgba(255, 255, 255, 0.12)',\n radius: '6px',\n duration: '1.5s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n contrast: '#f3f4f6',\n },\n auto: {\n // Dynamic CSS variables will resolve light/dark via prefers-color-scheme\n base: 'var(--veil-auto-base, #e5e7eb)',\n highlight: 'var(--veil-auto-highlight, rgba(255, 255, 255, 0.7))',\n radius: '6px',\n duration: '1.5s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n contrast: 'var(--veil-auto-contrast, #374151)',\n },\n glass: {\n base: 'rgba(255, 255, 255, 0.08)',\n highlight: 'rgba(255, 255, 255, 0.25)',\n radius: '12px',\n duration: '1.8s',\n easing: 'cubic-bezier(0.25, 1, 0.5, 1)',\n blur: '12px',\n border: '1px solid rgba(255, 255, 255, 0.15)',\n glow: 'inset 0 1px 1px 0 rgba(255, 255, 255, 0.25), 0 4px 16px 0 rgba(0, 0, 0, 0.12)',\n contrast: '#ffffff',\n },\n ios: {\n base: 'rgba(120, 120, 128, 0.18)',\n highlight: 'rgba(255, 255, 255, 0.45)',\n radius: '10px',\n duration: '1.4s',\n easing: 'cubic-bezier(0.32, 0.72, 0, 1)',\n border: 'none',\n contrast: '#1c1c1e',\n },\n material: {\n base: '#e7e0ec',\n highlight: '#f7f2fa',\n radius: '12px',\n duration: '1.6s',\n easing: 'cubic-bezier(0.2, 0, 0, 1)',\n border: 'none',\n contrast: '#1d1b20',\n },\n minimal: {\n base: '#f1f3f5',\n highlight: '#ffffff',\n radius: '4px',\n duration: '1.4s',\n easing: 'ease-in-out',\n border: 'none',\n contrast: '#212529',\n },\n mono: {\n base: '#e0e0e0',\n highlight: '#ffffff',\n radius: '0px',\n duration: '1.2s',\n easing: 'linear',\n border: '1px solid #cccccc',\n contrast: '#000000',\n },\n neon: {\n base: '#0c0b16',\n highlight: 'rgba(0, 240, 255, 0.5)',\n radius: '8px',\n duration: '1.6s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: '1px solid rgba(0, 240, 255, 0.3)',\n glow: '0 0 12px rgba(0, 240, 255, 0.35)',\n contrast: '#00f0ff',\n },\n sunset: {\n base: '#fed7aa',\n highlight: '#fff7ed',\n radius: '8px',\n duration: '1.7s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: 'none',\n glow: '0 0 8px rgba(251, 146, 60, 0.25)',\n contrast: '#7c2d12',\n },\n ocean: {\n base: '#0f2937',\n highlight: 'rgba(56, 189, 248, 0.45)',\n radius: '8px',\n duration: '1.7s',\n easing: 'cubic-bezier(0.4, 0, 0.2, 1)',\n border: '1px solid rgba(56, 189, 248, 0.2)',\n glow: '0 0 10px rgba(56, 189, 248, 0.25)',\n contrast: '#38bdf8',\n },\n};\n\nconst customThemesRegistry = new Map<string, VeilThemeTokens>();\n\n/**\n * Creates and registers a new custom theme\n */\nexport function createTheme(themeInput: CustomThemeInput): VeilThemeTokens {\n const parentTheme = themeInput.parent && BUILTIN_THEMES[themeInput.parent]\n ? BUILTIN_THEMES[themeInput.parent]\n : BUILTIN_THEMES.light;\n\n const resolvedTheme: VeilThemeTokens = {\n base: themeInput.base ?? parentTheme.base,\n highlight: themeInput.highlight ?? parentTheme.highlight,\n radius: themeInput.radius ?? parentTheme.radius,\n duration: themeInput.duration ?? parentTheme.duration,\n easing: themeInput.easing ?? parentTheme.easing,\n border: themeInput.border ?? parentTheme.border,\n blur: themeInput.blur ?? parentTheme.blur,\n glow: themeInput.glow ?? parentTheme.glow,\n contrast: themeInput.contrast ?? parentTheme.contrast,\n };\n\n customThemesRegistry.set(themeInput.name, resolvedTheme);\n return resolvedTheme;\n}\n\n/**\n * Get theme tokens by name or object\n */\nexport function getThemeTokens(theme?: VeilThemeName | CustomThemeInput | string): VeilThemeTokens {\n if (!theme) return BUILTIN_THEMES.light;\n if (typeof theme === 'string') {\n if (theme in BUILTIN_THEMES) {\n return BUILTIN_THEMES[theme as VeilThemeName];\n }\n const custom = customThemesRegistry.get(theme);\n if (custom) return custom;\n return BUILTIN_THEMES.light;\n }\n return createTheme(theme);\n}\n"]}