@webority/mobile-ui 0.15.0 → 0.16.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 (161) hide show
  1. package/lib/commonjs/components/Accordion/Accordion.js +1 -1
  2. package/lib/commonjs/components/AmountSlider/AmountSlider.js +1 -1
  3. package/lib/commonjs/components/AnimatePresence/AnimatePresence.js +1 -1
  4. package/lib/commonjs/components/AppBar/AppBar.js +1 -1
  5. package/lib/commonjs/components/AsyncBlock/AsyncBlock.js +1 -1
  6. package/lib/commonjs/components/Banner/Banner.js +1 -1
  7. package/lib/commonjs/components/BottomSheet/BottomSheet.js +1 -1
  8. package/lib/commonjs/components/Button/Button.js +1 -1
  9. package/lib/commonjs/components/Calendar/Calendar.js +1 -1
  10. package/lib/commonjs/components/Card/Card.js +1 -1
  11. package/lib/commonjs/components/Carousel/Carousel.js +1 -1
  12. package/lib/commonjs/components/Chip/Chip.js +1 -1
  13. package/lib/commonjs/components/DatePicker/DatePicker.js +1 -1
  14. package/lib/commonjs/components/DateRangePicker/DateRangePicker.js +1 -1
  15. package/lib/commonjs/components/Drawer/Drawer.js +1 -1
  16. package/lib/commonjs/components/EmptyState/EmptyState.js +1 -1
  17. package/lib/commonjs/components/FloatingActionButton/FloatingActionButton.js +1 -1
  18. package/lib/commonjs/components/IconButton/IconButton.js +1 -1
  19. package/lib/commonjs/components/ListItem/ListItem.js +1 -1
  20. package/lib/commonjs/components/LoaderOverlay/LoaderOverlay.js +1 -1
  21. package/lib/commonjs/components/Menu/MenuSurface.js +1 -1
  22. package/lib/commonjs/components/MessageBubble/MessageBubble.js +1 -1
  23. package/lib/commonjs/components/Modal/Modal.js +1 -1
  24. package/lib/commonjs/components/OTPInput/OTPInput.js +1 -1
  25. package/lib/commonjs/components/OnboardingPager/OnboardingPager.js +1 -1
  26. package/lib/commonjs/components/OptionSheet/OptionSheet.js +1 -1
  27. package/lib/commonjs/components/ProgressBar/ProgressBar.js +1 -1
  28. package/lib/commonjs/components/Screen/Screen.js +1 -0
  29. package/lib/commonjs/components/Screen/index.js +1 -0
  30. package/lib/commonjs/components/SignaturePad/SignaturePad.js +1 -1
  31. package/lib/commonjs/components/Skeleton/Skeleton.js +1 -1
  32. package/lib/commonjs/components/Skeleton/SkeletonContent.js +1 -1
  33. package/lib/commonjs/components/Skeleton/SkeletonProvider.js +1 -1
  34. package/lib/commonjs/components/Skeleton/index.js +1 -1
  35. package/lib/commonjs/components/Spinner/Spinner.js +1 -1
  36. package/lib/commonjs/components/TagInput/TagInput.js +1 -1
  37. package/lib/commonjs/components/Text/Text.js +1 -1
  38. package/lib/commonjs/components/TimePicker/TimePicker.js +1 -1
  39. package/lib/commonjs/components/Toast/Toast.js +1 -1
  40. package/lib/commonjs/components/Tooltip/Tooltip.js +1 -1
  41. package/lib/commonjs/components/Tour/Tour.js +1 -1
  42. package/lib/commonjs/components/WheelPicker/Wheel.js +1 -1
  43. package/lib/commonjs/components/WheelPicker/WheelPicker.js +1 -1
  44. package/lib/commonjs/components/index.js +1 -1
  45. package/lib/commonjs/hooks/index.js +1 -1
  46. package/lib/commonjs/hooks/useDragToDismiss.js +1 -1
  47. package/lib/commonjs/hooks/useFieldChain.js +1 -0
  48. package/lib/commonjs/hooks/usePresenceMotion.js +1 -0
  49. package/lib/commonjs/hooks/usePressAnimation.js +1 -1
  50. package/lib/commonjs/hooks/useReducedMotion.js +1 -1
  51. package/lib/commonjs/index.js +1 -1
  52. package/lib/commonjs/network/NetworkStatusBanner.js +1 -1
  53. package/lib/commonjs/theme/tokens.js +1 -1
  54. package/lib/commonjs/utils/hapticUtils.js +1 -1
  55. package/lib/module/components/Accordion/Accordion.js +1 -1
  56. package/lib/module/components/AmountSlider/AmountSlider.js +1 -1
  57. package/lib/module/components/AnimatePresence/AnimatePresence.js +1 -1
  58. package/lib/module/components/AppBar/AppBar.js +1 -1
  59. package/lib/module/components/AsyncBlock/AsyncBlock.js +1 -1
  60. package/lib/module/components/Banner/Banner.js +1 -1
  61. package/lib/module/components/BottomSheet/BottomSheet.js +1 -1
  62. package/lib/module/components/Button/Button.js +1 -1
  63. package/lib/module/components/Calendar/Calendar.js +1 -1
  64. package/lib/module/components/Card/Card.js +1 -1
  65. package/lib/module/components/Carousel/Carousel.js +1 -1
  66. package/lib/module/components/Chip/Chip.js +1 -1
  67. package/lib/module/components/DatePicker/DatePicker.js +1 -1
  68. package/lib/module/components/DateRangePicker/DateRangePicker.js +1 -1
  69. package/lib/module/components/Drawer/Drawer.js +1 -1
  70. package/lib/module/components/EmptyState/EmptyState.js +1 -1
  71. package/lib/module/components/FloatingActionButton/FloatingActionButton.js +1 -1
  72. package/lib/module/components/IconButton/IconButton.js +1 -1
  73. package/lib/module/components/ListItem/ListItem.js +1 -1
  74. package/lib/module/components/LoaderOverlay/LoaderOverlay.js +1 -1
  75. package/lib/module/components/Menu/MenuSurface.js +1 -1
  76. package/lib/module/components/MessageBubble/MessageBubble.js +1 -1
  77. package/lib/module/components/Modal/Modal.js +1 -1
  78. package/lib/module/components/OTPInput/OTPInput.js +1 -1
  79. package/lib/module/components/OnboardingPager/OnboardingPager.js +1 -1
  80. package/lib/module/components/OptionSheet/OptionSheet.js +1 -1
  81. package/lib/module/components/ProgressBar/ProgressBar.js +1 -1
  82. package/lib/module/components/Screen/Screen.js +1 -0
  83. package/lib/module/components/Screen/index.js +1 -0
  84. package/lib/module/components/SignaturePad/SignaturePad.js +1 -1
  85. package/lib/module/components/Skeleton/Skeleton.js +1 -1
  86. package/lib/module/components/Skeleton/SkeletonContent.js +1 -1
  87. package/lib/module/components/Skeleton/SkeletonProvider.js +1 -1
  88. package/lib/module/components/Skeleton/index.js +1 -1
  89. package/lib/module/components/Spinner/Spinner.js +1 -1
  90. package/lib/module/components/TagInput/TagInput.js +1 -1
  91. package/lib/module/components/Text/Text.js +1 -1
  92. package/lib/module/components/TimePicker/TimePicker.js +1 -1
  93. package/lib/module/components/Toast/Toast.js +1 -1
  94. package/lib/module/components/Tooltip/Tooltip.js +1 -1
  95. package/lib/module/components/Tour/Tour.js +1 -1
  96. package/lib/module/components/WheelPicker/Wheel.js +1 -1
  97. package/lib/module/components/WheelPicker/WheelPicker.js +1 -1
  98. package/lib/module/components/index.js +1 -1
  99. package/lib/module/hooks/index.js +1 -1
  100. package/lib/module/hooks/useDragToDismiss.js +1 -1
  101. package/lib/module/hooks/useFieldChain.js +1 -0
  102. package/lib/module/hooks/usePresenceMotion.js +1 -0
  103. package/lib/module/hooks/usePressAnimation.js +1 -1
  104. package/lib/module/hooks/useReducedMotion.js +1 -1
  105. package/lib/module/index.js +1 -1
  106. package/lib/module/network/NetworkStatusBanner.js +1 -1
  107. package/lib/module/theme/tokens.js +1 -1
  108. package/lib/module/utils/hapticUtils.js +1 -1
  109. package/lib/typescript/commonjs/components/AnimatePresence/AnimatePresence.d.ts +5 -5
  110. package/lib/typescript/commonjs/components/AsyncBlock/AsyncBlock.d.ts +11 -6
  111. package/lib/typescript/commonjs/components/BottomSheet/BottomSheet.d.ts +8 -2
  112. package/lib/typescript/commonjs/components/Button/Button.d.ts +6 -3
  113. package/lib/typescript/commonjs/components/Card/Card.d.ts +1 -1
  114. package/lib/typescript/commonjs/components/Carousel/Carousel.d.ts +2 -0
  115. package/lib/typescript/commonjs/components/ListItem/ListItem.d.ts +1 -1
  116. package/lib/typescript/commonjs/components/MessageBubble/MessageBubble.d.ts +6 -3
  117. package/lib/typescript/commonjs/components/OTPInput/OTPInput.d.ts +1 -2
  118. package/lib/typescript/commonjs/components/Screen/Screen.d.ts +39 -0
  119. package/lib/typescript/commonjs/components/Screen/index.d.ts +3 -0
  120. package/lib/typescript/commonjs/components/SignaturePad/SignaturePad.d.ts +6 -0
  121. package/lib/typescript/commonjs/components/Skeleton/Skeleton.d.ts +2 -2
  122. package/lib/typescript/commonjs/components/Skeleton/SkeletonProvider.d.ts +3 -11
  123. package/lib/typescript/commonjs/components/Skeleton/index.d.ts +1 -1
  124. package/lib/typescript/commonjs/components/WheelPicker/Wheel.d.ts +2 -0
  125. package/lib/typescript/commonjs/components/WheelPicker/WheelPicker.d.ts +5 -0
  126. package/lib/typescript/commonjs/components/index.d.ts +3 -1
  127. package/lib/typescript/commonjs/hooks/index.d.ts +4 -0
  128. package/lib/typescript/commonjs/hooks/useDragToDismiss.d.ts +10 -2
  129. package/lib/typescript/commonjs/hooks/useFieldChain.d.ts +10 -0
  130. package/lib/typescript/commonjs/hooks/usePresenceMotion.d.ts +14 -0
  131. package/lib/typescript/commonjs/hooks/usePressAnimation.d.ts +2 -2
  132. package/lib/typescript/commonjs/hooks/useReducedMotion.d.ts +0 -6
  133. package/lib/typescript/commonjs/index.d.ts +2 -2
  134. package/lib/typescript/commonjs/theme/types.d.ts +4 -0
  135. package/lib/typescript/module/components/AnimatePresence/AnimatePresence.d.ts +5 -5
  136. package/lib/typescript/module/components/AsyncBlock/AsyncBlock.d.ts +11 -6
  137. package/lib/typescript/module/components/BottomSheet/BottomSheet.d.ts +8 -2
  138. package/lib/typescript/module/components/Button/Button.d.ts +6 -3
  139. package/lib/typescript/module/components/Card/Card.d.ts +1 -1
  140. package/lib/typescript/module/components/Carousel/Carousel.d.ts +2 -0
  141. package/lib/typescript/module/components/ListItem/ListItem.d.ts +1 -1
  142. package/lib/typescript/module/components/MessageBubble/MessageBubble.d.ts +6 -3
  143. package/lib/typescript/module/components/OTPInput/OTPInput.d.ts +1 -2
  144. package/lib/typescript/module/components/Screen/Screen.d.ts +39 -0
  145. package/lib/typescript/module/components/Screen/index.d.ts +3 -0
  146. package/lib/typescript/module/components/SignaturePad/SignaturePad.d.ts +6 -0
  147. package/lib/typescript/module/components/Skeleton/Skeleton.d.ts +2 -2
  148. package/lib/typescript/module/components/Skeleton/SkeletonProvider.d.ts +3 -11
  149. package/lib/typescript/module/components/Skeleton/index.d.ts +1 -1
  150. package/lib/typescript/module/components/WheelPicker/Wheel.d.ts +2 -0
  151. package/lib/typescript/module/components/WheelPicker/WheelPicker.d.ts +5 -0
  152. package/lib/typescript/module/components/index.d.ts +3 -1
  153. package/lib/typescript/module/hooks/index.d.ts +4 -0
  154. package/lib/typescript/module/hooks/useDragToDismiss.d.ts +10 -2
  155. package/lib/typescript/module/hooks/useFieldChain.d.ts +10 -0
  156. package/lib/typescript/module/hooks/usePresenceMotion.d.ts +14 -0
  157. package/lib/typescript/module/hooks/usePressAnimation.d.ts +2 -2
  158. package/lib/typescript/module/hooks/useReducedMotion.d.ts +0 -6
  159. package/lib/typescript/module/index.d.ts +2 -2
  160. package/lib/typescript/module/theme/types.d.ts +4 -0
  161. package/package.json +3 -3
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.DatePicker=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeGestureHandler=require("react-native-gesture-handler"),_useDragToDismiss=require("../../hooks/useDragToDismiss.js"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_corners=require("../../utils/corners.js"),_defaultIcons=require("../AppIcon/defaultIcons.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_index3=require("../PickerTrigger/index.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_jsxRuntime=require("react/jsx-runtime");const GRID_SIZE=12,DECADE_SPAN=10,startOfDay=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),isSameDay=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate(),toIso=e=>`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,addMonths=(e,t)=>new Date(e.getFullYear(),e.getMonth()+t,1),buildMonthMatrix=(e,t)=>{const a=e.getFullYear(),r=e.getMonth(),i=(new Date(a,r,1).getDay()-t+7)%7,n=[];for(let e=0;e<42;e+=1){const t=new Date(a,r,1-i+e);n.push({date:t,inMonth:t.getMonth()===r,iso:toIso(t)})}return n},weekdayLabels=(e,t)=>{const a=new Intl.DateTimeFormat(e,{weekday:"short"}),r=[];for(let e=0;e<7;e+=1){const i=new Date(1970,0,4+(t+e)%7);r.push(a.format(i))}return r},formatMonthYear=(e,t)=>new Intl.DateTimeFormat(t,{month:"long",year:"numeric"}).format(e),formatLongDate=(e,t)=>new Intl.DateTimeFormat(t,{weekday:"long",year:"numeric",month:"long",day:"numeric"}).format(e),decadeStartFor=e=>10*Math.floor(e/10),buildYearCells=e=>{const t=e-4;return Array.from({length:12},(e,a)=>t+a)},buildDecadeCells=e=>{const t=decadeStartFor(e)-40;return Array.from({length:12},(e,a)=>t+10*a)},DatePicker=e=>{const{value:t,onChange:a,onClose:r,minDate:i,maxDate:n,disabledDates:s,mode:o="modal",locale:l="en-IN",weekStartsOn:c=0,title:d="Select Date",confirmLabel:u="Confirm",cancelLabel:m="Cancel",style:g,containerStyle:y,headerLabelStyle:_,navButtonStyle:x,footerButtonStyle:h,haptic:p,testID:b,label:v,placeholder:f,helperText:j,error:N,required:R,disabled:D,size:w,variant:S,clearable:C,onClear:k,formatValue:P,triggerStyle:T}=e,A=void 0!==e.visible,[V,M]=(0,_react.useState)(!1),I=A?e.visible:V,F=A?b:b?`${b}-calendar`:void 0,L=(0,_index.useTheme)(),[B,Y]=(0,_ModalSafeArea.useModalInsets)(),z=(0,_react.useMemo)(()=>buildStyles(L),[L]),[H,$]=(0,_react.useState)(()=>startOfDay(new Date));(0,_react.useEffect)(()=>{I&&$(startOfDay(new Date))},[I]);const W=t?startOfDay(t):H,[E,q]=(0,_react.useState)(W),[O,G]=(0,_react.useState)(t?startOfDay(t):null),[X,Z]=(0,_react.useState)("days"),J=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,K=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,Q=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,U=(0,_react.useRef)(0),ee=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,te=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,ae=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,re=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,ie=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,ne=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current;(0,_react.useEffect)(()=>{if(t){const e=startOfDay(t);G(e),q(e)}else G(null)},[t]),(0,_react.useEffect)(()=>{if("modal"===o&&I){J.setValue(0),(0,_index.setNativeValue)(K,0),(0,_index.setNativeValue)(Q,0);const e=_reactNative.Animated.parallel([_reactNative.Animated.timing(J,{toValue:1,duration:L.motion.duration.normal,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!1}),_reactNative.Animated.spring(K,{toValue:1,damping:L.motion.spring.gentle.damping,stiffness:L.motion.spring.gentle.stiffness,mass:L.motion.spring.gentle.mass,useNativeDriver:!0})]);return e.start(),()=>e.stop()}},[I,o,J,K,Q,L.motion]);const se=(0,_react.useMemo)(()=>{const e=new Set;return s?.forEach(t=>e.add(toIso(startOfDay(t)))),e},[s]),oe=(0,_react.useMemo)(()=>i?startOfDay(i):null,[i]),le=(0,_react.useMemo)(()=>n?startOfDay(n):null,[n]),ce=(0,_react.useCallback)(e=>!!(oe&&e.getTime()<oe.getTime())||(!!(le&&e.getTime()>le.getTime())||!!se.has(toIso(e))),[oe,le,se]),de=(0,_react.useMemo)(()=>buildMonthMatrix(E,c),[E,c]),ue=(0,_react.useMemo)(()=>buildYearCells(E.getFullYear()),[E]),me=(0,_react.useMemo)(()=>buildDecadeCells(E.getFullYear()),[E]),ge=(0,_react.useMemo)(()=>weekdayLabels(l,c),[l,c]),ye=(0,_react.useMemo)(()=>{if("days"===X)return formatMonthYear(E,l);if("years"===X){return`${ue[0]} - ${ue[ue.length-1]}`}return`${me[0]} - ${me[me.length-1]+9}`},[E,me,l,X,ue]),xe=(0,_react.useCallback)(e=>!!(oe&&e<oe.getFullYear())||!!(le&&e>le.getFullYear()),[oe,le]),he=(0,_react.useCallback)(e=>!!(oe&&e+10-1<oe.getFullYear())||!!(le&&e>le.getFullYear()),[oe,le]),pe=(0,_react.useCallback)(e=>{!1!==p&&(0,_index2.triggerHaptic)("impactLight");const t=e>0?1:-1,a=L.components.datePicker?.monthSlideDistance??32,r=L.components.datePicker?.monthSlideOutDuration??L.motion.duration.fast??140,i=L.components.datePicker?.monthSlideInDuration??L.motion.duration.fast??160;_reactNative.Animated.sequence([_reactNative.Animated.parallel([_reactNative.Animated.timing(ee,{toValue:-t*a,duration:r,easing:_reactNative.Easing.out(_reactNative.Easing.quad),useNativeDriver:!0}),_reactNative.Animated.timing(te,{toValue:0,duration:r,useNativeDriver:!0})]),_reactNative.Animated.timing(ee,{toValue:t*a,duration:0,useNativeDriver:!0}),_reactNative.Animated.parallel([_reactNative.Animated.timing(ee,{toValue:0,duration:i,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!0}),_reactNative.Animated.timing(te,{toValue:1,duration:i,useNativeDriver:!0})])]).start();const n=addMonths(E,e);q(n),_reactNative.AccessibilityInfo.announceForAccessibility(formatMonthYear(n,l))},[E,p,l,te,ee,L.components.datePicker,L.motion.duration.fast]),be=(0,_react.useCallback)(()=>{"days"!==X?(!1!==p&&(0,_index2.triggerHaptic)("impactLight"),q("years"===X?e=>new Date(e.getFullYear()-12,e.getMonth(),1):e=>new Date(e.getFullYear()-120,e.getMonth(),1))):pe(-1)},[pe,X,p]),ve=(0,_react.useCallback)(()=>{"days"!==X?(!1!==p&&(0,_index2.triggerHaptic)("impactLight"),q("years"===X?e=>new Date(e.getFullYear()+12,e.getMonth(),1):e=>new Date(e.getFullYear()+120,e.getMonth(),1))):pe(1)},[pe,X,p]),fe=(0,_react.useCallback)(()=>{const e=L.components.datePicker?.viewTransitionDuration??L.motion.duration.normal??200;(0,_index.setNativeValue)(re,0),(0,_index.setNativeValue)(ie,.9),_reactNative.Animated.parallel([_reactNative.Animated.timing(re,{toValue:1,duration:e,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!0}),_reactNative.Animated.timing(ie,{toValue:1,duration:e,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!0})]).start()},[re,ie,L.components.datePicker,L.motion.duration.normal]),je=(0,_react.useCallback)(()=>{const e=(0,_index2.resolveHaptic)(p,"selection");e&&(0,_index2.triggerHaptic)(e);const t=L.components.datePicker?.headerPressDuration??80,a=L.components.datePicker?.headerReleaseDuration??100;_reactNative.Animated.sequence([_reactNative.Animated.timing(ne,{toValue:.96,duration:t,useNativeDriver:!0}),_reactNative.Animated.timing(ne,{toValue:1,duration:a,useNativeDriver:!0})]).start(),Z(e=>"days"===e?"years":"years"===e?"decades":"years"),fe()},[fe,ne,p,L.components.datePicker]),Ne=(0,_react.useCallback)(e=>{const t=(0,_index2.resolveHaptic)(p,"selection");t&&(0,_index2.triggerHaptic)(t),q(t=>new Date(e,t.getMonth(),1)),Z("days"),fe()},[fe,p]),Re=(0,_react.useCallback)(e=>{const t=(0,_index2.resolveHaptic)(p,"selection");t&&(0,_index2.triggerHaptic)(t),q(t=>new Date(e+4,t.getMonth(),1)),Z("years"),fe()},[fe,p]),De=(0,_react.useCallback)(e=>{if(ce(e.date))return;const t=(0,_index2.resolveHaptic)(p,"selection");t&&(0,_index2.triggerHaptic)(t),G(e.date),e.inMonth||q(new Date(e.date.getFullYear(),e.date.getMonth(),1)),(0,_index.setNativeValue)(ae,.7),_reactNative.Animated.spring(ae,{toValue:1,damping:L.motion.spring.bouncy.damping,stiffness:L.motion.spring.bouncy.stiffness,mass:L.motion.spring.bouncy.mass,useNativeDriver:!0}).start()},[ce,ae,L.motion.spring.bouncy,p]),we=(0,_react.useCallback)(()=>{A||M(!1),r?.()},[A,r]),Se=(0,_react.useCallback)(()=>{"modal"===o?_reactNative.Animated.parallel([_reactNative.Animated.timing(J,{toValue:0,duration:L.motion.duration.fast,easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!1}),_reactNative.Animated.timing(K,{toValue:0,duration:L.motion.duration.fast,easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{we()}):we()},[J,o,we,K,L.motion.duration.fast,L.motion.easing.accelerate]),{handleGesture:Ce}=(0,_useDragToDismiss.useDragToDismiss)({drag:Q,travel:()=>U.current||320,onDismiss:Se}),ke=(0,_react.useCallback)(()=>{!1!==p&&(0,_index2.triggerHaptic)("selection"),Se()},[Se,p]),Pe=(0,_react.useCallback)(()=>{O&&(!1!==p&&(0,_index2.triggerHaptic)("notificationSuccess"),a?.(O),Se())},[Se,a,O,p]),Te=K.interpolate({inputRange:[0,1],outputRange:[320,0]}),Ae=(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.titleRow,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.title,accessibilityRole:"header",children:d})}),Ve=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[z.card,g,y],accessibilityRole:"modal"===o?void 0:"none",accessible:!1,testID:F,children:["modal"===o?(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:Ce,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:z.grabArea,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.handle}),Ae]})}):Ae,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:z.headerRow,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:be,style:({pressed:e})=>[z.navBtn,e&&z.navBtnPressed,x],accessibilityRole:"button",accessibilityLabel:"days"===X?"Previous month":"years"===X?"Previous years":"Previous decades",hitSlop:8,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.navText,children:"‹"})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:je,style:[z.headerLabelWrap,_],accessibilityRole:"button",accessibilityLabel:"days"===X?`${ye}, switch to year selection`:"years"===X?`${ye}, switch to decade selection`:`${ye}, switch to year selection`,hitSlop:8,children:(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[z.headerLabelInner,{transform:[{scale:ne}],opacity:"days"===X?te:1}],children:[(0,_jsxRuntime.jsx)(_reactNative.Animated.Text,{style:[z.headerLabel,{transform:[{translateX:"days"===X?ee:0}]}],accessibilityLiveRegion:"polite",children:ye}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.headerCaret,children:(L.icons?.chevronDown??_defaultIcons.defaultIcons.chevronDown)({size:L.typography.fontSize.sm,color:L.colors.text.secondary})})]})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:ve,style:({pressed:e})=>[z.navBtn,e&&z.navBtnPressed,x],accessibilityRole:"button",accessibilityLabel:"days"===X?"Next month":"years"===X?"Next years":"Next decades",hitSlop:8,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.navText,children:"›"})})]}),"days"===X?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.weekdayRow,children:ge.map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.weekdayCell,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.weekdayText,children:e})},`${e}-${t}`))}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.grid,{opacity:te,transform:[{translateX:ee}]}],children:Array.from({length:6}).map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.gridRow,children:de.slice(7*t,7*t+7).map(e=>{const t=ce(e.date),a=!!O&&isSameDay(e.date,O),r=isSameDay(e.date,H),i=a?L.colors.primary:"transparent",n=r&&!a?L.colors.primary:"transparent",s=a?L.colors.onPrimary:e.inMonth?t?L.colors.text.disabled:L.colors.text.primary:L.colors.text.tertiary,o=t?.3:e.inMonth?1:.4;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{disabled:t,onPress:()=>De(e),accessibilityRole:"button",accessibilityLabel:formatLongDate(e.date,l),accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:z.dayCell,children:(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.dayInner,{backgroundColor:i,borderColor:n,borderWidth:r&&!a?1.5:0,opacity:o},a?{transform:[{scale:ae}]}:null],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.dayText,{color:s}],children:e.date.getDate()})})},e.iso)})},`r-${t}`))})]}):"years"===X?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.yearGrid,{opacity:re,transform:[{scale:ie}]}],children:Array.from({length:3}).map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.gridRow,children:ue.slice(4*t,4*t+4).map(e=>{const t=xe(e),a=!!O&&O.getFullYear()===e,r=H.getFullYear()===e,i=a?L.colors.primary:"transparent",n=r&&!a?L.colors.primary:"transparent",s=a?L.colors.onPrimary:t?L.colors.text.disabled:L.colors.text.primary,o=t?.3:1;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{disabled:t,onPress:()=>Ne(e),accessibilityRole:"button",accessibilityLabel:`Year ${e}`,accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:z.yearCell,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:[z.yearInner,{backgroundColor:i,borderColor:n,borderWidth:r&&!a?1.5:0,opacity:o}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.yearText,{color:s}],children:e})})},`year-${e}`)})},`yr-${t}`))}):(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.yearGrid,{opacity:re,transform:[{scale:ie}]}],children:Array.from({length:3}).map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.gridRow,children:me.slice(4*t,4*t+4).map(e=>{const t=e+10-1,a=he(e),r=!!O&&decadeStartFor(O.getFullYear())===e,i=decadeStartFor(H.getFullYear())===e,n=r?L.colors.primary:"transparent",s=i&&!r?L.colors.primary:"transparent",o=r?L.colors.onPrimary:a?L.colors.text.disabled:L.colors.text.primary,l=a?.3:1;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{disabled:a,onPress:()=>Re(e),accessibilityRole:"button",accessibilityLabel:`Decade ${e} to ${t}`,accessibilityState:{selected:r,disabled:a},"aria-selected":r,"aria-disabled":a,style:z.yearCell,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[z.yearInner,{backgroundColor:n,borderColor:s,borderWidth:i&&!r?1.5:0,opacity:l}],children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.yearText,{color:o}],children:`${e}s`}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.decadeRangeText,{color:r?L.colors.onPrimary:L.colors.text.tertiary}],children:`${e}-${t}`})]})},`decade-${e}`)})},`dec-${t}`))}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:z.footer,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:ke,style:({pressed:e})=>[z.footerBtn,z.footerCancel,e&&z.footerBtnPressed,h],accessibilityRole:"button",accessibilityLabel:m,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.footerBtnText,{color:L.colors.text.secondary}],children:m})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:Pe,disabled:!O,style:({pressed:e})=>[z.footerBtn,z.footerConfirm,{backgroundColor:L.colors.primary,opacity:O?1:.5},e&&{backgroundColor:L.colors.primaryHover},h],accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{disabled:!O},"aria-disabled":!O,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.footerBtnText,{color:L.colors.onPrimary}],children:u})})]})]}),Me=t?(P??(e=>e.toLocaleDateString()))(t):void 0,Ie=!A;if("inline"===o)return I||Ie?Ie?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_index3.PickerTrigger,{label:v,value:Me,placeholder:f,helperText:j,error:N,required:R,disabled:D,size:w,variant:S,clearable:C,onClear:k,onPress:()=>M(!0),triggerStyle:T,testID:b}),I?Ve:null]}):Ve:null;const Fe=(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:I,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:Se,children:(0,_jsxRuntime.jsx)(_ModalSafeArea.ModalSafeArea,{onInsets:Y,children:(0,_jsxRuntime.jsxs)(_reactNativeGestureHandler.GestureHandlerRootView,{collapsable:!1,style:[z.backdrop,{backgroundColor:L.colors.background.overlay}],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:Se,accessibilityLabel:"Dismiss"}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.sheetWrap,{paddingBottom:Math.max(B.bottom,L.spacing.lg),opacity:K,transform:[{translateY:_reactNative.Animated.add(Te,Q)}]}],onLayout:e=>{U.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:Ve}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})});return Ie?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_index3.PickerTrigger,{label:v,value:Me,placeholder:f,helperText:j,error:N,required:R,disabled:D,size:w,variant:S,clearable:C,onClear:k,onPress:()=>M(!0),triggerStyle:T,testID:b}),Fe]}):Fe};exports.DatePicker=DatePicker;const buildStyles=e=>{const t=e.shadows.lg;return _reactNative.StyleSheet.create({backdrop:{..._reactNative.StyleSheet.absoluteFill},sheetWrap:{position:"absolute",left:0,right:0,bottom:0,paddingHorizontal:e.spacing.md,paddingBottom:e.spacing.lg},card:{backgroundColor:e.colors.background.elevated,borderRadius:e.radius.xl,..._corners.smoothCorners,padding:e.spacing.lg,shadowColor:t.shadowColor,shadowOffset:t.shadowOffset,shadowOpacity:t.shadowOpacity,shadowRadius:t.shadowRadius,elevation:t.elevation},grabArea:{marginTop:-e.spacing.lg,paddingTop:e.spacing.sm},handle:{alignSelf:"center",width:36,height:4,borderRadius:e.radius.full,..._corners.smoothCorners,backgroundColor:e.colors.border.secondary,marginBottom:e.spacing.sm},titleRow:{marginBottom:e.spacing.sm},title:{fontSize:e.typography.fontSize.lg,fontWeight:e.typography.fontWeight.semibold,color:e.colors.text.primary},headerRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:e.spacing.md},navBtn:{width:e.components.datePicker?.navButtonSize??36,height:e.components.datePicker?.navButtonSize??36,borderRadius:e.radius.full,..._corners.smoothCorners,alignItems:"center",justifyContent:"center",backgroundColor:e.colors.background.secondary},navBtnPressed:{backgroundColor:e.colors.surface.pressed},navText:{fontSize:e.components.datePicker?.navTextFontSize??22,lineHeight:e.components.datePicker?.navTextLineHeight??24,color:e.colors.text.primary,fontWeight:e.typography.fontWeight.semibold},headerLabelWrap:{flex:1,alignItems:"center"},headerLabelInner:{flexDirection:"row",alignItems:"center",justifyContent:"center"},headerLabel:{fontSize:e.typography.fontSize.base,fontWeight:e.typography.fontWeight.semibold,color:e.colors.text.primary},headerCaret:{marginLeft:e.spacing.xs,alignItems:"center",justifyContent:"center"},weekdayRow:{flexDirection:"row",marginBottom:e.spacing.xs},weekdayCell:{flex:1,alignItems:"center",paddingVertical:e.spacing.xs},weekdayText:{fontSize:e.typography.fontSize.xs,fontWeight:e.typography.fontWeight.medium,color:e.colors.text.tertiary,letterSpacing:e.typography.letterSpacing.wide},grid:{},gridRow:{flexDirection:"row"},dayCell:{flex:1,aspectRatio:1,alignItems:"center",justifyContent:"center",padding:e.components.datePicker?.dayCellPadding??2},dayInner:{width:"100%",height:"100%",borderRadius:e.components.datePicker?.dayInnerBorderRadius??e.radius.full,..._corners.smoothCorners,alignItems:"center",justifyContent:"center"},dayText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.medium},yearGrid:{},yearCell:{flex:1,aspectRatio:1.6,alignItems:"center",justifyContent:"center",padding:e.components.datePicker?.yearCellPadding??4},yearInner:{width:"100%",height:"100%",borderRadius:e.components.datePicker?.yearInnerBorderRadius??e.radius.lg,..._corners.smoothCorners,alignItems:"center",justifyContent:"center"},yearText:{fontSize:e.typography.fontSize.base,fontWeight:e.typography.fontWeight.semibold},decadeRangeText:{fontSize:e.typography.fontSize.xs,fontWeight:e.typography.fontWeight.medium,marginTop:e.components.datePicker?.decadeRangeMarginTop??2},footer:{flexDirection:"row",justifyContent:"flex-end",alignItems:"center",marginTop:e.spacing.lg,gap:e.spacing.sm},footerBtn:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,borderRadius:e.radius.md,..._corners.smoothCorners,minHeight:e.components.datePicker?.footerButtonMinHeight??40,alignItems:"center",justifyContent:"center"},footerCancel:{backgroundColor:"transparent"},footerConfirm:{},footerBtnPressed:{opacity:.85},footerBtnText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold}})};var _default=exports.default=DatePicker;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.DatePicker=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeGestureHandler=require("react-native-gesture-handler"),_useDragToDismiss=require("../../hooks/useDragToDismiss.js"),_usePresenceMotion=require("../../hooks/usePresenceMotion.js"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_corners=require("../../utils/corners.js"),_defaultIcons=require("../AppIcon/defaultIcons.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_index3=require("../PickerTrigger/index.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_jsxRuntime=require("react/jsx-runtime");const AnimatedGestureRoot=_reactNative.Animated.createAnimatedComponent(_reactNativeGestureHandler.GestureHandlerRootView),transparentOf=e=>{const t=e.match(/^rgba?\(([^)]+)\)$/);if(!t)return"transparent";const[a,r,i]=t[1].split(",").map(e=>e.trim());return`rgba(${a}, ${r}, ${i}, 0)`},GRID_SIZE=12,DECADE_SPAN=10,startOfDay=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),isSameDay=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate(),toIso=e=>`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,addMonths=(e,t)=>new Date(e.getFullYear(),e.getMonth()+t,1),buildMonthMatrix=(e,t)=>{const a=e.getFullYear(),r=e.getMonth(),i=(new Date(a,r,1).getDay()-t+7)%7,n=[];for(let e=0;e<42;e+=1){const t=new Date(a,r,1-i+e);n.push({date:t,inMonth:t.getMonth()===r,iso:toIso(t)})}return n},weekdayLabels=(e,t)=>{const a=new Intl.DateTimeFormat(e,{weekday:"short"}),r=[];for(let e=0;e<7;e+=1){const i=new Date(1970,0,4+(t+e)%7);r.push(a.format(i))}return r},formatMonthYear=(e,t)=>new Intl.DateTimeFormat(t,{month:"long",year:"numeric"}).format(e),formatLongDate=(e,t)=>new Intl.DateTimeFormat(t,{weekday:"long",year:"numeric",month:"long",day:"numeric"}).format(e),decadeStartFor=e=>10*Math.floor(e/10),buildYearCells=e=>{const t=e-4;return Array.from({length:12},(e,a)=>t+a)},buildDecadeCells=e=>{const t=decadeStartFor(e)-40;return Array.from({length:12},(e,a)=>t+10*a)},DatePicker=e=>{const{value:t,onChange:a,onClose:r,minDate:i,maxDate:n,disabledDates:s,mode:o="modal",locale:l="en-IN",weekStartsOn:c=0,title:d="Select Date",confirmLabel:u="Confirm",cancelLabel:m="Cancel",style:g,containerStyle:y,headerLabelStyle:_,navButtonStyle:p,footerButtonStyle:x,haptic:h,testID:v,label:b,placeholder:f,helperText:j,error:N,required:R,disabled:D,size:w,variant:C,clearable:S,onClear:k,formatValue:P,triggerStyle:A}=e,T=void 0!==e.visible,[M,V]=(0,_react.useState)(!1),I=T?e.visible:M,F=T?v:v?`${v}-calendar`:void 0,L=(0,_index.useTheme)(),B=(0,_usePresenceMotion.usePresenceMotion)(),[Y,$]=(0,_ModalSafeArea.useModalInsets)(),z=(0,_react.useMemo)(()=>buildStyles(L),[L]),[H,W]=(0,_react.useState)(()=>startOfDay(new Date));(0,_react.useEffect)(()=>{I&&W(startOfDay(new Date))},[I]);const q=t?startOfDay(t):H,[E,O]=(0,_react.useState)(q),[G,X]=(0,_react.useState)(t?startOfDay(t):null),[Z,J]=(0,_react.useState)("days"),K=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,Q=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,U=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,ee=(0,_react.useRef)(0),te=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,ae=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,re=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,ie=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,ne=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,se=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current;(0,_react.useEffect)(()=>{if(t){const e=startOfDay(t);X(e),O(e)}else X(null)},[t]);const oe=(0,_react.useMemo)(()=>{const e=new Set;return s?.forEach(t=>e.add(toIso(startOfDay(t)))),e},[s]),le=(0,_react.useMemo)(()=>i?startOfDay(i):null,[i]),ce=(0,_react.useMemo)(()=>n?startOfDay(n):null,[n]),de=(0,_react.useCallback)(e=>!!(le&&e.getTime()<le.getTime())||(!!(ce&&e.getTime()>ce.getTime())||!!oe.has(toIso(e))),[le,ce,oe]),ue=(0,_react.useMemo)(()=>buildMonthMatrix(E,c),[E,c]),me=(0,_react.useMemo)(()=>buildYearCells(E.getFullYear()),[E]),ge=(0,_react.useMemo)(()=>buildDecadeCells(E.getFullYear()),[E]),ye=(0,_react.useMemo)(()=>weekdayLabels(l,c),[l,c]),pe=(0,_react.useMemo)(()=>{if("days"===Z)return formatMonthYear(E,l);if("years"===Z){return`${me[0]} - ${me[me.length-1]}`}return`${ge[0]} - ${ge[ge.length-1]+9}`},[E,ge,l,Z,me]),xe=(0,_react.useCallback)(e=>!!(le&&e<le.getFullYear())||!!(ce&&e>ce.getFullYear()),[le,ce]),he=(0,_react.useCallback)(e=>!!(le&&e+10-1<le.getFullYear())||!!(ce&&e>ce.getFullYear()),[le,ce]),ve=(0,_react.useCallback)(e=>{!1!==h&&(0,_index2.triggerHaptic)("impactLight");const t=e>0?1:-1,a=L.components.datePicker?.monthSlideDistance??32,r=L.components.datePicker?.monthSlideOutDuration??L.motion.duration.fast??140,i=L.components.datePicker?.monthSlideInDuration??L.motion.duration.fast??160,[n]=B.range(-t*a,0),[s]=B.range(t*a,0),o=B.reduced?B.duration("fast"):r,c=B.reduced?B.duration("fast"):i;_reactNative.Animated.sequence([_reactNative.Animated.parallel([_reactNative.Animated.timing(te,{toValue:n,duration:r,easing:_reactNative.Easing.out(_reactNative.Easing.quad),useNativeDriver:!0}),_reactNative.Animated.timing(ae,{toValue:0,duration:o,useNativeDriver:!0})]),_reactNative.Animated.timing(te,{toValue:s,duration:0,useNativeDriver:!0}),_reactNative.Animated.parallel([_reactNative.Animated.timing(te,{toValue:0,duration:i,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!0}),_reactNative.Animated.timing(ae,{toValue:1,duration:c,useNativeDriver:!0})])]).start();const d=addMonths(E,e);O(d),_reactNative.AccessibilityInfo.announceForAccessibility(formatMonthYear(d,l))},[E,h,l,ae,te,B,L.components.datePicker,L.motion.duration.fast]),be=(0,_react.useCallback)(()=>{"days"!==Z?(!1!==h&&(0,_index2.triggerHaptic)("impactLight"),O("years"===Z?e=>new Date(e.getFullYear()-12,e.getMonth(),1):e=>new Date(e.getFullYear()-120,e.getMonth(),1))):ve(-1)},[ve,Z,h]),fe=(0,_react.useCallback)(()=>{"days"!==Z?(!1!==h&&(0,_index2.triggerHaptic)("impactLight"),O("years"===Z?e=>new Date(e.getFullYear()+12,e.getMonth(),1):e=>new Date(e.getFullYear()+120,e.getMonth(),1))):ve(1)},[ve,Z,h]),je=(0,_react.useCallback)(()=>{const[e]=B.range(.9,1),t=B.reduced?B.duration("normal"):L.components.datePicker?.viewTransitionDuration??L.motion.duration.normal??200;(0,_index.setNativeValue)(ie,0),(0,_index.setNativeValue)(ne,e),_reactNative.Animated.parallel([_reactNative.Animated.timing(ie,{toValue:1,duration:t,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!0}),_reactNative.Animated.timing(ne,{toValue:1,duration:t,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!0})]).start()},[ie,ne,B,L.components.datePicker,L.motion.duration.normal]),Ne=(0,_react.useCallback)(()=>{const e=(0,_index2.resolveHaptic)(h,"selection");if(e&&(0,_index2.triggerHaptic)(e),!B.reduced){const e=L.components.datePicker?.headerPressDuration??80,t=L.components.datePicker?.headerReleaseDuration??100;_reactNative.Animated.sequence([_reactNative.Animated.timing(se,{toValue:.96,duration:e,useNativeDriver:!0}),_reactNative.Animated.timing(se,{toValue:1,duration:t,useNativeDriver:!0})]).start()}J(e=>"days"===e?"years":"years"===e?"decades":"years"),je()},[je,se,h,B.reduced,L.components.datePicker]),Re=(0,_react.useCallback)(e=>{const t=(0,_index2.resolveHaptic)(h,"selection");t&&(0,_index2.triggerHaptic)(t),O(t=>new Date(e,t.getMonth(),1)),J("days"),je()},[je,h]),De=(0,_react.useCallback)(e=>{const t=(0,_index2.resolveHaptic)(h,"selection");t&&(0,_index2.triggerHaptic)(t),O(t=>new Date(e+4,t.getMonth(),1)),J("years"),je()},[je,h]),we=(0,_react.useCallback)(e=>{if(de(e.date))return;const t=(0,_index2.resolveHaptic)(h,"selection");t&&(0,_index2.triggerHaptic)(t),X(e.date),e.inMonth||O(new Date(e.date.getFullYear(),e.date.getMonth(),1)),B.reduced||((0,_index.setNativeValue)(re,.7),_reactNative.Animated.spring(re,{toValue:1,damping:L.motion.spring.bouncy.damping,stiffness:L.motion.spring.bouncy.stiffness,mass:L.motion.spring.bouncy.mass,useNativeDriver:!0}).start())},[de,B.reduced,re,L.motion.spring.bouncy,h]),Ce=(0,_react.useCallback)(()=>{T||V(!1),r?.()},[T,r]),Se=(0,_react.useCallback)(()=>{"modal"===o?_reactNative.Animated.parallel([_reactNative.Animated.timing(K,{toValue:0,duration:B.duration("normal"),easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!1}),_reactNative.Animated.timing(Q,{toValue:0,duration:B.duration("fast"),easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{Ce()}):Ce()},[K,o,Ce,B,Q,L.motion.easing.accelerate]),{handleGesture:ke,opacity:Pe}=(0,_useDragToDismiss.useDragToDismiss)({drag:U,travel:()=>ee.current||320,onDismiss:Se}),Ae=(0,_react.useMemo)(()=>_reactNative.Animated.multiply(Q,Pe),[Q,Pe]),Te=(0,_react.useMemo)(()=>K.interpolate({inputRange:[0,1],outputRange:[transparentOf(L.colors.background.overlay),L.colors.background.overlay]}),[K,L.colors.background.overlay]);(0,_react.useEffect)(()=>{if("modal"===o&&I){K.setValue(0),(0,_index.setNativeValue)(Q,0),(0,_index.setNativeValue)(U,0),(0,_index.setNativeValue)(Pe,1);const e=B.reduced?_reactNative.Animated.timing(Q,{toValue:1,duration:B.duration("normal"),useNativeDriver:!0}):_reactNative.Animated.spring(Q,{toValue:1,damping:L.motion.spring.gentle.damping,stiffness:L.motion.spring.gentle.stiffness,mass:L.motion.spring.gentle.mass,useNativeDriver:!0}),t=_reactNative.Animated.parallel([_reactNative.Animated.timing(K,{toValue:1,duration:B.duration("normal"),easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!1}),e]);return t.start(),()=>t.stop()}},[I,o,K,B,Q,U,Pe,L.motion]);const Me=(0,_react.useCallback)(()=>{!1!==h&&(0,_index2.triggerHaptic)("selection"),Se()},[Se,h]),Ve=(0,_react.useCallback)(()=>{G&&(!1!==h&&(0,_index2.triggerHaptic)("notificationSuccess"),a?.(G),Se())},[Se,a,G,h]),Ie=Q.interpolate({inputRange:[0,1],outputRange:B.range(320,0)}),Fe=(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.titleRow,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.title,accessibilityRole:"header",children:d})}),Le=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[z.card,g,y],accessibilityRole:"modal"===o?void 0:"none",accessible:!1,testID:F,children:["modal"===o?(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:ke,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:z.grabArea,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.handle}),Fe]})}):Fe,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:z.headerRow,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:be,style:({pressed:e})=>[z.navBtn,e&&z.navBtnPressed,p],accessibilityRole:"button",accessibilityLabel:"days"===Z?"Previous month":"years"===Z?"Previous years":"Previous decades",hitSlop:8,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.navText,children:"‹"})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:Ne,style:[z.headerLabelWrap,_],accessibilityRole:"button",accessibilityLabel:"days"===Z?`${pe}, switch to year selection`:"years"===Z?`${pe}, switch to decade selection`:`${pe}, switch to year selection`,hitSlop:8,children:(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[z.headerLabelInner,{transform:[{scale:se}],opacity:"days"===Z?ae:1}],children:[(0,_jsxRuntime.jsx)(_reactNative.Animated.Text,{style:[z.headerLabel,{transform:[{translateX:"days"===Z?te:0}]}],accessibilityLiveRegion:"polite",children:pe}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.headerCaret,children:(L.icons?.chevronDown??_defaultIcons.defaultIcons.chevronDown)({size:L.typography.fontSize.sm,color:L.colors.text.secondary})})]})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:fe,style:({pressed:e})=>[z.navBtn,e&&z.navBtnPressed,p],accessibilityRole:"button",accessibilityLabel:"days"===Z?"Next month":"years"===Z?"Next years":"Next decades",hitSlop:8,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.navText,children:"›"})})]}),"days"===Z?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.weekdayRow,children:ye.map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.weekdayCell,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:z.weekdayText,children:e})},`${e}-${t}`))}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.grid,{opacity:ae,transform:[{translateX:te}]}],children:Array.from({length:6}).map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.gridRow,children:ue.slice(7*t,7*t+7).map(e=>{const t=de(e.date),a=!!G&&isSameDay(e.date,G),r=isSameDay(e.date,H),i=a?L.colors.primary:"transparent",n=r&&!a?L.colors.primary:"transparent",s=a?L.colors.onPrimary:e.inMonth?t?L.colors.text.disabled:L.colors.text.primary:L.colors.text.tertiary,o=t?.3:e.inMonth?1:.4;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{disabled:t,onPress:()=>we(e),accessibilityRole:"button",accessibilityLabel:formatLongDate(e.date,l),accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:z.dayCell,children:(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.dayInner,{backgroundColor:i,borderColor:n,borderWidth:r&&!a?1.5:0,opacity:o},a?{transform:[{scale:re}]}:null],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.dayText,{color:s}],children:e.date.getDate()})})},e.iso)})},`r-${t}`))})]}):"years"===Z?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.yearGrid,{opacity:ie,transform:[{scale:ne}]}],children:Array.from({length:3}).map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.gridRow,children:me.slice(4*t,4*t+4).map(e=>{const t=xe(e),a=!!G&&G.getFullYear()===e,r=H.getFullYear()===e,i=a?L.colors.primary:"transparent",n=r&&!a?L.colors.primary:"transparent",s=a?L.colors.onPrimary:t?L.colors.text.disabled:L.colors.text.primary,o=t?.3:1;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{disabled:t,onPress:()=>Re(e),accessibilityRole:"button",accessibilityLabel:`Year ${e}`,accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:z.yearCell,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:[z.yearInner,{backgroundColor:i,borderColor:n,borderWidth:r&&!a?1.5:0,opacity:o}],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.yearText,{color:s}],children:e})})},`year-${e}`)})},`yr-${t}`))}):(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.yearGrid,{opacity:ie,transform:[{scale:ne}]}],children:Array.from({length:3}).map((e,t)=>(0,_jsxRuntime.jsx)(_reactNative.View,{style:z.gridRow,children:ge.slice(4*t,4*t+4).map(e=>{const t=e+10-1,a=he(e),r=!!G&&decadeStartFor(G.getFullYear())===e,i=decadeStartFor(H.getFullYear())===e,n=r?L.colors.primary:"transparent",s=i&&!r?L.colors.primary:"transparent",o=r?L.colors.onPrimary:a?L.colors.text.disabled:L.colors.text.primary,l=a?.3:1;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{disabled:a,onPress:()=>De(e),accessibilityRole:"button",accessibilityLabel:`Decade ${e} to ${t}`,accessibilityState:{selected:r,disabled:a},"aria-selected":r,"aria-disabled":a,style:z.yearCell,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[z.yearInner,{backgroundColor:n,borderColor:s,borderWidth:i&&!r?1.5:0,opacity:l}],children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.yearText,{color:o}],children:`${e}s`}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.decadeRangeText,{color:r?L.colors.onPrimary:L.colors.text.tertiary}],children:`${e}-${t}`})]})},`decade-${e}`)})},`dec-${t}`))}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:z.footer,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:Me,style:({pressed:e})=>[z.footerBtn,z.footerCancel,e&&z.footerBtnPressed,x],accessibilityRole:"button",accessibilityLabel:m,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.footerBtnText,{color:L.colors.text.secondary}],children:m})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:Ve,disabled:!G,style:({pressed:e})=>[z.footerBtn,z.footerConfirm,{backgroundColor:L.colors.primary,opacity:G?1:.5},e&&{backgroundColor:L.colors.primaryHover},x],accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{disabled:!G},"aria-disabled":!G,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[z.footerBtnText,{color:L.colors.onPrimary}],children:u})})]})]}),Be=t?(P??(e=>e.toLocaleDateString()))(t):void 0,Ye=!T;if("inline"===o)return I||Ye?Ye?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_index3.PickerTrigger,{label:b,value:Be,placeholder:f,helperText:j,error:N,required:R,disabled:D,size:w,variant:C,clearable:S,onClear:k,onPress:()=>V(!0),triggerStyle:A,testID:v}),I?Le:null]}):Le:null;const $e=(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:I,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:Se,children:(0,_jsxRuntime.jsx)(_ModalSafeArea.ModalSafeArea,{onInsets:$,children:(0,_jsxRuntime.jsxs)(AnimatedGestureRoot,{collapsable:!1,style:[z.backdrop,{backgroundColor:Te}],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:Se,accessibilityLabel:"Dismiss"}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[z.sheetWrap,{paddingBottom:Math.max(Y.bottom,L.spacing.lg),opacity:Ae,transform:[{translateY:_reactNative.Animated.add(Ie,U)}]}],onLayout:e=>{ee.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:Le}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})});return Ye?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_index3.PickerTrigger,{label:b,value:Be,placeholder:f,helperText:j,error:N,required:R,disabled:D,size:w,variant:C,clearable:S,onClear:k,onPress:()=>V(!0),triggerStyle:A,testID:v}),$e]}):$e};exports.DatePicker=DatePicker;const buildStyles=e=>{const t=e.shadows.lg;return _reactNative.StyleSheet.create({backdrop:{..._reactNative.StyleSheet.absoluteFill},sheetWrap:{position:"absolute",left:0,right:0,bottom:0,paddingHorizontal:e.spacing.md,paddingBottom:e.spacing.lg},card:{backgroundColor:e.colors.background.elevated,borderRadius:e.radius.xl,..._corners.smoothCorners,padding:e.spacing.lg,shadowColor:t.shadowColor,shadowOffset:t.shadowOffset,shadowOpacity:t.shadowOpacity,shadowRadius:t.shadowRadius,elevation:t.elevation},grabArea:{marginTop:-e.spacing.lg,paddingTop:e.spacing.sm},handle:{alignSelf:"center",width:36,height:4,borderRadius:e.radius.full,..._corners.smoothCorners,backgroundColor:e.colors.border.secondary,marginBottom:e.spacing.sm},titleRow:{marginBottom:e.spacing.sm},title:{fontSize:e.typography.fontSize.lg,fontWeight:e.typography.fontWeight.semibold,color:e.colors.text.primary},headerRow:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:e.spacing.md},navBtn:{width:e.components.datePicker?.navButtonSize??36,height:e.components.datePicker?.navButtonSize??36,borderRadius:e.radius.full,..._corners.smoothCorners,alignItems:"center",justifyContent:"center",backgroundColor:e.colors.background.secondary},navBtnPressed:{backgroundColor:e.colors.surface.pressed},navText:{fontSize:e.components.datePicker?.navTextFontSize??22,lineHeight:e.components.datePicker?.navTextLineHeight??24,color:e.colors.text.primary,fontWeight:e.typography.fontWeight.semibold},headerLabelWrap:{flex:1,alignItems:"center"},headerLabelInner:{flexDirection:"row",alignItems:"center",justifyContent:"center"},headerLabel:{fontSize:e.typography.fontSize.base,fontWeight:e.typography.fontWeight.semibold,color:e.colors.text.primary},headerCaret:{marginLeft:e.spacing.xs,alignItems:"center",justifyContent:"center"},weekdayRow:{flexDirection:"row",marginBottom:e.spacing.xs},weekdayCell:{flex:1,alignItems:"center",paddingVertical:e.spacing.xs},weekdayText:{fontSize:e.typography.fontSize.xs,fontWeight:e.typography.fontWeight.medium,color:e.colors.text.tertiary,letterSpacing:e.typography.letterSpacing.wide},grid:{},gridRow:{flexDirection:"row"},dayCell:{flex:1,aspectRatio:1,alignItems:"center",justifyContent:"center",padding:e.components.datePicker?.dayCellPadding??2},dayInner:{width:"100%",height:"100%",borderRadius:e.components.datePicker?.dayInnerBorderRadius??e.radius.full,..._corners.smoothCorners,alignItems:"center",justifyContent:"center"},dayText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.medium},yearGrid:{},yearCell:{flex:1,aspectRatio:1.6,alignItems:"center",justifyContent:"center",padding:e.components.datePicker?.yearCellPadding??4},yearInner:{width:"100%",height:"100%",borderRadius:e.components.datePicker?.yearInnerBorderRadius??e.radius.lg,..._corners.smoothCorners,alignItems:"center",justifyContent:"center"},yearText:{fontSize:e.typography.fontSize.base,fontWeight:e.typography.fontWeight.semibold},decadeRangeText:{fontSize:e.typography.fontSize.xs,fontWeight:e.typography.fontWeight.medium,marginTop:e.components.datePicker?.decadeRangeMarginTop??2},footer:{flexDirection:"row",justifyContent:"flex-end",alignItems:"center",marginTop:e.spacing.lg,gap:e.spacing.sm},footerBtn:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,borderRadius:e.radius.md,..._corners.smoothCorners,minHeight:e.components.datePicker?.footerButtonMinHeight??40,alignItems:"center",justifyContent:"center"},footerCancel:{backgroundColor:"transparent"},footerConfirm:{},footerBtnPressed:{opacity:.85},footerBtnText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold}})};var _default=exports.default=DatePicker;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.DateRangePicker=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeGestureHandler=require("react-native-gesture-handler"),_useDragToDismiss=require("../../hooks/useDragToDismiss.js"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_corners=require("../../utils/corners.js"),_index3=require("../Calendar/index.js"),_calendarDates=require("../Calendar/calendarDates.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_index4=require("../PickerTrigger/index.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_jsxRuntime=require("react/jsx-runtime");const formatRangePart=(e,t)=>new Intl.DateTimeFormat(t,{weekday:"short",day:"numeric",month:"short"}).format(e),DateRangePicker=exports.DateRangePicker=(0,_react.forwardRef)((e,t)=>{const{visible:a,value:r,onChange:i,onClose:s,label:n,placeholder:o,helperText:l,error:c,required:d,disabled:u,size:g,variant:m,clearable:_,onClear:x,formatValue:f,triggerStyle:p,minDate:h,maxDate:v,disabledDates:y,markedDates:b,strikeMarkedInRange:R,locale:j="en-IN",weekStartsOn:D=0,title:N="Select Date Range",confirmLabel:S="Confirm",cancelLabel:k="Cancel",maxRange:C,haptic:T,style:w,containerStyle:P,headerLabelStyle:M,navButtonStyle:V,footerButtonStyle:A,testID:B}=e,q=void 0!==a,[H,I]=(0,_react.useState)(!1),O=q?a:H,z=q?B:B?`${B}-calendar`:void 0,L=(0,_index.useTheme)(),[E,W]=(0,_ModalSafeArea.useModalInsets)(),$=(0,_react.useMemo)(()=>buildStyles(L),[L]),[G,F]=(0,_react.useState)(()=>(0,_calendarDates.startOfMonth)(r.start??new Date)),[Y,J]=(0,_react.useState)(r.start?(0,_calendarDates.startOfDay)(r.start):null),[K,Q]=(0,_react.useState)(r.end?(0,_calendarDates.startOfDay)(r.end):null),U=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,X=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,Z=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,ee=(0,_react.useRef)(0);(0,_react.useEffect)(()=>{if(r.start){const e=(0,_calendarDates.startOfDay)(r.start);J(e),F((0,_calendarDates.startOfMonth)(e))}else J(null);r.end?Q((0,_calendarDates.startOfDay)(r.end)):Q(null)},[r.start,r.end]),(0,_react.useEffect)(()=>{let e;return O&&(U.setValue(0),(0,_index.setNativeValue)(X,0),(0,_index.setNativeValue)(Z,0),e=_reactNative.Animated.parallel([_reactNative.Animated.timing(U,{toValue:1,duration:L.motion.duration.normal,easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!1}),_reactNative.Animated.spring(X,{toValue:1,damping:L.motion.spring.gentle.damping,stiffness:L.motion.spring.gentle.stiffness,mass:L.motion.spring.gentle.mass,useNativeDriver:!0})]),e.start()),()=>e?.stop()},[O,U,X,Z,L.motion]);const te=(0,_react.useCallback)(e=>{if(e.end&&C&&(0,_calendarDates.daysBetween)(e.start,e.end)+1>C)return!1!==T&&(0,_index2.triggerHaptic)("notificationWarning"),J(e.end),void Q(null);J(e.start),Q(e.end??null)},[C,T]),ae=(0,_react.useCallback)(()=>{q?s?.():I(!1)},[q,s]),re=(0,_react.useCallback)(()=>{_reactNative.Animated.parallel([_reactNative.Animated.timing(U,{toValue:0,duration:L.motion.duration.fast,easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!1}),_reactNative.Animated.timing(X,{toValue:0,duration:L.motion.duration.fast,easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{ae()})},[U,ae,X,L.motion.duration.fast,L.motion.easing.accelerate]),{handleGesture:ie}=(0,_useDragToDismiss.useDragToDismiss)({drag:Z,travel:()=>ee.current||320,onDismiss:re}),se=(0,_react.useCallback)(()=>{!1!==T&&(0,_index2.triggerHaptic)("selection"),re()},[re,T]),ne=(0,_react.useCallback)(()=>{Y&&K&&(!1!==T&&(0,_index2.triggerHaptic)("notificationSuccess"),i?.({start:Y,end:K}),re())},[re,i,Y,K,T]),oe=X.interpolate({inputRange:[0,1],outputRange:[320,0]}),le=(0,_react.useMemo)(()=>Y&&K?`${formatRangePart(Y,j)} — ${formatRangePart(K,j)}`:Y?`${formatRangePart(Y,j)} — …`:"—",[Y,K,j]),ce=!Y||!K,de=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[$.card,w,P],ref:t,accessible:!1,testID:z,children:[(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:ie,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:$.grabArea,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:$.handle}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:$.titleRow,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:$.title,accessibilityRole:"header",children:N}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:$.subtitle,accessibilityLiveRegion:"polite",children:le})]})]})}),(0,_jsxRuntime.jsx)(_index3.Calendar,{mode:"range",value:Y?{start:Y,end:K??void 0}:null,onChange:te,month:G,onMonthChange:F,minDate:h,maxDate:v,disabledDates:y,markedDates:b,strikeMarkedInRange:R,weekStartsOn:D,locale:j,haptic:T,headerLabelStyle:M,navButtonStyle:V,testID:z?`${z}-grid`:void 0}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:$.footer,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:se,style:({pressed:e})=>[$.footerBtn,$.footerCancel,e&&$.footerBtnPressed,A],accessibilityRole:"button",accessibilityLabel:k,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[$.footerBtnText,{color:L.colors.text.secondary}],children:k})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:ne,disabled:ce,style:({pressed:e})=>[$.footerBtn,$.footerConfirm,{backgroundColor:L.colors.primary,opacity:ce?.5:1},e&&{backgroundColor:L.colors.primaryHover},A],accessibilityRole:"button",accessibilityLabel:S,accessibilityState:{disabled:ce},"aria-disabled":ce,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[$.footerBtnText,{color:L.colors.onPrimary}],children:S})})]})]}),ue=(0,_react.useMemo)(()=>{if(!r.start||!r.end)return"";const e={start:r.start,end:r.end};return f?f(e):`${e.start.toLocaleDateString()} – ${e.end.toLocaleDateString()}`},[r.start,r.end,f]);return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[q?null:(0,_jsxRuntime.jsx)(_index4.PickerTrigger,{label:n,placeholder:o,helperText:l,error:c,required:d,disabled:u,size:g,variant:m,clearable:_,onClear:x,value:ue,onPress:()=>I(!0),triggerStyle:p,testID:B}),(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:O,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:re,children:(0,_jsxRuntime.jsx)(_ModalSafeArea.ModalSafeArea,{onInsets:W,children:(0,_jsxRuntime.jsxs)(_reactNativeGestureHandler.GestureHandlerRootView,{collapsable:!1,style:[$.backdrop,{backgroundColor:L.colors.background.overlay}],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:re,accessibilityLabel:"Dismiss"}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[$.sheetWrap,{paddingBottom:Math.max(E.bottom,L.spacing.lg),opacity:X,transform:[{translateY:_reactNative.Animated.add(oe,Z)}]}],onLayout:e=>{ee.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:de}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})})]})});DateRangePicker.displayName="DateRangePicker";const buildStyles=e=>{const t=e.shadows.lg;return _reactNative.StyleSheet.create({backdrop:{..._reactNative.StyleSheet.absoluteFill},sheetWrap:{position:"absolute",left:0,right:0,bottom:0,paddingHorizontal:e.spacing.md,paddingBottom:e.spacing.lg},card:{backgroundColor:e.colors.background.elevated,borderRadius:e.radius.xl,..._corners.smoothCorners,padding:e.spacing.lg,shadowColor:t.shadowColor,shadowOffset:t.shadowOffset,shadowOpacity:t.shadowOpacity,shadowRadius:t.shadowRadius,elevation:t.elevation},grabArea:{marginTop:-e.spacing.lg,paddingTop:e.spacing.sm},handle:{alignSelf:"center",width:36,height:4,borderRadius:e.radius.full,..._corners.smoothCorners,backgroundColor:e.colors.border.secondary,marginBottom:e.spacing.sm},titleRow:{marginBottom:e.spacing.sm},title:{fontSize:e.typography.fontSize.lg,fontWeight:e.typography.fontWeight.semibold,color:e.colors.text.primary},subtitle:{marginTop:e.spacing.xxs,fontSize:e.typography.fontSize.sm,color:e.colors.text.secondary},footer:{flexDirection:"row",justifyContent:"flex-end",alignItems:"center",marginTop:e.spacing.lg,gap:e.spacing.sm},footerBtn:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,borderRadius:e.radius.md,..._corners.smoothCorners,minHeight:e.components.dateRangePicker?.footerButtonMinHeight??40,alignItems:"center",justifyContent:"center"},footerCancel:{backgroundColor:"transparent"},footerConfirm:{},footerBtnPressed:{opacity:.85},footerBtnText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold}})};var _default=exports.default=DateRangePicker;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.DateRangePicker=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeGestureHandler=require("react-native-gesture-handler"),_useDragToDismiss=require("../../hooks/useDragToDismiss.js"),_usePresenceMotion=require("../../hooks/usePresenceMotion.js"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_corners=require("../../utils/corners.js"),_index3=require("../Calendar/index.js"),_calendarDates=require("../Calendar/calendarDates.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_index4=require("../PickerTrigger/index.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_jsxRuntime=require("react/jsx-runtime");const AnimatedGestureRoot=_reactNative.Animated.createAnimatedComponent(_reactNativeGestureHandler.GestureHandlerRootView),transparentOf=e=>{const t=e.match(/^rgba?\(([^)]+)\)$/);if(!t)return"transparent";const[a,r,i]=t[1].split(",").map(e=>e.trim());return`rgba(${a}, ${r}, ${i}, 0)`},formatRangePart=(e,t)=>new Intl.DateTimeFormat(t,{weekday:"short",day:"numeric",month:"short"}).format(e),DateRangePicker=exports.DateRangePicker=(0,_react.forwardRef)((e,t)=>{const{visible:a,value:r,onChange:i,onClose:s,label:n,placeholder:o,helperText:l,error:c,required:d,disabled:u,size:g,variant:m,clearable:_,onClear:p,formatValue:x,triggerStyle:f,minDate:v,maxDate:h,disabledDates:y,markedDates:b,strikeMarkedInRange:R,locale:j="en-IN",weekStartsOn:D=0,title:N="Select Date Range",confirmLabel:S="Confirm",cancelLabel:k="Cancel",maxRange:C,haptic:P,style:T,containerStyle:w,headerLabelStyle:M,navButtonStyle:A,footerButtonStyle:V,testID:B}=e,q=void 0!==a,[O,H]=(0,_react.useState)(!1),I=q?a:O,z=q?B:B?`${B}-calendar`:void 0,L=(0,_index.useTheme)(),$=(0,_usePresenceMotion.usePresenceMotion)(),[G,E]=(0,_ModalSafeArea.useModalInsets)(),W=(0,_react.useMemo)(()=>buildStyles(L),[L]),[F,Y]=(0,_react.useState)(()=>(0,_calendarDates.startOfMonth)(r.start??new Date)),[J,K]=(0,_react.useState)(r.start?(0,_calendarDates.startOfDay)(r.start):null),[Q,U]=(0,_react.useState)(r.end?(0,_calendarDates.startOfDay)(r.end):null),X=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,Z=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,ee=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,te=(0,_react.useRef)(0);(0,_react.useEffect)(()=>{if(r.start){const e=(0,_calendarDates.startOfDay)(r.start);K(e),Y((0,_calendarDates.startOfMonth)(e))}else K(null);r.end?U((0,_calendarDates.startOfDay)(r.end)):U(null)},[r.start,r.end]);const ae=(0,_react.useCallback)(e=>{if(e.end&&C&&(0,_calendarDates.daysBetween)(e.start,e.end)+1>C)return!1!==P&&(0,_index2.triggerHaptic)("notificationWarning"),K(e.end),void U(null);K(e.start),U(e.end??null)},[C,P]),re=(0,_react.useCallback)(()=>{q?s?.():H(!1)},[q,s]),ie=(0,_react.useCallback)(()=>{_reactNative.Animated.parallel([_reactNative.Animated.timing(X,{toValue:0,duration:$.duration("normal"),easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!1}),_reactNative.Animated.timing(Z,{toValue:0,duration:$.duration("fast"),easing:_reactNative.Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{re()})},[X,re,$,Z,L.motion.easing.accelerate]),{handleGesture:se,opacity:ne}=(0,_useDragToDismiss.useDragToDismiss)({drag:ee,travel:()=>te.current||320,onDismiss:ie}),oe=(0,_react.useMemo)(()=>_reactNative.Animated.multiply(Z,ne),[Z,ne]),le=(0,_react.useMemo)(()=>X.interpolate({inputRange:[0,1],outputRange:[transparentOf(L.colors.background.overlay),L.colors.background.overlay]}),[X,L.colors.background.overlay]);(0,_react.useEffect)(()=>{let e;if(I){X.setValue(0),(0,_index.setNativeValue)(Z,0),(0,_index.setNativeValue)(ee,0),(0,_index.setNativeValue)(ne,1);const t=$.reduced?_reactNative.Animated.timing(Z,{toValue:1,duration:$.duration("normal"),useNativeDriver:!0}):_reactNative.Animated.spring(Z,{toValue:1,damping:L.motion.spring.gentle.damping,stiffness:L.motion.spring.gentle.stiffness,mass:L.motion.spring.gentle.mass,useNativeDriver:!0});e=_reactNative.Animated.parallel([_reactNative.Animated.timing(X,{toValue:1,duration:$.duration("normal"),easing:_reactNative.Easing.out(_reactNative.Easing.cubic),useNativeDriver:!1}),t]),e.start()}return()=>e?.stop()},[I,X,$,Z,ee,ne,L.motion]);const ce=(0,_react.useCallback)(()=>{!1!==P&&(0,_index2.triggerHaptic)("selection"),ie()},[ie,P]),de=(0,_react.useCallback)(()=>{J&&Q&&(!1!==P&&(0,_index2.triggerHaptic)("notificationSuccess"),i?.({start:J,end:Q}),ie())},[ie,i,J,Q,P]),ue=Z.interpolate({inputRange:[0,1],outputRange:$.range(320,0)}),ge=(0,_react.useMemo)(()=>J&&Q?`${formatRangePart(J,j)} — ${formatRangePart(Q,j)}`:J?`${formatRangePart(J,j)} — …`:"—",[J,Q,j]),me=!J||!Q,pe=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[W.card,T,w],ref:t,accessible:!1,testID:z,children:[(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:se,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:W.grabArea,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:W.handle}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:W.titleRow,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:W.title,accessibilityRole:"header",children:N}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:W.subtitle,accessibilityLiveRegion:"polite",children:ge})]})]})}),(0,_jsxRuntime.jsx)(_index3.Calendar,{mode:"range",value:J?{start:J,end:Q??void 0}:null,onChange:ae,month:F,onMonthChange:Y,minDate:v,maxDate:h,disabledDates:y,markedDates:b,strikeMarkedInRange:R,weekStartsOn:D,locale:j,haptic:P,headerLabelStyle:M,navButtonStyle:A,testID:z?`${z}-grid`:void 0}),(0,_jsxRuntime.jsxs)(_reactNative.View,{style:W.footer,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:ce,style:({pressed:e})=>[W.footerBtn,W.footerCancel,e&&W.footerBtnPressed,V],accessibilityRole:"button",accessibilityLabel:k,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[W.footerBtnText,{color:L.colors.text.secondary}],children:k})}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:de,disabled:me,style:({pressed:e})=>[W.footerBtn,W.footerConfirm,{backgroundColor:L.colors.primary,opacity:me?.5:1},e&&{backgroundColor:L.colors.primaryHover},V],accessibilityRole:"button",accessibilityLabel:S,accessibilityState:{disabled:me},"aria-disabled":me,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[W.footerBtnText,{color:L.colors.onPrimary}],children:S})})]})]}),xe=(0,_react.useMemo)(()=>{if(!r.start||!r.end)return"";const e={start:r.start,end:r.end};return x?x(e):`${e.start.toLocaleDateString()} – ${e.end.toLocaleDateString()}`},[r.start,r.end,x]);return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[q?null:(0,_jsxRuntime.jsx)(_index4.PickerTrigger,{label:n,placeholder:o,helperText:l,error:c,required:d,disabled:u,size:g,variant:m,clearable:_,onClear:p,value:xe,onPress:()=>H(!0),triggerStyle:f,testID:B}),(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:I,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:ie,children:(0,_jsxRuntime.jsx)(_ModalSafeArea.ModalSafeArea,{onInsets:E,children:(0,_jsxRuntime.jsxs)(AnimatedGestureRoot,{collapsable:!1,style:[W.backdrop,{backgroundColor:le}],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:ie,accessibilityLabel:"Dismiss"}),(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[W.sheetWrap,{paddingBottom:Math.max(G.bottom,L.spacing.lg),opacity:oe,transform:[{translateY:_reactNative.Animated.add(ue,ee)}]}],onLayout:e=>{te.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:pe}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})})]})});DateRangePicker.displayName="DateRangePicker";const buildStyles=e=>{const t=e.shadows.lg;return _reactNative.StyleSheet.create({backdrop:{..._reactNative.StyleSheet.absoluteFill},sheetWrap:{position:"absolute",left:0,right:0,bottom:0,paddingHorizontal:e.spacing.md,paddingBottom:e.spacing.lg},card:{backgroundColor:e.colors.background.elevated,borderRadius:e.radius.xl,..._corners.smoothCorners,padding:e.spacing.lg,shadowColor:t.shadowColor,shadowOffset:t.shadowOffset,shadowOpacity:t.shadowOpacity,shadowRadius:t.shadowRadius,elevation:t.elevation},grabArea:{marginTop:-e.spacing.lg,paddingTop:e.spacing.sm},handle:{alignSelf:"center",width:36,height:4,borderRadius:e.radius.full,..._corners.smoothCorners,backgroundColor:e.colors.border.secondary,marginBottom:e.spacing.sm},titleRow:{marginBottom:e.spacing.sm},title:{fontSize:e.typography.fontSize.lg,fontWeight:e.typography.fontWeight.semibold,color:e.colors.text.primary},subtitle:{marginTop:e.spacing.xxs,fontSize:e.typography.fontSize.sm,color:e.colors.text.secondary},footer:{flexDirection:"row",justifyContent:"flex-end",alignItems:"center",marginTop:e.spacing.lg,gap:e.spacing.sm},footerBtn:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,borderRadius:e.radius.md,..._corners.smoothCorners,minHeight:e.components.dateRangePicker?.footerButtonMinHeight??40,alignItems:"center",justifyContent:"center"},footerCancel:{backgroundColor:"transparent"},footerConfirm:{},footerBtnPressed:{opacity:.85},footerBtnText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold}})};var _default=exports.default=DateRangePicker;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.Drawer=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeGestureHandler=require("react-native-gesture-handler"),_reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated")),_reactNativeSafeAreaContext=require("react-native-safe-area-context"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var a=new WeakMap,r=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var i,n,o={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return o;if(i=t?r:a){if(i.has(e))return i.get(e);i.set(e,o)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((n=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(n.get||n.set)?i(o,t,n):o[t]=e[t]);return o})(e,t)}const DEFAULT_CLOSE_VELOCITY_THRESHOLD=1e3,DEFAULT_DRAG_ACTIVATION_OFFSET=10,Drawer=exports.Drawer=(0,_react.forwardRef)((e,t)=>{const{visible:a,defaultVisible:r=!1,onChange:i,side:n="left",width:o,enableSwipe:s=!0,enableBackdropPress:l=!0,backdropOpacity:c=.5,haptic:u,containerStyle:d,children:_,accessibilityLabel:p,testID:f}=e,v=(0,_index.useTheme)(),h=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),b="boolean"==typeof a,m=v.components.drawer,g=m?.closeVelocityThreshold??1e3,w=m?.dragActivationOffset??10,[y,N]=(0,_react.useState)(()=>_reactNative.Dimensions.get("window"));(0,_react.useEffect)(()=>{const e=_reactNative.Dimensions.addEventListener("change",({window:e})=>N(e));return()=>e.remove()},[]);const R="left"===n||"right"===n,x=(0,_react.useMemo)(()=>resolveSize(o,R,y),[o,R,y]),S=(0,_react.useMemo)(()=>{switch(n){case"left":case"top":return-x;case"right":case"bottom":return x}},[n,x]),k=(0,_reactNativeReanimated.useSharedValue)(r?0:S),j=(0,_reactNativeReanimated.useSharedValue)(r?0:S),[M,O]=(0,_react.useState)(r),C=(0,_reactNativeReanimated.useSharedValue)(r);(0,_react.useEffect)(()=>{M||(k.value=S,j.value=S)},[S,M,k,j]);const D=v.motion.spring.snappy,E=(0,_react.useCallback)(()=>{k.value=(0,_reactNativeReanimated.withSpring)(0,D)},[k,D]),L=(0,_react.useCallback)(()=>{k.value=(0,_reactNativeReanimated.withSpring)(S,D)},[k,S,D]),A=(0,_react.useCallback)(e=>{O(t=>t===e?t:(i?.(e),e)),C.value=e},[i,C]),T=(0,_react.useCallback)(()=>{A(!0),E()},[A,E]),V=(0,_react.useCallback)(()=>{A(!1),L()},[A,L]),q=(0,_react.useCallback)(()=>{M?V():T()},[M,T,V]);(0,_react.useImperativeHandle)(t,()=>({open:T,close:V,toggle:q}),[T,V,q]),(0,_react.useEffect)(()=>{b&&a!==M&&(a?T():V())},[a]);const P=(0,_react.useMemo)(()=>{const e=S,t=n,a=s;let r=_reactNativeGestureHandler.Gesture.Pan();return r=R?r.activeOffsetX([-w,w]).failOffsetY([-15,15]):r.activeOffsetY([-w,w]).failOffsetX([-15,15]),r.onStart(()=>{"worklet";a&&(j.value=k.value)}).onUpdate(t=>{"worklet";if(!a)return;const r=R?t.translationX:t.translationY,i=j.value+r,n=Math.min(0,e),o=Math.max(0,e);k.value=i<n?n+.25*(i-n):i>o?o+.25*(i-o):i}).onEnd(r=>{"worklet";if(!a)return;const i=R?r.velocityX:r.velocityY,n=k.value;let o=!1;o="left"===t||"top"===t?i<-g:i>g;const s=Math.abs(e),l=Math.abs(n)/s;o||l>.5?((0,_reactNativeReanimated.runOnJS)(A)(!1),k.value=(0,_reactNativeReanimated.withSpring)(e,D)):((0,_reactNativeReanimated.runOnJS)(A)(!0),k.value=(0,_reactNativeReanimated.withSpring)(0,D))})},[S,j,s,R,k,A,n,D,g,w]),F=(0,_reactNativeReanimated.useAnimatedStyle)(()=>R?{transform:[{translateX:k.value}]}:{transform:[{translateY:k.value}]}),H=(0,_reactNativeReanimated.useAnimatedStyle)(()=>({opacity:(0,_reactNativeReanimated.interpolate)(k.value,[S,0],[0,c],_reactNativeReanimated.Extrapolation.CLAMP),pointerEvents:Math.abs(k.value-S)<.5?"none":"auto"}),[S,c]),I=(0,_react.useMemo)(()=>buildStyles(v),[v]),G=(0,_react.useCallback)(()=>{if(!l)return;const e=(0,_index2.resolveHaptic)(u,"selection");e&&(0,_index2.triggerHaptic)(e),V()},[l,V,u]),W=(0,_react.useMemo)(()=>{switch(n){case"left":return{position:"absolute",top:0,bottom:0,left:0,width:x,paddingTop:h.top,paddingBottom:h.bottom,paddingLeft:h.left};case"right":return{position:"absolute",top:0,bottom:0,right:0,width:x,paddingTop:h.top,paddingBottom:h.bottom,paddingRight:h.right};case"top":return{position:"absolute",top:0,left:0,right:0,height:x,paddingTop:h.top,paddingLeft:h.left,paddingRight:h.right};case"bottom":return{position:"absolute",bottom:0,left:0,right:0,height:x,paddingBottom:h.bottom,paddingLeft:h.left,paddingRight:h.right}}},[n,x,h]),Y=(0,_react.useRef)(r);return M&&(Y.current=!0),Y.current?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:_reactNative.StyleSheet.absoluteFill,pointerEvents:"box-none",testID:f,accessibilityViewIsModal:M,children:[(0,_jsxRuntime.jsx)(_reactNativeReanimated.default.View,{style:[I.backdrop,{backgroundColor:v.colors.background.overlay},H],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:G,accessibilityRole:"button",accessibilityLabel:"Close drawer",disabled:!l||!M})}),(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:P,children:(0,_jsxRuntime.jsx)(_reactNativeReanimated.default.View,{accessibilityRole:"alert",accessibilityLabel:p??"Drawer",style:[W,{backgroundColor:v.colors.background.elevated,...v.shadows.xl},d,F],children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:I.content,children:_})})})]}):null});Drawer.displayName="Drawer";const resolveSize=(e,t,a)=>{if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);if(Number.isNaN(r))return t?280:Math.round(.4*a.height);return r/100*(t?a.width:a.height)}return t?280:Math.round(.4*a.height)},buildStyles=e=>_reactNative.StyleSheet.create({backdrop:{..._reactNative.StyleSheet.absoluteFill},content:{flex:1}});var _default=exports.default=Drawer;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.Drawer=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeGestureHandler=require("react-native-gesture-handler"),_reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated")),_reactNativeSafeAreaContext=require("react-native-safe-area-context"),_usePresenceMotion=require("../../hooks/usePresenceMotion.js"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var a=new WeakMap,r=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var i,n,o={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return o;if(i=t?r:a){if(i.has(e))return i.get(e);i.set(e,o)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((n=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(n.get||n.set)?i(o,t,n):o[t]=e[t]);return o})(e,t)}const DEFAULT_CLOSE_VELOCITY_THRESHOLD=1e3,DEFAULT_DRAG_ACTIVATION_OFFSET=10,Drawer=exports.Drawer=(0,_react.forwardRef)((e,t)=>{const{visible:a,defaultVisible:r=!1,onChange:i,side:n="left",width:o,enableSwipe:s=!0,enableBackdropPress:c=!0,backdropOpacity:l=.5,haptic:u,containerStyle:d,children:_,accessibilityLabel:v,testID:p}=e,f=(0,_index.useTheme)(),h=(0,_usePresenceMotion.usePresenceMotion)(),m=h.reduced,b=h.duration("normal"),g=h.duration("fast"),N=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),R="boolean"==typeof a,w=f.components.drawer,y=w?.closeVelocityThreshold??1e3,S=w?.dragActivationOffset??10,[M,x]=(0,_react.useState)(()=>_reactNative.Dimensions.get("window"));(0,_react.useEffect)(()=>{const e=_reactNative.Dimensions.addEventListener("change",({window:e})=>x(e));return()=>e.remove()},[]);const E="left"===n||"right"===n,O=(0,_react.useMemo)(()=>resolveSize(o,E,M),[o,E,M]),C=(0,_react.useMemo)(()=>{switch(n){case"left":case"top":return-O;case"right":case"bottom":return O}},[n,O]),k=(0,_reactNativeReanimated.useSharedValue)(r?0:C),j=(0,_reactNativeReanimated.useSharedValue)(r?0:C),D=(0,_reactNativeReanimated.useSharedValue)(r?1:0),[P,T]=(0,_react.useState)(r),L=(0,_reactNativeReanimated.useSharedValue)(r);(0,_react.useEffect)(()=>{P||m||(k.value=C,j.value=C)},[C,P,k,j,m]);const V=f.motion.spring.snappy,q=(0,_react.useCallback)(()=>{if(m)return k.value=0,void(D.value=(0,_reactNativeReanimated.withTiming)(1,{duration:b,reduceMotion:_usePresenceMotion.PRESENCE_REDUCE_MOTION}));D.value=1,k.value=(0,_reactNativeReanimated.withSpring)(0,V)},[k,D,V,m,b]),A=(0,_react.useCallback)(()=>{m?D.value=(0,_reactNativeReanimated.withTiming)(0,{duration:g,reduceMotion:_usePresenceMotion.PRESENCE_REDUCE_MOTION},e=>{"worklet";e&&(k.value=C)}):k.value=(0,_reactNativeReanimated.withSpring)(C,V)},[k,D,C,V,m,g]),I=(0,_react.useCallback)(e=>{T(t=>t===e?t:(i?.(e),e)),L.value=e},[i,L]),F=(0,_react.useCallback)(()=>{I(!0),q()},[I,q]),H=(0,_react.useCallback)(()=>{I(!1),A()},[I,A]),U=(0,_react.useCallback)(()=>{P?H():F()},[P,F,H]);(0,_react.useImperativeHandle)(t,()=>({open:F,close:H,toggle:U}),[F,H,U]),(0,_react.useEffect)(()=>{R&&a!==P&&(a?F():H())},[a]);const G=(0,_react.useMemo)(()=>{const e=C,t=n,a=s;let r=_reactNativeGestureHandler.Gesture.Pan();return r=E?r.activeOffsetX([-S,S]).failOffsetY([-15,15]):r.activeOffsetY([-S,S]).failOffsetX([-15,15]),r.onStart(()=>{"worklet";a&&(j.value=k.value)}).onUpdate(t=>{"worklet";if(!a)return;const r=E?t.translationX:t.translationY,i=j.value+r,n=Math.min(0,e),o=Math.max(0,e);k.value=i<n?n+.25*(i-n):i>o?o+.25*(i-o):i}).onEnd(r=>{"worklet";if(!a)return;const i=E?r.velocityX:r.velocityY,n=k.value;let o=!1;o="left"===t||"top"===t?i<-y:i>y;const s=Math.abs(e),c=Math.abs(n)/s;o||c>.5?((0,_reactNativeReanimated.runOnJS)(I)(!1),m?D.value=(0,_reactNativeReanimated.withTiming)(0,{duration:g,reduceMotion:_usePresenceMotion.PRESENCE_REDUCE_MOTION},t=>{"worklet";t&&(k.value=e)}):k.value=(0,_reactNativeReanimated.withSpring)(e,V)):((0,_reactNativeReanimated.runOnJS)(I)(!0),m?(k.value=0,D.value=(0,_reactNativeReanimated.withTiming)(1,{duration:b,reduceMotion:_usePresenceMotion.PRESENCE_REDUCE_MOTION})):k.value=(0,_reactNativeReanimated.withSpring)(0,V))})},[C,j,s,E,k,D,I,n,V,y,S,m,b,g]),W=(0,_reactNativeReanimated.useAnimatedStyle)(()=>E?{opacity:D.value,transform:[{translateX:k.value}]}:{opacity:D.value,transform:[{translateY:k.value}]}),Y=(0,_reactNativeReanimated.useAnimatedStyle)(()=>({opacity:(0,_reactNativeReanimated.interpolate)(k.value,[C,0],[0,l],_reactNativeReanimated.Extrapolation.CLAMP)*D.value,pointerEvents:Math.abs(k.value-C)<.5?"none":"auto"}),[C,l]),X=(0,_react.useMemo)(()=>buildStyles(f),[f]),B=(0,_react.useCallback)(()=>{if(!c)return;const e=(0,_index2.resolveHaptic)(u,"selection");e&&(0,_index2.triggerHaptic)(e),H()},[c,H,u]),z=(0,_react.useMemo)(()=>{switch(n){case"left":return{position:"absolute",top:0,bottom:0,left:0,width:O,paddingTop:N.top,paddingBottom:N.bottom,paddingLeft:N.left};case"right":return{position:"absolute",top:0,bottom:0,right:0,width:O,paddingTop:N.top,paddingBottom:N.bottom,paddingRight:N.right};case"top":return{position:"absolute",top:0,left:0,right:0,height:O,paddingTop:N.top,paddingLeft:N.left,paddingRight:N.right};case"bottom":return{position:"absolute",bottom:0,left:0,right:0,height:O,paddingBottom:N.bottom,paddingLeft:N.left,paddingRight:N.right}}},[n,O,N]),J=(0,_react.useRef)(r);return P&&(J.current=!0),J.current?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:_reactNative.StyleSheet.absoluteFill,pointerEvents:"box-none",testID:p,accessibilityViewIsModal:P,children:[(0,_jsxRuntime.jsx)(_reactNativeReanimated.default.View,{style:[X.backdrop,{backgroundColor:f.colors.background.overlay},Y],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:B,accessibilityRole:"button",accessibilityLabel:"Close drawer",disabled:!c||!P})}),(0,_jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector,{gesture:G,children:(0,_jsxRuntime.jsx)(_reactNativeReanimated.default.View,{accessibilityRole:"alert",accessibilityLabel:v??"Drawer",style:[z,{backgroundColor:f.colors.background.elevated,...f.shadows.xl},d,W],children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:X.content,children:_})})})]}):null});Drawer.displayName="Drawer";const resolveSize=(e,t,a)=>{if("number"==typeof e)return e;if("string"==typeof e){const r=parseFloat(e);if(Number.isNaN(r))return t?280:Math.round(.4*a.height);return r/100*(t?a.width:a.height)}return t?280:Math.round(.4*a.height)},buildStyles=e=>_reactNative.StyleSheet.create({backdrop:{..._reactNative.StyleSheet.absoluteFill},content:{flex:1}});var _default=exports.default=Drawer;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.EmptyState=void 0;var _react=require("react"),_reactNative=require("react-native"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_SquircleFill=require("../SquircleFill/SquircleFill.js"),_jsxRuntime=require("react/jsx-runtime");const SIZE_FALLBACK={sm:{iconSize:48,titleFontSize:"lg",descriptionFontSize:"sm",paddingVertical:"lg",titleGap:"md",descriptionGap:"xs"},md:{iconSize:64,titleFontSize:"xl",descriptionFontSize:"base",paddingVertical:"xl",titleGap:"md",descriptionGap:"xs"},lg:{iconSize:80,titleFontSize:"2xl",descriptionFontSize:"base",paddingVertical:"2xl",titleGap:"md",descriptionGap:"xs"}},sizeFor=(e,t)=>{const i={...SIZE_FALLBACK[t],...e.components.emptyState?.[t]??{}};return{iconSize:i.iconSize,titleSize:e.typography.fontSize[i.titleFontSize],descriptionSize:e.typography.fontSize[i.descriptionFontSize],paddingVertical:e.spacing[i.paddingVertical],titleGap:e.spacing[i.titleGap],descriptionGap:e.spacing[i.descriptionGap]}},ActionButton=({action:e,variant:t})=>{const i=(0,_index.useTheme)(),{scale:r,pressIn:o,pressOut:s}=(0,_usePressAnimation.usePressAnimation)({enabled:!0}),n=(0,_react.useMemo)(()=>buildActionStyles(i),[i]),a="primary"===t,l=(0,_SquircleFill.useSquircle)(!0,i.radius.md),fillFor=e=>a?i.colors.primary:e?i.colors.surface.pressed:"transparent";return(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:{transform:[{scale:r}]},children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:()=>{(0,_hapticUtils.triggerHaptic)("selection"),e.onPress()},onPressIn:o,onPressOut:s,accessibilityRole:"button",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityHint:e.accessibilityHint,testID:e.testID,onLayout:l.onLayout,android_ripple:{color:a?i.colors.primaryHover:i.colors.surface.pressed,borderless:!1},style:({pressed:e})=>[n.button,a?n.buttonPrimary:n.buttonSecondary,!e||a||l.active?null:n.buttonSecondaryPressed,l.active?n.buttonSquircleHost:null],children:({pressed:t})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[l.active&&l.size?(0,_jsxRuntime.jsx)(_SquircleFill.SquircleFill,{width:l.size.width,height:l.size.height,radius:i.radius.md,fill:fillFor(t),stroke:a?void 0:i.colors.border.primary,strokeWidth:a?0:1,outset:a?0:1}):null,(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[n.buttonText,a?n.buttonTextPrimary:n.buttonTextSecondary],numberOfLines:1,children:e.label})]})})})},EmptyState=exports.EmptyState=(0,_react.forwardRef)((e,t)=>{const{icon:i,title:r,description:o,action:s,secondaryAction:n,size:a="md",fill:l=!1,style:c,testID:d}=e,u=(0,_index.useTheme)(),p=(0,_react.useMemo)(()=>sizeFor(u,a),[u,a]),m=(0,_react.useMemo)(()=>buildStyles(u),[u]);return(0,_jsxRuntime.jsxs)(_reactNative.View,{ref:t,accessibilityRole:"summary",testID:d,style:[m.root,{paddingVertical:p.paddingVertical},l?m.fill:null,c],children:[i?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[m.iconCircle,{width:p.iconSize,height:p.iconSize,marginBottom:p.titleGap,borderRadius:p.iconSize/2,..._corners.smoothCorners}],children:i}):null,(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[m.title,{fontSize:p.titleSize,...(0,_index.fontFor)(u,"semibold")}],children:r}),o?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[m.description,{fontSize:p.descriptionSize,marginTop:p.descriptionGap}],children:o}):null,s||n?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:m.actions,children:[s?(0,_jsxRuntime.jsx)(ActionButton,{action:s,variant:"primary"}):null,n?(0,_jsxRuntime.jsx)(ActionButton,{action:n,variant:"secondary"}):null]}):null]})});EmptyState.displayName="EmptyState";const buildStyles=e=>_reactNative.StyleSheet.create({root:{alignItems:"center",justifyContent:"center",paddingHorizontal:e.spacing.lg},fill:{flexGrow:1},iconCircle:{backgroundColor:e.colors.surface.disabled,alignItems:"center",justifyContent:"center"},title:{color:e.colors.text.primary,textAlign:"center"},description:{color:e.colors.text.secondary,textAlign:"center",maxWidth:320,lineHeight:e.typography.fontSize.base*e.typography.lineHeight.normal},actions:{flexDirection:"row",alignItems:"center",gap:e.spacing.sm,marginTop:e.spacing.md+e.spacing.xs}}),buildActionStyles=e=>_reactNative.StyleSheet.create({button:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,minHeight:42,borderRadius:e.radius.md,..._corners.smoothCorners,alignItems:"center",justifyContent:"center",flexDirection:"row"},buttonPrimary:{backgroundColor:e.colors.primary},buttonSecondary:{backgroundColor:"transparent",borderWidth:1,borderColor:e.colors.border.primary},buttonSecondaryPressed:{backgroundColor:e.colors.surface.pressed},buttonSquircleHost:{backgroundColor:"transparent",borderColor:"transparent",overflow:"visible"},buttonText:{fontSize:e.typography.fontSize.base,...(0,_index.fontFor)(e,"semibold")},buttonTextPrimary:{color:e.colors.onPrimary},buttonTextSecondary:{color:e.colors.text.primary}});var _default=exports.default=EmptyState;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.EmptyState=void 0;var _react=require("react"),_reactNative=require("react-native"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_SquircleFill=require("../SquircleFill/SquircleFill.js"),_jsxRuntime=require("react/jsx-runtime");const SIZE_FALLBACK={sm:{iconSize:48,titleFontSize:"lg",descriptionFontSize:"sm",paddingVertical:"lg",titleGap:"md",descriptionGap:"xs"},md:{iconSize:64,titleFontSize:"xl",descriptionFontSize:"base",paddingVertical:"xl",titleGap:"md",descriptionGap:"xs"},lg:{iconSize:80,titleFontSize:"2xl",descriptionFontSize:"base",paddingVertical:"2xl",titleGap:"md",descriptionGap:"xs"}},sizeFor=(e,t)=>{const i={...SIZE_FALLBACK[t],...e.components.emptyState?.[t]??{}};return{iconSize:i.iconSize,titleSize:e.typography.fontSize[i.titleFontSize],descriptionSize:e.typography.fontSize[i.descriptionFontSize],paddingVertical:e.spacing[i.paddingVertical],titleGap:e.spacing[i.titleGap],descriptionGap:e.spacing[i.descriptionGap]}},ActionButton=({action:e,variant:t})=>{const i=(0,_index.useTheme)(),{style:r,pressIn:o,pressOut:s}=(0,_usePressAnimation.usePressAnimation)({enabled:!0}),n=(0,_react.useMemo)(()=>buildActionStyles(i),[i]),a="primary"===t,l=(0,_SquircleFill.useSquircle)(!0,i.radius.md),fillFor=e=>a?i.colors.primary:e?i.colors.surface.pressed:"transparent";return(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:r,children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:()=>{(0,_hapticUtils.triggerHaptic)("selection"),e.onPress()},onPressIn:o,onPressOut:s,accessibilityRole:"button",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityHint:e.accessibilityHint,testID:e.testID,onLayout:l.onLayout,android_ripple:{color:a?i.colors.primaryHover:i.colors.surface.pressed,borderless:!1},style:({pressed:e})=>[n.button,a?n.buttonPrimary:n.buttonSecondary,!e||a||l.active?null:n.buttonSecondaryPressed,l.active?n.buttonSquircleHost:null],children:({pressed:t})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[l.active&&l.size?(0,_jsxRuntime.jsx)(_SquircleFill.SquircleFill,{width:l.size.width,height:l.size.height,radius:i.radius.md,fill:fillFor(t),stroke:a?void 0:i.colors.border.primary,strokeWidth:a?0:1,outset:a?0:1}):null,(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[n.buttonText,a?n.buttonTextPrimary:n.buttonTextSecondary],numberOfLines:1,children:e.label})]})})})},EmptyState=exports.EmptyState=(0,_react.forwardRef)((e,t)=>{const{icon:i,title:r,description:o,action:s,secondaryAction:n,size:a="md",fill:l=!1,style:c,testID:d}=e,u=(0,_index.useTheme)(),p=(0,_react.useMemo)(()=>sizeFor(u,a),[u,a]),m=(0,_react.useMemo)(()=>buildStyles(u),[u]);return(0,_jsxRuntime.jsxs)(_reactNative.View,{ref:t,accessibilityRole:"summary",testID:d,style:[m.root,{paddingVertical:p.paddingVertical},l?m.fill:null,c],children:[i?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[m.iconCircle,{width:p.iconSize,height:p.iconSize,marginBottom:p.titleGap,borderRadius:p.iconSize/2,..._corners.smoothCorners}],children:i}):null,(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[m.title,{fontSize:p.titleSize,...(0,_index.fontFor)(u,"semibold")}],children:r}),o?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[m.description,{fontSize:p.descriptionSize,marginTop:p.descriptionGap}],children:o}):null,s||n?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:m.actions,children:[s?(0,_jsxRuntime.jsx)(ActionButton,{action:s,variant:"primary"}):null,n?(0,_jsxRuntime.jsx)(ActionButton,{action:n,variant:"secondary"}):null]}):null]})});EmptyState.displayName="EmptyState";const buildStyles=e=>_reactNative.StyleSheet.create({root:{alignItems:"center",justifyContent:"center",paddingHorizontal:e.spacing.lg},fill:{flexGrow:1},iconCircle:{backgroundColor:e.colors.surface.disabled,alignItems:"center",justifyContent:"center"},title:{color:e.colors.text.primary,textAlign:"center"},description:{color:e.colors.text.secondary,textAlign:"center",maxWidth:320,lineHeight:e.typography.fontSize.base*e.typography.lineHeight.normal},actions:{flexDirection:"row",alignItems:"center",gap:e.spacing.sm,marginTop:e.spacing.md+e.spacing.xs}}),buildActionStyles=e=>_reactNative.StyleSheet.create({button:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,minHeight:42,borderRadius:e.radius.md,..._corners.smoothCorners,alignItems:"center",justifyContent:"center",flexDirection:"row"},buttonPrimary:{backgroundColor:e.colors.primary},buttonSecondary:{backgroundColor:"transparent",borderWidth:1,borderColor:e.colors.border.primary},buttonSecondaryPressed:{backgroundColor:e.colors.surface.pressed},buttonSquircleHost:{backgroundColor:"transparent",borderColor:"transparent",overflow:"visible"},buttonText:{fontSize:e.typography.fontSize.base,...(0,_index.fontFor)(e,"semibold")},buttonTextPrimary:{color:e.colors.onPrimary},buttonTextSecondary:{color:e.colors.text.primary}});var _default=exports.default=EmptyState;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.FloatingActionButtonGroup=exports.FloatingActionButton=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated")),_reactNativeSafeAreaContext=require("react-native-safe-area-context"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_useReducedMotion=require("../../hooks/useReducedMotion.js"),_index=require("../../theme/index.js"),_announce=require("../../utils/announce.js"),_color=require("../../utils/color.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var i=new WeakMap,n=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var r,a,o={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return o;if(r=t?n:i){if(r.has(e))return r.get(e);r.set(e,o)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((a=(r=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?r(o,t,a):o[t]=e[t]);return o})(e,t)}const sizeMap={sm:{diameter:40,iconSize:18,fontSize:13,labelPaddingHorizontal:14},md:{diameter:56,iconSize:22,fontSize:15,labelPaddingHorizontal:18},lg:{diameter:72,iconSize:28,fontSize:16,labelPaddingHorizontal:22}},toneBackground=(e,t)=>{switch(t){case"success":return e.colors.success;case"warning":return e.colors.warning;case"error":return e.colors.error;case"neutral":return e.colors.background.tertiary;default:return e.colors.primary}},pressedTintFor=(e,t)=>"neutral"===t?e.colors.surface.pressed:_color.ACCENT_PRESSED_TINT,toneForeground=(e,t)=>{if("neutral"===t)return e.colors.text.primary;switch(t){case"success":return e.colors.onSuccess;case"warning":return e.colors.onWarning;case"error":return e.colors.onError;default:return e.colors.onPrimary}},FloatingActionButton=exports.FloatingActionButton=(0,_react.forwardRef)((e,t)=>{const{icon:i,onPress:n,label:r,collapsed:a=!1,size:o="md",tone:s="primary",position:c,bottomOffset:l,disabled:u=!1,hideOnScroll:d=!1,isScrolling:m=!1,accessibilityLabel:p,accessibilityHint:_,haptic:g,style:b,containerStyle:f,labelStyle:h,testID:y}=e,v=(0,_index.useTheme)(),x=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),R=sizeMap[o],j=(0,_react.useMemo)(()=>buildStyles(v),[v]),{scale:N,pressIn:S,pressOut:w}=(0,_usePressAnimation.usePressAnimation)({enabled:!u}),A=v.components.floatingActionButton,C=A?.edgeOffset??24,P=A?.bottomOffset??24,E=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current;(0,_react.useEffect)(()=>{if(!d)return void(0,_index.setNativeValue)(E,0);const e=_reactNative.Animated.timing(E,{toValue:m?1:0,duration:v.motion.duration.normal,easing:_reactNative.Easing.bezier(...v.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[d,m,E,v.motion.duration.normal,v.motion.easing.standard]);const I=E.interpolate({inputRange:[0,1],outputRange:[0,R.diameter+(l??P)+x.bottom+C]}),k=E.interpolate({inputRange:[0,1],outputRange:[1,0]}),F=i,V="string"==typeof r&&r.length>0,z=V&&a,D=(0,_useReducedMotion.useReducedMotion)(),M=v.spacing.sm,O=R.labelPaddingHorizontal,B=v.motion.duration.fast,T=v.motion.easing.standard,q=(0,_reactNativeReanimated.useSharedValue)(z?1:0),[L,H]=(0,_react.useState)(null);(0,_react.useEffect)(()=>{const e=z?1:0;return q.value=D?e:(0,_reactNativeReanimated.withTiming)(e,{duration:B,easing:_reactNativeReanimated.Easing.bezier(...T)}),()=>(0,_reactNativeReanimated.cancelAnimation)(q)},[z,D,q,B,T]);const W=(0,_react.useCallback)(e=>{const t=Math.ceil(e);H(e=>e===t?e:t)},[]),$=(0,_reactNativeReanimated.useAnimatedStyle)(()=>({paddingHorizontal:O*(1-q.value)})),G=(0,_reactNativeReanimated.useAnimatedStyle)(()=>{const e=Math.max(0,1-2*q.value);return null===L?q.value>=1?{opacity:e,width:0}:{opacity:e}:{opacity:e,width:(L+M)*(1-q.value)}}),U=u?v.colors.surface.disabled:toneBackground(v,s),Y=u?v.colors.text.disabled:toneForeground(v,s),Q=(0,_react.useMemo)(()=>{if(!c)return null;const e=(l??P)+x.bottom;switch(c){case"bottomLeft":return{position:"absolute",bottom:e,left:C};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center"};default:return{position:"absolute",bottom:e,right:C}}},[c,l,x.bottom,P,C]);return(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[Q,{transform:[{translateY:I},{scale:N}],opacity:k},f,b],pointerEvents:d&&m?"none":"auto",children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:t,onPress:e=>{if(u)return;const t=(0,_hapticUtils.resolveHaptic)(g,"impactLight");t&&(0,_hapticUtils.triggerHaptic)(t),n()},onPressIn:S,onPressOut:w,disabled:u,accessibilityRole:"button",accessibilityLabel:p,accessibilityHint:_,accessibilityState:{disabled:u},"aria-disabled":u,testID:y,style:[j.base,V?{height:R.diameter,minWidth:R.diameter,borderRadius:R.diameter/2,..._corners.smoothCorners}:{width:R.diameter,height:R.diameter,borderRadius:R.diameter/2,..._corners.smoothCorners},v.shadows.lg,{backgroundColor:U,opacity:u?.55:1}],children:({pressed:e})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[e&&!u?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",testID:"fab-pressed",style:[j.pressedTint,{backgroundColor:pressedTintFor(v,s),borderRadius:R.diameter/2,..._corners.smoothCorners}]}):null,V?(0,_jsxRuntime.jsxs)(_reactNativeReanimated.default.View,{style:[j.extendedRow,$],children:[F,(0,_jsxRuntime.jsx)(_reactNativeReanimated.default.View,{style:[j.labelClip,G],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{onLayout:e=>W(e.nativeEvent.layout.width),style:[j.label,{color:Y,fontSize:R.fontSize,fontWeight:v.typography.fontWeight.semibold,marginLeft:M},h],numberOfLines:1,children:r})})]}):F]})})})});FloatingActionButton.displayName="FloatingActionButton";const buildStyles=e=>_reactNative.StyleSheet.create({base:{flexDirection:"row",alignItems:"center",justifyContent:"center",overflow:"hidden"},pressedTint:{position:"absolute",top:0,right:0,bottom:0,left:0},extendedRow:{flexDirection:"row",alignItems:"center"},labelClip:{flexDirection:"row",overflow:"hidden"},label:{includeFontPadding:!1,flexShrink:0}}),FAB_GROUP_MIN_ACTIONS=2,FAB_GROUP_MAX_ACTIONS=6,FAB_GROUP_RANGE="2 to 6",describeActionProblem=e=>e.length<2?`was given ${e.length} action(s); a menu holds 2 to 6.`:e.length>6?`was given ${e.length} actions; a menu holds 2 to 6, so only the first 6 are drawn.`:e.some(e=>"string"!=typeof e.label||""===e.label.trim())?"has an action without a visible `label`; every menu action needs one.":"",FloatingActionButtonGroup=e=>{const{primaryIcon:t,primaryActiveIcon:i,actions:n,open:r,defaultOpen:a=!1,onOpenChange:o,position:s="bottomRight",bottomOffset:c,size:l="md",accessibilityLabel:u="Quick actions",haptic:d,hideOnScroll:m=!1,isScrolling:p=!1,containerStyle:_,secondaryActionStyle:g,labelPillStyle:b,labelStyle:f,testID:h}=e,y=(0,_index.useTheme)(),v=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),x=sizeMap[l],R=(0,_react.useMemo)(()=>buildGroupStyles(y),[y]),j=y.components.floatingActionButton,N=j?.edgeOffset??24,S=j?.bottomOffset??24,w=j?.secondaryGap??16,A=j?.staggerMs??50,C=(0,_react.useMemo)(()=>n.slice(0,6),[n]),P=C.length,E=(0,_react.useMemo)(()=>C.map((e,t)=>({action:e,index:t})).reverse(),[C]),I=__DEV__?describeActionProblem(n):"";(0,_react.useEffect)(()=>{__DEV__&&I&&console.warn(`[@webority/mobile-ui] FloatingActionButtonGroup ${I}`)},[I]);const k="boolean"==typeof r,[F,V]=(0,_react.useState)(a),z=k?r:F,D=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current;(0,_react.useEffect)(()=>{if(!m)return void(0,_index.setNativeValue)(D,0);const e=_reactNative.Animated.timing(D,{toValue:p?1:0,duration:y.motion.duration.normal,easing:_reactNative.Easing.bezier(...y.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[m,p,D,y.motion.duration.normal,y.motion.easing.standard]);const M=m&&p;(0,_react.useEffect)(()=>{M&&z&&(k||V(!1),o?.(!1))},[M,z,k,o]);const O=D.interpolate({inputRange:[0,1],outputRange:[0,x.diameter+(c??S)+v.bottom+N]}),B=D.interpolate({inputRange:[0,1],outputRange:[1,0]}),T=(0,_react.useRef)((0,_index.createAnimatedValue)(z?1:0)).current,q=(0,_react.useRef)([]),[L,H]=(0,_react.useState)(0);(0,_react.useEffect)(()=>{const e=q.current;if(e.length!==P){if(e.length<P){const t=e.slice();for(let i=e.length;i<P;i+=1)t.push(new _reactNative.Animated.Value(z?1:0));q.current=t}else q.current=e.slice(0,P);H(e=>e+1)}},[P]),(0,_react.useEffect)(()=>{const e=_reactNative.Animated.timing(T,{toValue:z?1:0,duration:y.motion.duration.normal,easing:_reactNative.Easing.bezier(...y.motion.easing.standard),useNativeDriver:!0});e.start();const t=q.current.map(e=>_reactNative.Animated.timing(e,{toValue:z?1:0,duration:y.motion.duration.normal,easing:_reactNative.Easing.bezier(...y.motion.easing.standard),useNativeDriver:!0})),i=z?t:[...t].reverse(),n=_reactNative.Animated.stagger(A,i);return n.start(),()=>{e.stop(),n.stop()}},[z,T,y.motion.duration.normal,y.motion.easing.standard,P,L,A]);const W=(0,_react.useCallback)(e=>{const t=(0,_hapticUtils.resolveHaptic)(d,"impactLight");t&&(0,_hapticUtils.triggerHaptic)(t),k||V(e),o?.(e)},[k,o,d]),$=(0,_react.useRef)(null),G=(0,_react.useRef)(z),U=(0,_react.useRef)(!1);(0,_react.useEffect)(()=>{if(G.current===z)return;G.current=z;const e=U.current;if(U.current=!1,M||e)return;const t=$.current;t&&("web"===_reactNative.Platform.OS?t.focus?.():_reactNative.AccessibilityInfo.sendAccessibilityEvent(t,"focus"));const i=1===P?"action":"actions";(0,_announce.announce)(z?`${u}, expanded, ${P} ${i}`:`${u}, collapsed`)},[z,M,u,P]);const Y=(0,_react.useCallback)(()=>{W(!z)},[z,W]),Q=(0,_react.useCallback)(e=>{!1!==d&&(0,_hapticUtils.triggerHaptic)("selection"),U.current=!0,e.onPress(),k||V(!1),o?.(!1)},[k,o,d]),X=(0,_react.useCallback)(()=>{z&&W(!1)},[z,W]),J=(0,_react.useMemo)(()=>{const e=(c??S)+v.bottom;switch(s){case"bottomLeft":return{position:"absolute",bottom:e,left:N,alignItems:"flex-start"};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center",alignItems:"center"};default:return{position:"absolute",bottom:e,right:N,alignItems:"flex-end"}}},[s,c,v.bottom,S,N]),slotOffset=e=>-(x.diameter+w)*(e+1),K=(0,_react.useMemo)(()=>{switch(s){case"bottomLeft":return{left:0,right:0,justifyContent:"flex-start"};case"bottomCenter":return{left:0,right:0,justifyContent:"center"};default:return{left:0,right:0,justifyContent:"flex-end"}}},[s]),Z=.78*x.diameter,ee=(0,_react.useMemo)(()=>{const e=Z+y.spacing.sm;switch(s){case"bottomLeft":return{left:e,alignItems:"flex-start"};case"bottomCenter":return{right:x.diameter/2+Z/2+y.spacing.sm,alignItems:"flex-end"};default:return{right:e,alignItems:"flex-end"}}},[s,Z,x.diameter,y.spacing.sm]),te=T.interpolate({inputRange:[0,1],outputRange:[0,.4]}),ie=T.interpolate({inputRange:[0,1],outputRange:["0deg","45deg"]});return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[z?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{pointerEvents:z?"auto":"none",style:[_reactNative.StyleSheet.absoluteFill,{backgroundColor:y.colors.background.overlay,opacity:te}],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:X,accessibilityElementsHidden:!0,importantForAccessibility:"no",testID:h?`${h}-backdrop`:void 0})}):null,(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{pointerEvents:M?"none":"box-none",style:[J,{transform:[{translateY:O}],opacity:B},_],accessibilityRole:"menu",testID:h,children:[E.map(({action:e,index:t})=>{const i=q.current[t];if(!i)return null;const n=i.interpolate({inputRange:[0,1],outputRange:[0,slotOffset(t)]}),r=i.interpolate({inputRange:[0,1],outputRange:[.6,1]}),a=toneBackground(y,e.tone??"primary"),o=toneForeground(y,e.tone??"primary"),s=e.label?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",style:[R.labelSlot,ee],testID:h?`${h}-label-${e.key}`:void 0,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:[R.labelPill,y.shadows.sm,{backgroundColor:y.colors.background.elevated,paddingHorizontal:y.spacing.sm,paddingVertical:y.spacing.xs,borderRadius:y.radius.sm,..._corners.smoothCorners},b],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[{color:y.colors.text.primary,fontSize:y.typography.fontSize.sm,fontWeight:y.typography.fontWeight.medium},f],numberOfLines:1,children:e.label})})}):null;return(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{pointerEvents:z?"auto":"none",accessibilityElementsHidden:!z,importantForAccessibility:z?"auto":"no-hide-descendants","aria-hidden":!z,style:[R.secondaryRow,K,{position:"absolute",bottom:0,opacity:i,transform:[{translateY:n},{scale:r}]}],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:()=>Q(e),focusable:z,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel,style:[R.fabBase,y.shadows.md,{width:Z,height:Z,borderRadius:Z/2,..._corners.smoothCorners,backgroundColor:a},g],testID:h?`${h}-action-${e.key}`:void 0,children:({pressed:t})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[t?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",testID:"fab-pressed",style:[R.pressedTint,{backgroundColor:pressedTintFor(y,e.tone??"primary"),borderRadius:Z/2,..._corners.smoothCorners}]}):null,_react.default.isValidElement(e.icon)?e.icon:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:{color:o},children:String(e.icon??"")})]})}),s]},e.key)}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:$,onPress:Y,accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{expanded:z},"aria-expanded":z,style:[R.fabBase,y.shadows.lg,{width:x.diameter,height:x.diameter,borderRadius:x.diameter/2,..._corners.smoothCorners,backgroundColor:y.colors.primary}],testID:h?`${h}-primary`:void 0,children:({pressed:e})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[e?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",testID:"fab-pressed",style:[R.pressedTint,{backgroundColor:_color.ACCENT_PRESSED_TINT,borderRadius:x.diameter/2,..._corners.smoothCorners}]}):null,(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:i?void 0:{transform:[{rotate:ie}]},children:z&&i?i:t})]})})]})]})};exports.FloatingActionButtonGroup=FloatingActionButtonGroup;const buildGroupStyles=e=>_reactNative.StyleSheet.create({fabBase:{flexDirection:"row",alignItems:"center",justifyContent:"center",overflow:"hidden"},pressedTint:{position:"absolute",top:0,right:0,bottom:0,left:0},secondaryRow:{flexDirection:"row",alignItems:"center"},labelSlot:{position:"absolute",top:0,bottom:0,justifyContent:"center"},labelPill:{alignSelf:"auto"}});var _default=exports.default=FloatingActionButton;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.FloatingActionButtonGroup=exports.FloatingActionButton=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_reactNativeReanimated=_interopRequireWildcard(require("react-native-reanimated")),_reactNativeSafeAreaContext=require("react-native-safe-area-context"),_usePresenceMotion=require("../../hooks/usePresenceMotion.js"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_index=require("../../theme/index.js"),_announce=require("../../utils/announce.js"),_color=require("../../utils/color.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var n=new WeakMap,r=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var i,a,o={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return o;if(i=t?r:n){if(i.has(e))return i.get(e);i.set(e,o)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((a=(i=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(a.get||a.set)?i(o,t,a):o[t]=e[t]);return o})(e,t)}const sizeMap={sm:{diameter:40,iconSize:18,fontSize:13,labelPaddingHorizontal:14},md:{diameter:56,iconSize:22,fontSize:15,labelPaddingHorizontal:18},lg:{diameter:72,iconSize:28,fontSize:16,labelPaddingHorizontal:22}},toneBackground=(e,t)=>{switch(t){case"success":return e.colors.success;case"warning":return e.colors.warning;case"error":return e.colors.error;case"neutral":return e.colors.background.tertiary;default:return e.colors.primary}},pressedTintFor=(e,t)=>"neutral"===t?e.colors.surface.pressed:_color.ACCENT_PRESSED_TINT,toneForeground=(e,t)=>{if("neutral"===t)return e.colors.text.primary;switch(t){case"success":return e.colors.onSuccess;case"warning":return e.colors.onWarning;case"error":return e.colors.onError;default:return e.colors.onPrimary}},FloatingActionButton=exports.FloatingActionButton=(0,_react.forwardRef)((e,t)=>{const{icon:n,onPress:r,label:i,collapsed:a=!1,size:o="md",tone:s="primary",position:c,bottomOffset:l,disabled:u=!1,hideOnScroll:d=!1,isScrolling:m=!1,accessibilityLabel:_,accessibilityHint:p,haptic:g,style:f,containerStyle:b,labelStyle:h,testID:y}=e,v=(0,_index.useTheme)(),x=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),R=sizeMap[o],j=(0,_react.useMemo)(()=>buildStyles(v),[v]),{scale:w,opacity:N,pressIn:S,pressOut:A}=(0,_usePressAnimation.usePressAnimation)({enabled:!u}),P=(0,_usePresenceMotion.usePresenceMotion)(),C=v.components.floatingActionButton,E=C?.edgeOffset??24,k=C?.bottomOffset??24,I=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current,F=P.duration("normal");(0,_react.useEffect)(()=>{if(!d)return void(0,_index.setNativeValue)(I,1);const e=_reactNative.Animated.timing(I,{toValue:m?0:1,duration:F,easing:_reactNative.Easing.bezier(...v.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[d,m,I,F,v.motion.easing.standard]);const M=R.diameter+(l??k)+x.bottom+E,V=I.interpolate({inputRange:[0,1],outputRange:P.range(M,0)}),z=(0,_react.useMemo)(()=>_reactNative.Animated.multiply(I,N),[I,N]),O=n,D="string"==typeof i&&i.length>0,B=D&&a,T=P.reduced,L=v.spacing.sm,q=R.labelPaddingHorizontal,H=v.motion.duration.fast,W=v.motion.easing.standard,$=(0,_reactNativeReanimated.useSharedValue)(B?1:0),[G,U]=(0,_react.useState)(null);(0,_react.useEffect)(()=>{const e=B?1:0;return $.value=T?e:(0,_reactNativeReanimated.withTiming)(e,{duration:H,easing:_reactNativeReanimated.Easing.bezier(...W)}),()=>(0,_reactNativeReanimated.cancelAnimation)($)},[B,T,$,H,W]);const Y=(0,_react.useCallback)(e=>{const t=Math.ceil(e);U(e=>e===t?e:t)},[]),Q=(0,_reactNativeReanimated.useAnimatedStyle)(()=>({paddingHorizontal:q*(1-$.value)})),X=(0,_reactNativeReanimated.useAnimatedStyle)(()=>{const e=Math.max(0,1-2*$.value);return null===G?$.value>=1?{opacity:e,width:0}:{opacity:e}:{opacity:e,width:(G+L)*(1-$.value)}}),J=u?v.colors.surface.disabled:toneBackground(v,s),K=u?v.colors.text.disabled:toneForeground(v,s),Z=(0,_react.useMemo)(()=>{if(!c)return null;const e=(l??k)+x.bottom;switch(c){case"bottomLeft":return{position:"absolute",bottom:e,left:E};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center"};default:return{position:"absolute",bottom:e,right:E}}},[c,l,x.bottom,k,E]);return(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[Z,{transform:[{translateY:V},{scale:w}],opacity:z},b,f],pointerEvents:d&&m?"none":"auto",children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:t,onPress:e=>{if(u)return;const t=(0,_hapticUtils.resolveHaptic)(g,"impactLight");t&&(0,_hapticUtils.triggerHaptic)(t),r()},onPressIn:S,onPressOut:A,disabled:u,accessibilityRole:"button",accessibilityLabel:_,accessibilityHint:p,accessibilityState:{disabled:u},"aria-disabled":u,testID:y,style:[j.base,D?{height:R.diameter,minWidth:R.diameter,borderRadius:R.diameter/2,..._corners.smoothCorners}:{width:R.diameter,height:R.diameter,borderRadius:R.diameter/2,..._corners.smoothCorners},v.shadows.lg,{backgroundColor:J,opacity:u?.55:1}],children:({pressed:e})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[e&&!u?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",testID:"fab-pressed",style:[j.pressedTint,{backgroundColor:pressedTintFor(v,s),borderRadius:R.diameter/2,..._corners.smoothCorners}]}):null,D?(0,_jsxRuntime.jsxs)(_reactNativeReanimated.default.View,{style:[j.extendedRow,Q],children:[O,(0,_jsxRuntime.jsx)(_reactNativeReanimated.default.View,{style:[j.labelClip,X],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{onLayout:e=>Y(e.nativeEvent.layout.width),style:[j.label,{color:K,fontSize:R.fontSize,fontWeight:v.typography.fontWeight.semibold,marginLeft:L},h],numberOfLines:1,children:i})})]}):O]})})})});FloatingActionButton.displayName="FloatingActionButton";const buildStyles=e=>_reactNative.StyleSheet.create({base:{flexDirection:"row",alignItems:"center",justifyContent:"center",overflow:"hidden"},pressedTint:{position:"absolute",top:0,right:0,bottom:0,left:0},extendedRow:{flexDirection:"row",alignItems:"center"},labelClip:{flexDirection:"row",overflow:"hidden"},label:{includeFontPadding:!1,flexShrink:0}}),FAB_GROUP_MIN_ACTIONS=2,FAB_GROUP_MAX_ACTIONS=6,FAB_GROUP_RANGE="2 to 6",describeActionProblem=e=>e.length<2?`was given ${e.length} action(s); a menu holds 2 to 6.`:e.length>6?`was given ${e.length} actions; a menu holds 2 to 6, so only the first 6 are drawn.`:e.some(e=>"string"!=typeof e.label||""===e.label.trim())?"has an action without a visible `label`; every menu action needs one.":"",FloatingActionButtonGroup=e=>{const{primaryIcon:t,primaryActiveIcon:n,actions:r,open:i,defaultOpen:a=!1,onOpenChange:o,position:s="bottomRight",bottomOffset:c,size:l="md",accessibilityLabel:u="Quick actions",haptic:d,hideOnScroll:m=!1,isScrolling:_=!1,containerStyle:p,secondaryActionStyle:g,labelPillStyle:f,labelStyle:b,testID:h}=e,y=(0,_index.useTheme)(),v=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),x=sizeMap[l],R=(0,_react.useMemo)(()=>buildGroupStyles(y),[y]),j=(0,_usePresenceMotion.usePresenceMotion)(),w=j.duration("normal"),N=y.components.floatingActionButton,S=N?.edgeOffset??24,A=N?.bottomOffset??24,P=N?.secondaryGap??16,C=N?.staggerMs??50,E=(0,_react.useMemo)(()=>r.slice(0,6),[r]),k=E.length,I=(0,_react.useMemo)(()=>E.map((e,t)=>({action:e,index:t})).reverse(),[E]),F=__DEV__?describeActionProblem(r):"";(0,_react.useEffect)(()=>{__DEV__&&F&&console.warn(`[@webority/mobile-ui] FloatingActionButtonGroup ${F}`)},[F]);const M="boolean"==typeof i,[V,z]=(0,_react.useState)(a),O=M?i:V,D=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current;(0,_react.useEffect)(()=>{if(!m)return void(0,_index.setNativeValue)(D,1);const e=_reactNative.Animated.timing(D,{toValue:_?0:1,duration:w,easing:_reactNative.Easing.bezier(...y.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[m,_,D,w,y.motion.easing.standard]);const B=m&&_;(0,_react.useEffect)(()=>{B&&O&&(M||z(!1),o?.(!1))},[B,O,M,o]);const T=x.diameter+(c??A)+v.bottom+S,L=D.interpolate({inputRange:[0,1],outputRange:j.range(T,0)}),q=D,H=(0,_react.useRef)((0,_index.createAnimatedValue)(O?1:0)).current,W=(0,_react.useRef)([]),[$,G]=(0,_react.useState)(0);(0,_react.useEffect)(()=>{const e=W.current;if(e.length!==k){if(e.length<k){const t=e.slice();for(let n=e.length;n<k;n+=1)t.push(new _reactNative.Animated.Value(O?1:0));W.current=t}else W.current=e.slice(0,k);G(e=>e+1)}},[k]),(0,_react.useEffect)(()=>{const e=_reactNative.Animated.timing(H,{toValue:O?1:0,duration:w,easing:_reactNative.Easing.bezier(...y.motion.easing.standard),useNativeDriver:!0});e.start();const t=W.current.map(e=>_reactNative.Animated.timing(e,{toValue:O?1:0,duration:w,easing:_reactNative.Easing.bezier(...y.motion.easing.standard),useNativeDriver:!0})),n=O?t:[...t].reverse(),r=_reactNative.Animated.stagger(C,n);return r.start(),()=>{e.stop(),r.stop()}},[O,H,w,y.motion.easing.standard,k,$,C]);const U=(0,_react.useCallback)(e=>{const t=(0,_hapticUtils.resolveHaptic)(d,"impactLight");t&&(0,_hapticUtils.triggerHaptic)(t),M||z(e),o?.(e)},[M,o,d]),Y=(0,_react.useRef)(null),Q=(0,_react.useRef)(O),X=(0,_react.useRef)(!1);(0,_react.useEffect)(()=>{if(Q.current===O)return;Q.current=O;const e=X.current;if(X.current=!1,B||e)return;const t=Y.current;t&&("web"===_reactNative.Platform.OS?t.focus?.():_reactNative.AccessibilityInfo.sendAccessibilityEvent(t,"focus"));const n=1===k?"action":"actions";(0,_announce.announce)(O?`${u}, expanded, ${k} ${n}`:`${u}, collapsed`)},[O,B,u,k]);const J=(0,_react.useCallback)(()=>{U(!O)},[O,U]),K=(0,_react.useCallback)(e=>{!1!==d&&(0,_hapticUtils.triggerHaptic)("selection"),X.current=!0,e.onPress(),M||z(!1),o?.(!1)},[M,o,d]),Z=(0,_react.useCallback)(()=>{O&&U(!1)},[O,U]);(0,_react.useEffect)(()=>{if(!O)return;const e=_reactNative.BackHandler.addEventListener("hardwareBackPress",()=>(U(!1),!0));return()=>e.remove()},[O,U]),(0,_react.useEffect)(()=>{if(!O||"web"!==_reactNative.Platform.OS)return;const onKeyDown=e=>{"Escape"===e.key&&U(!1)};return window.addEventListener("keydown",onKeyDown),()=>window.removeEventListener("keydown",onKeyDown)},[O,U]);const ee=(0,_react.useMemo)(()=>{const e=(c??A)+v.bottom;switch(s){case"bottomLeft":return{position:"absolute",bottom:e,left:S,alignItems:"flex-start"};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center",alignItems:"center"};default:return{position:"absolute",bottom:e,right:S,alignItems:"flex-end"}}},[s,c,v.bottom,A,S]),slotOffset=e=>-(x.diameter+P)*(e+1),te=(0,_react.useMemo)(()=>{switch(s){case"bottomLeft":return{left:0,right:0,justifyContent:"flex-start"};case"bottomCenter":return{left:0,right:0,justifyContent:"center"};default:return{left:0,right:0,justifyContent:"flex-end"}}},[s]),ne=.78*x.diameter,re=(0,_react.useMemo)(()=>{const e=ne+y.spacing.sm;switch(s){case"bottomLeft":return{left:e,alignItems:"flex-start"};case"bottomCenter":return{right:x.diameter/2+ne/2+y.spacing.sm,alignItems:"flex-end"};default:return{right:e,alignItems:"flex-end"}}},[s,ne,x.diameter,y.spacing.sm]),ie=H.interpolate({inputRange:[0,1],outputRange:[0,.4]}),ae=H.interpolate(j.reduced?{inputRange:[0,.5,.5001,1],outputRange:["0deg","0deg","45deg","45deg"]}:{inputRange:[0,1],outputRange:["0deg","45deg"]});return(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[O?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{pointerEvents:O?"auto":"none",style:[_reactNative.StyleSheet.absoluteFill,{backgroundColor:y.colors.background.overlay,opacity:ie}],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:Z,accessibilityElementsHidden:!0,importantForAccessibility:"no",testID:h?`${h}-backdrop`:void 0})}):null,(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{pointerEvents:B?"none":"box-none",style:[ee,{transform:[{translateY:L}],opacity:q},p],accessibilityRole:"menu",testID:h,children:[I.map(({action:e,index:t})=>{const n=W.current[t];if(!n)return null;const r=n.interpolate({inputRange:[0,1],outputRange:j.range(0,slotOffset(t))}),i=n.interpolate({inputRange:[0,1],outputRange:j.range(.6,1)}),a=toneBackground(y,e.tone??"primary"),o=toneForeground(y,e.tone??"primary"),s=e.label?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",style:[R.labelSlot,re],testID:h?`${h}-label-${e.key}`:void 0,children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:[R.labelPill,y.shadows.sm,{backgroundColor:y.colors.background.elevated,paddingHorizontal:y.spacing.sm,paddingVertical:y.spacing.xs,borderRadius:y.radius.sm,..._corners.smoothCorners},f],children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[{color:y.colors.text.primary,fontSize:y.typography.fontSize.sm,fontWeight:y.typography.fontWeight.medium},b],numberOfLines:1,children:e.label})})}):null;return(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{pointerEvents:O?"auto":"none",accessibilityElementsHidden:!O,importantForAccessibility:O?"auto":"no-hide-descendants","aria-hidden":!O,style:[R.secondaryRow,te,{position:"absolute",bottom:0,opacity:n,transform:[{translateY:r},{scale:i}]}],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{onPress:()=>K(e),focusable:O,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel,style:[R.fabBase,y.shadows.md,{width:ne,height:ne,borderRadius:ne/2,..._corners.smoothCorners,backgroundColor:a},g],testID:h?`${h}-action-${e.key}`:void 0,children:({pressed:t})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[t?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",testID:"fab-pressed",style:[R.pressedTint,{backgroundColor:pressedTintFor(y,e.tone??"primary"),borderRadius:ne/2,..._corners.smoothCorners}]}):null,_react.default.isValidElement(e.icon)?e.icon:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:{color:o},children:String(e.icon??"")})]})}),s]},e.key)}),(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:Y,onPress:J,accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{expanded:O},"aria-expanded":O,style:[R.fabBase,y.shadows.lg,{width:x.diameter,height:x.diameter,borderRadius:x.diameter/2,..._corners.smoothCorners,backgroundColor:y.colors.primary}],testID:h?`${h}-primary`:void 0,children:({pressed:e})=>(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[e?(0,_jsxRuntime.jsx)(_reactNative.View,{pointerEvents:"none",testID:"fab-pressed",style:[R.pressedTint,{backgroundColor:_color.ACCENT_PRESSED_TINT,borderRadius:x.diameter/2,..._corners.smoothCorners}]}):null,(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:n?void 0:{transform:[{rotate:ae}]},children:O&&n?n:t})]})})]})]})};exports.FloatingActionButtonGroup=FloatingActionButtonGroup;const buildGroupStyles=e=>_reactNative.StyleSheet.create({fabBase:{flexDirection:"row",alignItems:"center",justifyContent:"center",overflow:"hidden"},pressedTint:{position:"absolute",top:0,right:0,bottom:0,left:0},secondaryRow:{flexDirection:"row",alignItems:"center"},labelSlot:{position:"absolute",top:0,bottom:0,justifyContent:"center"},labelPill:{alignSelf:"auto"}});var _default=exports.default=FloatingActionButton;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.IconButton=void 0;var _react=require("react"),_reactNative=require("react-native"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_color=require("../../utils/color.js"),_corners=require("../../utils/corners.js"),_slotIcon=require("../AppIcon/slotIcon.js"),_index3=require("../Spinner/index.js"),_jsxRuntime=require("react/jsx-runtime");const GLASS_RIM_WIDTH=1,SOFT_FILL_OPACITY=.14,SIZE_MAP={sm:{diameter:32,icon:16},md:{diameter:40,icon:20},lg:{diameter:48,icon:24}},toneFor=(e,r)=>{switch(r){case"secondary":return{base:e.colors.secondary,on:e.colors.onSecondary,fg:e.colors.secondary};case"success":return{base:e.colors.success,on:e.colors.onSuccess,fg:e.colors.toneText.success};case"warning":return{base:e.colors.warning,on:e.colors.onWarning,fg:e.colors.toneText.warning};case"error":return{base:e.colors.error,on:e.colors.onError,fg:e.colors.toneText.error};case"neutral":return{base:e.colors.background.tertiary,on:e.colors.text.primary,fg:e.colors.text.primary};default:return{base:e.colors.primary,on:e.colors.onPrimary,fg:e.colors.primary}}},IconButton=exports.IconButton=(0,_react.forwardRef)((e,r)=>{const{icon:s,iconVariant:o,onPress:t,accessibilityLabel:n,tone:i="primary",variant:c="solid",size:a="md",shape:l="circle",active:d=!1,disabled:u=!1,loading:b=!1,haptic:m,style:_,testID:x}=e,y=(0,_index.useTheme)(),p=SIZE_MAP[a],g=u||b,{scale:f,pressIn:I,pressOut:j}=(0,_usePressAnimation.usePressAnimation)({scaleTo:.92,enabled:!g}),{base:h,on:P,fg:S}=toneFor(y,i),v=d?"solid":c;let q="transparent",A="transparent",w=0,R=g?y.colors.text.disabled:S;"solid"===v?(q=g?y.colors.surface.disabled:h,R=g?y.colors.text.disabled:P):"soft"===v?q=g?y.colors.surface.disabled:(0,_color.tintOf)(h,.14,y.colors.background.secondary):"outline"===v?(A=g?y.colors.border.primary:h,w=y.colors.border.width):"glass"===v&&(q=y.colors.glass.fill,A=y.colors.glass.border,w=1,R=g?y.colors.text.disabled:y.colors.glass.on);const T={color:R,size:p.icon,disabled:g},B="circle"===l?p.diameter/2:y.radius.md;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:r,onPress:e=>{if(g)return;const r=(0,_index2.resolveHaptic)(m,"selection");r&&(0,_index2.triggerHaptic)(r),t?.(e)},onPressIn:I,onPressOut:j,disabled:g,accessibilityRole:"button",accessibilityLabel:n,accessibilityState:{disabled:g,selected:d},"aria-disabled":g,"aria-selected":d,hitSlop:6,testID:x,style:({pressed:e})=>[styles.base,{width:p.diameter,height:p.diameter,borderRadius:B,..._corners.smoothCorners,backgroundColor:q,borderColor:A,borderWidth:w,opacity:e&&"solid"!==v?.7:1},_],children:(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.content,{transform:[{scale:f}]}],children:b?(0,_jsxRuntime.jsx)(_index3.Spinner,{size:"sm",color:R}):(0,_slotIcon.renderSlotIcon)(s,T,o)})})});IconButton.displayName="IconButton";const styles=_reactNative.StyleSheet.create({base:{alignItems:"center",justifyContent:"center"},content:{alignItems:"center",justifyContent:"center"}});var _default=exports.default=IconButton;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.IconButton=void 0;var _react=require("react"),_reactNative=require("react-native"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_index=require("../../theme/index.js"),_index2=require("../../utils/index.js"),_color=require("../../utils/color.js"),_corners=require("../../utils/corners.js"),_slotIcon=require("../AppIcon/slotIcon.js"),_index3=require("../Spinner/index.js"),_jsxRuntime=require("react/jsx-runtime");const GLASS_RIM_WIDTH=1,SOFT_FILL_OPACITY=.14,SIZE_MAP={sm:{diameter:32,icon:16},md:{diameter:40,icon:20},lg:{diameter:48,icon:24}},toneFor=(e,r)=>{switch(r){case"secondary":return{base:e.colors.secondary,on:e.colors.onSecondary,fg:e.colors.secondary};case"success":return{base:e.colors.success,on:e.colors.onSuccess,fg:e.colors.toneText.success};case"warning":return{base:e.colors.warning,on:e.colors.onWarning,fg:e.colors.toneText.warning};case"error":return{base:e.colors.error,on:e.colors.onError,fg:e.colors.toneText.error};case"neutral":return{base:e.colors.background.tertiary,on:e.colors.text.primary,fg:e.colors.text.primary};default:return{base:e.colors.primary,on:e.colors.onPrimary,fg:e.colors.primary}}},IconButton=exports.IconButton=(0,_react.forwardRef)((e,r)=>{const{icon:s,iconVariant:o,onPress:t,accessibilityLabel:n,tone:i="primary",variant:c="solid",size:a="md",shape:l="circle",active:d=!1,disabled:u=!1,loading:b=!1,haptic:m,style:_,testID:x}=e,y=(0,_index.useTheme)(),p=SIZE_MAP[a],g=u||b,{style:f,pressIn:I,pressOut:j}=(0,_usePressAnimation.usePressAnimation)({scaleTo:.92,enabled:!g}),{base:h,on:P,fg:S}=toneFor(y,i),v=d?"solid":c;let q="transparent",A="transparent",w=0,R=g?y.colors.text.disabled:S;"solid"===v?(q=g?y.colors.surface.disabled:h,R=g?y.colors.text.disabled:P):"soft"===v?q=g?y.colors.surface.disabled:(0,_color.tintOf)(h,.14,y.colors.background.secondary):"outline"===v?(A=g?y.colors.border.primary:h,w=y.colors.border.width):"glass"===v&&(q=y.colors.glass.fill,A=y.colors.glass.border,w=1,R=g?y.colors.text.disabled:y.colors.glass.on);const T={color:R,size:p.icon,disabled:g},B="circle"===l?p.diameter/2:y.radius.md;return(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:r,onPress:e=>{if(g)return;const r=(0,_index2.resolveHaptic)(m,"selection");r&&(0,_index2.triggerHaptic)(r),t?.(e)},onPressIn:I,onPressOut:j,disabled:g,accessibilityRole:"button",accessibilityLabel:n,accessibilityState:{disabled:g,selected:d},"aria-disabled":g,"aria-selected":d,hitSlop:6,testID:x,style:({pressed:e})=>[styles.base,{width:p.diameter,height:p.diameter,borderRadius:B,..._corners.smoothCorners,backgroundColor:q,borderColor:A,borderWidth:w,opacity:e&&"solid"!==v?.7:1},_],children:(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[styles.content,f],children:b?(0,_jsxRuntime.jsx)(_index3.Spinner,{size:"sm",color:R}):(0,_slotIcon.renderSlotIcon)(s,T,o)})})});IconButton.displayName="IconButton";const styles=_reactNative.StyleSheet.create({base:{alignItems:"center",justifyContent:"center"},content:{alignItems:"center",justifyContent:"center"}});var _default=exports.default=IconButton;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.ListItem=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_reactNativeSvg=_interopRequireWildcard(require("react-native-svg")),_useFlickGuard=require("../../hooks/useFlickGuard.js"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_mergeRefs=require("../../utils/mergeRefs.js"),_defaultIcons=require("../AppIcon/defaultIcons.js"),_index2=require("../Button/index.js"),_index3=require("../IconBadge/index.js"),_useContextMenu=require("../Menu/useContextMenu.js"),_index4=require("../Skeleton/index.js"),_index5=require("../Swipeable/index.js"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var i=new WeakMap,s=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,r,l={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return l;if(n=t?s:i){if(n.has(e))return n.get(e);n.set(e,l)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((r=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(r.get||r.set)?n(l,t,r):l[t]=e[t]);return l})(e,t)}const SIZE_FALLBACK={sm:{paddingVertical:"sm",titleFontSize:"sm",subtitleFontSize:"xs",minHeight:44},md:{paddingVertical:"md",titleFontSize:"base",subtitleFontSize:"sm",minHeight:56},lg:{paddingVertical:"lg",titleFontSize:"lg",subtitleFontSize:"sm",minHeight:72}},sizeFor=(e,t)=>{const i={...SIZE_FALLBACK[t],...e.components.listItem?.[t]??{}};return{paddingVertical:e.spacing[i.paddingVertical],titleSize:e.typography.fontSize[i.titleFontSize],subtitleSize:e.typography.fontSize[i.subtitleFontSize],minHeight:i.minHeight}},Chevron=({color:e})=>{const t=(0,_index.useTheme)();return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:(t.icons?.chevronRight??_defaultIcons.defaultIcons.chevronRight)({size:20,color:e})})},BADGE_SIZE={sm:"sm",md:"md",lg:"lg"},RIGHT_BELOW_FONT_SCALE=1.2,DEFAULT_BOX_SIZE=20,SelectionBox=({checked:e,disabled:t})=>{const i=(0,_index.useTheme)(),s=i.components.checkbox?.md?.boxSize??20,n=Math.round(.72*s);return(0,_jsxRuntime.jsx)(_reactNative.View,{accessibilityElementsHidden:!0,importantForAccessibility:"no-hide-descendants",pointerEvents:"none",style:{width:s,height:s,alignItems:"center",justifyContent:"center",borderWidth:i.colors.border.width,borderRadius:i.radius.xs,..._corners.smoothCorners,borderColor:e?i.colors.primary:i.colors.border.primary,backgroundColor:e?i.colors.primary:t?i.colors.surface.disabled:"transparent"},children:e?(0,_jsxRuntime.jsx)(_reactNativeSvg.default,{width:n,height:n,viewBox:"0 0 24 24",children:(0,_jsxRuntime.jsx)(_reactNativeSvg.Path,{d:"M5 12.5l4.5 4.5L19 7.5",stroke:i.colors.onPrimary,strokeWidth:3,strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})}):null})},isActionList=e=>Array.isArray(e)&&e.length>0&&e.every(e=>null!=e&&"object"==typeof e&&!_react.default.isValidElement(e)&&"label"in e),renderActions=e=>isActionList(e)?e.map(e=>(0,_jsxRuntime.jsx)(_index2.Button,{size:"sm",variant:e.variant??"outline",tone:e.tone,leftIcon:e.icon,disabled:e.disabled,testID:e.testID,title:e.label,onPress:e.onPress},e.label)):e,ListItem=exports.ListItem=(0,_react.forwardRef)((e,t)=>{const{title:i,loading:s=!1,subtitle:n,description:r,titleLines:l=1,subtitleLines:o=1,left:a,icon:c,iconTone:d="primary",right:u,rightPlacement:m="auto",selectable:x=!1,checked:h=!1,onCheckedChange:_,actions:g,onPress:p,haptic:j,selected:b=!1,disabled:f=!1,size:y="md",divider:v=!1,chevron:S=!1,leftActions:R,rightActions:w,contextMenu:I,accessibilityLabel:L,accessibilityHint:k,style:z,containerStyle:N,titleStyle:V,subtitleStyle:A,descriptionStyle:C,leftSlotStyle:F,rightSlotStyle:q,testID:B}=e,P=(0,_index.useTheme)(),H=(0,_react.useMemo)(()=>sizeFor(P,y),[P,y]),D=(0,_react.useMemo)(()=>buildStyles(P),[P]),{fontScale:M}=(0,_reactNative.useWindowDimensions)(),W=!!u&&("below"===m||"auto"===m&&M>1.2),T=(0,_useContextMenu.useContextMenu)(f?void 0:I,{haptic:j,testID:B}),E=(0,_react.useMemo)(()=>(0,_mergeRefs.mergeRefs)(t,T.hostRef),[t,T.hostRef]),O=x||!!p,G=O||T.enabled,U=G&&!f,{scale:Z,pressIn:K,pressOut:X}=(0,_usePressAnimation.usePressAnimation)({enabled:U}),J=(0,_useFlickGuard.useFlickGuard)(),Q=L??("string"==typeof i?i:void 0),isText=e=>"string"==typeof e||"number"==typeof e,Y=a??(void 0===c?null:(0,_jsxRuntime.jsx)(_index3.IconBadge,{icon:c,tone:d,size:BADGE_SIZE[y]})),$=x?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:D.selectionLead,children:[(0,_jsxRuntime.jsx)(SelectionBox,{checked:h,disabled:f}),Y?(0,_jsxRuntime.jsx)(_reactNative.View,{style:D.selectionLeadContent,children:Y}):null]}):Y,ee=null!=g&&!1!==g&&!(Array.isArray(g)&&0===g.length),te=v&&!ee,ie=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[D.row,{paddingVertical:H.paddingVertical,minHeight:H.minHeight,backgroundColor:b?P.colors.surface.selected:"transparent"},te?D.divider:null,f?D.disabled:null,N],children:[$?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[D.leftSlot,F],children:$}):null,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:D.middle,children:[null==i||isText(i)?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[D.title,{fontSize:H.titleSize,...(0,_index.fontFor)(P,"medium"),color:f?P.colors.text.disabled:P.colors.text.primary},V],numberOfLines:l,children:i??" "}):i,null==n||""===n?null:isText(n)?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[D.subtitle,{fontSize:H.subtitleSize,color:f?P.colors.text.disabled:P.colors.text.secondary},A],numberOfLines:o,children:n}):n,r?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[D.description,{fontSize:H.subtitleSize,color:f?P.colors.text.disabled:P.colors.text.tertiary},C],numberOfLines:2,children:r}):null,W?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[D.rightBelow,q],children:u}):null]}),u&&!W||S?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[D.rightSlot,W?null:q],children:[W?null:u,S?(0,_jsxRuntime.jsx)(_reactNative.View,{style:u&&!W?D.chevronWithRight:null,children:(0,_jsxRuntime.jsx)(Chevron,{color:f?P.colors.text.disabled:P.colors.text.tertiary})}):null]}):null]}),se=G?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[{transform:[{scale:Z}]},z],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:E,onPress:e=>{if(!U||!O||J.isFlick(e))return;const t=(0,_hapticUtils.resolveHaptic)(j,"selection");t&&(0,_hapticUtils.triggerHaptic)(t),x?_?.(!h):p?.(e)},onPressIn:e=>{J.onPressIn(e),K()},onPressOut:X,disabled:!U,accessibilityRole:x?"checkbox":p?"button":void 0,accessibilityLabel:Q,accessibilityHint:k,accessibilityState:x?{checked:h,disabled:!U}:{selected:b,disabled:!U},"aria-disabled":!U,...x?{"aria-checked":h}:{"aria-selected":b},testID:B,android_ripple:{color:P.colors.surface.pressed,borderless:!1},style:({pressed:e})=>e?D.pressed:null,...T.hostProps,children:ie})}):(0,_jsxRuntime.jsx)(_reactNative.View,{ref:t,accessibilityRole:"none",accessibilityLabel:Q,accessibilityHint:k,accessibilityState:{selected:b,disabled:f},"aria-selected":b,"aria-disabled":f,testID:B,style:z,children:ie}),ne=R&&R.length>0||w&&w.length>0,re=ee?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[b?{backgroundColor:P.colors.surface.selected}:null,v?D.divider:null],children:[se,(0,_jsxRuntime.jsx)(_reactNative.View,{style:D.actions,children:renderActions(g)})]}):se,le=ne?(0,_jsxRuntime.jsx)(_index5.Swipeable,{leftActions:R,rightActions:w,accessibilityLabel:Q,children:re}):re;return s?(0,_jsxRuntime.jsx)(ListItemSkeleton,{...e}):T.enabled?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[le,T.renderSurface((0,_jsxRuntime.jsx)(_reactNative.View,{style:D.preview,children:ie}))]}):le});ListItem.displayName="ListItem";const ListItemSkeleton=({subtitle:e,description:t,left:i,icon:s,right:n,chevron:r,size:l="md",containerStyle:o,style:a})=>{const c=(0,_index.useTheme)(),d=sizeFor(c,l),u=Math.round(1.15*d.titleSize),m=Math.round(1.15*d.subtitleSize);return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[{flexDirection:"row",alignItems:"center",paddingHorizontal:c.spacing.md,paddingVertical:d.paddingVertical,minHeight:d.minHeight},o,a],children:[void 0!==i||void 0!==s?(0,_jsxRuntime.jsx)(_reactNative.View,{style:{marginRight:c.spacing.sm},children:(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"circle",width:40,height:40})}):null,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:{flex:1},children:[(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"text",width:"70%",height:u,style:{marginBottom:c.spacing.xs}}),void 0!==e?(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"text",width:"50%",height:m,style:void 0!==t?{marginBottom:c.spacing.xs}:void 0}):null,void 0!==t?(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"text",width:"85%",height:m}):null]}),void 0!==n||r?(0,_jsxRuntime.jsx)(_reactNative.View,{style:{marginLeft:c.spacing.sm},children:(0,_jsxRuntime.jsx)(_index4.Skeleton,{width:20,height:20,radius:"sm"})}):null]})};ListItemSkeleton.displayName="ListItemSkeleton",ListItem.Skeleton=ListItemSkeleton;const buildStyles=e=>_reactNative.StyleSheet.create({row:{flexDirection:"row",alignItems:"center",paddingHorizontal:e.spacing.md},divider:{borderBottomWidth:_reactNative.StyleSheet.hairlineWidth,borderBottomColor:e.colors.border.primary},pressed:{backgroundColor:e.colors.surface.pressed},disabled:{opacity:.55},leftSlot:{marginRight:e.spacing.md,alignItems:"center",justifyContent:"center"},middle:{flex:1,flexDirection:"column",justifyContent:"center"},selectionLead:{flexDirection:"row",alignItems:"center"},selectionLeadContent:{marginLeft:e.spacing.sm},rightBelow:{alignSelf:"flex-start",flexDirection:"row",alignItems:"center",marginTop:e.spacing.xs},rightSlot:{marginLeft:e.spacing.md,alignItems:"center",justifyContent:"center",flexDirection:"row"},actions:{flexDirection:"row",flexWrap:"wrap",gap:e.spacing.sm,paddingHorizontal:e.spacing.md,paddingBottom:e.spacing.md},chevronWithRight:{marginLeft:e.spacing.xs},preview:{flex:1,backgroundColor:e.colors.background.elevated,borderRadius:e.radius.md,..._corners.smoothCorners,overflow:"hidden"},title:{letterSpacing:e.typography.letterSpacing.normal},subtitle:{marginTop:2,...(0,_index.fontFor)(e,"normal")},description:{marginTop:2,...(0,_index.fontFor)(e,"normal")}});var _default=exports.default=ListItem;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.ListItem=void 0;var _react=_interopRequireWildcard(require("react")),_reactNative=require("react-native"),_reactNativeSvg=_interopRequireWildcard(require("react-native-svg")),_useFlickGuard=require("../../hooks/useFlickGuard.js"),_usePressAnimation=require("../../hooks/usePressAnimation.js"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_mergeRefs=require("../../utils/mergeRefs.js"),_defaultIcons=require("../AppIcon/defaultIcons.js"),_index2=require("../Button/index.js"),_index3=require("../IconBadge/index.js"),_useContextMenu=require("../Menu/useContextMenu.js"),_index4=require("../Skeleton/index.js"),_index5=require("../Swipeable/index.js"),_jsxRuntime=require("react/jsx-runtime");function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var i=new WeakMap,s=new WeakMap;return(_interopRequireWildcard=function(e,t){if(!t&&e&&e.__esModule)return e;var n,r,l={__proto__:null,default:e};if(null===e||"object"!=typeof e&&"function"!=typeof e)return l;if(n=t?s:i){if(n.has(e))return n.get(e);n.set(e,l)}for(const t in e)"default"!==t&&{}.hasOwnProperty.call(e,t)&&((r=(n=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,t))&&(r.get||r.set)?n(l,t,r):l[t]=e[t]);return l})(e,t)}const SIZE_FALLBACK={sm:{paddingVertical:"sm",titleFontSize:"sm",subtitleFontSize:"xs",minHeight:44},md:{paddingVertical:"md",titleFontSize:"base",subtitleFontSize:"sm",minHeight:56},lg:{paddingVertical:"lg",titleFontSize:"lg",subtitleFontSize:"sm",minHeight:72}},sizeFor=(e,t)=>{const i={...SIZE_FALLBACK[t],...e.components.listItem?.[t]??{}};return{paddingVertical:e.spacing[i.paddingVertical],titleSize:e.typography.fontSize[i.titleFontSize],subtitleSize:e.typography.fontSize[i.subtitleFontSize],minHeight:i.minHeight}},Chevron=({color:e})=>{const t=(0,_index.useTheme)();return(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:(t.icons?.chevronRight??_defaultIcons.defaultIcons.chevronRight)({size:20,color:e})})},BADGE_SIZE={sm:"sm",md:"md",lg:"lg"},RIGHT_BELOW_FONT_SCALE=1.2,DEFAULT_BOX_SIZE=20,SelectionBox=({checked:e,disabled:t})=>{const i=(0,_index.useTheme)(),s=i.components.checkbox?.md?.boxSize??20,n=Math.round(.72*s);return(0,_jsxRuntime.jsx)(_reactNative.View,{accessibilityElementsHidden:!0,importantForAccessibility:"no-hide-descendants",pointerEvents:"none",style:{width:s,height:s,alignItems:"center",justifyContent:"center",borderWidth:i.colors.border.width,borderRadius:i.radius.xs,..._corners.smoothCorners,borderColor:e?i.colors.primary:i.colors.border.primary,backgroundColor:e?i.colors.primary:t?i.colors.surface.disabled:"transparent"},children:e?(0,_jsxRuntime.jsx)(_reactNativeSvg.default,{width:n,height:n,viewBox:"0 0 24 24",children:(0,_jsxRuntime.jsx)(_reactNativeSvg.Path,{d:"M5 12.5l4.5 4.5L19 7.5",stroke:i.colors.onPrimary,strokeWidth:3,strokeLinecap:"round",strokeLinejoin:"round",fill:"none"})}):null})},isActionList=e=>Array.isArray(e)&&e.length>0&&e.every(e=>null!=e&&"object"==typeof e&&!_react.default.isValidElement(e)&&"label"in e),renderActions=e=>isActionList(e)?e.map(e=>(0,_jsxRuntime.jsx)(_index2.Button,{size:"sm",variant:e.variant??"outline",tone:e.tone,leftIcon:e.icon,disabled:e.disabled,testID:e.testID,title:e.label,onPress:e.onPress},e.label)):e,ListItem=exports.ListItem=(0,_react.forwardRef)((e,t)=>{const{title:i,loading:s=!1,subtitle:n,description:r,titleLines:l=1,subtitleLines:o=1,left:a,icon:c,iconTone:d="primary",right:u,rightPlacement:m="auto",selectable:x=!1,checked:h=!1,onCheckedChange:_,actions:g,onPress:p,haptic:j,selected:b=!1,disabled:y=!1,size:f="md",divider:v=!1,chevron:S=!1,leftActions:R,rightActions:w,contextMenu:I,accessibilityLabel:L,accessibilityHint:k,style:z,containerStyle:N,titleStyle:V,subtitleStyle:A,descriptionStyle:C,leftSlotStyle:F,rightSlotStyle:q,testID:B}=e,P=(0,_index.useTheme)(),D=(0,_react.useMemo)(()=>sizeFor(P,f),[P,f]),H=(0,_react.useMemo)(()=>buildStyles(P),[P]),{fontScale:M}=(0,_reactNative.useWindowDimensions)(),W=!!u&&("below"===m||"auto"===m&&M>1.2),T=(0,_useContextMenu.useContextMenu)(y?void 0:I,{haptic:j||!1,testID:B}),E=(0,_react.useMemo)(()=>(0,_mergeRefs.mergeRefs)(t,T.hostRef),[t,T.hostRef]),O=x||!!p,G=O||T.enabled,Z=G&&!y,{style:U,pressIn:K,pressOut:X}=(0,_usePressAnimation.usePressAnimation)({enabled:Z}),J=(0,_useFlickGuard.useFlickGuard)(),Q=L??("string"==typeof i?i:void 0),isText=e=>"string"==typeof e||"number"==typeof e,Y=a??(void 0===c?null:(0,_jsxRuntime.jsx)(_index3.IconBadge,{icon:c,tone:d,size:BADGE_SIZE[f]})),$=x?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:H.selectionLead,children:[(0,_jsxRuntime.jsx)(SelectionBox,{checked:h,disabled:y}),Y?(0,_jsxRuntime.jsx)(_reactNative.View,{style:H.selectionLeadContent,children:Y}):null]}):Y,ee=null!=g&&!1!==g&&!(Array.isArray(g)&&0===g.length),te=v&&!ee,ie=(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[H.row,{paddingVertical:D.paddingVertical,minHeight:D.minHeight,backgroundColor:b?P.colors.surface.selected:"transparent"},te?H.divider:null,y?H.disabled:null,N],children:[$?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[H.leftSlot,F],children:$}):null,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:H.middle,children:[null==i||isText(i)?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[H.title,{fontSize:D.titleSize,...(0,_index.fontFor)(P,"medium"),color:y?P.colors.text.disabled:P.colors.text.primary},V],numberOfLines:l,children:i??" "}):i,null==n||""===n?null:isText(n)?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[H.subtitle,{fontSize:D.subtitleSize,color:y?P.colors.text.disabled:P.colors.text.secondary},A],numberOfLines:o,children:n}):n,r?(0,_jsxRuntime.jsx)(_reactNative.Text,{style:[H.description,{fontSize:D.subtitleSize,color:y?P.colors.text.disabled:P.colors.text.tertiary},C],numberOfLines:2,children:r}):null,W?(0,_jsxRuntime.jsx)(_reactNative.View,{style:[H.rightBelow,q],children:u}):null]}),u&&!W||S?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[H.rightSlot,W?null:q],children:[W?null:u,S?(0,_jsxRuntime.jsx)(_reactNative.View,{style:u&&!W?H.chevronWithRight:null,children:(0,_jsxRuntime.jsx)(Chevron,{color:y?P.colors.text.disabled:P.colors.text.tertiary})}):null]}):null]}),se=G?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{style:[U,z],children:(0,_jsxRuntime.jsx)(_reactNative.Pressable,{ref:E,onPress:e=>{Z&&O&&!J.isFlick(e)&&(j&&(0,_hapticUtils.triggerHaptic)(j),x?_?.(!h):p?.(e))},onPressIn:e=>{J.onPressIn(e),K()},onPressOut:X,disabled:!Z,accessibilityRole:x?"checkbox":p?"button":void 0,accessibilityLabel:Q,accessibilityHint:k,accessibilityState:x?{checked:h,disabled:!Z}:{selected:b,disabled:!Z},"aria-disabled":!Z,...x?{"aria-checked":h}:{"aria-selected":b},testID:B,android_ripple:{color:P.colors.surface.pressed,borderless:!1},style:({pressed:e})=>e?H.pressed:null,...T.hostProps,children:ie})}):(0,_jsxRuntime.jsx)(_reactNative.View,{ref:t,accessibilityRole:"none",accessibilityLabel:Q,accessibilityHint:k,accessibilityState:{selected:b,disabled:y},"aria-selected":b,"aria-disabled":y,testID:B,style:z,children:ie}),ne=R&&R.length>0||w&&w.length>0,re=ee?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[b?{backgroundColor:P.colors.surface.selected}:null,v?H.divider:null],children:[se,(0,_jsxRuntime.jsx)(_reactNative.View,{style:H.actions,children:renderActions(g)})]}):se,le=ne?(0,_jsxRuntime.jsx)(_index5.Swipeable,{leftActions:R,rightActions:w,accessibilityLabel:Q,children:re}):re;return s?(0,_jsxRuntime.jsx)(ListItemSkeleton,{...e}):T.enabled?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[le,T.renderSurface((0,_jsxRuntime.jsx)(_reactNative.View,{style:H.preview,children:ie}))]}):le});ListItem.displayName="ListItem";const ListItemSkeleton=({subtitle:e,description:t,left:i,icon:s,right:n,chevron:r,size:l="md",containerStyle:o,style:a})=>{const c=(0,_index.useTheme)(),d=sizeFor(c,l),u=Math.round(1.15*d.titleSize),m=Math.round(1.15*d.subtitleSize);return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[{flexDirection:"row",alignItems:"center",paddingHorizontal:c.spacing.md,paddingVertical:d.paddingVertical,minHeight:d.minHeight},o,a],children:[void 0!==i||void 0!==s?(0,_jsxRuntime.jsx)(_reactNative.View,{style:{marginRight:c.spacing.sm},children:(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"circle",width:40,height:40})}):null,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:{flex:1},children:[(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"text",width:"70%",height:u,style:{marginBottom:c.spacing.xs}}),void 0!==e?(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"text",width:"50%",height:m,style:void 0!==t?{marginBottom:c.spacing.xs}:void 0}):null,void 0!==t?(0,_jsxRuntime.jsx)(_index4.Skeleton,{shape:"text",width:"85%",height:m}):null]}),void 0!==n||r?(0,_jsxRuntime.jsx)(_reactNative.View,{style:{marginLeft:c.spacing.sm},children:(0,_jsxRuntime.jsx)(_index4.Skeleton,{width:20,height:20,radius:"sm"})}):null]})};ListItemSkeleton.displayName="ListItemSkeleton",ListItem.Skeleton=ListItemSkeleton;const buildStyles=e=>_reactNative.StyleSheet.create({row:{flexDirection:"row",alignItems:"center",paddingHorizontal:e.spacing.md},divider:{borderBottomWidth:_reactNative.StyleSheet.hairlineWidth,borderBottomColor:e.colors.border.primary},pressed:{backgroundColor:e.colors.surface.pressed},disabled:{opacity:.55},leftSlot:{marginRight:e.spacing.md,alignItems:"center",justifyContent:"center"},middle:{flex:1,flexDirection:"column",justifyContent:"center"},selectionLead:{flexDirection:"row",alignItems:"center"},selectionLeadContent:{marginLeft:e.spacing.sm},rightBelow:{alignSelf:"flex-start",flexDirection:"row",alignItems:"center",marginTop:e.spacing.xs},rightSlot:{marginLeft:e.spacing.md,alignItems:"center",justifyContent:"center",flexDirection:"row"},actions:{flexDirection:"row",flexWrap:"wrap",gap:e.spacing.sm,paddingHorizontal:e.spacing.md,paddingBottom:e.spacing.md},chevronWithRight:{marginLeft:e.spacing.xs},preview:{flex:1,backgroundColor:e.colors.background.elevated,borderRadius:e.radius.md,..._corners.smoothCorners,overflow:"hidden"},title:{letterSpacing:e.typography.letterSpacing.normal},subtitle:{marginTop:2,...(0,_index.fontFor)(e,"normal")},description:{marginTop:2,...(0,_index.fontFor)(e,"normal")}});var _default=exports.default=ListItem;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.useLoader=exports.loader=exports.LoaderOverlay=void 0;var _react=require("react"),_reactNative=require("react-native"),_useReducedMotion=require("../../hooks/useReducedMotion.js"),_index=require("../../theme/index.js"),_index2=require("../Spinner/index.js"),_jsxRuntime=require("react/jsx-runtime");const DEFAULT_SHOW_DELAY_MS=150,DEFAULT_MIN_VISIBLE_MS=400;let state={refCount:0,message:void 0};const listeners=new Set,notify=()=>{for(const e of listeners)e()},subscribe=e=>(listeners.add(e),()=>{listeners.delete(e)}),getState=()=>state,show=e=>{state={refCount:state.refCount+1,message:e??state.message},notify()},hide=()=>{if(state.refCount<=0)return;const e=state.refCount-1;state={refCount:e,message:0===e?void 0:state.message},notify()},reset=()=>{0===state.refCount&&void 0===state.message||(state={refCount:0,message:void 0},notify())},isVisible=()=>state.refCount>0,wrap=async(e,t)=>{show(t);try{return await("function"==typeof e?e():e)}finally{hide()}},loader=exports.loader={show:show,hide:hide,wrap:wrap,isVisible:isVisible,reset:reset},useLoader=()=>loader;exports.useLoader=useLoader;const LoaderOverlay=({renderIndicator:e,backdropColor:t,showDelayMs:r=150,minVisibleMs:s=400,testID:a})=>{const n=(0,_index.useTheme)(),i=(0,_useReducedMotion.useReducedMotion)(),o=(0,_react.useSyncExternalStore)(subscribe,getState),[u,c]=(0,_react.useState)(!1),l=(0,_react.useRef)(null),d=(0,_react.useRef)(null),f=(0,_react.useRef)(null),_=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,y=o.refCount>0;(0,_react.useEffect)(()=>{if(y)return null!==d.current&&(clearTimeout(d.current),d.current=null),void(u||null!==l.current||(l.current=setTimeout(()=>{l.current=null,0!==getState().refCount&&(f.current=Date.now(),c(!0))},r)));if(null!==l.current&&(clearTimeout(l.current),l.current=null),u&&null===d.current){const e=null!==f.current?Date.now()-f.current:s,t=Math.max(0,s-e);d.current=setTimeout(()=>{d.current=null,f.current=null,c(!1)},t)}},[y,u,r,s]),(0,_react.useEffect)(()=>()=>{null!==l.current&&clearTimeout(l.current),null!==d.current&&clearTimeout(d.current)},[]),(0,_react.useEffect)(()=>{u?i?_.setValue(1):_reactNative.Animated.timing(_,{toValue:1,duration:n.motion.duration.normal,easing:_reactNative.Easing.bezier(...n.motion.easing.standard),useNativeDriver:!0}).start():_.setValue(0)},[u,i,_,n]),(0,_react.useEffect)(()=>{if(!u)return;const e=_reactNative.BackHandler.addEventListener("hardwareBackPress",()=>!0);return()=>{e.remove()}},[u]);const m=o.message;(0,_react.useEffect)(()=>{u&&m&&_reactNative.AccessibilityInfo.announceForAccessibility(m)},[u,m]);const v=(0,_react.useMemo)(()=>buildStyles(),[]);return u?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{pointerEvents:"auto",testID:a,accessible:!0,accessibilityViewIsModal:!0,accessibilityLiveRegion:"polite",accessibilityLabel:m??"Loading",accessibilityRole:"progressbar",accessibilityState:{busy:!0},"aria-busy":!0,style:[v.overlay,{backgroundColor:t??n.colors.background.overlay,opacity:_}],children:e?e(m):(0,_jsxRuntime.jsx)(_index2.Spinner,{size:"lg",message:m})}):null};exports.LoaderOverlay=LoaderOverlay;const buildStyles=()=>_reactNative.StyleSheet.create({overlay:{..._reactNative.StyleSheet.absoluteFill,alignItems:"center",justifyContent:"center",zIndex:1e3}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.useLoader=exports.loader=exports.LoaderOverlay=void 0;var _react=require("react"),_reactNative=require("react-native"),_usePresenceMotion=require("../../hooks/usePresenceMotion.js"),_index=require("../../theme/index.js"),_index2=require("../Spinner/index.js"),_jsxRuntime=require("react/jsx-runtime");const DEFAULT_SHOW_DELAY_MS=150,DEFAULT_MIN_VISIBLE_MS=400;let state={refCount:0,message:void 0};const listeners=new Set,notify=()=>{for(const e of listeners)e()},subscribe=e=>(listeners.add(e),()=>{listeners.delete(e)}),getState=()=>state,show=e=>{state={refCount:state.refCount+1,message:e??state.message},notify()},hide=()=>{if(state.refCount<=0)return;const e=state.refCount-1;state={refCount:e,message:0===e?void 0:state.message},notify()},reset=()=>{0===state.refCount&&void 0===state.message||(state={refCount:0,message:void 0},notify())},isVisible=()=>state.refCount>0,wrap=async(e,t)=>{show(t);try{return await("function"==typeof e?e():e)}finally{hide()}},loader=exports.loader={show:show,hide:hide,wrap:wrap,isVisible:isVisible,reset:reset},useLoader=()=>loader;exports.useLoader=useLoader;const LoaderOverlay=({renderIndicator:e,backdropColor:t,showDelayMs:r=150,minVisibleMs:s=400,testID:a})=>{const n=(0,_index.useTheme)(),i=(0,_usePresenceMotion.usePresenceMotion)().duration("normal"),o=(0,_react.useSyncExternalStore)(subscribe,getState),[u,c]=(0,_react.useState)(!1),l=(0,_react.useRef)(null),d=(0,_react.useRef)(null),f=(0,_react.useRef)(null),_=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,y=o.refCount>0;(0,_react.useEffect)(()=>{if(y)return null!==d.current&&(clearTimeout(d.current),d.current=null),void(u||null!==l.current||(l.current=setTimeout(()=>{l.current=null,0!==getState().refCount&&(f.current=Date.now(),c(!0))},r)));if(null!==l.current&&(clearTimeout(l.current),l.current=null),u&&null===d.current){const e=null!==f.current?Date.now()-f.current:s,t=Math.max(0,s-e);d.current=setTimeout(()=>{d.current=null,f.current=null,c(!1)},t)}},[y,u,r,s]),(0,_react.useEffect)(()=>()=>{null!==l.current&&clearTimeout(l.current),null!==d.current&&clearTimeout(d.current)},[]),(0,_react.useEffect)(()=>{u?_reactNative.Animated.timing(_,{toValue:1,duration:i,easing:_reactNative.Easing.bezier(...n.motion.easing.standard),useNativeDriver:!0}).start():_.setValue(0)},[u,i,_,n]),(0,_react.useEffect)(()=>{if(!u)return;const e=_reactNative.BackHandler.addEventListener("hardwareBackPress",()=>!0);return()=>{e.remove()}},[u]);const m=o.message;(0,_react.useEffect)(()=>{u&&m&&_reactNative.AccessibilityInfo.announceForAccessibility(m)},[u,m]);const v=(0,_react.useMemo)(()=>buildStyles(),[]);return u?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{pointerEvents:"auto",testID:a,accessible:!0,accessibilityViewIsModal:!0,accessibilityLiveRegion:"polite",accessibilityLabel:m??"Loading",accessibilityRole:"progressbar",accessibilityState:{busy:!0},"aria-busy":!0,style:[v.overlay,{backgroundColor:t??n.colors.background.overlay,opacity:_}],children:e?e(m):(0,_jsxRuntime.jsx)(_index2.Spinner,{size:"lg",message:m})}):null};exports.LoaderOverlay=LoaderOverlay;const buildStyles=()=>_reactNative.StyleSheet.create({overlay:{..._reactNative.StyleSheet.absoluteFill,alignItems:"center",justifyContent:"center",zIndex:1e3}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MenuSurface=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeSafeAreaContext=require("react-native-safe-area-context"),_useReducedMotion=require("../../hooks/useReducedMotion.js"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_placement=require("../../utils/placement.js"),_responsive=require("../../utils/responsive.js"),_AppIcon=require("../AppIcon/AppIcon.js"),_slotIcon=require("../AppIcon/slotIcon.js"),_index2=require("../Divider/index.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_index3=require("../OptionSheet/index.js"),_index4=require("../Text/index.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_focusHost=require("./focusHost.js"),_menuModel=require("./menuModel.js"),_webOnly=require("./webOnly.js"),_jsxRuntime=require("react/jsx-runtime");const MENU_MIN_WIDTH=180,MENU_MAX_WIDTH=280,ROW_MIN_HEIGHT=48,TOP_ACTION_MIN_HEIGHT=64,ICON_SIZE=20,PREVIEW_LIFT=1.02,BACK_KEY="__menu-back",TOP_PREFIX="__menu-top:",WEB_CHECKABLE_ROLE=(0,_webOnly.webOnly)({role:"menuitemcheckbox"}),MenuSurface=e=>{const{open:t,anchor:s,items:i,title:n,topActions:r,placement:o,presentation:a,unavailable:l,context:c=!1,preview:u,onClose:d,restoreFocusTo:_,haptic:m,accessibilityLabel:p,closeLabel:x,backLabel:b,testID:h}=e,f=(0,_index.useTheme)(),v=(0,_react.useMemo)(()=>buildStyles(f),[f]),j=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),[y,R]=(0,_ModalSafeArea.useModalInsets)(),g=(0,_react.useMemo)(()=>({...j,top:y.top,bottom:y.bottom}),[j,y]),w=(0,_reactNative.useWindowDimensions)(),A=(0,_useReducedMotion.useReducedMotion)(),I=(0,_react.useMemo)(()=>(0,_menuModel.visibleGroups)(i,l),[i,l]),k=(0,_react.useMemo)(()=>(0,_menuModel.visibleTopActions)(r,l),[r,l]),S="sheet"===a||"auto"===a&&w.width<_responsive.Breakpoints.lg&&(0,_menuModel.wantsSheet)(I,k),[M,N]=(0,_react.useState)(null),[E,T]=(0,_react.useState)(null),C=(0,_react.useRef)(d);C.current=d;const O=(0,_react.useRef)(_);O.current=_;const L=(0,_react.useRef)(null),H=(0,_react.useRef)(!1),D=(0,_react.useRef)(!1),P=(0,_react.useRef)(new Map),q=(0,_react.useRef)(null),B=(0,_react.useCallback)(()=>{if(!H.current)return;H.current=!1;const e=L.current;L.current=null,e?e():(0,_focusHost.focusHost)(O.current?.())},[]);(0,_react.useEffect)(()=>{if(t)return D.current=!0,H.current=!1,L.current=null,(0,_placement.claimAnchoredSurface)(()=>C.current());D.current&&(D.current=!1,H.current=!0,N(null),T(null),S||"ios"===_reactNative.Platform.OS||B())},[t]);const V=(0,_react.useCallback)(e=>{if(e.disabled)return;const t=(0,_hapticUtils.resolveHaptic)(m,"selection");t&&(0,_hapticUtils.triggerHaptic)(t),e.key!==BACK_KEY?e.submenu?N(e):(L.current=e.onPress??null,C.current()):N(null)},[m]),F=(0,_react.useMemo)(()=>({width:w.width,height:w.height,insets:g}),[w.width,w.height,g]),K=(0,_react.useMemo)(()=>{if(!s||!E)return null;const e=s.x+s.width/2>F.width/2?"end":"start";return(0,_placement.computePlacement)(s,E,F,o,{align:e})},[s,E,F,o]);let W=F.height-g.top-g.bottom-2*_placement.PLACEMENT_MARGIN;if(s&&K){const e=(0,_placement.placementRoom)(s,F);W="top"===K.placement?e.above:e.below}const z=Math.min(280,F.width-g.left-g.right-2*_placement.PLACEMENT_MARGIN),$=t&&null!==K,G=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,U=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current;(0,_react.useEffect)(()=>{if(!$)return(0,_index.setNativeValue)(G,0),void(0,_index.setNativeValue)(U,1);const e=[_reactNative.Animated.timing(G,{toValue:1,duration:f.motion.duration.fast,easing:_reactNative.Easing.bezier(...f.motion.easing.decelerate),useNativeDriver:!0})];c&&!A&&e.push(_reactNative.Animated.spring(U,{toValue:1.02,damping:f.motion.spring.snappy.damping,stiffness:f.motion.spring.snappy.stiffness,mass:f.motion.spring.snappy.mass,useNativeDriver:!0}));const t=_reactNative.Animated.parallel(e);return t.start(),()=>t.stop()},[$,c,A,G,U,f.motion]);const Y=(0,_react.useCallback)(e=>{const{width:t,height:s}=e.nativeEvent.layout;T(e=>e&&e.width===t&&e.height===s?e:{width:t,height:s})},[]),X=c&&"top"===K?.placement,Z=M?.submenu?[M.submenu]:I,J=X?[...Z].reverse().map(e=>[...e].reverse()):Z,Q=[];if(M)Q.push({key:BACK_KEY,label:M.label});else for(const e of k)Q.push({key:`${TOP_PREFIX}${e.key}`,label:e.label,item:e});for(const e of J)for(const t of e)Q.push({key:t.key,label:t.label,item:t});const ee=Q[0]?.key;(0,_react.useEffect)(()=>{if(!$||S||!ee)return;const e=setTimeout(()=>(0,_focusHost.focusHost)(P.current.get(ee)),_focusHost.FOCUS_DELAY_MS);return()=>clearTimeout(e)},[$,S,ee]);const setItemRef=e=>t=>{t?P.current.set(e,t):P.current.delete(e)},te=(0,_webOnly.webOnly)({onKeyDown:e=>{const t=e.key??e.nativeEvent?.key??"",s=Q.length,i=Q.findIndex(e=>e.key===q.current);let n=-1;if("ArrowDown"===t)n=(i+1)%s;else if("ArrowUp"===t)n=i<=0?s-1:i-1;else if("Home"===t)n=0;else if("End"===t)n=s-1;else{if("ArrowLeft"===t&&M)return e.preventDefault?.(),void N(null);if("ArrowRight"===t&&Q[i]?.item?.submenu)return e.preventDefault?.(),void V(Q[i].item);if(1===t.length&&""!==t.trim()){const e=t.toLowerCase();for(let t=1;t<=s;t+=1){const r=(i+t)%s;if(Q[r].label.toLowerCase().startsWith(e)){n=r;break}}}}n>=0&&(e.preventDefault?.(),(e=>{const t=Q[e];t&&(0,_focusHost.focusHost)(P.current.get(t.key))})(n))}});if(S){const e=M?.submenu?[{key:BACK_KEY,label:b,icon:"chevron-left"},...M.submenu]:[...k,...I.flat()],s=new Set(e.filter(e=>e.checked).map(e=>e.key));return(0,_jsxRuntime.jsx)(_index3.OptionSheet,{open:t,onClose:d,onAfterClose:B,title:M?.label??n,options:e,labelOf:e=>e.label,getValue:e=>e.key,disabledOf:e=>Boolean(e.disabled),destructiveOf:e=>Boolean(e.destructive),descriptionOf:e=>e.description,iconOf:e=>{const t=e;return(0,_slotIcon.renderSlotIcon)(t.icon,{color:t.destructive?f.colors.toneText.error:f.colors.text.secondary,size:20,disabled:Boolean(t.disabled)})},isSelected:e=>s.has(String(e)),onSelect:e=>V(e),accessibilityLabel:p??n,testID:h?`${h}-sheet`:void 0})}const inkFor=e=>e.disabled?f.colors.text.disabled:e.destructive?f.colors.toneText.error:f.colors.text.primary,se=M?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{ref:setItemRef(BACK_KEY),onPress:()=>N(null),onFocus:()=>{q.current=BACK_KEY},accessibilityRole:"menuitem",accessibilityLabel:`${b}, ${M.label}`,android_ripple:{color:f.colors.surface.pressed,borderless:!1},style:({pressed:e})=>[v.row,e?v.pressed:null],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.icon,children:(0,_jsxRuntime.jsx)(_AppIcon.AppIcon,{name:"chevron-left",size:20,color:f.colors.text.secondary})}),(0,_jsxRuntime.jsx)(_index4.Text,{variant:"body",weight:"semibold",numberOfLines:1,style:v.labels,children:M.label})]}),(0,_jsxRuntime.jsx)(_index2.Divider,{spacing:"none"})]}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[n?(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:"secondary",accessibilityRole:"header",numberOfLines:2,style:v.title,children:n}):null,k.length>0?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.topRow,children:k.map(e=>{const t=`${TOP_PREFIX}${e.key}`,s=Boolean(e.disabled),i=inkFor(e);return(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{ref:setItemRef(t),onPress:()=>V(e),onFocus:()=>{q.current=t},disabled:s,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityState:{disabled:s},"aria-disabled":s,testID:e.testID,style:({pressed:e})=>[v.topAction,e?v.pressed:null],children:[(0,_slotIcon.renderSlotIcon)(e.icon,{color:i,size:20,disabled:s}),(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:i,numberOfLines:1,children:e.label})]},t)})}),(0,_jsxRuntime.jsx)(_index2.Divider,{spacing:"none"})]}):null]});return(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:t,transparent:!0,statusBarTranslucent:!0,presentationStyle:"overFullScreen",animationType:"none",onRequestClose:d,onDismiss:B,children:(0,_jsxRuntime.jsxs)(_ModalSafeArea.ModalSafeArea,{onInsets:R,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:[_reactNative.StyleSheet.absoluteFill,c?v.scrim:null],onPress:d,accessibilityRole:"button",accessibilityLabel:x,testID:h?`${h}-scrim`:void 0}),c&&u&&s?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{pointerEvents:"none",accessibilityElementsHidden:!0,importantForAccessibility:"no-hide-descendants",style:[v.preview,{left:s.x,top:s.y,width:s.width,height:s.height,transform:[{scale:U}]}],children:u}):null,(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{accessibilityRole:"menu",accessibilityLabel:M?.label??p??n,onLayout:Y,testID:h?`${h}-menu`:void 0,...te,style:[v.anchored,{left:K?.x??0,top:K?.y??0,maxWidth:z,opacity:$?G:0}],children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.surface,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[v.clip,{maxHeight:W}],children:[se,(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{style:v.scroll,bounces:!1,keyboardShouldPersistTaps:"handled",children:J.map((e,t)=>{const s=e.some(e=>null!=e.icon);return(0,_jsxRuntime.jsxs)(_reactNative.View,{children:[t>0?(0,_jsxRuntime.jsx)(_index2.Divider,{spacing:"none"}):null,e.map(e=>((e,t)=>{const s=Boolean(e.disabled),i=inkFor(e);return(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{ref:setItemRef(e.key),onPress:()=>V(e),onFocus:()=>{q.current=e.key},disabled:s,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityState:{disabled:s,checked:e.checked},"aria-disabled":s,"aria-checked":e.checked,...void 0!==e.checked?WEB_CHECKABLE_ROLE:null,android_ripple:{color:f.colors.surface.pressed,borderless:!1},testID:e.testID,style:({pressed:e})=>[v.row,e?v.pressed:null],children:[t?(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.icon,children:(0,_slotIcon.renderSlotIcon)(e.icon,{color:i,size:20,disabled:s})}):null,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:v.labels,children:[(0,_jsxRuntime.jsx)(_index4.Text,{variant:"body",color:i,numberOfLines:2,children:e.label}),e.description?(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:"secondary",numberOfLines:2,children:e.description}):null]}),e.detail?(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:"tertiary",children:e.detail}):null,e.checked?(0,_jsxRuntime.jsx)(_AppIcon.AppIcon,{name:"check",size:20,color:f.colors.primary}):null,e.submenu?(0,_jsxRuntime.jsx)(_AppIcon.AppIcon,{name:"chevron-right",size:20,color:f.colors.text.tertiary}):null]},e.key)})(e,s))]},e[0].key)})})]})})}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})};exports.MenuSurface=MenuSurface;const buildStyles=e=>_reactNative.StyleSheet.create({scrim:{backgroundColor:e.colors.background.overlay},preview:{position:"absolute"},anchored:{position:"absolute",minWidth:180},surface:{backgroundColor:e.colors.background.elevated,borderRadius:e.radius.md,..._corners.smoothCorners,...e.shadows.lg},clip:{borderRadius:e.radius.md,..._corners.smoothCorners,overflow:"hidden"},scroll:{flexGrow:0,flexShrink:1},title:{paddingHorizontal:e.spacing.md,paddingTop:e.spacing.sm,paddingBottom:e.spacing.xs},row:{flexDirection:"row",alignItems:"center",gap:e.spacing.md,minHeight:48,paddingHorizontal:e.spacing.md,paddingVertical:e.spacing.sm},pressed:{backgroundColor:e.colors.surface.pressed},icon:{width:20,alignItems:"center"},labels:{flexGrow:1,flexShrink:1},topRow:{flexDirection:"row",padding:e.spacing.xs,gap:e.spacing.xs},topAction:{flexGrow:1,flexBasis:0,alignItems:"center",justifyContent:"center",gap:e.spacing.xs,minHeight:64,borderRadius:e.radius.sm,..._corners.smoothCorners}});
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MenuSurface=void 0;var _react=require("react"),_reactNative=require("react-native"),_reactNativeSafeAreaContext=require("react-native-safe-area-context"),_usePresenceMotion=require("../../hooks/usePresenceMotion.js"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_placement=require("../../utils/placement.js"),_responsive=require("../../utils/responsive.js"),_AppIcon=require("../AppIcon/AppIcon.js"),_slotIcon=require("../AppIcon/slotIcon.js"),_index2=require("../Divider/index.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_index3=require("../OptionSheet/index.js"),_index4=require("../Text/index.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_focusHost=require("./focusHost.js"),_menuModel=require("./menuModel.js"),_webOnly=require("./webOnly.js"),_jsxRuntime=require("react/jsx-runtime");const MENU_MIN_WIDTH=180,MENU_MAX_WIDTH=280,ROW_MIN_HEIGHT=48,TOP_ACTION_MIN_HEIGHT=64,ICON_SIZE=20,PREVIEW_LIFT=1.02,BACK_KEY="__menu-back",TOP_PREFIX="__menu-top:",WEB_CHECKABLE_ROLE=(0,_webOnly.webOnly)({role:"menuitemcheckbox"}),MenuSurface=e=>{const{open:t,anchor:s,items:i,title:n,topActions:r,placement:o,presentation:a,unavailable:l,context:c=!1,preview:u,onClose:d,restoreFocusTo:_,haptic:m,accessibilityLabel:p,closeLabel:x,backLabel:b,testID:h}=e,f=(0,_index.useTheme)(),v=(0,_react.useMemo)(()=>buildStyles(f),[f]),j=(0,_reactNativeSafeAreaContext.useSafeAreaInsets)(),[y,g]=(0,_ModalSafeArea.useModalInsets)(),R=(0,_react.useMemo)(()=>({...j,top:y.top,bottom:y.bottom}),[j,y]),w=(0,_reactNative.useWindowDimensions)(),A=(0,_usePresenceMotion.usePresenceMotion)(),I=A.duration("fast"),k=(0,_react.useMemo)(()=>(0,_menuModel.visibleGroups)(i,l),[i,l]),S=(0,_react.useMemo)(()=>(0,_menuModel.visibleTopActions)(r,l),[r,l]),M="sheet"===a||"auto"===a&&w.width<_responsive.Breakpoints.lg&&(0,_menuModel.wantsSheet)(k,S),[N,E]=(0,_react.useState)(null),[T,C]=(0,_react.useState)(null),O=(0,_react.useRef)(d);O.current=d;const P=(0,_react.useRef)(_);P.current=_;const L=(0,_react.useRef)(null),H=(0,_react.useRef)(!1),D=(0,_react.useRef)(!1),q=(0,_react.useRef)(new Map),B=(0,_react.useRef)(null),V=(0,_react.useCallback)(()=>{if(!H.current)return;H.current=!1;const e=L.current;L.current=null,e?e():(0,_focusHost.focusHost)(P.current?.())},[]);(0,_react.useEffect)(()=>{if(t)return D.current=!0,H.current=!1,L.current=null,(0,_placement.claimAnchoredSurface)(()=>O.current());D.current&&(D.current=!1,H.current=!0,E(null),C(null),M||"ios"===_reactNative.Platform.OS||V())},[t]);const F=(0,_react.useCallback)(e=>{if(e.disabled)return;const t=(0,_hapticUtils.resolveHaptic)(m,"selection");t&&(0,_hapticUtils.triggerHaptic)(t),e.key!==BACK_KEY?e.submenu?E(e):(L.current=e.onPress??null,O.current()):E(null)},[m]),K=(0,_react.useMemo)(()=>({width:w.width,height:w.height,insets:R}),[w.width,w.height,R]),W=(0,_react.useMemo)(()=>{if(!s||!T)return null;const e=s.x+s.width/2>K.width/2?"end":"start";return(0,_placement.computePlacement)(s,T,K,o,{align:e})},[s,T,K,o]);let z=K.height-R.top-R.bottom-2*_placement.PLACEMENT_MARGIN;if(s&&W){const e=(0,_placement.placementRoom)(s,K);z="top"===W.placement?e.above:e.below}const $=Math.min(280,K.width-R.left-R.right-2*_placement.PLACEMENT_MARGIN),G=t&&null!==W,U=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,Y=(0,_react.useRef)((0,_index.createAnimatedValue)(1)).current;(0,_react.useEffect)(()=>{if(!G)return(0,_index.setNativeValue)(U,0),void(0,_index.setNativeValue)(Y,1);const e=[_reactNative.Animated.timing(U,{toValue:1,duration:I,easing:_reactNative.Easing.bezier(...f.motion.easing.decelerate),useNativeDriver:!0})];c&&!A.reduced&&e.push(_reactNative.Animated.spring(Y,{toValue:1.02,damping:f.motion.spring.snappy.damping,stiffness:f.motion.spring.snappy.stiffness,mass:f.motion.spring.snappy.mass,useNativeDriver:!0}));const t=_reactNative.Animated.parallel(e);return t.start(),()=>t.stop()},[G,c,A.reduced,U,Y,f.motion,I]);const X=(0,_react.useCallback)(e=>{const{width:t,height:s}=e.nativeEvent.layout;C(e=>e&&e.width===t&&e.height===s?e:{width:t,height:s})},[]),Z=c&&"top"===W?.placement,J=N?.submenu?[N.submenu]:k,Q=Z?[...J].reverse().map(e=>[...e].reverse()):J,ee=[];if(N)ee.push({key:BACK_KEY,label:N.label});else for(const e of S)ee.push({key:`${TOP_PREFIX}${e.key}`,label:e.label,item:e});for(const e of Q)for(const t of e)ee.push({key:t.key,label:t.label,item:t});const te=ee[0]?.key;(0,_react.useEffect)(()=>{if(!G||M||!te)return;const e=setTimeout(()=>(0,_focusHost.focusHost)(q.current.get(te)),_focusHost.FOCUS_DELAY_MS);return()=>clearTimeout(e)},[G,M,te]);const setItemRef=e=>t=>{t?q.current.set(e,t):q.current.delete(e)},se=(0,_webOnly.webOnly)({onKeyDown:e=>{const t=e.key??e.nativeEvent?.key??"",s=ee.length,i=ee.findIndex(e=>e.key===B.current);let n=-1;if("ArrowDown"===t)n=(i+1)%s;else if("ArrowUp"===t)n=i<=0?s-1:i-1;else if("Home"===t)n=0;else if("End"===t)n=s-1;else{if("ArrowLeft"===t&&N)return e.preventDefault?.(),void E(null);if("ArrowRight"===t&&ee[i]?.item?.submenu)return e.preventDefault?.(),void F(ee[i].item);if(1===t.length&&""!==t.trim()){const e=t.toLowerCase();for(let t=1;t<=s;t+=1){const r=(i+t)%s;if(ee[r].label.toLowerCase().startsWith(e)){n=r;break}}}}n>=0&&(e.preventDefault?.(),(e=>{const t=ee[e];t&&(0,_focusHost.focusHost)(q.current.get(t.key))})(n))}});if(M){const e=N?.submenu?[{key:BACK_KEY,label:b,icon:"chevron-left"},...N.submenu]:[...S,...k.flat()],s=new Set(e.filter(e=>e.checked).map(e=>e.key));return(0,_jsxRuntime.jsx)(_index3.OptionSheet,{open:t,onClose:d,onAfterClose:V,title:N?.label??n,options:e,labelOf:e=>e.label,getValue:e=>e.key,disabledOf:e=>Boolean(e.disabled),destructiveOf:e=>Boolean(e.destructive),descriptionOf:e=>e.description,iconOf:e=>{const t=e;return(0,_slotIcon.renderSlotIcon)(t.icon,{color:t.destructive?f.colors.toneText.error:f.colors.text.secondary,size:20,disabled:Boolean(t.disabled)})},isSelected:e=>s.has(String(e)),onSelect:e=>F(e),accessibilityLabel:p??n,testID:h?`${h}-sheet`:void 0})}const inkFor=e=>e.disabled?f.colors.text.disabled:e.destructive?f.colors.toneText.error:f.colors.text.primary,ie=N?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{ref:setItemRef(BACK_KEY),onPress:()=>E(null),onFocus:()=>{B.current=BACK_KEY},accessibilityRole:"menuitem",accessibilityLabel:`${b}, ${N.label}`,android_ripple:{color:f.colors.surface.pressed,borderless:!1},style:({pressed:e})=>[v.row,e?v.pressed:null],children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.icon,children:(0,_jsxRuntime.jsx)(_AppIcon.AppIcon,{name:"chevron-left",size:20,color:f.colors.text.secondary})}),(0,_jsxRuntime.jsx)(_index4.Text,{variant:"body",weight:"semibold",numberOfLines:1,style:v.labels,children:N.label})]}),(0,_jsxRuntime.jsx)(_index2.Divider,{spacing:"none"})]}):(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[n?(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:"secondary",accessibilityRole:"header",numberOfLines:2,style:v.title,children:n}):null,S.length>0?(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.topRow,children:S.map(e=>{const t=`${TOP_PREFIX}${e.key}`,s=Boolean(e.disabled),i=inkFor(e);return(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{ref:setItemRef(t),onPress:()=>F(e),onFocus:()=>{B.current=t},disabled:s,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityState:{disabled:s},"aria-disabled":s,testID:e.testID,style:({pressed:e})=>[v.topAction,e?v.pressed:null],children:[(0,_slotIcon.renderSlotIcon)(e.icon,{color:i,size:20,disabled:s}),(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:i,numberOfLines:1,children:e.label})]},t)})}),(0,_jsxRuntime.jsx)(_index2.Divider,{spacing:"none"})]}):null]});return(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:t,transparent:!0,statusBarTranslucent:!0,presentationStyle:"overFullScreen",animationType:"none",onRequestClose:d,onDismiss:V,children:(0,_jsxRuntime.jsxs)(_ModalSafeArea.ModalSafeArea,{onInsets:g,children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:[_reactNative.StyleSheet.absoluteFill,c?v.scrim:null],onPress:d,accessibilityRole:"button",accessibilityLabel:x,testID:h?`${h}-scrim`:void 0}),c&&u&&s?(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{pointerEvents:"none",accessibilityElementsHidden:!0,importantForAccessibility:"no-hide-descendants",style:[v.preview,{left:s.x,top:s.y,width:s.width,height:s.height,transform:[{scale:Y}]}],children:u}):null,(0,_jsxRuntime.jsx)(_reactNative.Animated.View,{accessibilityRole:"menu",accessibilityLabel:N?.label??p??n,onLayout:X,testID:h?`${h}-menu`:void 0,...se,style:[v.anchored,{left:W?.x??0,top:W?.y??0,maxWidth:$,opacity:G?U:0}],children:(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.surface,children:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[v.clip,{maxHeight:z}],children:[ie,(0,_jsxRuntime.jsx)(_reactNative.ScrollView,{style:v.scroll,bounces:!1,keyboardShouldPersistTaps:"handled",children:Q.map((e,t)=>{const s=e.some(e=>null!=e.icon);return(0,_jsxRuntime.jsxs)(_reactNative.View,{children:[t>0?(0,_jsxRuntime.jsx)(_index2.Divider,{spacing:"none"}):null,e.map(e=>((e,t)=>{const s=Boolean(e.disabled),i=inkFor(e);return(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{ref:setItemRef(e.key),onPress:()=>F(e),onFocus:()=>{B.current=e.key},disabled:s,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityState:{disabled:s,checked:e.checked},"aria-disabled":s,"aria-checked":e.checked,...void 0!==e.checked?WEB_CHECKABLE_ROLE:null,android_ripple:{color:f.colors.surface.pressed,borderless:!1},testID:e.testID,style:({pressed:e})=>[v.row,e?v.pressed:null],children:[t?(0,_jsxRuntime.jsx)(_reactNative.View,{style:v.icon,children:(0,_slotIcon.renderSlotIcon)(e.icon,{color:i,size:20,disabled:s})}):null,(0,_jsxRuntime.jsxs)(_reactNative.View,{style:v.labels,children:[(0,_jsxRuntime.jsx)(_index4.Text,{variant:"body",color:i,numberOfLines:2,children:e.label}),e.description?(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:"secondary",numberOfLines:2,children:e.description}):null]}),e.detail?(0,_jsxRuntime.jsx)(_index4.Text,{variant:"caption",color:"tertiary",children:e.detail}):null,e.checked?(0,_jsxRuntime.jsx)(_AppIcon.AppIcon,{name:"check",size:20,color:f.colors.primary}):null,e.submenu?(0,_jsxRuntime.jsx)(_AppIcon.AppIcon,{name:"chevron-right",size:20,color:f.colors.text.tertiary}):null]},e.key)})(e,s))]},e[0].key)})})]})})}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})};exports.MenuSurface=MenuSurface;const buildStyles=e=>_reactNative.StyleSheet.create({scrim:{backgroundColor:e.colors.background.overlay},preview:{position:"absolute"},anchored:{position:"absolute",minWidth:180},surface:{backgroundColor:e.colors.background.elevated,borderRadius:e.radius.md,..._corners.smoothCorners,...e.shadows.lg},clip:{borderRadius:e.radius.md,..._corners.smoothCorners,overflow:"hidden"},scroll:{flexGrow:0,flexShrink:1},title:{paddingHorizontal:e.spacing.md,paddingTop:e.spacing.sm,paddingBottom:e.spacing.xs},row:{flexDirection:"row",alignItems:"center",gap:e.spacing.md,minHeight:48,paddingHorizontal:e.spacing.md,paddingVertical:e.spacing.sm},pressed:{backgroundColor:e.colors.surface.pressed},icon:{width:20,alignItems:"center"},labels:{flexGrow:1,flexShrink:1},topRow:{flexDirection:"row",padding:e.spacing.xs,gap:e.spacing.xs},topAction:{flexGrow:1,flexBasis:0,alignItems:"center",justifyContent:"center",gap:e.spacing.xs,minHeight:64,borderRadius:e.radius.sm,..._corners.smoothCorners}});
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.MessageBubble=exports.DEFAULT_MESSAGE_BUBBLE_LABELS=void 0;var _mobileCore=require("@webority/mobile-core"),_react=require("react"),_reactNative=require("react-native"),_index=require("../../theme/index.js"),_announce=require("../../utils/announce.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_index2=require("../AppIcon/index.js"),_index3=require("../Button/index.js"),_index4=require("../Markdown/index.js"),_index5=require("../Text/index.js"),_jsxRuntime=require("react/jsx-runtime");const DEFAULT_MESSAGE_BUBBLE_LABELS=exports.DEFAULT_MESSAGE_BUBBLE_LABELS=Object.freeze({you:"You",sending:"Sending",sent:"Sent",delivered:"Delivered",read:"Read",failed:"Not sent",retry:"Try again",replyTo:e=>e?`Reply to ${e}`:"Reply"}),RUN_GAP=2,MAX_WIDTH="85%",STATUS_ICON=14,statusIcon=e=>{switch(e){case"sending":return"clock";case"sent":return"check";case"failed":return"alert-circle";default:return"check-check"}},statusColour=(e,t)=>{switch(t){case"read":return e.colors.toneText.info;case"failed":return e.colors.toneText.error;default:return e.colors.text.tertiary}},MessageBubble=({side:e,text:t,children:s,markdown:r=!1,groupPosition:i="single",author:n,time:a,status:o,replyTo:l,streaming:c=!1,error:u,onRetry:d,actions:x,onLongPress:_,footer:b,labels:m,haptic:p,style:g,testID:y})=>{const h=(0,_index.useTheme)(),f=(0,_react.useMemo)(()=>buildStyles(h),[h]),j=m?{...DEFAULT_MESSAGE_BUBBLE_LABELS,...m}:DEFAULT_MESSAGE_BUBBLE_LABELS,L="mine"===e,B="single"===i||"first"===i,T="single"===i||"last"===i,R=null==a?"":(0,_mobileCore.formatTime)(a),E=("failed"===o||Boolean(u))&&Boolean(d),v=L?j.you:n??"",S=(0,_react.useMemo)(()=>{const e=x?[...x]:[];return l?.onPress&&e.push({name:"openReply",label:j.replyTo(l.author),onPress:l.onPress}),E&&d&&e.push({name:"retry",label:j.retry,onPress:d}),e},[x,l,E,d,j]),A=!s||(x?.length??0)>0,M=o&&L?j[o]:"",P=[v,R,t,l?`${j.replyTo(l.author)}: ${l.text}`:"",M].filter(Boolean).join(", "),I=(0,_react.useRef)(c);(0,_react.useEffect)(()=>{I.current&&!c&&!u&&t&&(0,_announce.announce)(v?`${v}, ${t}`:t),I.current=c},[c,u,t,v]);const U=(0,_react.useRef)(u);(0,_react.useEffect)(()=>{u&&u!==U.current&&(0,_announce.announce)(u,{polite:!1}),U.current=u},[u]);const k=(0,_react.useCallback)(()=>{const e=(0,_hapticUtils.resolveHaptic)(p,"longPress");e&&(0,_hapticUtils.triggerHaptic)(e),_?.()},[p,_]),q=(0,_react.useCallback)(e=>{S.find(t=>t.name===e.nativeEvent.actionName)?.onPress()},[S]),D=h.radius.xl,w=h.radius.xs,C=L?{borderTopRightRadius:B?D:w,borderBottomRightRadius:T?D:w}:{borderTopLeftRadius:B?D:w,borderBottomLeftRadius:T?D:w},$=s??(r?(0,_jsxRuntime.jsx)(_index4.Markdown,{children:t}):(0,_jsxRuntime.jsx)(_index5.Text,{variant:"body",children:t})),N=l?(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{onPress:l.onPress,disabled:!l.onPress,accessibilityRole:l.onPress?"button":void 0,accessibilityLabel:`${j.replyTo(l.author)}: ${l.text}`,style:f.quote,children:[l.author?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"caption",weight:"semibold",color:"link",numberOfLines:1,children:l.author}):null,(0,_jsxRuntime.jsx)(_index5.Text,{variant:"bodySmall",color:"secondary",numberOfLines:2,children:l.text})]}):null,H=[f.bubble,L?f.mine:f.theirs,C],F=A?{accessible:!0,accessibilityLabel:P,accessibilityState:{busy:c},"aria-busy":c,accessibilityActions:S.map(({name:e,label:t})=>({name:e,label:t})),onAccessibilityAction:q}:{accessible:!1},z=(x?.length??0)>0?(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{onLongPress:k,delayLongPress:350,style:H,testID:y?`${y}-bubble`:void 0,...F,children:[N,$]}):(0,_jsxRuntime.jsxs)(_reactNative.View,{style:H,testID:y?`${y}-bubble`:void 0,...F,children:[N,$]}),G=T&&(""!==R||L&&o);return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[f.root,L?f.rootMine:f.rootTheirs,{marginTop:B?h.spacing.sm:2},g],testID:y,children:[!L&&B&&n?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"caption",color:"secondary",style:f.author,numberOfLines:1,importantForAccessibility:A?"no-hide-descendants":"auto",accessibilityElementsHidden:A,children:n}):null,z,G?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[f.meta,L?f.metaMine:null],importantForAccessibility:A?"no-hide-descendants":"auto",accessibilityElementsHidden:A,children:[R?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"caption",color:"tertiary",children:R}):null,L&&o?(0,_jsxRuntime.jsx)(_index2.AppIcon,{name:statusIcon(o),size:14,color:statusColour(h,o),accessibilityLabel:j[o],testID:y?`${y}-status-${o}`:void 0}):null]}):null,u?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"bodySmall",color:"error",style:L?f.endText:null,children:u}):null,E?(0,_jsxRuntime.jsx)(_index3.Button,{title:j.retry,variant:"link",size:"sm",leftIcon:"refresh-cw",onPress:d,testID:y?`${y}-retry`:void 0}):null,b]})};exports.MessageBubble=MessageBubble;const buildStyles=e=>_reactNative.StyleSheet.create({root:{maxWidth:"85%",gap:e.spacing.xs},rootMine:{alignSelf:"flex-end",alignItems:"flex-end"},rootTheirs:{alignSelf:"flex-start",alignItems:"flex-start"},author:{paddingHorizontal:e.spacing.md},bubble:{borderRadius:e.radius.xl,..._corners.smoothCorners,paddingHorizontal:e.spacing.md,paddingVertical:e.spacing.sm,gap:e.spacing.xs},mine:{backgroundColor:e.colors.primaryMuted},theirs:{backgroundColor:e.colors.background.secondary},quote:{borderLeftWidth:3,borderLeftColor:e.colors.primary,paddingLeft:e.spacing.sm,paddingVertical:e.spacing.xs},meta:{flexDirection:"row",alignItems:"center",gap:e.spacing.xs,paddingHorizontal:e.spacing.xs},metaMine:{justifyContent:"flex-end"},endText:{textAlign:"right"}});var _default=exports.default=MessageBubble;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.MessageBubble=exports.DEFAULT_MESSAGE_BUBBLE_LABELS=void 0;var _mobileCore=require("@webority/mobile-core"),_react=require("react"),_reactNative=require("react-native"),_index=require("../../theme/index.js"),_announce=require("../../utils/announce.js"),_corners=require("../../utils/corners.js"),_index2=require("../AppIcon/index.js"),_index3=require("../Button/index.js"),_index4=require("../Markdown/index.js"),_useContextMenu=require("../Menu/useContextMenu.js"),_index5=require("../Text/index.js"),_jsxRuntime=require("react/jsx-runtime");const DEFAULT_MESSAGE_BUBBLE_LABELS=exports.DEFAULT_MESSAGE_BUBBLE_LABELS=Object.freeze({you:"You",sending:"Sending",sent:"Sent",delivered:"Delivered",read:"Read",failed:"Not sent",retry:"Try again",copy:"Copy",replyTo:e=>e?`Reply to ${e}`:"Reply"}),RUN_GAP=2,MAX_WIDTH="85%",STATUS_ICON=14,statusIcon=e=>{switch(e){case"sending":return"clock";case"sent":return"check";case"failed":return"alert-circle";default:return"check-check"}},statusColour=(e,t)=>{switch(t){case"read":return e.colors.toneText.info;case"failed":return e.colors.toneText.error;default:return e.colors.text.tertiary}},MessageBubble=({side:e,text:t,children:s,markdown:r=!1,groupPosition:n="single",author:i,time:o,status:a,replyTo:l,streaming:c=!1,error:u,onRetry:d,actions:x,onCopy:b,onLongPress:_,footer:m,labels:p,haptic:y,style:h,testID:g})=>{const f=(0,_index.useTheme)(),j=(0,_react.useMemo)(()=>buildStyles(f),[f]),L=p?{...DEFAULT_MESSAGE_BUBBLE_LABELS,...p}:DEFAULT_MESSAGE_BUBBLE_LABELS,B="mine"===e,R="single"===n||"first"===n,T="single"===n||"last"===n,E=null==o?"":(0,_mobileCore.formatTime)(o),v=("failed"===a||Boolean(u))&&Boolean(d),S=B?L.you:i??"",M=(0,_react.useMemo)(()=>{const e=[];return b&&!x?.some(e=>"copy"===e.name)&&e.push({name:"copy",label:L.copy,onPress:()=>b(t)}),x&&e.push(...x),l?.onPress&&e.push({name:"openReply",label:L.replyTo(l.author),onPress:l.onPress}),v&&d&&e.push({name:"retry",label:L.retry,onPress:d}),e},[x,b,t,l,v,d,L]),A=(x?.length??0)>0||Boolean(b),P=(0,_react.useMemo)(()=>A?{items:M.map(({name:e,label:t,onPress:s})=>({key:e,label:t,onPress:s}))}:void 0,[A,M]),C=(0,_useContextMenu.useContextMenu)(P,{haptic:y,testID:g}),I=C.hostProps.onLongPress,k=!s||(x?.length??0)>0,D=a&&B?L[a]:"",q=[S,E,t,l?`${L.replyTo(l.author)}: ${l.text}`:"",D].filter(Boolean).join(", "),w=(0,_react.useRef)(c);(0,_react.useEffect)(()=>{w.current&&!c&&!u&&t&&(0,_announce.announce)(S?`${S}, ${t}`:t),w.current=c},[c,u,t,S]);const U=(0,_react.useRef)(u);(0,_react.useEffect)(()=>{u&&u!==U.current&&(0,_announce.announce)(u,{polite:!1}),U.current=u},[u]);const $=(0,_react.useCallback)(e=>{I?.(e),_?.()},[I,_]),N=(0,_react.useCallback)(e=>{M.find(t=>t.name===e.nativeEvent.actionName)?.onPress()},[M]),F=f.radius.xl,z=f.radius.xs,G=B?{borderTopRightRadius:R?F:z,borderBottomRightRadius:T?F:z}:{borderTopLeftRadius:R?F:z,borderBottomLeftRadius:T?F:z},H=s??(r?(0,_jsxRuntime.jsx)(_index4.Markdown,{children:t}):(0,_jsxRuntime.jsx)(_index5.Text,{variant:"body",children:t})),O=l?(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{onPress:l.onPress,disabled:!l.onPress,accessibilityRole:l.onPress?"button":void 0,accessibilityLabel:`${L.replyTo(l.author)}: ${l.text}`,style:j.quote,children:[l.author?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"caption",weight:"semibold",color:"link",numberOfLines:1,children:l.author}):null,(0,_jsxRuntime.jsx)(_index5.Text,{variant:"bodySmall",color:"secondary",numberOfLines:2,children:l.text})]}):null,V=[j.bubble,B?j.mine:j.theirs,G],W=k?{accessible:!0,accessibilityLabel:q,accessibilityState:{busy:c},"aria-busy":c,accessibilityActions:M.map(({name:e,label:t})=>({name:e,label:t})),onAccessibilityAction:N}:{accessible:!1},X=A?(0,_jsxRuntime.jsxs)(_reactNative.Pressable,{ref:C.hostRef,...C.hostProps,onLongPress:$,delayLongPress:350,style:V,testID:g?`${g}-bubble`:void 0,...W,children:[O,H]}):(0,_jsxRuntime.jsxs)(_reactNative.View,{style:V,testID:g?`${g}-bubble`:void 0,...W,children:[O,H]}),Y=T&&(""!==E||B&&a);return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[j.root,B?j.rootMine:j.rootTheirs,{marginTop:R?f.spacing.sm:2},h],testID:g,children:[!B&&R&&i?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"caption",color:"secondary",style:j.author,numberOfLines:1,importantForAccessibility:k?"no-hide-descendants":"auto",accessibilityElementsHidden:k,children:i}):null,X,C.renderSurface(),Y?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:[j.meta,B?j.metaMine:null],importantForAccessibility:k?"no-hide-descendants":"auto",accessibilityElementsHidden:k,children:[E?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"caption",color:"tertiary",children:E}):null,B&&a?(0,_jsxRuntime.jsx)(_index2.AppIcon,{name:statusIcon(a),size:14,color:statusColour(f,a),accessibilityLabel:L[a],testID:g?`${g}-status-${a}`:void 0}):null]}):null,u?(0,_jsxRuntime.jsx)(_index5.Text,{variant:"bodySmall",color:"error",style:B?j.endText:null,children:u}):null,v?(0,_jsxRuntime.jsx)(_index3.Button,{title:L.retry,variant:"link",size:"sm",leftIcon:"refresh-cw",onPress:d,testID:g?`${g}-retry`:void 0}):null,m]})};exports.MessageBubble=MessageBubble;const buildStyles=e=>_reactNative.StyleSheet.create({root:{maxWidth:"85%",gap:e.spacing.xs},rootMine:{alignSelf:"flex-end",alignItems:"flex-end"},rootTheirs:{alignSelf:"flex-start",alignItems:"flex-start"},author:{paddingHorizontal:e.spacing.md},bubble:{borderRadius:e.radius.xl,..._corners.smoothCorners,paddingHorizontal:e.spacing.md,paddingVertical:e.spacing.sm,gap:e.spacing.xs},mine:{backgroundColor:e.colors.primaryMuted},theirs:{backgroundColor:e.colors.background.secondary},quote:{borderLeftWidth:3,borderLeftColor:e.colors.primary,paddingLeft:e.spacing.sm,paddingVertical:e.spacing.xs},meta:{flexDirection:"row",alignItems:"center",gap:e.spacing.xs,paddingHorizontal:e.spacing.xs},metaMine:{justifyContent:"flex-end"},endText:{textAlign:"right"}});var _default=exports.default=MessageBubble;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.Modal=exports.MODAL_DISMISS_GRACE_MS=void 0;var _react=require("react"),_reactNative=require("react-native"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_squircle=require("../../utils/squircle.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_SquircleFill=require("../SquircleFill/SquircleFill.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_jsxRuntime=require("react/jsx-runtime");const MODAL_DISMISS_GRACE_MS=exports.MODAL_DISMISS_GRACE_MS=300,Modal=exports.Modal=(0,_react.forwardRef)((e,t)=>{const{visible:r,onRequestClose:a,presentation:i="centered",backdropOpacity:s,backdropPressClose:n=!0,animationDuration:o,accessibilityLabel:l,hardwareBackPress:c=!0,children:u,contentStyle:d,backdropStyle:m,restoreFocusRef:_,onDismissed:f,haptic:p,testID:g}=e,b=(0,_index.useTheme)(),[v,S]=(0,_ModalSafeArea.useModalInsets)(),x=o??b.motion.duration.normal,h=_reactNative.Dimensions.get("window").height,y=b.components.modal,M=y?.scaleStartValue??.9,A=(0,_react.useRef)((0,_index.createAnimatedValue)(M)).current,N=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,R=(0,_react.useRef)((0,_index.createAnimatedValue)(h)).current,j=(0,_react.useRef)(null),C=(0,_react.useRef)(!1),[q,D]=(0,_react.useState)(r),T=(0,_react.useMemo)(()=>buildStyles(b),[b]),k=(0,_react.useMemo)(()=>{const e=b.colors.background.overlay;if("number"!=typeof s)return e;const t=e.match(/^rgba?\(([^)]+)\)$/);if(!t)return e;const[r,a,i]=t[1].split(",").map(e=>e.trim());return`rgba(${r}, ${a}, ${i}, ${s})`},[b.colors.background.overlay,s]);(0,_react.useEffect)(()=>{r&&D(!0)},[r]),(0,_react.useEffect)(()=>{const e=[];if(r&&q)if("bottom"===i){const t=_reactNative.Animated.spring(R,{toValue:0,damping:b.motion.spring.gentle.damping,stiffness:b.motion.spring.gentle.stiffness,mass:b.motion.spring.gentle.mass,useNativeDriver:!0});t.start(),e.push(t)}else{const t=_reactNative.Animated.parallel([_reactNative.Animated.spring(A,{toValue:1,damping:b.motion.spring.gentle.damping,stiffness:b.motion.spring.gentle.stiffness,mass:b.motion.spring.gentle.mass,useNativeDriver:!0}),_reactNative.Animated.timing(N,{toValue:1,duration:x,useNativeDriver:!0})]);t.start(),e.push(t)}else if(q){const t=b.motion.duration.fast,r=_reactNative.Easing.bezier(...b.motion.easing.accelerate),a=_reactNative.Animated.parallel(["bottom"===i?_reactNative.Animated.timing(R,{toValue:h,duration:t,easing:r,useNativeDriver:!0}):_reactNative.Animated.parallel([_reactNative.Animated.timing(A,{toValue:M,duration:t,easing:r,useNativeDriver:!0}),_reactNative.Animated.timing(N,{toValue:0,duration:t,easing:r,useNativeDriver:!0})])]);a.start(({finished:e})=>{e&&D(!1)}),e.push(a)}return()=>e.forEach(e=>e.stop())},[r,q,i,x,A,N,R,h,b.motion.spring.gentle.damping,b.motion.spring.gentle.stiffness,b.motion.spring.gentle.mass,b.motion.duration.fast,b.motion.easing.accelerate,M]),(0,_react.useEffect)(()=>{if("web"===_reactNative.Platform.OS)return;let e,t;return r?(e=setTimeout(()=>{j.current&&_reactNative.AccessibilityInfo.sendAccessibilityEvent(j.current,"focus")},150),C.current=!0):C.current&&(C.current=!1,_&&_.current&&(t=setTimeout(()=>{const e=_.current;e&&_reactNative.AccessibilityInfo.sendAccessibilityEvent(e,"focus")},x))),()=>{e&&clearTimeout(e),t&&clearTimeout(t)}},[r,x,_]);const w=(0,_react.useRef)(!1);(0,_react.useEffect)(()=>{if(r)return void(w.current=!0);if(!w.current)return;if(w.current=!1,!f)return;const e=setTimeout(f,MODAL_DISMISS_GRACE_MS);return()=>clearTimeout(e)},[r,f]);const I=(0,_react.useCallback)(()=>{if(!n)return;const e=(0,_hapticUtils.resolveHaptic)(p,"selection");e&&(0,_hapticUtils.triggerHaptic)(e),a()},[n,a,p]),V=(0,_react.useCallback)(()=>{c&&a()},[c,a]),E=(0,_SquircleFill.useSquircle)("bottom"!==i&&"fullScreen"!==i,b.radius.xl),z=(0,_react.useMemo)(()=>"fullScreen"===i?[T.fullScreenContent,{backgroundColor:b.colors.background.elevated}]:"bottom"===i?[T.bottomContent,{backgroundColor:b.colors.background.elevated,borderTopLeftRadius:b.radius.xl,borderTopRightRadius:b.radius.xl,..._corners.smoothCorners,paddingTop:b.spacing.lg,paddingHorizontal:b.spacing.lg,paddingBottom:b.spacing.lg+v.bottom},b.shadows.xl]:[T.centeredContent,{backgroundColor:b.colors.background.elevated,borderRadius:E.active&&E.size?(0,_squircle.squircleHostRadius)(E.size.width,E.size.height,b.radius.xl):b.radius.xl,..._corners.smoothCorners,padding:b.spacing.xl},b.shadows.xl],[i,b,T,v.bottom,E.active,E.size]),L=(0,_react.useMemo)(()=>"bottom"===i?T.bottomWrapper:"fullScreen"===i?T.fullScreenWrapper:T.centeredWrapper,[i,T]),F=(0,_react.useMemo)(()=>"bottom"===i?{transform:[{translateY:R}]}:"fullScreen"===i?{opacity:N}:{opacity:N,transform:[{scale:A}]},[i,A,N,R]);return(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:q,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:V,testID:g,children:(0,_jsxRuntime.jsx)(_reactNative.View,{ref:e=>{j.current=e,"function"==typeof t?t(e):t&&(t.current=e)},style:T.root,accessible:!1,accessibilityViewIsModal:!0,accessibilityRole:"alert",accessibilityLabel:l,children:(0,_jsxRuntime.jsxs)(_ModalSafeArea.ModalSafeArea,{onInsets:S,children:[(0,_jsxRuntime.jsxs)(_reactNative.View,{collapsable:!1,style:[_reactNative.StyleSheet.absoluteFill,L,{backgroundColor:k},m],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:I,accessibilityRole:"button",accessibilityLabel:"Close modal",disabled:!n}),(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[z,F,d],onLayout:E.onLayout,pointerEvents:"auto",children:[E.active&&E.size?(0,_jsxRuntime.jsx)(_SquircleFill.SquircleFill,{width:E.size.width,height:E.size.height,radius:b.radius.xl,fill:b.colors.background.elevated}):null,u]})]}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})})});Modal.displayName="Modal";const buildStyles=e=>_reactNative.StyleSheet.create({root:{flex:1},centeredWrapper:{flex:1,alignItems:"center",justifyContent:"center",paddingHorizontal:16},centeredContent:{maxWidth:"90%",width:"90%"},bottomWrapper:{flex:1,justifyContent:"flex-end"},bottomContent:{width:"100%"},fullScreenWrapper:{flex:1},fullScreenContent:{flex:1}});var _default=exports.default=Modal;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=exports.Modal=exports.MODAL_DISMISS_GRACE_MS=void 0;var _react=require("react"),_reactNative=require("react-native"),_usePresenceMotion=require("../../hooks/usePresenceMotion.js"),_index=require("../../theme/index.js"),_corners=require("../../utils/corners.js"),_hapticUtils=require("../../utils/hapticUtils.js"),_squircle=require("../../utils/squircle.js"),_ModalSafeArea=require("../ModalSafeArea/ModalSafeArea.js"),_SquircleFill=require("../SquircleFill/SquircleFill.js"),_ToastProvider=require("../Toast/ToastProvider.js"),_jsxRuntime=require("react/jsx-runtime");const MODAL_DISMISS_GRACE_MS=exports.MODAL_DISMISS_GRACE_MS=300,Modal=exports.Modal=(0,_react.forwardRef)((e,t)=>{const{visible:r,onRequestClose:a,presentation:i="centered",backdropOpacity:s,backdropPressClose:n=!0,animationDuration:o,accessibilityLabel:l,hardwareBackPress:c=!0,children:u,contentStyle:d,backdropStyle:m,restoreFocusRef:_,onDismissed:p,haptic:f,testID:g}=e,v=(0,_index.useTheme)(),b=(0,_usePresenceMotion.usePresenceMotion)(),[S,x]=(0,_ModalSafeArea.useModalInsets)(),h=o??b.duration("normal"),M=_reactNative.Dimensions.get("window").height,y=v.components.modal,A=y?.scaleStartValue??.9,N=(0,_react.useRef)((0,_index.createAnimatedValue)(A)).current,R=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,j=(0,_react.useRef)((0,_index.createAnimatedValue)(M)).current,q=(0,_react.useRef)((0,_index.createAnimatedValue)(0)).current,C=(0,_react.useRef)(null),V=(0,_react.useRef)(!1),[D,T]=(0,_react.useState)(r),k=(0,_react.useMemo)(()=>buildStyles(v),[v]),w=(0,_react.useMemo)(()=>{const e=v.colors.background.overlay;if("number"!=typeof s)return e;const t=e.match(/^rgba?\(([^)]+)\)$/);if(!t)return e;const[r,a,i]=t[1].split(",").map(e=>e.trim());return`rgba(${r}, ${a}, ${i}, ${s})`},[v.colors.background.overlay,s]),I=(0,_react.useMemo)(()=>q.interpolate({inputRange:[0,1],outputRange:[transparentOf(w),w]}),[q,w]);(0,_react.useEffect)(()=>{r&&T(!0)},[r]),(0,_react.useEffect)(()=>{const e=[];if(r&&D){const t=_reactNative.Animated.timing(q,{toValue:1,duration:b.duration("normal"),useNativeDriver:!1});if(t.start(),e.push(t),b.reduced){R.setValue(0),j.setValue(0),N.setValue(1);const t=_reactNative.Animated.timing(R,{toValue:1,duration:h,useNativeDriver:!0});t.start(),e.push(t)}else if("bottom"===i){R.setValue(1);const t=_reactNative.Animated.spring(j,{toValue:0,damping:v.motion.spring.gentle.damping,stiffness:v.motion.spring.gentle.stiffness,mass:v.motion.spring.gentle.mass,useNativeDriver:!0});t.start(),e.push(t)}else{const t=_reactNative.Animated.parallel([_reactNative.Animated.spring(N,{toValue:1,damping:v.motion.spring.gentle.damping,stiffness:v.motion.spring.gentle.stiffness,mass:v.motion.spring.gentle.mass,useNativeDriver:!0}),_reactNative.Animated.timing(R,{toValue:1,duration:h,useNativeDriver:!0})]);t.start(),e.push(t)}}else if(D){const t=b.duration("fast"),r=_reactNative.Easing.bezier(...v.motion.easing.accelerate),a=_reactNative.Animated.timing(R,{toValue:0,duration:t,easing:r,useNativeDriver:!0}),s=b.reduced?a:"bottom"===i?_reactNative.Animated.timing(j,{toValue:M,duration:t,easing:r,useNativeDriver:!0}):_reactNative.Animated.parallel([_reactNative.Animated.timing(N,{toValue:A,duration:t,easing:r,useNativeDriver:!0}),a]),n=_reactNative.Animated.parallel([s,_reactNative.Animated.timing(q,{toValue:0,duration:b.duration("normal"),useNativeDriver:!1})]);n.start(({finished:e})=>{e&&(j.setValue(M),T(!1))}),e.push(n)}return()=>e.forEach(e=>e.stop())},[r,D,i,h,N,R,q,j,M,v.motion.spring.gentle.damping,v.motion.spring.gentle.stiffness,v.motion.spring.gentle.mass,b,v.motion.easing.accelerate,A]),(0,_react.useEffect)(()=>{if("web"===_reactNative.Platform.OS)return;let e,t;return r?(e=setTimeout(()=>{C.current&&_reactNative.AccessibilityInfo.sendAccessibilityEvent(C.current,"focus")},150),V.current=!0):V.current&&(V.current=!1,_&&_.current&&(t=setTimeout(()=>{const e=_.current;e&&_reactNative.AccessibilityInfo.sendAccessibilityEvent(e,"focus")},h))),()=>{e&&clearTimeout(e),t&&clearTimeout(t)}},[r,h,_]);const E=(0,_react.useRef)(!1);(0,_react.useEffect)(()=>{if(r)return void(E.current=!0);if(!E.current)return;if(E.current=!1,!p)return;const e=setTimeout(p,MODAL_DISMISS_GRACE_MS);return()=>clearTimeout(e)},[r,p]);const P=(0,_react.useCallback)(()=>{if(!n)return;const e=(0,_hapticUtils.resolveHaptic)(f,"selection");e&&(0,_hapticUtils.triggerHaptic)(e),a()},[n,a,f]),z=(0,_react.useCallback)(()=>{c&&a()},[c,a]),L=(0,_SquircleFill.useSquircle)("bottom"!==i&&"fullScreen"!==i,v.radius.xl),F=(0,_react.useMemo)(()=>"fullScreen"===i?[k.fullScreenContent,{backgroundColor:v.colors.background.elevated}]:"bottom"===i?[k.bottomContent,{backgroundColor:v.colors.background.elevated,borderTopLeftRadius:v.radius.xl,borderTopRightRadius:v.radius.xl,..._corners.smoothCorners,paddingTop:v.spacing.lg,paddingHorizontal:v.spacing.lg,paddingBottom:v.spacing.lg+S.bottom},v.shadows.xl]:[k.centeredContent,{backgroundColor:v.colors.background.elevated,borderRadius:L.active&&L.size?(0,_squircle.squircleHostRadius)(L.size.width,L.size.height,v.radius.xl):v.radius.xl,..._corners.smoothCorners,padding:v.spacing.xl},v.shadows.xl],[i,v,k,S.bottom,L.active,L.size]),O=(0,_react.useMemo)(()=>"bottom"===i?k.bottomWrapper:"fullScreen"===i?k.fullScreenWrapper:k.centeredWrapper,[i,k]),$=(0,_react.useMemo)(()=>"bottom"===i?{opacity:R,transform:[{translateY:j}]}:"fullScreen"===i?{opacity:R}:{opacity:R,transform:[{scale:N}]},[i,N,R,j]);return(0,_jsxRuntime.jsx)(_reactNative.Modal,{visible:D,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:z,testID:g,children:(0,_jsxRuntime.jsx)(_reactNative.View,{ref:e=>{C.current=e,"function"==typeof t?t(e):t&&(t.current=e)},style:k.root,accessible:!1,accessibilityViewIsModal:!0,accessibilityRole:"alert",accessibilityLabel:l,children:(0,_jsxRuntime.jsxs)(_ModalSafeArea.ModalSafeArea,{onInsets:x,children:[(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{collapsable:!1,style:[_reactNative.StyleSheet.absoluteFill,O,{backgroundColor:I},m],children:[(0,_jsxRuntime.jsx)(_reactNative.Pressable,{style:_reactNative.StyleSheet.absoluteFill,onPress:P,accessibilityRole:"button",accessibilityLabel:"Close modal",disabled:!n}),(0,_jsxRuntime.jsxs)(_reactNative.Animated.View,{style:[F,$,d],onLayout:L.onLayout,pointerEvents:"auto",children:[L.active&&L.size?(0,_jsxRuntime.jsx)(_SquircleFill.SquircleFill,{width:L.size.width,height:L.size.height,radius:v.radius.xl,fill:v.colors.background.elevated}):null,u]})]}),(0,_jsxRuntime.jsx)(_ToastProvider.ToastHost,{})]})})})});Modal.displayName="Modal";const transparentOf=e=>{const t=e.match(/^rgba?\(([^)]+)\)$/);if(!t)return"transparent";const[r,a,i]=t[1].split(",").map(e=>e.trim());return`rgba(${r}, ${a}, ${i}, 0)`},buildStyles=e=>_reactNative.StyleSheet.create({root:{flex:1},centeredWrapper:{flex:1,alignItems:"center",justifyContent:"center",paddingHorizontal:16},centeredContent:{maxWidth:"90%",width:"90%"},bottomWrapper:{flex:1,justifyContent:"flex-end"},bottomContent:{width:"100%"},fullScreenWrapper:{flex:1},fullScreenContent:{flex:1}});var _default=exports.default=Modal;