@webority/mobile-ui 0.18.1 → 0.19.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 (215) hide show
  1. package/lib/commonjs/canvasKit/index.js +1 -1
  2. package/lib/commonjs/components/Accordion/Accordion.js +1 -1
  3. package/lib/commonjs/components/AppBar/AppBar.js +1 -1
  4. package/lib/commonjs/components/Avatar/Avatar.js +1 -1
  5. package/lib/commonjs/components/Badge/Badge.js +1 -1
  6. package/lib/commonjs/components/Banner/Banner.js +1 -1
  7. package/lib/commonjs/components/BarChart/BarChart.js +1 -1
  8. package/lib/commonjs/components/BottomNavigation/BottomNavigation.js +1 -1
  9. package/lib/commonjs/components/BottomSheet/BottomSheet.js +1 -1
  10. package/lib/commonjs/components/Box/Box.js +1 -1
  11. package/lib/commonjs/components/Button/Button.js +1 -1
  12. package/lib/commonjs/components/Calendar/calendarStyles.js +1 -1
  13. package/lib/commonjs/components/Card/Card.js +1 -1
  14. package/lib/commonjs/components/Carousel/Carousel.js +1 -1
  15. package/lib/commonjs/components/Checkbox/Checkbox.js +1 -1
  16. package/lib/commonjs/components/Chip/Chip.js +1 -1
  17. package/lib/commonjs/components/ChoiceGroup/ChoiceGroup.js +1 -1
  18. package/lib/commonjs/components/Composer/Composer.js +1 -1
  19. package/lib/commonjs/components/DatePicker/DatePicker.js +1 -1
  20. package/lib/commonjs/components/DateRangePicker/DateRangePicker.js +1 -1
  21. package/lib/commonjs/components/Descriptions/Descriptions.js +1 -1
  22. package/lib/commonjs/components/Dialog/Dialog.js +1 -1
  23. package/lib/commonjs/components/EmptyState/EmptyState.js +1 -1
  24. package/lib/commonjs/components/FieldBase/ChoiceText.js +1 -1
  25. package/lib/commonjs/components/FieldBase/FieldBase.js +1 -1
  26. package/lib/commonjs/components/FieldBase/index.js +1 -1
  27. package/lib/commonjs/components/FieldBase/useFloatingLabel.js +1 -1
  28. package/lib/commonjs/components/FilePicker/FilePicker.js +1 -1
  29. package/lib/commonjs/components/FloatingActionButton/FloatingActionButton.js +1 -1
  30. package/lib/commonjs/components/ImageGallery/ImageGallery.js +1 -1
  31. package/lib/commonjs/components/InlineSelect/InlineSelect.js +1 -1
  32. package/lib/commonjs/components/Input/Input.js +1 -1
  33. package/lib/commonjs/components/ListItem/ListItem.js +1 -1
  34. package/lib/commonjs/components/Markdown/Markdown.js +1 -1
  35. package/lib/commonjs/components/MessageBubble/MessageBubble.js +1 -1
  36. package/lib/commonjs/components/MessageList/MessageList.js +1 -1
  37. package/lib/commonjs/components/Modal/Modal.js +1 -1
  38. package/lib/commonjs/components/NumberInput/NumberInput.js +1 -1
  39. package/lib/commonjs/components/OTPInput/OTPInput.js +1 -1
  40. package/lib/commonjs/components/OptionSheet/OptionSheet.js +1 -1
  41. package/lib/commonjs/components/PaymentResult/PaymentResult.js +1 -1
  42. package/lib/commonjs/components/PhoneNumberInput/PhoneNumberInput.js +1 -1
  43. package/lib/commonjs/components/PickerTrigger/PickerTrigger.js +1 -1
  44. package/lib/commonjs/components/ProfileCompletion/ProfileCompletion.js +1 -1
  45. package/lib/commonjs/components/ProfilePicker/ProfilePicker.js +1 -1
  46. package/lib/commonjs/components/ProgressBar/ProgressBar.js +1 -1
  47. package/lib/commonjs/components/Radio/Radio.js +1 -1
  48. package/lib/commonjs/components/Radio/RadioDot.js +1 -1
  49. package/lib/commonjs/components/Rating/Rating.js +1 -1
  50. package/lib/commonjs/components/ScannerOverlay/ScannerOverlay.js +1 -1
  51. package/lib/commonjs/components/SearchBar/SearchBar.js +1 -1
  52. package/lib/commonjs/components/SegmentedControl/SegmentedControl.js +1 -1
  53. package/lib/commonjs/components/Select/Select.js +1 -1
  54. package/lib/commonjs/components/Skeleton/Skeleton.js +1 -1
  55. package/lib/commonjs/components/Skeleton/SkeletonContent.js +1 -1
  56. package/lib/commonjs/components/SlideToConfirm/SlideToConfirm.js +1 -1
  57. package/lib/commonjs/components/Slider/Slider.js +1 -1
  58. package/lib/commonjs/components/SliderField/SliderField.js +1 -1
  59. package/lib/commonjs/components/Spinner/Spinner.js +1 -1
  60. package/lib/commonjs/components/StatusBadge/StatusBadge.js +1 -1
  61. package/lib/commonjs/components/Stepper/Stepper.js +1 -1
  62. package/lib/commonjs/components/Swipeable/Swipeable.js +1 -1
  63. package/lib/commonjs/components/Switch/Switch.js +1 -1
  64. package/lib/commonjs/components/Tabs/Tabs.js +1 -1
  65. package/lib/commonjs/components/TagInput/TagInput.js +1 -1
  66. package/lib/commonjs/components/TimePicker/TimePicker.js +1 -1
  67. package/lib/commonjs/components/Timeline/Timeline.js +1 -1
  68. package/lib/commonjs/components/Toast/Toast.js +1 -1
  69. package/lib/commonjs/components/Tooltip/Tooltip.js +1 -1
  70. package/lib/commonjs/components/Tour/Tour.js +1 -1
  71. package/lib/commonjs/components/TypingIndicator/TypingIndicator.js +1 -1
  72. package/lib/commonjs/components/WheelPicker/Wheel.js +1 -1
  73. package/lib/commonjs/index.js +1 -1
  74. package/lib/commonjs/network/NetworkStatusBanner.js +1 -1
  75. package/lib/commonjs/theme/componentSizes.js +1 -0
  76. package/lib/commonjs/theme/componentTokens.js +1 -0
  77. package/lib/commonjs/theme/index.js +1 -1
  78. package/lib/commonjs/theme/merge.js +1 -1
  79. package/lib/commonjs/theme/retiredThemeKeys.js +1 -0
  80. package/lib/commonjs/theme/scale.js +1 -0
  81. package/lib/commonjs/theme/tokens.js +1 -1
  82. package/lib/commonjs/utils/index.js +1 -1
  83. package/lib/module/canvasKit/index.js +1 -1
  84. package/lib/module/components/Accordion/Accordion.js +1 -1
  85. package/lib/module/components/AppBar/AppBar.js +1 -1
  86. package/lib/module/components/Avatar/Avatar.js +1 -1
  87. package/lib/module/components/Badge/Badge.js +1 -1
  88. package/lib/module/components/Banner/Banner.js +1 -1
  89. package/lib/module/components/BarChart/BarChart.js +1 -1
  90. package/lib/module/components/BottomNavigation/BottomNavigation.js +1 -1
  91. package/lib/module/components/BottomSheet/BottomSheet.js +1 -1
  92. package/lib/module/components/Box/Box.js +1 -1
  93. package/lib/module/components/Button/Button.js +1 -1
  94. package/lib/module/components/Calendar/calendarStyles.js +1 -1
  95. package/lib/module/components/Card/Card.js +1 -1
  96. package/lib/module/components/Carousel/Carousel.js +1 -1
  97. package/lib/module/components/Checkbox/Checkbox.js +1 -1
  98. package/lib/module/components/Chip/Chip.js +1 -1
  99. package/lib/module/components/ChoiceGroup/ChoiceGroup.js +1 -1
  100. package/lib/module/components/Composer/Composer.js +1 -1
  101. package/lib/module/components/DatePicker/DatePicker.js +1 -1
  102. package/lib/module/components/DateRangePicker/DateRangePicker.js +1 -1
  103. package/lib/module/components/Descriptions/Descriptions.js +1 -1
  104. package/lib/module/components/Dialog/Dialog.js +1 -1
  105. package/lib/module/components/EmptyState/EmptyState.js +1 -1
  106. package/lib/module/components/FieldBase/ChoiceText.js +1 -1
  107. package/lib/module/components/FieldBase/FieldBase.js +1 -1
  108. package/lib/module/components/FieldBase/index.js +1 -1
  109. package/lib/module/components/FieldBase/useFloatingLabel.js +1 -1
  110. package/lib/module/components/FilePicker/FilePicker.js +1 -1
  111. package/lib/module/components/FloatingActionButton/FloatingActionButton.js +1 -1
  112. package/lib/module/components/ImageGallery/ImageGallery.js +1 -1
  113. package/lib/module/components/InlineSelect/InlineSelect.js +1 -1
  114. package/lib/module/components/Input/Input.js +1 -1
  115. package/lib/module/components/ListItem/ListItem.js +1 -1
  116. package/lib/module/components/Markdown/Markdown.js +1 -1
  117. package/lib/module/components/MessageBubble/MessageBubble.js +1 -1
  118. package/lib/module/components/MessageList/MessageList.js +1 -1
  119. package/lib/module/components/Modal/Modal.js +1 -1
  120. package/lib/module/components/NumberInput/NumberInput.js +1 -1
  121. package/lib/module/components/OTPInput/OTPInput.js +1 -1
  122. package/lib/module/components/OptionSheet/OptionSheet.js +1 -1
  123. package/lib/module/components/PaymentResult/PaymentResult.js +1 -1
  124. package/lib/module/components/PhoneNumberInput/PhoneNumberInput.js +1 -1
  125. package/lib/module/components/PickerTrigger/PickerTrigger.js +1 -1
  126. package/lib/module/components/ProfileCompletion/ProfileCompletion.js +1 -1
  127. package/lib/module/components/ProfilePicker/ProfilePicker.js +1 -1
  128. package/lib/module/components/ProgressBar/ProgressBar.js +1 -1
  129. package/lib/module/components/Radio/Radio.js +1 -1
  130. package/lib/module/components/Radio/RadioDot.js +1 -1
  131. package/lib/module/components/Rating/Rating.js +1 -1
  132. package/lib/module/components/ScannerOverlay/ScannerOverlay.js +1 -1
  133. package/lib/module/components/SearchBar/SearchBar.js +1 -1
  134. package/lib/module/components/SegmentedControl/SegmentedControl.js +1 -1
  135. package/lib/module/components/Select/Select.js +1 -1
  136. package/lib/module/components/Skeleton/Skeleton.js +1 -1
  137. package/lib/module/components/Skeleton/SkeletonContent.js +1 -1
  138. package/lib/module/components/SlideToConfirm/SlideToConfirm.js +1 -1
  139. package/lib/module/components/Slider/Slider.js +1 -1
  140. package/lib/module/components/SliderField/SliderField.js +1 -1
  141. package/lib/module/components/Spinner/Spinner.js +1 -1
  142. package/lib/module/components/StatusBadge/StatusBadge.js +1 -1
  143. package/lib/module/components/Stepper/Stepper.js +1 -1
  144. package/lib/module/components/Swipeable/Swipeable.js +1 -1
  145. package/lib/module/components/Switch/Switch.js +1 -1
  146. package/lib/module/components/Tabs/Tabs.js +1 -1
  147. package/lib/module/components/TagInput/TagInput.js +1 -1
  148. package/lib/module/components/TimePicker/TimePicker.js +1 -1
  149. package/lib/module/components/Timeline/Timeline.js +1 -1
  150. package/lib/module/components/Toast/Toast.js +1 -1
  151. package/lib/module/components/Tooltip/Tooltip.js +1 -1
  152. package/lib/module/components/Tour/Tour.js +1 -1
  153. package/lib/module/components/TypingIndicator/TypingIndicator.js +1 -1
  154. package/lib/module/components/WheelPicker/Wheel.js +1 -1
  155. package/lib/module/index.js +1 -1
  156. package/lib/module/network/NetworkStatusBanner.js +1 -1
  157. package/lib/module/theme/componentSizes.js +1 -0
  158. package/lib/module/theme/componentTokens.js +1 -0
  159. package/lib/module/theme/index.js +1 -1
  160. package/lib/module/theme/merge.js +1 -1
  161. package/lib/module/theme/retiredThemeKeys.js +1 -0
  162. package/lib/module/theme/scale.js +1 -0
  163. package/lib/module/theme/tokens.js +1 -1
  164. package/lib/module/utils/index.js +1 -1
  165. package/lib/typescript/commonjs/components/BottomNavigation/BottomNavigation.d.ts +6 -6
  166. package/lib/typescript/commonjs/components/Box/Box.d.ts +18 -20
  167. package/lib/typescript/commonjs/components/Calendar/calendarStyles.d.ts +1 -1
  168. package/lib/typescript/commonjs/components/Card/Card.d.ts +1 -1
  169. package/lib/typescript/commonjs/components/FieldBase/FieldBase.d.ts +2 -8
  170. package/lib/typescript/commonjs/components/FieldBase/index.d.ts +1 -1
  171. package/lib/typescript/commonjs/components/FieldBase/useFloatingLabel.d.ts +3 -2
  172. package/lib/typescript/commonjs/components/InlineSelect/InlineSelect.d.ts +1 -1
  173. package/lib/typescript/commonjs/components/Input/Input.d.ts +1 -1
  174. package/lib/typescript/commonjs/components/PhoneNumberInput/PhoneNumberInput.d.ts +1 -1
  175. package/lib/typescript/commonjs/components/SearchBar/SearchBar.d.ts +1 -1
  176. package/lib/typescript/commonjs/components/SegmentedControl/SegmentedControl.d.ts +1 -15
  177. package/lib/typescript/commonjs/components/Select/Select.d.ts +2 -2
  178. package/lib/typescript/commonjs/components/Skeleton/Skeleton.d.ts +1 -1
  179. package/lib/typescript/commonjs/components/Tabs/Tabs.d.ts +1 -1
  180. package/lib/typescript/commonjs/index.d.ts +4 -4
  181. package/lib/typescript/commonjs/theme/componentSizes.d.ts +27 -0
  182. package/lib/typescript/commonjs/theme/componentTokens.d.ts +762 -0
  183. package/lib/typescript/commonjs/theme/index.d.ts +4 -1
  184. package/lib/typescript/commonjs/theme/retiredThemeKeys.d.ts +22 -0
  185. package/lib/typescript/commonjs/theme/scale.d.ts +5 -0
  186. package/lib/typescript/commonjs/theme/types.d.ts +6 -790
  187. package/lib/typescript/commonjs/utils/index.d.ts +0 -2
  188. package/lib/typescript/module/components/BottomNavigation/BottomNavigation.d.ts +6 -6
  189. package/lib/typescript/module/components/Box/Box.d.ts +18 -20
  190. package/lib/typescript/module/components/Calendar/calendarStyles.d.ts +1 -1
  191. package/lib/typescript/module/components/Card/Card.d.ts +1 -1
  192. package/lib/typescript/module/components/FieldBase/FieldBase.d.ts +2 -8
  193. package/lib/typescript/module/components/FieldBase/index.d.ts +1 -1
  194. package/lib/typescript/module/components/FieldBase/useFloatingLabel.d.ts +3 -2
  195. package/lib/typescript/module/components/InlineSelect/InlineSelect.d.ts +1 -1
  196. package/lib/typescript/module/components/Input/Input.d.ts +1 -1
  197. package/lib/typescript/module/components/PhoneNumberInput/PhoneNumberInput.d.ts +1 -1
  198. package/lib/typescript/module/components/SearchBar/SearchBar.d.ts +1 -1
  199. package/lib/typescript/module/components/SegmentedControl/SegmentedControl.d.ts +1 -15
  200. package/lib/typescript/module/components/Select/Select.d.ts +2 -2
  201. package/lib/typescript/module/components/Skeleton/Skeleton.d.ts +1 -1
  202. package/lib/typescript/module/components/Tabs/Tabs.d.ts +1 -1
  203. package/lib/typescript/module/index.d.ts +4 -4
  204. package/lib/typescript/module/theme/componentSizes.d.ts +27 -0
  205. package/lib/typescript/module/theme/componentTokens.d.ts +762 -0
  206. package/lib/typescript/module/theme/index.d.ts +4 -1
  207. package/lib/typescript/module/theme/retiredThemeKeys.d.ts +22 -0
  208. package/lib/typescript/module/theme/scale.d.ts +5 -0
  209. package/lib/typescript/module/theme/types.d.ts +6 -790
  210. package/lib/typescript/module/utils/index.d.ts +0 -2
  211. package/package.json +14 -4
  212. package/lib/commonjs/utils/spacing.js +0 -1
  213. package/lib/module/utils/spacing.js +0 -1
  214. package/lib/typescript/commonjs/utils/spacing.d.ts +0 -61
  215. package/lib/typescript/module/utils/spacing.d.ts +0 -61
@@ -1 +1 @@
1
- "use strict";import{forwardRef,useCallback,useMemo}from"react";import{Pressable,StyleSheet,Text,View}from"react-native";import{useControllableState}from"../../hooks/index.js";import{fontFor,useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{tintOf}from"../../utils/color.js";import{smoothCorners}from"../../utils/corners.js";import{renderSlotIcon}from"../AppIcon/slotIcon.js";import{RadioDot}from"../Radio/RadioDot.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const sizeTokens={sm:{paddingHorizontal:10,chipPaddingHorizontal:12,paddingVertical:6,fontSize:13,minHeight:32,iconSize:14},md:{paddingHorizontal:12,chipPaddingHorizontal:16,paddingVertical:8,fontSize:15,minHeight:40,iconSize:16},lg:{paddingHorizontal:16,chipPaddingHorizontal:20,paddingVertical:11,fontSize:16,minHeight:48,iconSize:18}},ChoiceGroup=forwardRef((e,i)=>{const{options:o,getOptionLabel:r,getOptionValue:t,getOptionDisabled:l,getOptionDescription:n,getOptionIcon:a,getOptionColor:s,renderOption:c,variant:d="card",indicatorPosition:p="trailing",direction:u="row",gap:m,wrap:b=!1,fullWidth:g,disabled:h=!1,size:f="md",labelLines:x=1,descriptionLines:y=2,haptic:z,accessibilityLabel:S,style:C,optionStyle:j,testID:H}=e,w=useTheme(),k=useMemo(()=>buildStyles(w),[w]),V=sizeTokens[f],_=useCallback(e=>r?r(e):e.label??"",[r]),O=useCallback(e=>t?t(e):e.value,[t]),v=useCallback(e=>l?l(e):!0===e.disabled,[l]),D=useCallback(e=>n?n(e):e.description,[n]),L=useCallback(e=>a?a(e):e.icon,[a]),R=useCallback(e=>s?s(e):e.color,[s]),T="multiple"===e.selectionMode,{min:P,max:F}=e,[G,I]=useControllableState({value:e.value,defaultValue:e.defaultValue??(T?[]:void 0),onChange:e.onChange}),M=Array.isArray(G)?G:[],W=useCallback(e=>{const i=O(e);if(T){const e=M.includes(i);if(e&&null!=P&&M.length<=P)return;if(!e&&null!=F&&M.length>=F)return;const o=resolveHaptic(z,"selection");return o&&triggerHaptic(o),void I(e?M.filter(e=>e!==i):[...M,i])}const o=resolveHaptic(z,"selection");o&&triggerHaptic(o),I(i)},[z,T,P,F,M,I,O]),A=g??("card"===d&&"row"===u&&!b),$=w.components.choiceGroup?.selectedFillOpacity??.12,N=w.components.choiceGroup?.borderRadius??w.radius.md,surfaceFor=(e,i,o)=>i?{borderColor:w.colors.border.primary,backgroundColor:w.colors.surface.disabled}:{borderColor:e?o:w.colors.border.primary,backgroundColor:e?tintOf(o,$,w.colors.surface.selected):w.colors.background.primary},renderIcon=(e,i,o,r)=>{const t=L(e);if(null==t)return null;return renderSlotIcon("string"==typeof t&&i?{name:t,variant:"bold"}:t,{color:o,size:V.iconSize,disabled:r})},renderChip=e=>{const{option:i,selected:o,disabled:r,color:t}=e,l=r?w.colors.text.disabled:o?t:w.colors.text.primary,n=renderIcon(i,o,l,r);return _jsxs(View,{style:[k.chip,{minHeight:V.minHeight,paddingHorizontal:V.chipPaddingHorizontal,paddingVertical:V.paddingVertical,borderRadius:w.radius.full,...smoothCorners,borderWidth:w.colors.border.width,...surfaceFor(o,r,t),columnGap:w.spacing.xs}],children:[n?_jsx(View,{children:n}):null,_jsx(Text,{style:[k.cardLabel,{color:l,fontSize:V.fontSize,...fontFor(w,"medium")}],numberOfLines:x,ellipsizeMode:"tail",children:_(i)})]})},renderDefaultCard=e=>{const{option:i,selected:o,disabled:r,color:t}=e,l=R(i),n=r?w.colors.text.disabled:l??w.colors.text.primary,a=D(i),s=renderIcon(i,o,n,r),c=_jsx(RadioDot,{selected:o,color:t,disabled:r,size:f});return _jsxs(View,{style:[k.card,{minHeight:V.minHeight,paddingHorizontal:V.paddingHorizontal,paddingVertical:V.paddingVertical,borderRadius:N,...smoothCorners,borderWidth:w.colors.border.width,...surfaceFor(o,r,t),columnGap:w.spacing.sm}],children:["leading"===p?c:null,s?_jsx(View,{children:s}):null,_jsxs(View,{style:k.cardTextWrap,children:[_jsx(Text,{style:[k.cardLabel,{color:n,fontSize:V.fontSize,...fontFor(w,"medium")}],numberOfLines:x,ellipsizeMode:"tail",children:_(i)}),a?_jsx(Text,{style:[k.cardDescription,{color:o?w.colors.text.secondary:w.colors.text.tertiary,fontSize:w.typography.fontSize.xs}],numberOfLines:y,ellipsizeMode:"tail",children:a}):null]}),"trailing"===p?c:null]})};return _jsx(View,{ref:i,accessibilityRole:T?void 0:"radiogroup",accessibilityLabel:S,accessibilityState:{disabled:h},"aria-disabled":h,testID:H,style:[{flexDirection:u,gap:m??w.spacing.sm,flexWrap:b?"wrap":"nowrap"},C],children:o.map((e,i)=>{const o=O(e),r=T?M.includes(o):G===o,t=T&&null!=F&&!r&&M.length>=F,l=h||t||v(e),n=R(e)??w.colors.primary,a=c||"card"!==d?void 0:D(e);return _jsx(Pressable,{onPress:()=>{l||W(e)},disabled:l,accessibilityRole:T?"checkbox":"radio",accessibilityLabel:a?`${_(e)}, ${a}`:_(e),accessibilityState:{checked:r,disabled:l},"aria-checked":r,"aria-disabled":l,style:[A?k.stretchOption:null,{opacity:l&&c?.55:1},j],children:({pressed:o})=>{const t={option:e,index:i,selected:r,pressed:o&&!l,disabled:l,color:n};return _jsx(_Fragment,{children:c?c(t):"chip"===d?renderChip(t):renderDefaultCard(t)})}},String(o))})})});ChoiceGroup.displayName="ChoiceGroup";const buildStyles=e=>StyleSheet.create({stretchOption:{flex:1},card:{flexDirection:"row",alignItems:"center"},chip:{flexDirection:"row",alignItems:"center",justifyContent:"center"},cardTextWrap:{flex:1},cardLabel:{includeFontPadding:!1},cardDescription:{includeFontPadding:!1,marginTop:2}});export{ChoiceGroup};export default ChoiceGroup;
1
+ "use strict";import{forwardRef,useCallback,useMemo}from"react";import{Pressable,StyleSheet,Text,View}from"react-native";import{useControllableState}from"../../hooks/index.js";import{fontFor,radiusOf,useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{tintOf}from"../../utils/color.js";import{smoothCorners}from"../../utils/corners.js";import{renderSlotIcon}from"../AppIcon/slotIcon.js";import{RadioDot}from"../Radio/RadioDot.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const sizeTokensOf=e=>({sm:{paddingHorizontal:e.spacing.sm,chipPaddingHorizontal:e.spacing.md,paddingVertical:e.spacing.xs,fontSize:e.typography.fontSize.sm,minHeight:32,iconSize:14},md:{paddingHorizontal:e.spacing.md,chipPaddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,fontSize:e.typography.fontSize.base,minHeight:40,iconSize:16},lg:{paddingHorizontal:e.spacing.lg,chipPaddingHorizontal:e.spacing.xl,paddingVertical:e.spacing.md,fontSize:e.typography.fontSize.lg,minHeight:48,iconSize:18}}),ChoiceGroup=forwardRef((e,i)=>{const{options:o,getOptionLabel:r,getOptionValue:t,getOptionDisabled:l,getOptionDescription:s,getOptionIcon:n,getOptionColor:a,renderOption:c,variant:d="card",indicatorPosition:p="trailing",direction:u="row",gap:g,wrap:m=!1,fullWidth:b,disabled:h=!1,size:f="md",labelLines:x=1,descriptionLines:y=2,haptic:z,accessibilityLabel:S,style:C,optionStyle:j,testID:H}=e,O=useTheme(),w=useMemo(()=>buildStyles(O),[O]),k=useMemo(()=>sizeTokensOf(O)[f],[O,f]),V=useCallback(e=>r?r(e):e.label??"",[r]),_=useCallback(e=>t?t(e):e.value,[t]),v=useCallback(e=>l?l(e):!0===e.disabled,[l]),D=useCallback(e=>s?s(e):e.description,[s]),L=useCallback(e=>n?n(e):e.icon,[n]),T=useCallback(e=>a?a(e):e.color,[a]),G="multiple"===e.selectionMode,{min:P,max:R}=e,[F,I]=useControllableState({value:e.value,defaultValue:e.defaultValue??(G?[]:void 0),onChange:e.onChange}),M=Array.isArray(F)?F:[],W=useCallback(e=>{const i=_(e);if(G){const e=M.includes(i);if(e&&null!=P&&M.length<=P)return;if(!e&&null!=R&&M.length>=R)return;const o=resolveHaptic(z,"selection");return o&&triggerHaptic(o),void I(e?M.filter(e=>e!==i):[...M,i])}const o=resolveHaptic(z,"selection");o&&triggerHaptic(o),I(i)},[z,G,P,R,M,I,_]),A=b??("card"===d&&"row"===u&&!m),$=O.components.choiceGroup?.selectedFillOpacity??.12,N=radiusOf(O,O.components.choiceGroup?.radius??"md","components.choiceGroup.radius"),surfaceFor=(e,i,o)=>i?{borderColor:O.colors.border.primary,backgroundColor:O.colors.surface.disabled}:{borderColor:e?o:O.colors.border.primary,backgroundColor:e?tintOf(o,$,O.colors.surface.selected):O.colors.background.primary},renderIcon=(e,i,o,r)=>{const t=L(e);if(null==t)return null;return renderSlotIcon("string"==typeof t&&i?{name:t,variant:"bold"}:t,{color:o,size:k.iconSize,disabled:r})},renderChip=e=>{const{option:i,selected:o,disabled:r,color:t}=e,l=r?O.colors.text.disabled:o?t:O.colors.text.primary,s=renderIcon(i,o,l,r);return _jsxs(View,{style:[w.chip,{minHeight:k.minHeight,paddingHorizontal:k.chipPaddingHorizontal,paddingVertical:k.paddingVertical,borderRadius:O.radius.pill,...smoothCorners,borderWidth:O.colors.border.width,...surfaceFor(o,r,t),columnGap:O.spacing.xs}],children:[s?_jsx(View,{children:s}):null,_jsx(Text,{style:[w.cardLabel,{color:l,fontSize:k.fontSize,...fontFor(O,"medium")}],numberOfLines:x,ellipsizeMode:"tail",children:V(i)})]})},renderDefaultCard=e=>{const{option:i,selected:o,disabled:r,color:t}=e,l=T(i),s=r?O.colors.text.disabled:l??O.colors.text.primary,n=D(i),a=renderIcon(i,o,s,r),c=_jsx(RadioDot,{selected:o,color:t,disabled:r,size:f});return _jsxs(View,{style:[w.card,{minHeight:k.minHeight,paddingHorizontal:k.paddingHorizontal,paddingVertical:k.paddingVertical,borderRadius:N,...smoothCorners,borderWidth:O.colors.border.width,...surfaceFor(o,r,t),columnGap:O.spacing.sm}],children:["leading"===p?c:null,a?_jsx(View,{children:a}):null,_jsxs(View,{style:w.cardTextWrap,children:[_jsx(Text,{style:[w.cardLabel,{color:s,fontSize:k.fontSize,...fontFor(O,"medium")}],numberOfLines:x,ellipsizeMode:"tail",children:V(i)}),n?_jsx(Text,{style:[w.cardDescription,{color:o?O.colors.text.secondary:O.colors.text.tertiary,fontSize:O.typography.fontSize.xs}],numberOfLines:y,ellipsizeMode:"tail",children:n}):null]}),"trailing"===p?c:null]})};return _jsx(View,{ref:i,accessibilityRole:G?void 0:"radiogroup",accessibilityLabel:S,accessibilityState:{disabled:h},"aria-disabled":h,testID:H,style:[{flexDirection:u,gap:g??O.spacing.sm,flexWrap:m?"wrap":"nowrap"},C],children:o.map((e,i)=>{const o=_(e),r=G?M.includes(o):F===o,t=G&&null!=R&&!r&&M.length>=R,l=h||t||v(e),s=T(e)??O.colors.primary,n=c||"card"!==d?void 0:D(e);return _jsx(Pressable,{onPress:()=>{l||W(e)},disabled:l,accessibilityRole:G?"checkbox":"radio",accessibilityLabel:n?`${V(e)}, ${n}`:V(e),accessibilityState:{checked:r,disabled:l},"aria-checked":r,"aria-disabled":l,style:[A?w.stretchOption:null,{opacity:l&&c?.55:1},j],children:({pressed:o})=>{const t={option:e,index:i,selected:r,pressed:o&&!l,disabled:l,color:s};return _jsx(_Fragment,{children:c?c(t):"chip"===d?renderChip(t):renderDefaultCard(t)})}},String(o))})})});ChoiceGroup.displayName="ChoiceGroup";const buildStyles=e=>StyleSheet.create({stretchOption:{flex:1},card:{flexDirection:"row",alignItems:"center"},chip:{flexDirection:"row",alignItems:"center",justifyContent:"center"},cardTextWrap:{flex:1},cardLabel:{includeFontPadding:!1},cardDescription:{includeFontPadding:!1,marginTop:e.spacing.xxs}});export{ChoiceGroup};export default ChoiceGroup;
@@ -1 +1 @@
1
- "use strict";import{forwardRef,useCallback,useMemo,useState}from"react";import{Platform,StyleSheet,TextInput,View}from"react-native";import{KeyboardStickyView}from"react-native-keyboard-controller";import{useSafeAreaInsets}from"react-native-safe-area-context";import{useControllableState}from"../../hooks/useControllableState.js";import{useTheme}from"../../theme/index.js";import{smoothCorners}from"../../utils/corners.js";import{resolveFieldTextStyle}from"../FieldBase/FieldBase.js";import{IconButton}from"../IconButton/index.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const MIN_BOX=44;export const Composer=forwardRef(({onSend:e,value:o,onChangeText:t,placeholder:a="Message",accessibilityLabel:i,sendLabel:r="Send",busy:s=!1,disabled:l=!1,maxLength:n,maxLines:d=5,leading:c,trailing:m,above:b,below:p,keyboardAware:u=!0,keyboardOffset:g,safeArea:h=!0,autoFocus:f,haptic:x,style:y,testID:S},C)=>{const j=useTheme(),v=useSafeAreaInsets(),w=useMemo(()=>buildStyles(j),[j]),[k,I]=useControllableState({value:o,defaultValue:"",onChange:t}),T=k.trim(),V=s||l||""===T,_=h?v.bottom:0,D=g??_,z=resolveFieldTextStyle(j,{disabled:l}),B=j.typography.fontSize.base,F=Math.round(B*j.typography.lineHeight.normal),H=(44-F)/2,L=F*d+2*H,[M,A]=useState(void 0),P=useCallback(e=>{const o=e.nativeEvent.contentSize.height+2*H;A(Math.min(Math.max(o,44),L))},[H,L]),O=useCallback(()=>{V||(I(""),e(T))},[V,I,e,T]),R=_jsxs(View,{style:[w.bar,{paddingBottom:j.spacing.sm+_},y],testID:S,children:[b,_jsxs(View,{style:w.row,children:[c,_jsx(View,{style:[w.box,l?w.boxDisabled:null],children:_jsx(TextInput,{ref:C,value:k,onChangeText:I,multiline:!0,maxLength:n,editable:!l,autoFocus:f,placeholder:a,placeholderTextColor:z.placeholderColor,selectionColor:j.colors.field.caret,accessibilityLabel:i??a,accessibilityState:{disabled:l},"aria-disabled":l,onContentSizeChange:"web"===Platform.OS?P:void 0,style:[w.input,{color:z.color,...z.weightStyle,fontSize:B,lineHeight:F,paddingVertical:H,maxHeight:L,height:"web"===Platform.OS?M:void 0}],testID:S?`${S}-input`:void 0})}),m,_jsx(IconButton,{icon:"send",accessibilityLabel:r,variant:"solid",tone:"primary",disabled:V,loading:s,haptic:x,onPress:O,testID:S?`${S}-send`:void 0})]}),p]});return u?_jsx(KeyboardStickyView,{offset:{closed:0,opened:D},children:R}):R});Composer.displayName="Composer";const buildStyles=e=>StyleSheet.create({bar:{gap:e.spacing.xs,paddingHorizontal:e.spacing.md,paddingTop:e.spacing.sm,backgroundColor:e.colors.background.primary,borderTopWidth:StyleSheet.hairlineWidth,borderTopColor:e.colors.border.secondary},row:{flexDirection:"row",alignItems:"flex-end",gap:e.spacing.sm},box:{flex:1,minHeight:44,justifyContent:"center",backgroundColor:e.colors.field.background,borderRadius:22,...smoothCorners,paddingHorizontal:e.spacing.md},boxDisabled:{backgroundColor:e.colors.field.backgroundDisabled},input:{margin:0,paddingHorizontal:0,includeFontPadding:!1,textAlignVertical:"top"}});export default Composer;
1
+ "use strict";import{forwardRef,useCallback,useMemo,useState}from"react";import{Platform,StyleSheet,TextInput,View}from"react-native";import{KeyboardStickyView}from"react-native-keyboard-controller";import{useSafeAreaInsets}from"react-native-safe-area-context";import{useControllableState}from"../../hooks/useControllableState.js";import{useTheme}from"../../theme/index.js";import{smoothCorners}from"../../utils/corners.js";import{resolveFieldTextStyle}from"../FieldBase/FieldBase.js";import{IconButton}from"../IconButton/index.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const MIN_BOX=44;export const Composer=forwardRef(({onSend:e,value:o,onChangeText:t,placeholder:a="Message",accessibilityLabel:i,sendLabel:r="Send",busy:s=!1,disabled:l=!1,maxLength:n,maxLines:d=5,leading:c,trailing:m,above:p,below:b,keyboardAware:u=!0,keyboardOffset:g,safeArea:h=!0,autoFocus:f,haptic:x,style:y,testID:S},C)=>{const j=useTheme(),v=useSafeAreaInsets(),w=useMemo(()=>buildStyles(j),[j]),[k,I]=useControllableState({value:o,defaultValue:"",onChange:t}),T=k.trim(),V=s||l||""===T,_=h?v.bottom:0,D=g??_,z=resolveFieldTextStyle(j,{disabled:l}),B=j.typography.fontSize.base,F=Math.round(B*j.typography.lineHeight.normal),H=(44-F)/2,L=F*d+2*H,[M,A]=useState(void 0),P=useCallback(e=>{const o=e.nativeEvent.contentSize.height+2*H;A(Math.min(Math.max(o,44),L))},[H,L]),O=useCallback(()=>{V||(I(""),e(T))},[V,I,e,T]),R=_jsxs(View,{style:[w.bar,{paddingBottom:j.spacing.sm+_},y],testID:S,children:[p,_jsxs(View,{style:w.row,children:[c,_jsx(View,{style:[w.box,l?w.boxDisabled:null],children:_jsx(TextInput,{ref:C,value:k,onChangeText:I,multiline:!0,maxLength:n,editable:!l,autoFocus:f,placeholder:a,placeholderTextColor:z.placeholderColor,selectionColor:j.colors.field.caret,accessibilityLabel:i??a,accessibilityState:{disabled:l},"aria-disabled":l,onContentSizeChange:"web"===Platform.OS?P:void 0,style:[w.input,{color:z.color,...z.weightStyle,fontSize:B,lineHeight:F,paddingVertical:H,maxHeight:L,height:"web"===Platform.OS?M:void 0}],testID:S?`${S}-input`:void 0})}),m,_jsx(IconButton,{icon:"send",accessibilityLabel:r,variant:"solid",tone:"primary",disabled:V,loading:s,haptic:x,onPress:O,testID:S?`${S}-send`:void 0})]}),b]});return u?_jsx(KeyboardStickyView,{offset:{closed:0,opened:D},children:R}):R});Composer.displayName="Composer";const buildStyles=e=>StyleSheet.create({bar:{gap:e.spacing.xs,paddingHorizontal:e.spacing.md,paddingTop:e.spacing.sm,backgroundColor:e.colors.background.primary,borderTopWidth:StyleSheet.hairlineWidth,borderTopColor:e.colors.border.secondary},row:{flexDirection:"row",alignItems:"flex-end",gap:e.spacing.sm},box:{flex:1,minHeight:44,justifyContent:"center",backgroundColor:e.colors.field.background,borderRadius:e.radius.pill,...smoothCorners,paddingHorizontal:e.spacing.md},boxDisabled:{backgroundColor:e.colors.field.backgroundDisabled},input:{margin:e.spacing.none,paddingHorizontal:e.spacing.none,includeFontPadding:!1,textAlignVertical:"top"}});export default Composer;
@@ -1 +1 @@
1
- "use strict";import{useCallback,useEffect,useMemo,useRef,useState}from"react";import{AccessibilityInfo,Animated,Easing,Modal,Pressable,StyleSheet,Text,View}from"react-native";import{GestureDetector,GestureHandlerRootView}from"react-native-gesture-handler";import{useDragToDismiss}from"../../hooks/useDragToDismiss.js";import{usePresenceMotion}from"../../hooks/usePresenceMotion.js";import{createAnimatedValue,setNativeValue,useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{ModalSafeArea,useModalInsets}from"../ModalSafeArea/ModalSafeArea.js";import{PickerTrigger}from"../PickerTrigger/index.js";import{ToastHost}from"../Toast/ToastProvider.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const AnimatedGestureRoot=Animated.createAnimatedComponent(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,o=[];for(let e=0;e<42;e+=1){const t=new Date(a,r,1-i+e);o.push({date:t,inMonth:t.getMonth()===r,iso:toIso(t)})}return o},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),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:o,disabledDates:s,mode:n="modal",locale:l="en-IN",weekStartsOn:c=0,title:d="Select Date",confirmLabel:u="Confirm",cancelLabel:m="Cancel",style:g,containerStyle:y,headerLabelStyle:p,navButtonStyle:h,footerButtonStyle:f,haptic:b,testID:x,label:D,placeholder:v,helperText:w,error:C,required:S,disabled:j,size:k,variant:P,clearable:A,onClear:T,formatValue:R,triggerStyle:V}=e,_=void 0!==e.visible,[M,I]=useState(!1),F=_?e.visible:M,B=_?x:x?`${x}-calendar`:void 0,L=useTheme(),Y=usePresenceMotion(),[$,z]=useModalInsets(),N=useMemo(()=>buildStyles(L),[L]),[H,W]=useState(()=>startOfDay(new Date));useEffect(()=>{F&&W(startOfDay(new Date))},[F]);const E=t?startOfDay(t):H,[O,G]=useState(E),[q,X]=useState(t?startOfDay(t):null),[Z,J]=useState("days"),K=useRef(createAnimatedValue(0)).current,Q=useRef(createAnimatedValue(0)).current,U=useRef(createAnimatedValue(0)).current,ee=useRef(0),te=useRef(createAnimatedValue(0)).current,ae=useRef(createAnimatedValue(1)).current,re=useRef(createAnimatedValue(1)).current,ie=useRef(createAnimatedValue(1)).current,oe=useRef(createAnimatedValue(1)).current,se=useRef(createAnimatedValue(1)).current;useEffect(()=>{if(t){const e=startOfDay(t);X(e),G(e)}else X(null)},[t]);const ne=useMemo(()=>{const e=new Set;return s?.forEach(t=>e.add(toIso(startOfDay(t)))),e},[s]),le=useMemo(()=>i?startOfDay(i):null,[i]),ce=useMemo(()=>o?startOfDay(o):null,[o]),de=useCallback(e=>!!(le&&e.getTime()<le.getTime())||(!!(ce&&e.getTime()>ce.getTime())||!!ne.has(toIso(e))),[le,ce,ne]),ue=useMemo(()=>buildMonthMatrix(O,c),[O,c]),me=useMemo(()=>buildYearCells(O.getFullYear()),[O]),ge=useMemo(()=>buildDecadeCells(O.getFullYear()),[O]),ye=useMemo(()=>weekdayLabels(l,c),[l,c]),pe=useMemo(()=>new Intl.DateTimeFormat(l,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),[l]),he=useMemo(()=>{if("days"===Z)return formatMonthYear(O,l);if("years"===Z){return`${me[0]} - ${me[me.length-1]}`}return`${ge[0]} - ${ge[ge.length-1]+9}`},[O,ge,l,Z,me]),fe=useCallback(e=>!!(le&&e<le.getFullYear())||!!(ce&&e>ce.getFullYear()),[le,ce]),be=useCallback(e=>!!(le&&e+10-1<le.getFullYear())||!!(ce&&e>ce.getFullYear()),[le,ce]),xe=useCallback(e=>{!1!==b&&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,[o]=Y.range(-t*a,0),[s]=Y.range(t*a,0),n=Y.reduced?Y.duration("fast"):r,c=Y.reduced?Y.duration("fast"):i;Animated.sequence([Animated.parallel([Animated.timing(te,{toValue:o,duration:r,easing:Easing.out(Easing.quad),useNativeDriver:!0}),Animated.timing(ae,{toValue:0,duration:n,useNativeDriver:!0})]),Animated.timing(te,{toValue:s,duration:0,useNativeDriver:!0}),Animated.parallel([Animated.timing(te,{toValue:0,duration:i,easing:Easing.out(Easing.cubic),useNativeDriver:!0}),Animated.timing(ae,{toValue:1,duration:c,useNativeDriver:!0})])]).start();const d=addMonths(O,e);G(d),AccessibilityInfo.announceForAccessibility(formatMonthYear(d,l))},[O,b,l,ae,te,Y,L.components.datePicker,L.motion.duration.fast]),De=useCallback(()=>{"days"!==Z?(!1!==b&&triggerHaptic("impactLight"),G("years"===Z?e=>new Date(e.getFullYear()-12,e.getMonth(),1):e=>new Date(e.getFullYear()-120,e.getMonth(),1))):xe(-1)},[xe,Z,b]),ve=useCallback(()=>{"days"!==Z?(!1!==b&&triggerHaptic("impactLight"),G("years"===Z?e=>new Date(e.getFullYear()+12,e.getMonth(),1):e=>new Date(e.getFullYear()+120,e.getMonth(),1))):xe(1)},[xe,Z,b]),we=useCallback(()=>{const[e]=Y.range(.9,1),t=Y.reduced?Y.duration("normal"):L.components.datePicker?.viewTransitionDuration??L.motion.duration.normal??200;setNativeValue(ie,0),setNativeValue(oe,e),Animated.parallel([Animated.timing(ie,{toValue:1,duration:t,easing:Easing.out(Easing.cubic),useNativeDriver:!0}),Animated.timing(oe,{toValue:1,duration:t,easing:Easing.out(Easing.cubic),useNativeDriver:!0})]).start()},[ie,oe,Y,L.components.datePicker,L.motion.duration.normal]),Ce=useCallback(()=>{const e=resolveHaptic(b,"selection");if(e&&triggerHaptic(e),!Y.reduced){const e=L.components.datePicker?.headerPressDuration??80,t=L.components.datePicker?.headerReleaseDuration??100;Animated.sequence([Animated.timing(se,{toValue:.96,duration:e,useNativeDriver:!0}),Animated.timing(se,{toValue:1,duration:t,useNativeDriver:!0})]).start()}J(e=>"days"===e?"years":"years"===e?"decades":"years"),we()},[we,se,b,Y.reduced,L.components.datePicker]),Se=useCallback(e=>{const t=resolveHaptic(b,"selection");t&&triggerHaptic(t),G(t=>new Date(e,t.getMonth(),1)),J("days"),we()},[we,b]),je=useCallback(e=>{const t=resolveHaptic(b,"selection");t&&triggerHaptic(t),G(t=>new Date(e+4,t.getMonth(),1)),J("years"),we()},[we,b]),ke=useCallback(e=>{if(de(e.date))return;const t=resolveHaptic(b,"selection");t&&triggerHaptic(t),X(e.date),e.inMonth||G(new Date(e.date.getFullYear(),e.date.getMonth(),1)),Y.reduced||(setNativeValue(re,.7),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,Y.reduced,re,L.motion.spring.bouncy,b]),Pe=useCallback(()=>{_||I(!1),r?.()},[_,r]),Ae=useCallback(()=>{"modal"===n?Animated.parallel([Animated.timing(K,{toValue:0,duration:Y.duration("normal"),easing:Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!1}),Animated.timing(Q,{toValue:0,duration:Y.duration("fast"),easing:Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{Pe()}):Pe()},[K,n,Pe,Y,Q,L.motion.easing.accelerate]),{handleGesture:Te,opacity:Re}=useDragToDismiss({drag:U,travel:()=>ee.current||320,onDismiss:Ae}),Ve=useMemo(()=>Animated.multiply(Q,Re),[Q,Re]),Me=useMemo(()=>K.interpolate({inputRange:[0,1],outputRange:[transparentOf(L.colors.background.overlay),L.colors.background.overlay]}),[K,L.colors.background.overlay]);useEffect(()=>{if("modal"===n&&F){K.setValue(0),setNativeValue(Q,0),setNativeValue(U,0),setNativeValue(Re,1);const e=Y.reduced?Animated.timing(Q,{toValue:1,duration:Y.duration("normal"),useNativeDriver:!0}):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=Animated.parallel([Animated.timing(K,{toValue:1,duration:Y.duration("normal"),easing:Easing.out(Easing.cubic),useNativeDriver:!1}),e]);return t.start(),()=>t.stop()}},[F,n,K,Y,Q,U,Re,L.motion]);const Ie=useCallback(()=>{!1!==b&&triggerHaptic("selection"),Ae()},[Ae,b]),Fe=useCallback(()=>{q&&(!1!==b&&triggerHaptic("notificationSuccess"),a?.(q),Ae())},[Ae,a,q,b]),Be=Q.interpolate({inputRange:[0,1],outputRange:Y.range(320,0)}),Le=_jsx(View,{style:N.titleRow,children:_jsx(Text,{style:N.title,accessibilityRole:"header",children:d})}),Ye=_jsxs(View,{style:[N.card,g,y],accessibilityRole:"modal"===n?void 0:"none",accessible:!1,testID:B,children:["modal"===n?_jsx(GestureDetector,{gesture:Te,children:_jsxs(View,{style:N.grabArea,children:[_jsx(View,{style:N.handle}),Le]})}):Le,_jsxs(View,{style:N.headerRow,children:[_jsx(Pressable,{onPress:De,style:({pressed:e})=>[N.navBtn,e&&N.navBtnPressed,h],accessibilityRole:"button",accessibilityLabel:"days"===Z?"Previous month":"years"===Z?"Previous years":"Previous decades",hitSlop:8,children:_jsx(Text,{style:N.navText,children:"‹"})}),_jsx(Pressable,{onPress:Ce,style:[N.headerLabelWrap,p],accessibilityRole:"button",accessibilityLabel:"days"===Z?`${he}, switch to year selection`:"years"===Z?`${he}, switch to decade selection`:`${he}, switch to year selection`,hitSlop:8,children:_jsxs(Animated.View,{style:[N.headerLabelInner,{transform:[{scale:se}],opacity:"days"===Z?ae:1}],children:[_jsx(Animated.Text,{style:[N.headerLabel,{transform:[{translateX:"days"===Z?te:0}]}],accessibilityLiveRegion:"polite",children:he}),_jsx(View,{style:N.headerCaret,children:(L.icons?.chevronDown??defaultIcons.chevronDown)({size:L.typography.fontSize.sm,color:L.colors.text.secondary})})]})}),_jsx(Pressable,{onPress:ve,style:({pressed:e})=>[N.navBtn,e&&N.navBtnPressed,h],accessibilityRole:"button",accessibilityLabel:"days"===Z?"Next month":"years"===Z?"Next years":"Next decades",hitSlop:8,children:_jsx(Text,{style:N.navText,children:"›"})})]}),"days"===Z?_jsxs(_Fragment,{children:[_jsx(View,{style:N.weekdayRow,children:ye.map((e,t)=>_jsx(View,{style:N.weekdayCell,children:_jsx(Text,{style:N.weekdayText,children:e})},`${e}-${t}`))}),_jsx(Animated.View,{style:[N.grid,{opacity:ae,transform:[{translateX:te}]}],children:Array.from({length:6}).map((e,t)=>_jsx(View,{style:N.gridRow,children:ue.slice(7*t,7*t+7).map(e=>{const t=de(e.date),a=!!q&&isSameDay(e.date,q),r=isSameDay(e.date,H),i=a?L.colors.primary:"transparent",o=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,n=t?.3:e.inMonth?1:.4;return _jsx(Pressable,{disabled:t,onPress:()=>ke(e),accessibilityRole:"button",accessibilityLabel:pe.format(e.date),accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:N.dayCell,children:_jsx(Animated.View,{style:[N.dayInner,{backgroundColor:i,borderColor:o,borderWidth:r&&!a?1.5:0,opacity:n},a?{transform:[{scale:re}]}:null],children:_jsx(Text,{style:[N.dayText,{color:s}],children:e.date.getDate()})})},e.iso)})},`r-${t}`))})]}):_jsx(Animated.View,"years"===Z?{style:[N.yearGrid,{opacity:ie,transform:[{scale:oe}]}],children:Array.from({length:3}).map((e,t)=>_jsx(View,{style:N.gridRow,children:me.slice(4*t,4*t+4).map(e=>{const t=fe(e),a=!!q&&q.getFullYear()===e,r=H.getFullYear()===e,i=a?L.colors.primary:"transparent",o=r&&!a?L.colors.primary:"transparent",s=a?L.colors.onPrimary:t?L.colors.text.disabled:L.colors.text.primary,n=t?.3:1;return _jsx(Pressable,{disabled:t,onPress:()=>Se(e),accessibilityRole:"button",accessibilityLabel:`Year ${e}`,accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:N.yearCell,children:_jsx(View,{style:[N.yearInner,{backgroundColor:i,borderColor:o,borderWidth:r&&!a?1.5:0,opacity:n}],children:_jsx(Text,{style:[N.yearText,{color:s}],children:e})})},`year-${e}`)})},`yr-${t}`))}:{style:[N.yearGrid,{opacity:ie,transform:[{scale:oe}]}],children:Array.from({length:3}).map((e,t)=>_jsx(View,{style:N.gridRow,children:ge.slice(4*t,4*t+4).map(e=>{const t=e+10-1,a=be(e),r=!!q&&decadeStartFor(q.getFullYear())===e,i=decadeStartFor(H.getFullYear())===e,o=r?L.colors.primary:"transparent",s=i&&!r?L.colors.primary:"transparent",n=r?L.colors.onPrimary:a?L.colors.text.disabled:L.colors.text.primary,l=a?.3:1;return _jsx(Pressable,{disabled:a,onPress:()=>je(e),accessibilityRole:"button",accessibilityLabel:`Decade ${e} to ${t}`,accessibilityState:{selected:r,disabled:a},"aria-selected":r,"aria-disabled":a,style:N.yearCell,children:_jsxs(View,{style:[N.yearInner,{backgroundColor:o,borderColor:s,borderWidth:i&&!r?1.5:0,opacity:l}],children:[_jsx(Text,{style:[N.yearText,{color:n}],children:`${e}s`}),_jsx(Text,{style:[N.decadeRangeText,{color:r?L.colors.onPrimary:L.colors.text.tertiary}],children:`${e}-${t}`})]})},`decade-${e}`)})},`dec-${t}`))}),_jsxs(View,{style:N.footer,children:[_jsx(Pressable,{onPress:Ie,style:({pressed:e})=>[N.footerBtn,N.footerCancel,e&&N.footerBtnPressed,f],accessibilityRole:"button",accessibilityLabel:m,children:_jsx(Text,{style:[N.footerBtnText,{color:L.colors.text.secondary}],children:m})}),_jsx(Pressable,{onPress:Fe,disabled:!q,style:({pressed:e})=>[N.footerBtn,N.footerConfirm,{backgroundColor:L.colors.primary,opacity:q?1:.5},e&&{backgroundColor:L.colors.primaryHover},f],accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{disabled:!q},"aria-disabled":!q,children:_jsx(Text,{style:[N.footerBtnText,{color:L.colors.onPrimary}],children:u})})]})]}),$e=t?(R??(e=>e.toLocaleDateString()))(t):void 0,ze=!_;if("inline"===n)return F||ze?ze?_jsxs(_Fragment,{children:[_jsx(PickerTrigger,{label:D,value:$e,placeholder:v,helperText:w,error:C,required:S,disabled:j,size:k,variant:P,clearable:A,onClear:T,onPress:()=>I(!0),triggerStyle:V,testID:x}),F?Ye:null]}):Ye:null;const Ne=_jsx(Modal,{visible:F,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:Ae,children:_jsx(ModalSafeArea,{onInsets:z,children:_jsxs(AnimatedGestureRoot,{collapsable:!1,style:[N.backdrop,{backgroundColor:Me}],children:[_jsx(Pressable,{style:StyleSheet.absoluteFill,onPress:Ae,accessibilityLabel:"Dismiss"}),_jsx(Animated.View,{style:[N.sheetWrap,{paddingBottom:Math.max($.bottom,L.spacing.lg),opacity:Ve,transform:[{translateY:Animated.add(Be,U)}]}],onLayout:e=>{ee.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:Ye}),_jsx(ToastHost,{})]})})});return ze?_jsxs(_Fragment,{children:[_jsx(PickerTrigger,{label:D,value:$e,placeholder:v,helperText:w,error:C,required:S,disabled:j,size:k,variant:P,clearable:A,onClear:T,onPress:()=>I(!0),triggerStyle:V,testID:x}),Ne]}):Ne},buildStyles=e=>{const t=e.shadows.lg;return StyleSheet.create({backdrop:{...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,...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,...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,...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,...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,...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,...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}})};export{DatePicker};export default DatePicker;
1
+ "use strict";import{useCallback,useEffect,useMemo,useRef,useState}from"react";import{AccessibilityInfo,Animated,Easing,Modal,Pressable,StyleSheet,Text,View}from"react-native";import{GestureDetector,GestureHandlerRootView}from"react-native-gesture-handler";import{useDragToDismiss}from"../../hooks/useDragToDismiss.js";import{usePresenceMotion}from"../../hooks/usePresenceMotion.js";import{createAnimatedValue,setNativeValue,useTheme}from"../../theme/index.js";import{fontSizeOf,radiusOf,spaceOf}from"../../theme/scale.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{ModalSafeArea,useModalInsets}from"../ModalSafeArea/ModalSafeArea.js";import{PickerTrigger}from"../PickerTrigger/index.js";import{ToastHost}from"../Toast/ToastProvider.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const AnimatedGestureRoot=Animated.createAnimatedComponent(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,s=[];for(let e=0;e<42;e+=1){const t=new Date(a,r,1-i+e);s.push({date:t,inMonth:t.getMonth()===r,iso:toIso(t)})}return s},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),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:s,disabledDates:o,mode:n="modal",locale:l="en-IN",weekStartsOn:c=0,title:d="Select Date",confirmLabel:u="Confirm",cancelLabel:m="Cancel",style:g,containerStyle:y,headerLabelStyle:p,navButtonStyle:h,footerButtonStyle:f,haptic:b,testID:x,label:v,placeholder:D,helperText:w,error:C,required:S,disabled:j,size:k,variant:P,clearable:T,onClear:A,formatValue:R,triggerStyle:V}=e,M=void 0!==e.visible,[_,I]=useState(!1),F=M?e.visible:_,z=M?x:x?`${x}-calendar`:void 0,L=useTheme(),Y=usePresenceMotion(),[$,B]=useModalInsets(),N=useMemo(()=>buildStyles(L),[L]),[H,O]=useState(()=>startOfDay(new Date));useEffect(()=>{F&&O(startOfDay(new Date))},[F]);const W=t?startOfDay(t):H,[E,G]=useState(W),[q,X]=useState(t?startOfDay(t):null),[Z,J]=useState("days"),K=useRef(createAnimatedValue(0)).current,Q=useRef(createAnimatedValue(0)).current,U=useRef(createAnimatedValue(0)).current,ee=useRef(0),te=useRef(createAnimatedValue(0)).current,ae=useRef(createAnimatedValue(1)).current,re=useRef(createAnimatedValue(1)).current,ie=useRef(createAnimatedValue(1)).current,se=useRef(createAnimatedValue(1)).current,oe=useRef(createAnimatedValue(1)).current;useEffect(()=>{if(t){const e=startOfDay(t);X(e),G(e)}else X(null)},[t]);const ne=useMemo(()=>{const e=new Set;return o?.forEach(t=>e.add(toIso(startOfDay(t)))),e},[o]),le=useMemo(()=>i?startOfDay(i):null,[i]),ce=useMemo(()=>s?startOfDay(s):null,[s]),de=useCallback(e=>!!(le&&e.getTime()<le.getTime())||(!!(ce&&e.getTime()>ce.getTime())||!!ne.has(toIso(e))),[le,ce,ne]),ue=useMemo(()=>buildMonthMatrix(E,c),[E,c]),me=useMemo(()=>buildYearCells(E.getFullYear()),[E]),ge=useMemo(()=>buildDecadeCells(E.getFullYear()),[E]),ye=useMemo(()=>weekdayLabels(l,c),[l,c]),pe=useMemo(()=>new Intl.DateTimeFormat(l,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),[l]),he=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]),fe=useCallback(e=>!!(le&&e<le.getFullYear())||!!(ce&&e>ce.getFullYear()),[le,ce]),be=useCallback(e=>!!(le&&e+10-1<le.getFullYear())||!!(ce&&e>ce.getFullYear()),[le,ce]),xe=useCallback(e=>{!1!==b&&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,[s]=Y.range(-t*a,0),[o]=Y.range(t*a,0),n=Y.reduced?Y.duration("fast"):r,c=Y.reduced?Y.duration("fast"):i;Animated.sequence([Animated.parallel([Animated.timing(te,{toValue:s,duration:r,easing:Easing.out(Easing.quad),useNativeDriver:!0}),Animated.timing(ae,{toValue:0,duration:n,useNativeDriver:!0})]),Animated.timing(te,{toValue:o,duration:0,useNativeDriver:!0}),Animated.parallel([Animated.timing(te,{toValue:0,duration:i,easing:Easing.out(Easing.cubic),useNativeDriver:!0}),Animated.timing(ae,{toValue:1,duration:c,useNativeDriver:!0})])]).start();const d=addMonths(E,e);G(d),AccessibilityInfo.announceForAccessibility(formatMonthYear(d,l))},[E,b,l,ae,te,Y,L.components.datePicker,L.motion.duration.fast]),ve=useCallback(()=>{"days"!==Z?(!1!==b&&triggerHaptic("impactLight"),G("years"===Z?e=>new Date(e.getFullYear()-12,e.getMonth(),1):e=>new Date(e.getFullYear()-120,e.getMonth(),1))):xe(-1)},[xe,Z,b]),De=useCallback(()=>{"days"!==Z?(!1!==b&&triggerHaptic("impactLight"),G("years"===Z?e=>new Date(e.getFullYear()+12,e.getMonth(),1):e=>new Date(e.getFullYear()+120,e.getMonth(),1))):xe(1)},[xe,Z,b]),we=useCallback(()=>{const[e]=Y.range(.9,1),t=Y.reduced?Y.duration("normal"):L.components.datePicker?.viewTransitionDuration??L.motion.duration.normal??200;setNativeValue(ie,0),setNativeValue(se,e),Animated.parallel([Animated.timing(ie,{toValue:1,duration:t,easing:Easing.out(Easing.cubic),useNativeDriver:!0}),Animated.timing(se,{toValue:1,duration:t,easing:Easing.out(Easing.cubic),useNativeDriver:!0})]).start()},[ie,se,Y,L.components.datePicker,L.motion.duration.normal]),Ce=useCallback(()=>{const e=resolveHaptic(b,"selection");if(e&&triggerHaptic(e),!Y.reduced){const e=L.components.datePicker?.headerPressDuration??80,t=L.components.datePicker?.headerReleaseDuration??100;Animated.sequence([Animated.timing(oe,{toValue:.96,duration:e,useNativeDriver:!0}),Animated.timing(oe,{toValue:1,duration:t,useNativeDriver:!0})]).start()}J(e=>"days"===e?"years":"years"===e?"decades":"years"),we()},[we,oe,b,Y.reduced,L.components.datePicker]),Se=useCallback(e=>{const t=resolveHaptic(b,"selection");t&&triggerHaptic(t),G(t=>new Date(e,t.getMonth(),1)),J("days"),we()},[we,b]),je=useCallback(e=>{const t=resolveHaptic(b,"selection");t&&triggerHaptic(t),G(t=>new Date(e+4,t.getMonth(),1)),J("years"),we()},[we,b]),ke=useCallback(e=>{if(de(e.date))return;const t=resolveHaptic(b,"selection");t&&triggerHaptic(t),X(e.date),e.inMonth||G(new Date(e.date.getFullYear(),e.date.getMonth(),1)),Y.reduced||(setNativeValue(re,.7),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,Y.reduced,re,L.motion.spring.bouncy,b]),Pe=useCallback(()=>{M||I(!1),r?.()},[M,r]),Te=useCallback(()=>{"modal"===n?Animated.parallel([Animated.timing(K,{toValue:0,duration:Y.duration("normal"),easing:Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!1}),Animated.timing(Q,{toValue:0,duration:Y.duration("fast"),easing:Easing.bezier(...L.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{Pe()}):Pe()},[K,n,Pe,Y,Q,L.motion.easing.accelerate]),{handleGesture:Ae,opacity:Re}=useDragToDismiss({drag:U,travel:()=>ee.current||320,onDismiss:Te}),Ve=useMemo(()=>Animated.multiply(Q,Re),[Q,Re]),Me=useMemo(()=>K.interpolate({inputRange:[0,1],outputRange:[transparentOf(L.colors.background.overlay),L.colors.background.overlay]}),[K,L.colors.background.overlay]);useEffect(()=>{if("modal"===n&&F){K.setValue(0),setNativeValue(Q,0),setNativeValue(U,0),setNativeValue(Re,1);const e=Y.reduced?Animated.timing(Q,{toValue:1,duration:Y.duration("normal"),useNativeDriver:!0}):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=Animated.parallel([Animated.timing(K,{toValue:1,duration:Y.duration("normal"),easing:Easing.out(Easing.cubic),useNativeDriver:!1}),e]);return t.start(),()=>t.stop()}},[F,n,K,Y,Q,U,Re,L.motion]);const Ie=useCallback(()=>{!1!==b&&triggerHaptic("selection"),Te()},[Te,b]),Fe=useCallback(()=>{q&&(!1!==b&&triggerHaptic("notificationSuccess"),a?.(q),Te())},[Te,a,q,b]),ze=Q.interpolate({inputRange:[0,1],outputRange:Y.range(320,0)}),Le=_jsx(View,{style:N.titleRow,children:_jsx(Text,{style:N.title,accessibilityRole:"header",children:d})}),Ye=_jsxs(View,{style:[N.card,g,y],accessibilityRole:"modal"===n?void 0:"none",accessible:!1,testID:z,children:["modal"===n?_jsx(GestureDetector,{gesture:Ae,children:_jsxs(View,{style:N.grabArea,children:[_jsx(View,{style:N.handle}),Le]})}):Le,_jsxs(View,{style:N.headerRow,children:[_jsx(Pressable,{onPress:ve,style:({pressed:e})=>[N.navBtn,e&&N.navBtnPressed,h],accessibilityRole:"button",accessibilityLabel:"days"===Z?"Previous month":"years"===Z?"Previous years":"Previous decades",hitSlop:8,children:_jsx(Text,{style:N.navText,children:"‹"})}),_jsx(Pressable,{onPress:Ce,style:[N.headerLabelWrap,p],accessibilityRole:"button",accessibilityLabel:"days"===Z?`${he}, switch to year selection`:"years"===Z?`${he}, switch to decade selection`:`${he}, switch to year selection`,hitSlop:8,children:_jsxs(Animated.View,{style:[N.headerLabelInner,{transform:[{scale:oe}],opacity:"days"===Z?ae:1}],children:[_jsx(Animated.Text,{style:[N.headerLabel,{transform:[{translateX:"days"===Z?te:0}]}],accessibilityLiveRegion:"polite",children:he}),_jsx(View,{style:N.headerCaret,children:(L.icons?.chevronDown??defaultIcons.chevronDown)({size:L.typography.fontSize.sm,color:L.colors.text.secondary})})]})}),_jsx(Pressable,{onPress:De,style:({pressed:e})=>[N.navBtn,e&&N.navBtnPressed,h],accessibilityRole:"button",accessibilityLabel:"days"===Z?"Next month":"years"===Z?"Next years":"Next decades",hitSlop:8,children:_jsx(Text,{style:N.navText,children:"›"})})]}),"days"===Z?_jsxs(_Fragment,{children:[_jsx(View,{style:N.weekdayRow,children:ye.map((e,t)=>_jsx(View,{style:N.weekdayCell,children:_jsx(Text,{style:N.weekdayText,children:e})},`${e}-${t}`))}),_jsx(Animated.View,{style:[N.grid,{opacity:ae,transform:[{translateX:te}]}],children:Array.from({length:6}).map((e,t)=>_jsx(View,{style:N.gridRow,children:ue.slice(7*t,7*t+7).map(e=>{const t=de(e.date),a=!!q&&isSameDay(e.date,q),r=isSameDay(e.date,H),i=a?L.colors.primary:"transparent",s=r&&!a?L.colors.primary:"transparent",o=a?L.colors.onPrimary:e.inMonth?t?L.colors.text.disabled:L.colors.text.primary:L.colors.text.tertiary,n=t?.3:e.inMonth?1:.4;return _jsx(Pressable,{disabled:t,onPress:()=>ke(e),accessibilityRole:"button",accessibilityLabel:pe.format(e.date),accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:N.dayCell,children:_jsx(Animated.View,{style:[N.dayInner,{backgroundColor:i,borderColor:s,borderWidth:r&&!a?1.5:0,opacity:n},a?{transform:[{scale:re}]}:null],children:_jsx(Text,{style:[N.dayText,{color:o}],children:e.date.getDate()})})},e.iso)})},`r-${t}`))})]}):_jsx(Animated.View,"years"===Z?{style:[N.yearGrid,{opacity:ie,transform:[{scale:se}]}],children:Array.from({length:3}).map((e,t)=>_jsx(View,{style:N.gridRow,children:me.slice(4*t,4*t+4).map(e=>{const t=fe(e),a=!!q&&q.getFullYear()===e,r=H.getFullYear()===e,i=a?L.colors.primary:"transparent",s=r&&!a?L.colors.primary:"transparent",o=a?L.colors.onPrimary:t?L.colors.text.disabled:L.colors.text.primary,n=t?.3:1;return _jsx(Pressable,{disabled:t,onPress:()=>Se(e),accessibilityRole:"button",accessibilityLabel:`Year ${e}`,accessibilityState:{selected:a,disabled:t},"aria-selected":a,"aria-disabled":t,style:N.yearCell,children:_jsx(View,{style:[N.yearInner,{backgroundColor:i,borderColor:s,borderWidth:r&&!a?1.5:0,opacity:n}],children:_jsx(Text,{style:[N.yearText,{color:o}],children:e})})},`year-${e}`)})},`yr-${t}`))}:{style:[N.yearGrid,{opacity:ie,transform:[{scale:se}]}],children:Array.from({length:3}).map((e,t)=>_jsx(View,{style:N.gridRow,children:ge.slice(4*t,4*t+4).map(e=>{const t=e+10-1,a=be(e),r=!!q&&decadeStartFor(q.getFullYear())===e,i=decadeStartFor(H.getFullYear())===e,s=r?L.colors.primary:"transparent",o=i&&!r?L.colors.primary:"transparent",n=r?L.colors.onPrimary:a?L.colors.text.disabled:L.colors.text.primary,l=a?.3:1;return _jsx(Pressable,{disabled:a,onPress:()=>je(e),accessibilityRole:"button",accessibilityLabel:`Decade ${e} to ${t}`,accessibilityState:{selected:r,disabled:a},"aria-selected":r,"aria-disabled":a,style:N.yearCell,children:_jsxs(View,{style:[N.yearInner,{backgroundColor:s,borderColor:o,borderWidth:i&&!r?1.5:0,opacity:l}],children:[_jsx(Text,{style:[N.yearText,{color:n}],children:`${e}s`}),_jsx(Text,{style:[N.decadeRangeText,{color:r?L.colors.onPrimary:L.colors.text.tertiary}],children:`${e}-${t}`})]})},`decade-${e}`)})},`dec-${t}`))}),_jsxs(View,{style:N.footer,children:[_jsx(Pressable,{onPress:Ie,style:({pressed:e})=>[N.footerBtn,N.footerCancel,e&&N.footerBtnPressed,f],accessibilityRole:"button",accessibilityLabel:m,children:_jsx(Text,{style:[N.footerBtnText,{color:L.colors.text.secondary}],children:m})}),_jsx(Pressable,{onPress:Fe,disabled:!q,style:({pressed:e})=>[N.footerBtn,N.footerConfirm,{backgroundColor:L.colors.primary,opacity:q?1:.5},e&&{backgroundColor:L.colors.primaryHover},f],accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{disabled:!q},"aria-disabled":!q,children:_jsx(Text,{style:[N.footerBtnText,{color:L.colors.onPrimary}],children:u})})]})]}),$e=t?(R??(e=>e.toLocaleDateString()))(t):void 0,Be=!M;if("inline"===n)return F||Be?Be?_jsxs(_Fragment,{children:[_jsx(PickerTrigger,{label:v,value:$e,placeholder:D,helperText:w,error:C,required:S,disabled:j,size:k,variant:P,clearable:T,onClear:A,onPress:()=>I(!0),triggerStyle:V,testID:x}),F?Ye:null]}):Ye:null;const Ne=_jsx(Modal,{visible:F,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:Te,children:_jsx(ModalSafeArea,{onInsets:B,children:_jsxs(AnimatedGestureRoot,{collapsable:!1,style:[N.backdrop,{backgroundColor:Me}],children:[_jsx(Pressable,{style:StyleSheet.absoluteFill,onPress:Te,accessibilityLabel:"Dismiss"}),_jsx(Animated.View,{style:[N.sheetWrap,{paddingBottom:Math.max($.bottom,L.spacing.lg),opacity:Ve,transform:[{translateY:Animated.add(ze,U)}]}],onLayout:e=>{ee.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:Ye}),_jsx(ToastHost,{})]})})});return Be?_jsxs(_Fragment,{children:[_jsx(PickerTrigger,{label:v,value:$e,placeholder:D,helperText:w,error:C,required:S,disabled:j,size:k,variant:P,clearable:T,onClear:A,onPress:()=>I(!0),triggerStyle:V,testID:x}),Ne]}):Ne},buildStyles=e=>{const t=e.shadows.lg,a=e.components.datePicker;return StyleSheet.create({backdrop:{...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,...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.pill,...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.pill,...smoothCorners,alignItems:"center",justifyContent:"center",backgroundColor:e.colors.background.secondary},navBtnPressed:{backgroundColor:e.colors.surface.pressed},navText:{fontSize:fontSizeOf(e,a?.navText??"2xl","components.datePicker.navText"),lineHeight:a?.navTextLineHeight??26,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:spaceOf(e,a?.dayCellPadding??"xxs","components.datePicker.dayCellPadding")},dayInner:{width:"100%",height:"100%",borderRadius:radiusOf(e,a?.dayInnerRadius??"pill","components.datePicker.dayInnerRadius"),...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:spaceOf(e,a?.yearCellPadding??"xs","components.datePicker.yearCellPadding")},yearInner:{width:"100%",height:"100%",borderRadius:radiusOf(e,a?.yearInnerRadius??"lg","components.datePicker.yearInnerRadius"),...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:spaceOf(e,a?.decadeRangeMarginTop??"xxs","components.datePicker.decadeRangeMarginTop")},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,...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}})};export{DatePicker};export default DatePicker;
@@ -1 +1 @@
1
- "use strict";import{forwardRef,useCallback,useEffect,useMemo,useRef,useState}from"react";import{Animated,Easing,Modal,Pressable,StyleSheet,Text,View}from"react-native";import{GestureDetector,GestureHandlerRootView}from"react-native-gesture-handler";import{useDragToDismiss}from"../../hooks/useDragToDismiss.js";import{usePresenceMotion}from"../../hooks/usePresenceMotion.js";import{createAnimatedValue,setNativeValue,useTheme}from"../../theme/index.js";import{triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{Calendar}from"../Calendar/index.js";import{daysBetween,startOfDay,startOfMonth}from"../Calendar/calendarDates.js";import{ModalSafeArea,useModalInsets}from"../ModalSafeArea/ModalSafeArea.js";import{PickerTrigger}from"../PickerTrigger/index.js";import{ToastHost}from"../Toast/ToastProvider.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const AnimatedGestureRoot=Animated.createAnimatedComponent(GestureHandlerRootView),transparentOf=e=>{const t=e.match(/^rgba?\(([^)]+)\)$/);if(!t)return"transparent";const[a,r,s]=t[1].split(",").map(e=>e.trim());return`rgba(${a}, ${r}, ${s}, 0)`},formatRangePart=(e,t)=>new Intl.DateTimeFormat(t,{weekday:"short",day:"numeric",month:"short"}).format(e),DateRangePicker=forwardRef((e,t)=>{const{visible:a,value:r,onChange:s,onClose:o,label:n,placeholder:i,helperText:l,error:d,required:c,disabled:u,size:m,variant:g,clearable:p,onClear:f,formatValue:h,triggerStyle:y,minDate:b,maxDate:x,disabledDates:D,markedDates:v,strikeMarkedInRange:R,locale:S="en-IN",weekStartsOn:j=0,title:k="Select Date Range",confirmLabel:C="Confirm",cancelLabel:w="Cancel",maxRange:T,haptic:P,style:M,containerStyle:V,headerLabelStyle:A,navButtonStyle:_,footerButtonStyle:B,testID:O}=e,I=void 0!==a,[H,z]=useState(!1),L=I?a:H,N=I?O:O?`${O}-calendar`:void 0,$=useTheme(),E=usePresenceMotion(),[G,W]=useModalInsets(),F=useMemo(()=>buildStyles($),[$]),[q,Y]=useState(()=>startOfMonth(r.start??new Date)),[J,K]=useState(r.start?startOfDay(r.start):null),[Q,U]=useState(r.end?startOfDay(r.end):null),X=useRef(createAnimatedValue(0)).current,Z=useRef(createAnimatedValue(0)).current,ee=useRef(createAnimatedValue(0)).current,te=useRef(0);useEffect(()=>{if(r.start){const e=startOfDay(r.start);K(e),Y(startOfMonth(e))}else K(null);r.end?U(startOfDay(r.end)):U(null)},[r.start,r.end]);const ae=useCallback(e=>{if(e.end&&T&&daysBetween(e.start,e.end)+1>T)return!1!==P&&triggerHaptic("notificationWarning"),K(e.end),void U(null);K(e.start),U(e.end??null)},[T,P]),re=useCallback(()=>{I?o?.():z(!1)},[I,o]),se=useCallback(()=>{Animated.parallel([Animated.timing(X,{toValue:0,duration:E.duration("normal"),easing:Easing.bezier(...$.motion.easing.accelerate),useNativeDriver:!1}),Animated.timing(Z,{toValue:0,duration:E.duration("fast"),easing:Easing.bezier(...$.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{re()})},[X,re,E,Z,$.motion.easing.accelerate]),{handleGesture:oe,opacity:ne}=useDragToDismiss({drag:ee,travel:()=>te.current||320,onDismiss:se}),ie=useMemo(()=>Animated.multiply(Z,ne),[Z,ne]),le=useMemo(()=>X.interpolate({inputRange:[0,1],outputRange:[transparentOf($.colors.background.overlay),$.colors.background.overlay]}),[X,$.colors.background.overlay]);useEffect(()=>{let e;if(L){X.setValue(0),setNativeValue(Z,0),setNativeValue(ee,0),setNativeValue(ne,1);const t=E.reduced?Animated.timing(Z,{toValue:1,duration:E.duration("normal"),useNativeDriver:!0}):Animated.spring(Z,{toValue:1,damping:$.motion.spring.gentle.damping,stiffness:$.motion.spring.gentle.stiffness,mass:$.motion.spring.gentle.mass,useNativeDriver:!0});e=Animated.parallel([Animated.timing(X,{toValue:1,duration:E.duration("normal"),easing:Easing.out(Easing.cubic),useNativeDriver:!1}),t]),e.start()}return()=>e?.stop()},[L,X,E,Z,ee,ne,$.motion]);const de=useCallback(()=>{!1!==P&&triggerHaptic("selection"),se()},[se,P]),ce=useCallback(()=>{J&&Q&&(!1!==P&&triggerHaptic("notificationSuccess"),s?.({start:J,end:Q}),se())},[se,s,J,Q,P]),ue=Z.interpolate({inputRange:[0,1],outputRange:E.range(320,0)}),me=useMemo(()=>J&&Q?`${formatRangePart(J,S)} — ${formatRangePart(Q,S)}`:J?`${formatRangePart(J,S)} — …`:"—",[J,Q,S]),ge=!J||!Q,pe=_jsxs(View,{style:[F.card,M,V],ref:t,accessible:!1,testID:N,children:[_jsx(GestureDetector,{gesture:oe,children:_jsxs(View,{style:F.grabArea,children:[_jsx(View,{style:F.handle}),_jsxs(View,{style:F.titleRow,children:[_jsx(Text,{style:F.title,accessibilityRole:"header",children:k}),_jsx(Text,{style:F.subtitle,accessibilityLiveRegion:"polite",children:me})]})]})}),_jsx(Calendar,{mode:"range",value:J?{start:J,end:Q??void 0}:null,onChange:ae,month:q,onMonthChange:Y,minDate:b,maxDate:x,disabledDates:D,markedDates:v,strikeMarkedInRange:R,weekStartsOn:j,locale:S,haptic:P,headerLabelStyle:A,navButtonStyle:_,testID:N?`${N}-grid`:void 0}),_jsxs(View,{style:F.footer,children:[_jsx(Pressable,{onPress:de,style:({pressed:e})=>[F.footerBtn,F.footerCancel,e&&F.footerBtnPressed,B],accessibilityRole:"button",accessibilityLabel:w,children:_jsx(Text,{style:[F.footerBtnText,{color:$.colors.text.secondary}],children:w})}),_jsx(Pressable,{onPress:ce,disabled:ge,style:({pressed:e})=>[F.footerBtn,F.footerConfirm,{backgroundColor:$.colors.primary,opacity:ge?.5:1},e&&{backgroundColor:$.colors.primaryHover},B],accessibilityRole:"button",accessibilityLabel:C,accessibilityState:{disabled:ge},"aria-disabled":ge,children:_jsx(Text,{style:[F.footerBtnText,{color:$.colors.onPrimary}],children:C})})]})]}),fe=useMemo(()=>{if(!r.start||!r.end)return"";const e={start:r.start,end:r.end};return h?h(e):`${e.start.toLocaleDateString()} – ${e.end.toLocaleDateString()}`},[r.start,r.end,h]);return _jsxs(_Fragment,{children:[I?null:_jsx(PickerTrigger,{label:n,placeholder:i,helperText:l,error:d,required:c,disabled:u,size:m,variant:g,clearable:p,onClear:f,value:fe,onPress:()=>z(!0),triggerStyle:y,testID:O}),_jsx(Modal,{visible:L,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:se,children:_jsx(ModalSafeArea,{onInsets:W,children:_jsxs(AnimatedGestureRoot,{collapsable:!1,style:[F.backdrop,{backgroundColor:le}],children:[_jsx(Pressable,{style:StyleSheet.absoluteFill,onPress:se,accessibilityLabel:"Dismiss"}),_jsx(Animated.View,{style:[F.sheetWrap,{paddingBottom:Math.max(G.bottom,$.spacing.lg),opacity:ie,transform:[{translateY:Animated.add(ue,ee)}]}],onLayout:e=>{te.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:pe}),_jsx(ToastHost,{})]})})})]})});DateRangePicker.displayName="DateRangePicker";const buildStyles=e=>{const t=e.shadows.lg;return StyleSheet.create({backdrop:{...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,...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,...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,...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}})};export{DateRangePicker};export default DateRangePicker;
1
+ "use strict";import{forwardRef,useCallback,useEffect,useMemo,useRef,useState}from"react";import{Animated,Easing,Modal,Pressable,StyleSheet,Text,View}from"react-native";import{GestureDetector,GestureHandlerRootView}from"react-native-gesture-handler";import{useDragToDismiss}from"../../hooks/useDragToDismiss.js";import{usePresenceMotion}from"../../hooks/usePresenceMotion.js";import{createAnimatedValue,setNativeValue,useTheme}from"../../theme/index.js";import{triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{Calendar}from"../Calendar/index.js";import{daysBetween,startOfDay,startOfMonth}from"../Calendar/calendarDates.js";import{ModalSafeArea,useModalInsets}from"../ModalSafeArea/ModalSafeArea.js";import{PickerTrigger}from"../PickerTrigger/index.js";import{ToastHost}from"../Toast/ToastProvider.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const AnimatedGestureRoot=Animated.createAnimatedComponent(GestureHandlerRootView),transparentOf=e=>{const t=e.match(/^rgba?\(([^)]+)\)$/);if(!t)return"transparent";const[a,r,s]=t[1].split(",").map(e=>e.trim());return`rgba(${a}, ${r}, ${s}, 0)`},formatRangePart=(e,t)=>new Intl.DateTimeFormat(t,{weekday:"short",day:"numeric",month:"short"}).format(e),DateRangePicker=forwardRef((e,t)=>{const{visible:a,value:r,onChange:s,onClose:o,label:n,placeholder:i,helperText:l,error:d,required:c,disabled:u,size:m,variant:g,clearable:p,onClear:f,formatValue:h,triggerStyle:y,minDate:b,maxDate:x,disabledDates:D,markedDates:v,strikeMarkedInRange:R,locale:S="en-IN",weekStartsOn:j=0,title:k="Select Date Range",confirmLabel:C="Confirm",cancelLabel:w="Cancel",maxRange:T,haptic:P,style:M,containerStyle:V,headerLabelStyle:A,navButtonStyle:_,footerButtonStyle:B,testID:O}=e,I=void 0!==a,[H,z]=useState(!1),L=I?a:H,N=I?O:O?`${O}-calendar`:void 0,$=useTheme(),E=usePresenceMotion(),[G,W]=useModalInsets(),F=useMemo(()=>buildStyles($),[$]),[q,Y]=useState(()=>startOfMonth(r.start??new Date)),[J,K]=useState(r.start?startOfDay(r.start):null),[Q,U]=useState(r.end?startOfDay(r.end):null),X=useRef(createAnimatedValue(0)).current,Z=useRef(createAnimatedValue(0)).current,ee=useRef(createAnimatedValue(0)).current,te=useRef(0);useEffect(()=>{if(r.start){const e=startOfDay(r.start);K(e),Y(startOfMonth(e))}else K(null);r.end?U(startOfDay(r.end)):U(null)},[r.start,r.end]);const ae=useCallback(e=>{if(e.end&&T&&daysBetween(e.start,e.end)+1>T)return!1!==P&&triggerHaptic("notificationWarning"),K(e.end),void U(null);K(e.start),U(e.end??null)},[T,P]),re=useCallback(()=>{I?o?.():z(!1)},[I,o]),se=useCallback(()=>{Animated.parallel([Animated.timing(X,{toValue:0,duration:E.duration("normal"),easing:Easing.bezier(...$.motion.easing.accelerate),useNativeDriver:!1}),Animated.timing(Z,{toValue:0,duration:E.duration("fast"),easing:Easing.bezier(...$.motion.easing.accelerate),useNativeDriver:!0})]).start(()=>{re()})},[X,re,E,Z,$.motion.easing.accelerate]),{handleGesture:oe,opacity:ne}=useDragToDismiss({drag:ee,travel:()=>te.current||320,onDismiss:se}),ie=useMemo(()=>Animated.multiply(Z,ne),[Z,ne]),le=useMemo(()=>X.interpolate({inputRange:[0,1],outputRange:[transparentOf($.colors.background.overlay),$.colors.background.overlay]}),[X,$.colors.background.overlay]);useEffect(()=>{let e;if(L){X.setValue(0),setNativeValue(Z,0),setNativeValue(ee,0),setNativeValue(ne,1);const t=E.reduced?Animated.timing(Z,{toValue:1,duration:E.duration("normal"),useNativeDriver:!0}):Animated.spring(Z,{toValue:1,damping:$.motion.spring.gentle.damping,stiffness:$.motion.spring.gentle.stiffness,mass:$.motion.spring.gentle.mass,useNativeDriver:!0});e=Animated.parallel([Animated.timing(X,{toValue:1,duration:E.duration("normal"),easing:Easing.out(Easing.cubic),useNativeDriver:!1}),t]),e.start()}return()=>e?.stop()},[L,X,E,Z,ee,ne,$.motion]);const de=useCallback(()=>{!1!==P&&triggerHaptic("selection"),se()},[se,P]),ce=useCallback(()=>{J&&Q&&(!1!==P&&triggerHaptic("notificationSuccess"),s?.({start:J,end:Q}),se())},[se,s,J,Q,P]),ue=Z.interpolate({inputRange:[0,1],outputRange:E.range(320,0)}),me=useMemo(()=>J&&Q?`${formatRangePart(J,S)} — ${formatRangePart(Q,S)}`:J?`${formatRangePart(J,S)} — …`:"—",[J,Q,S]),ge=!J||!Q,pe=_jsxs(View,{style:[F.card,M,V],ref:t,accessible:!1,testID:N,children:[_jsx(GestureDetector,{gesture:oe,children:_jsxs(View,{style:F.grabArea,children:[_jsx(View,{style:F.handle}),_jsxs(View,{style:F.titleRow,children:[_jsx(Text,{style:F.title,accessibilityRole:"header",children:k}),_jsx(Text,{style:F.subtitle,accessibilityLiveRegion:"polite",children:me})]})]})}),_jsx(Calendar,{mode:"range",value:J?{start:J,end:Q??void 0}:null,onChange:ae,month:q,onMonthChange:Y,minDate:b,maxDate:x,disabledDates:D,markedDates:v,strikeMarkedInRange:R,weekStartsOn:j,locale:S,haptic:P,headerLabelStyle:A,navButtonStyle:_,testID:N?`${N}-grid`:void 0}),_jsxs(View,{style:F.footer,children:[_jsx(Pressable,{onPress:de,style:({pressed:e})=>[F.footerBtn,F.footerCancel,e&&F.footerBtnPressed,B],accessibilityRole:"button",accessibilityLabel:w,children:_jsx(Text,{style:[F.footerBtnText,{color:$.colors.text.secondary}],children:w})}),_jsx(Pressable,{onPress:ce,disabled:ge,style:({pressed:e})=>[F.footerBtn,F.footerConfirm,{backgroundColor:$.colors.primary,opacity:ge?.5:1},e&&{backgroundColor:$.colors.primaryHover},B],accessibilityRole:"button",accessibilityLabel:C,accessibilityState:{disabled:ge},"aria-disabled":ge,children:_jsx(Text,{style:[F.footerBtnText,{color:$.colors.onPrimary}],children:C})})]})]}),fe=useMemo(()=>{if(!r.start||!r.end)return"";const e={start:r.start,end:r.end};return h?h(e):`${e.start.toLocaleDateString()} – ${e.end.toLocaleDateString()}`},[r.start,r.end,h]);return _jsxs(_Fragment,{children:[I?null:_jsx(PickerTrigger,{label:n,placeholder:i,helperText:l,error:d,required:c,disabled:u,size:m,variant:g,clearable:p,onClear:f,value:fe,onPress:()=>z(!0),triggerStyle:y,testID:O}),_jsx(Modal,{visible:L,transparent:!0,statusBarTranslucent:!0,navigationBarTranslucent:!0,animationType:"none",onRequestClose:se,children:_jsx(ModalSafeArea,{onInsets:W,children:_jsxs(AnimatedGestureRoot,{collapsable:!1,style:[F.backdrop,{backgroundColor:le}],children:[_jsx(Pressable,{style:StyleSheet.absoluteFill,onPress:se,accessibilityLabel:"Dismiss"}),_jsx(Animated.View,{style:[F.sheetWrap,{paddingBottom:Math.max(G.bottom,$.spacing.lg),opacity:ie,transform:[{translateY:Animated.add(ue,ee)}]}],onLayout:e=>{te.current=e.nativeEvent.layout.height},accessibilityViewIsModal:!0,accessibilityRole:"none",children:pe}),_jsx(ToastHost,{})]})})})]})});DateRangePicker.displayName="DateRangePicker";const buildStyles=e=>{const t=e.shadows.lg;return StyleSheet.create({backdrop:{...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,...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.pill,...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,...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}})};export{DateRangePicker};export default DateRangePicker;
@@ -1 +1 @@
1
- "use strict";import{isValidElement,useMemo}from"react";import{StyleSheet,Text,View}from"react-native";import{fontFor,useTheme}from"../../theme/index.js";import{Notation,NotationInkContext}from"../Notation/Notation.js";import{resolveColor}from"../Text/Text.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const EMPTY_VALUE="-",rowKey=(e,t)=>e.key??("string"==typeof e.label?`${e.label}-${t}`:`row-${t}`),isEmptyValue=e=>null==e||""===e||Array.isArray(e)&&!e.length,isInlineText=e=>"string"==typeof e||"number"==typeof e||isValidElement(e)&&e.type===Notation||Array.isArray(e)&&e.length>0&&e.every(isInlineText);export const Descriptions=({items:e,columns:t=1,size:o="md",bordered:l=!1,title:r,variant:i="list",style:s,testID:n})=>{const a=useTheme(),m=useMemo(()=>buildStyles(a),[a]),d="sm"===o?a.typography.fontSize.xs:a.typography.fontSize.sm,y="sm"===o?a.typography.fontSize.sm:a.typography.fontSize.base,c="sm"===o?a.spacing.xs:a.spacing.sm,x="summary"===i,u=useMemo(()=>({fontSize:d,color:a.colors.text.tertiary}),[d,a.colors.text.tertiary]),p=useMemo(()=>({fontSize:y,color:a.colors.text.secondary}),[y,a.colors.text.secondary]);return _jsxs(View,{style:[x?null:{gap:c},s],testID:n,children:[r?_jsx(Text,{style:[m.title,{fontSize:a.typography.fontSize.lg,color:a.colors.text.primary}],children:r}):null,e.map((e,o)=>{const r=isEmptyValue(e.value),i=2===t&&!e.full,s=r?a.colors.text.tertiary:resolveColor(a,e.tone??"primary"),n=fontFor(a,e.strong?"semibold":"normal"),f=r||isInlineText(e.value),h=r?"-":"string"==typeof e.value?e.value:_jsx(NotationInkContext.Provider,{value:{fontSize:y,color:s},children:e.value});return _jsxs(View,x?{style:[m.summaryRow,{paddingVertical:c,borderBottomColor:a.colors.border.secondary}],children:[_jsx(Text,{style:[m.summaryLabel,{fontSize:y,color:a.colors.text.secondary}],children:_jsx(NotationInkContext.Provider,{value:p,children:e.label})}),f?_jsx(Text,{style:[m.summaryValue,{fontSize:y,color:s},n],children:h}):_jsx(View,{style:m.summaryValueView,children:e.value})]}:{style:[i?m.rowSide:m.rowStack,{paddingVertical:c},l&&o>0?m.bordered:null,l&&o>0?{borderTopColor:a.colors.border.secondary}:null],children:["string"==typeof e.label?_jsx(Text,{style:[m.label,{fontSize:d,color:a.colors.text.tertiary},i?m.labelSide:null],children:e.label}):_jsx(View,{style:i?m.labelSide:null,children:_jsx(Text,{style:[m.label,{fontSize:d,color:a.colors.text.tertiary}],children:_jsx(NotationInkContext.Provider,{value:u,children:e.label})})}),f?_jsx(Text,{style:[m.value,{fontSize:y,color:s},e.strong?n:null,i?m.valueSide:null],children:h}):_jsx(View,{style:i?m.valueSide:null,children:e.value})]},rowKey(e,o))})]})};const buildStyles=e=>StyleSheet.create({title:{...fontFor(e,"semibold")},rowStack:{gap:2},rowSide:{flexDirection:"row",alignItems:"flex-start",gap:e.spacing.md},bordered:{borderTopWidth:StyleSheet.hairlineWidth},label:{...fontFor(e,"semibold")},labelSide:{flex:4},value:{...fontFor(e,"normal")},valueSide:{flex:6},summaryRow:{flexDirection:"row",alignItems:"center",gap:e.spacing.md,borderBottomWidth:StyleSheet.hairlineWidth},summaryLabel:{flex:1,...fontFor(e,"normal")},summaryValue:{textAlign:"right",flexShrink:1,maxWidth:"60%"},summaryValueView:{flexShrink:1,maxWidth:"60%",alignItems:"flex-end"}});export default Descriptions;
1
+ "use strict";import{isValidElement,useMemo}from"react";import{StyleSheet,Text,View}from"react-native";import{fontFor,useTheme}from"../../theme/index.js";import{Notation,NotationInkContext}from"../Notation/Notation.js";import{resolveColor}from"../Text/Text.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const EMPTY_VALUE="-",rowKey=(e,t)=>e.key??("string"==typeof e.label?`${e.label}-${t}`:`row-${t}`),isEmptyValue=e=>null==e||""===e||Array.isArray(e)&&!e.length,isInlineText=e=>"string"==typeof e||"number"==typeof e||isValidElement(e)&&e.type===Notation||Array.isArray(e)&&e.length>0&&e.every(isInlineText);export const Descriptions=({items:e,columns:t=1,size:o="md",bordered:l=!1,title:r,variant:i="list",style:s,testID:n})=>{const a=useTheme(),m=useMemo(()=>buildStyles(a),[a]),d="sm"===o?a.typography.fontSize.xs:a.typography.fontSize.sm,y="sm"===o?a.typography.fontSize.sm:a.typography.fontSize.base,c="sm"===o?a.spacing.xs:a.spacing.sm,x="summary"===i,u=useMemo(()=>({fontSize:d,color:a.colors.text.tertiary}),[d,a.colors.text.tertiary]),p=useMemo(()=>({fontSize:y,color:a.colors.text.secondary}),[y,a.colors.text.secondary]);return _jsxs(View,{style:[x?null:{gap:c},s],testID:n,children:[r?_jsx(Text,{style:[m.title,{fontSize:a.typography.fontSize.lg,color:a.colors.text.primary}],children:r}):null,e.map((e,o)=>{const r=isEmptyValue(e.value),i=2===t&&!e.full,s=r?a.colors.text.tertiary:resolveColor(a,e.tone??"primary"),n=fontFor(a,e.strong?"semibold":"normal"),f=r||isInlineText(e.value),h=r?"-":"string"==typeof e.value?e.value:_jsx(NotationInkContext.Provider,{value:{fontSize:y,color:s},children:e.value});return _jsxs(View,x?{style:[m.summaryRow,{paddingVertical:c,borderBottomColor:a.colors.border.secondary}],children:[_jsx(Text,{style:[m.summaryLabel,{fontSize:y,color:a.colors.text.secondary}],children:_jsx(NotationInkContext.Provider,{value:p,children:e.label})}),f?_jsx(Text,{style:[m.summaryValue,{fontSize:y,color:s},n],children:h}):_jsx(View,{style:m.summaryValueView,children:e.value})]}:{style:[i?m.rowSide:m.rowStack,{paddingVertical:c},l&&o>0?m.bordered:null,l&&o>0?{borderTopColor:a.colors.border.secondary}:null],children:["string"==typeof e.label?_jsx(Text,{style:[m.label,{fontSize:d,color:a.colors.text.tertiary},i?m.labelSide:null],children:e.label}):_jsx(View,{style:i?m.labelSide:null,children:_jsx(Text,{style:[m.label,{fontSize:d,color:a.colors.text.tertiary}],children:_jsx(NotationInkContext.Provider,{value:u,children:e.label})})}),f?_jsx(Text,{style:[m.value,{fontSize:y,color:s},e.strong?n:null,i?m.valueSide:null],children:h}):_jsx(View,{style:i?m.valueSide:null,children:e.value})]},rowKey(e,o))})]})};const buildStyles=e=>StyleSheet.create({title:{...fontFor(e,"semibold")},rowStack:{gap:e.spacing.xxs},rowSide:{flexDirection:"row",alignItems:"flex-start",gap:e.spacing.md},bordered:{borderTopWidth:StyleSheet.hairlineWidth},label:{...fontFor(e,"semibold")},labelSide:{flex:4},value:{...fontFor(e,"normal")},valueSide:{flex:6},summaryRow:{flexDirection:"row",alignItems:"center",gap:e.spacing.md,borderBottomWidth:StyleSheet.hairlineWidth},summaryLabel:{flex:1,...fontFor(e,"normal")},summaryValue:{textAlign:"right",flexShrink:1,maxWidth:"60%"},summaryValueView:{flexShrink:1,maxWidth:"60%",alignItems:"flex-end"}});export default Descriptions;
@@ -1 +1 @@
1
- "use strict";import{useCallback,useMemo}from"react";import{ActivityIndicator,Pressable,StyleSheet,Text,View}from"react-native";import{fontFor,useTheme}from"../../theme/index.js";import{tintOf}from"../../utils/color.js";import{smoothCorners}from"../../utils/corners.js";import{resolveHaptic,triggerHaptic}from"../../utils/hapticUtils.js";import{MODAL_DISMISS_GRACE_MS,Modal}from"../Modal/Modal.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const Dialog=e=>{const{visible:o,onClose:r,title:t,message:i,children:n,icon:l,variant:s="default",actions:a,dismissOnAction:c=!0,accessibilityLabel:d,contentStyle:g,containerStyle:u,titleStyle:m,messageStyle:p,iconWrapperStyle:b,actionsRowStyle:y,actionButtonStyle:h,actionTextStyle:f,haptic:x,testID:S}=e,C=useTheme(),j=useMemo(()=>buildStyles(C),[C]),_=useMemo(()=>discFor(C,s),[C,s]),I=C.components.dialog,M=I?.iconWrapperSize??48,w=I?.iconWrapperBorderRadius??24,B=I?.actionButtonMinHeight??44,D=Boolean(a&&a.length>0),R=useCallback(e=>{if(e.loading||e.disabled)return;const o=resolveHaptic(x,"selection");o&&triggerHaptic(o),c?(r(),setTimeout(e.onPress,MODAL_DISMISS_GRACE_MS)):e.onPress()},[c,r,x]);return _jsx(Modal,{visible:o,onRequestClose:r,haptic:x,presentation:"centered",accessibilityLabel:d??t,contentStyle:g,testID:S,children:_jsxs(View,{accessibilityRole:"alert",accessibilityLabel:d??t,style:[j.container,u],children:[l?_jsx(View,{style:[j.iconWrapper,{width:M,height:M,borderRadius:w,...smoothCorners,backgroundColor:_,marginBottom:C.spacing.md},b],children:l}):null,t?_jsx(Text,{style:[j.title,{color:C.colors.text.primary,fontSize:C.typography.fontSize.xl,...fontFor(C,"semibold"),marginBottom:i||null!=n?C.spacing.sm:C.spacing.md},m],accessibilityRole:"header",children:t}):null,i?_jsx(Text,{style:[j.message,{color:C.colors.text.secondary,fontSize:C.typography.fontSize.base,lineHeight:C.typography.fontSize.base*C.typography.lineHeight.normal,marginBottom:null!=n?C.spacing.md:D?C.spacing.lg:0},p],children:i}):null,null!=n?_jsx(View,{style:{marginBottom:D?C.spacing.lg:0},children:n}):null,a&&a.length>0?_jsx(View,{style:[j.actionsRow,y],children:a.map((e,o)=>{const r=e.tone??"primary",t=Boolean(e.disabled),i=actionStyleFor(C,r,t),n=o===a.length-1;return _jsx(Pressable,{onPress:()=>R(e),disabled:e.loading||t,accessibilityRole:"button",accessibilityLabel:e.label,accessibilityState:{busy:e.loading,disabled:Boolean(e.loading)||t},"aria-busy":e.loading,"aria-disabled":Boolean(e.loading)||t,style:({pressed:o})=>[j.actionButton,{minHeight:B,backgroundColor:i.backgroundColor,borderColor:i.borderColor,borderWidth:i.borderWidth,borderRadius:C.radius.md,...smoothCorners,paddingVertical:C.spacing.md-2,paddingHorizontal:C.spacing.md,marginRight:n?0:C.spacing.sm,opacity:e.loading?.7:o&&!t?.85:1},h],children:e.loading?_jsx(ActivityIndicator,{size:"small",color:i.textColor}):_jsx(Text,{style:[{color:i.textColor,fontSize:C.typography.fontSize.base,...fontFor(C,"semibold"),textAlign:"center"},f],children:e.label})},`${e.label}-${o}`)})}):null]})})};Dialog.displayName="Dialog";const SOFT_DISC_OPACITY=.14,discFor=(e,o)=>{const r=e.colors.background.secondary;switch(o){case"success":return tintOf(e.colors.success,.14,r);case"warning":return tintOf(e.colors.warning,.14,r);case"error":return tintOf(e.colors.error,.14,r);case"info":return tintOf(e.colors.info,.14,r);default:return e.colors.primaryMuted}},actionStyleFor=(e,o,r)=>{if(r)return{backgroundColor:"neutral"===o?"transparent":e.colors.surface.disabled,borderColor:"neutral"===o?e.colors.border.primary:"transparent",borderWidth:"neutral"===o?1:0,textColor:e.colors.text.disabled};switch(o){case"primary":return{backgroundColor:e.colors.primary,borderColor:"transparent",borderWidth:0,textColor:e.colors.onPrimary};case"info":return{backgroundColor:e.colors.info,borderColor:"transparent",borderWidth:0,textColor:e.colors.onInfo};case"error":return{backgroundColor:e.colors.error,borderColor:"transparent",borderWidth:0,textColor:e.colors.onError};default:return{backgroundColor:"transparent",borderColor:e.colors.border.primary,borderWidth:1,textColor:e.colors.text.primary}}},buildStyles=e=>StyleSheet.create({container:{alignItems:"stretch"},iconWrapper:{alignItems:"center",justifyContent:"center",alignSelf:"center"},title:{textAlign:"center"},message:{textAlign:"center"},actionsRow:{flexDirection:"row",justifyContent:"flex-end",alignItems:"stretch"},actionButton:{flex:1,alignItems:"center",justifyContent:"center"}});export{Dialog};export default Dialog;
1
+ "use strict";import{useCallback,useMemo}from"react";import{ActivityIndicator,Pressable,StyleSheet,Text,View}from"react-native";import{fontFor,useTheme}from"../../theme/index.js";import{tintOf}from"../../utils/color.js";import{smoothCorners}from"../../utils/corners.js";import{resolveHaptic,triggerHaptic}from"../../utils/hapticUtils.js";import{MODAL_DISMISS_GRACE_MS,Modal}from"../Modal/Modal.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const Dialog=e=>{const{visible:o,onClose:t,title:r,message:i,children:l,icon:n,variant:s="default",actions:a,dismissOnAction:c=!0,accessibilityLabel:d,contentStyle:g,containerStyle:u,titleStyle:m,messageStyle:p,iconWrapperStyle:b,actionsRowStyle:y,actionButtonStyle:h,actionTextStyle:f,haptic:x,testID:S}=e,C=useTheme(),j=useMemo(()=>buildStyles(C),[C]),_=useMemo(()=>discFor(C,s),[C,s]),I=C.components.dialog,M=I?.iconWrapperSize??48,w=I?.actionButtonMinHeight??44,D=Boolean(a&&a.length>0),B=useCallback(e=>{if(e.loading||e.disabled)return;const o=resolveHaptic(x,"selection");o&&triggerHaptic(o),c?(t(),setTimeout(e.onPress,MODAL_DISMISS_GRACE_MS)):e.onPress()},[c,t,x]);return _jsx(Modal,{visible:o,onRequestClose:t,haptic:x,presentation:"centered",accessibilityLabel:d??r,contentStyle:g,testID:S,children:_jsxs(View,{accessibilityRole:"alert",accessibilityLabel:d??r,style:[j.container,u],children:[n?_jsx(View,{style:[j.iconWrapper,{width:M,height:M,borderRadius:C.radius.pill,...smoothCorners,backgroundColor:_,marginBottom:C.spacing.md},b],children:n}):null,r?_jsx(Text,{style:[j.title,{color:C.colors.text.primary,fontSize:C.typography.fontSize.xl,...fontFor(C,"semibold"),marginBottom:i||null!=l?C.spacing.sm:C.spacing.md},m],accessibilityRole:"header",children:r}):null,i?_jsx(Text,{style:[j.message,{color:C.colors.text.secondary,fontSize:C.typography.fontSize.base,lineHeight:C.typography.fontSize.base*C.typography.lineHeight.normal,marginBottom:null!=l?C.spacing.md:D?C.spacing.lg:0},p],children:i}):null,null!=l?_jsx(View,{style:{marginBottom:D?C.spacing.lg:0},children:l}):null,a&&a.length>0?_jsx(View,{style:[j.actionsRow,y],children:a.map((e,o)=>{const t=e.tone??"primary",r=Boolean(e.disabled),i=actionStyleFor(C,t,r),l=o===a.length-1;return _jsx(Pressable,{onPress:()=>B(e),disabled:e.loading||r,accessibilityRole:"button",accessibilityLabel:e.label,accessibilityState:{busy:e.loading,disabled:Boolean(e.loading)||r},"aria-busy":e.loading,"aria-disabled":Boolean(e.loading)||r,style:({pressed:o})=>[j.actionButton,{minHeight:w,backgroundColor:i.backgroundColor,borderColor:i.borderColor,borderWidth:i.borderWidth,borderRadius:C.radius.md,...smoothCorners,paddingVertical:C.spacing.sm,paddingHorizontal:C.spacing.md,marginRight:l?0:C.spacing.sm,opacity:e.loading?.7:o&&!r?.85:1},h],children:e.loading?_jsx(ActivityIndicator,{size:"small",color:i.textColor}):_jsx(Text,{style:[{color:i.textColor,fontSize:C.typography.fontSize.base,...fontFor(C,"semibold"),textAlign:"center"},f],children:e.label})},`${e.label}-${o}`)})}):null]})})};Dialog.displayName="Dialog";const SOFT_DISC_OPACITY=.14,discFor=(e,o)=>{const t=e.colors.background.secondary;switch(o){case"success":return tintOf(e.colors.success,.14,t);case"warning":return tintOf(e.colors.warning,.14,t);case"error":return tintOf(e.colors.error,.14,t);case"info":return tintOf(e.colors.info,.14,t);default:return e.colors.primaryMuted}},actionStyleFor=(e,o,t)=>{if(t)return{backgroundColor:"neutral"===o?"transparent":e.colors.surface.disabled,borderColor:"neutral"===o?e.colors.border.primary:"transparent",borderWidth:"neutral"===o?1:0,textColor:e.colors.text.disabled};switch(o){case"primary":return{backgroundColor:e.colors.primary,borderColor:"transparent",borderWidth:0,textColor:e.colors.onPrimary};case"info":return{backgroundColor:e.colors.info,borderColor:"transparent",borderWidth:0,textColor:e.colors.onInfo};case"error":return{backgroundColor:e.colors.error,borderColor:"transparent",borderWidth:0,textColor:e.colors.onError};default:return{backgroundColor:"transparent",borderColor:e.colors.border.primary,borderWidth:1,textColor:e.colors.text.primary}}},buildStyles=e=>StyleSheet.create({container:{alignItems:"stretch"},iconWrapper:{alignItems:"center",justifyContent:"center",alignSelf:"center"},title:{textAlign:"center"},message:{textAlign:"center"},actionsRow:{flexDirection:"row",justifyContent:"flex-end",alignItems:"stretch"},actionButton:{flex:1,alignItems:"center",justifyContent:"center"}});export{Dialog};export default Dialog;
@@ -1 +1 @@
1
- "use strict";import{forwardRef,useMemo}from"react";import{Animated,Pressable,StyleSheet,Text,View}from"react-native";import{usePressAnimation}from"../../hooks/usePressAnimation.js";import{fontFor,useTheme}from"../../theme/index.js";import{smoothCorners}from"../../utils/corners.js";import{triggerHaptic}from"../../utils/hapticUtils.js";import{SquircleFill,useSquircle}from"../SquircleFill/SquircleFill.js";import{jsx as _jsx,Fragment as _Fragment,jsxs as _jsxs}from"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=useTheme(),{style:r,pressIn:o,pressOut:s}=usePressAnimation({enabled:!0}),n=useMemo(()=>buildActionStyles(i),[i]),l="primary"===t,a=useSquircle(!0,i.radius.md),fillFor=e=>l?e?i.colors.primaryHover:i.colors.primary:e?i.colors.surface.pressed:"transparent";return _jsx(Animated.View,{style:r,children:_jsx(Pressable,{onPress:()=>{triggerHaptic("selection"),e.onPress()},onPressIn:o,onPressOut:s,accessibilityRole:"button",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityHint:e.accessibilityHint,testID:e.testID,onLayout:a.onLayout,style:({pressed:e})=>[n.button,l?n.buttonPrimary:n.buttonSecondary,e&&!a.active?l?n.buttonPrimaryPressed:n.buttonSecondaryPressed:null,a.active?n.buttonSquircleHost:null],children:({pressed:t})=>_jsxs(_Fragment,{children:[a.active&&a.size?_jsx(SquircleFill,{width:a.size.width,height:a.size.height,radius:i.radius.md,fill:fillFor(t),stroke:l?void 0:i.colors.border.primary,strokeWidth:l?0:1,outset:l?0:1}):null,_jsx(Text,{style:[n.buttonText,l?n.buttonTextPrimary:n.buttonTextSecondary],numberOfLines:1,children:e.label})]})})})},EmptyState=forwardRef((e,t)=>{const{icon:i,title:r,description:o,action:s,secondaryAction:n,size:l="md",fill:a=!1,style:c,testID:d}=e,p=useTheme(),m=useMemo(()=>sizeFor(p,l),[p,l]),u=useMemo(()=>buildStyles(p),[p]);return _jsxs(View,{ref:t,accessibilityRole:"summary",testID:d,style:[u.root,{paddingVertical:m.paddingVertical},a?u.fill:null,c],children:[i?_jsx(View,{style:[u.iconCircle,{width:m.iconSize,height:m.iconSize,marginBottom:m.titleGap,borderRadius:m.iconSize/2,...smoothCorners}],children:i}):null,_jsx(Text,{style:[u.title,{fontSize:m.titleSize,...fontFor(p,"semibold")}],children:r}),o?_jsx(Text,{style:[u.description,{fontSize:m.descriptionSize,marginTop:m.descriptionGap}],children:o}):null,s||n?_jsxs(View,{style:u.actions,children:[s?_jsx(ActionButton,{action:s,variant:"primary"}):null,n?_jsx(ActionButton,{action:n,variant:"secondary"}):null]}):null]})});EmptyState.displayName="EmptyState";const buildStyles=e=>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=>StyleSheet.create({button:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,minHeight:42,borderRadius:e.radius.md,...smoothCorners,overflow:"hidden",alignItems:"center",justifyContent:"center",flexDirection:"row"},buttonPrimary:{backgroundColor:e.colors.primary},buttonPrimaryPressed:{backgroundColor:e.colors.primaryHover},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,...fontFor(e,"semibold")},buttonTextPrimary:{color:e.colors.onPrimary},buttonTextSecondary:{color:e.colors.text.primary}});export{EmptyState};export default EmptyState;
1
+ "use strict";import{forwardRef,useMemo}from"react";import{Animated,Pressable,StyleSheet,Text,View}from"react-native";import{usePressAnimation}from"../../hooks/usePressAnimation.js";import{fontFor,resolveEmptyStateSize,useTheme}from"../../theme/index.js";import{smoothCorners}from"../../utils/corners.js";import{triggerHaptic}from"../../utils/hapticUtils.js";import{SquircleFill,useSquircle}from"../SquircleFill/SquircleFill.js";import{jsx as _jsx,Fragment as _Fragment,jsxs as _jsxs}from"react/jsx-runtime";const ActionButton=({action:e,variant:t})=>{const r=useTheme(),{style:o,pressIn:i,pressOut:s}=usePressAnimation({enabled:!0}),n=useMemo(()=>buildActionStyles(r),[r]),l="primary"===t,a=useSquircle(!0,r.radius.md),fillFor=e=>l?e?r.colors.primaryHover:r.colors.primary:e?r.colors.surface.pressed:"transparent";return _jsx(Animated.View,{style:o,children:_jsx(Pressable,{onPress:()=>{triggerHaptic("selection"),e.onPress()},onPressIn:i,onPressOut:s,accessibilityRole:"button",accessibilityLabel:e.accessibilityLabel??e.label,accessibilityHint:e.accessibilityHint,testID:e.testID,onLayout:a.onLayout,style:({pressed:e})=>[n.button,l?n.buttonPrimary:n.buttonSecondary,e&&!a.active?l?n.buttonPrimaryPressed:n.buttonSecondaryPressed:null,a.active?n.buttonSquircleHost:null],children:({pressed:t})=>_jsxs(_Fragment,{children:[a.active&&a.size?_jsx(SquircleFill,{width:a.size.width,height:a.size.height,radius:r.radius.md,fill:fillFor(t),stroke:l?void 0:r.colors.border.primary,strokeWidth:l?0:1,outset:l?0:1}):null,_jsx(Text,{style:[n.buttonText,l?n.buttonTextPrimary:n.buttonTextSecondary],numberOfLines:1,children:e.label})]})})})},EmptyState=forwardRef((e,t)=>{const{icon:r,title:o,description:i,action:s,secondaryAction:n,size:l="md",fill:a=!1,style:c,testID:d}=e,u=useTheme(),m=useMemo(()=>resolveEmptyStateSize(u,l),[u,l]),y=useMemo(()=>buildStyles(u),[u]);return _jsxs(View,{ref:t,accessibilityRole:"summary",testID:d,style:[y.root,{paddingVertical:m.paddingY},a?y.fill:null,c],children:[r?_jsx(View,{style:[y.iconCircle,{width:m.icon,height:m.icon,marginBottom:m.titleGap,borderRadius:u.radius.pill,...smoothCorners}],children:r}):null,_jsx(Text,{style:[y.title,{fontSize:m.titleText,...fontFor(u,"semibold")}],children:o}),i?_jsx(Text,{style:[y.description,{fontSize:m.descriptionText,marginTop:m.descriptionGap}],children:i}):null,s||n?_jsxs(View,{style:y.actions,children:[s?_jsx(ActionButton,{action:s,variant:"primary"}):null,n?_jsx(ActionButton,{action:n,variant:"secondary"}):null]}):null]})});EmptyState.displayName="EmptyState";const buildStyles=e=>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.lg}}),buildActionStyles=e=>StyleSheet.create({button:{paddingHorizontal:e.spacing.lg,paddingVertical:e.spacing.sm,minHeight:42,borderRadius:e.radius.md,...smoothCorners,overflow:"hidden",alignItems:"center",justifyContent:"center",flexDirection:"row"},buttonPrimary:{backgroundColor:e.colors.primary},buttonPrimaryPressed:{backgroundColor:e.colors.primaryHover},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,...fontFor(e,"semibold")},buttonTextPrimary:{color:e.colors.onPrimary},buttonTextSecondary:{color:e.colors.text.primary}});export{EmptyState};export default EmptyState;
@@ -1 +1 @@
1
- "use strict";import{StyleSheet,Text,View}from"react-native";import{fontFor,useTheme}from"../../theme/index.js";import{NotationInkContext,useNotationInk}from"../Notation/Notation.js";import{FieldErrorGlyph,hasFieldText}from"./FieldBase.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const hasChoiceDetail=(e,o)=>hasFieldText(e)||hasFieldText(o);export const ChoiceText=({label:e,description:o,error:t,disabled:s=!1,labelLines:i,descriptionLines:r,style:l,labelStyle:n})=>{const a=useTheme(),x=s?a.colors.text.disabled:a.colors.text.primary,c=s?a.colors.text.disabled:a.colors.text.secondary,d=a.typography.fontSize.sm,h=useNotationInk(n,a.typography.fontSize.base,x),m=useNotationInk(void 0,d,c),p=useNotationInk(void 0,d,a.colors.field.message);return hasFieldText(e)||hasFieldText(o)||hasFieldText(t)?_jsxs(View,{style:[styles.column,l],children:[hasFieldText(e)?_jsx(Text,{style:[{color:x,fontSize:a.typography.fontSize.base,...fontFor(a,"normal")},n],numberOfLines:i,children:_jsx(NotationInkContext.Provider,{value:h,children:e})}):null,hasFieldText(o)?_jsx(Text,{style:{color:c,fontSize:d,marginTop:a.spacing.xs/2,...fontFor(a,"normal")},numberOfLines:r,children:_jsx(NotationInkContext.Provider,{value:m,children:o})}):null,hasFieldText(t)?_jsxs(View,{style:[styles.errorRow,{marginTop:a.spacing.xs,columnGap:a.spacing.xs}],accessibilityLiveRegion:"polite",children:[_jsx(FieldErrorGlyph,{size:d,color:a.colors.field.message}),_jsx(Text,{style:{flexShrink:1,color:a.colors.field.message,fontSize:d,...fontFor(a,"normal")},children:_jsx(NotationInkContext.Provider,{value:p,children:t})})]}):null]}):null};const styles=StyleSheet.create({column:{flexShrink:1},errorRow:{flexDirection:"row",alignItems:"center"}});
1
+ "use strict";import{StyleSheet,Text,View}from"react-native";import{fontFor,useTheme}from"../../theme/index.js";import{NotationInkContext,useNotationInk}from"../Notation/Notation.js";import{FieldErrorGlyph,hasFieldText}from"./FieldBase.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const hasChoiceDetail=(e,o)=>hasFieldText(e)||hasFieldText(o);export const ChoiceText=({label:e,description:o,error:t,disabled:s=!1,labelLines:i,descriptionLines:r,style:l,labelStyle:n})=>{const a=useTheme(),x=s?a.colors.text.disabled:a.colors.text.primary,c=s?a.colors.text.disabled:a.colors.text.secondary,d=a.typography.fontSize.sm,h=useNotationInk(n,a.typography.fontSize.base,x),m=useNotationInk(void 0,d,c),p=useNotationInk(void 0,d,a.colors.field.message);return hasFieldText(e)||hasFieldText(o)||hasFieldText(t)?_jsxs(View,{style:[styles.column,l],children:[hasFieldText(e)?_jsx(Text,{style:[{color:x,fontSize:a.typography.fontSize.base,...fontFor(a,"normal")},n],numberOfLines:i,children:_jsx(NotationInkContext.Provider,{value:h,children:e})}):null,hasFieldText(o)?_jsx(Text,{style:{color:c,fontSize:d,marginTop:a.spacing.xxs,...fontFor(a,"normal")},numberOfLines:r,children:_jsx(NotationInkContext.Provider,{value:m,children:o})}):null,hasFieldText(t)?_jsxs(View,{style:[styles.errorRow,{marginTop:a.spacing.xs,columnGap:a.spacing.xs}],accessibilityLiveRegion:"polite",children:[_jsx(FieldErrorGlyph,{size:d,color:a.colors.field.message}),_jsx(Text,{style:{flexShrink:1,color:a.colors.field.message,fontSize:d,...fontFor(a,"normal")},children:_jsx(NotationInkContext.Provider,{value:p,children:t})})]}):null]}):null};const styles=StyleSheet.create({column:{flexShrink:1},errorRow:{flexDirection:"row",alignItems:"center"}});
@@ -1 +1 @@
1
- "use strict";import{useEffect,useMemo,useRef}from"react";import{Animated,Easing,Pressable,StyleSheet,Text,View}from"react-native";import{createAnimatedValue,fontFor,useTheme}from"../../theme/index.js";import{ariaFromState}from"../../utils/ariaState.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{NotationInkContext,useNotationInk}from"../Notation/Notation.js";import{SquircleFill,useSquircle}from"../SquircleFill/SquircleFill.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const expandColorSides=e=>"string"==typeof e?{top:e,right:e,bottom:e,left:e}:{top:e.top??"transparent",right:e.right??"transparent",bottom:e.bottom??"transparent",left:e.left??"transparent"},expandWidthSides=e=>"number"==typeof e?{top:e,right:e,bottom:e,left:e}:{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0};export const pickRepresentativeBorderColor=e=>{for(const t of["bottom","top","left","right"]){const o=e[t];if(o&&"transparent"!==o)return o}return e.bottom};export const resolveFieldTextStyle=(e,t={})=>{const{disabled:o=!1}=t,r=e.components.field,i=e.colors.field;return{color:o?r?.disabledTextColor??i.textDisabled:r?.textColor??i.text,placeholderColor:r?.placeholderColor??(o?i.placeholderDisabled:i.placeholder),weightStyle:r?.fontWeight?{fontWeight:r.fontWeight}:fontFor(e,"normal")}};export const RequiredMark=()=>{const e=useTheme(),t=e.components.field;return _jsx(Text,{style:{color:t?.requiredMarkerColor??e.colors.toneText.error},children:` ${t?.requiredMarker??"*"}`})};export const RequiredPlaceholder=({text:e,color:t,fontSize:o,weightStyle:r,align:i="center",paddingTop:l,textAlign:n})=>_jsx(View,{pointerEvents:"none",style:[StyleSheet.absoluteFill,{justifyContent:"top"===i?"flex-start":"center",paddingTop:l}],children:_jsxs(Text,{accessible:!1,numberOfLines:1,style:{color:t,fontSize:o,...r,includeFontPadding:!1,textAlign:n},children:[e,_jsx(RequiredMark,{})]})});export const FieldErrorGlyph=({size:e,color:t})=>{const o=useTheme(),r=o.icons?.error??defaultIcons.error;return _jsx(_Fragment,{children:r({size:e,color:t})})};export const hasFieldText=e=>null!=e&&!1!==e&&!0!==e&&""!==e;export const fieldTextAsString=e=>"string"==typeof e?e:void 0;export const FieldLabel=({children:e,size:t="md",required:o=!1,help:r,color:i,style:l})=>{const n=useTheme(),s=resolveFieldSize(n,t),a=hasFieldText(r),d=useNotationInk(l,s.labelFontSize,i??n.colors.field.label),c=_jsxs(Text,{style:[familyStyles.label,{color:i??n.colors.field.label,fontSize:s.labelFontSize,...fontFor(n,"semibold"),marginBottom:a?0:s.labelGap},a?familyStyles.labelShrink:null,l],children:[_jsx(NotationInkContext.Provider,{value:d,children:e}),o?_jsx(RequiredMark,{}):null]});return a?_jsxs(View,{style:[familyStyles.labelRow,{marginBottom:s.labelGap}],children:[c,_jsx(View,{style:[familyStyles.help,{marginLeft:n.spacing.xs}],children:r})]}):c};export const FieldMessage=({text:e,error:t=!1,size:o="md",style:r})=>{const i=useTheme(),l=resolveFieldSize(i,o),n=t?i.colors.field.message:i.colors.text.secondary,s=useNotationInk(r,l.messageFontSize,n);return hasFieldText(e)?_jsxs(View,{style:[familyStyles.messageRow,{marginTop:l.messageGap,columnGap:i.spacing.xs+2}],accessibilityLiveRegion:t?"polite":"none",children:[t?_jsx(FieldErrorGlyph,{size:l.messageFontSize,color:n}):null,_jsx(Text,{style:[familyStyles.messageText,{color:n,fontSize:l.messageFontSize,...fontFor(i,"normal")},r],children:_jsx(NotationInkContext.Provider,{value:s,children:e})})]}):null};const familyStyles=StyleSheet.create({label:{includeFontPadding:!1},labelShrink:{flexShrink:1},labelRow:{flexDirection:"row",alignItems:"center"},help:{flexShrink:0,alignItems:"center",justifyContent:"center"},messageRow:{flexDirection:"row",alignItems:"center"},messageText:{flexShrink:1,includeFontPadding:!1}});export const resolveFieldSize=(e,t)=>{const o=e.components.field?.[t],r=DEFAULT_SIZES[t];return{paddingHorizontal:o?.paddingHorizontal??r.paddingHorizontal,paddingVertical:o?.paddingVertical??r.paddingVertical,minHeight:o?.minHeight??r.minHeight,fontSize:o?.fontSize??r.fontSize,borderRadius:o?.borderRadius??r.borderRadius,iconSize:o?.iconSize??r.iconSize,labelFontSize:o?.labelFontSize??r.labelFontSize,labelGap:o?.labelGap??r.labelGap,messageFontSize:o?.messageFontSize??r.messageFontSize,messageGap:o?.messageGap??r.messageGap}};const DEFAULT_SIZES={sm:{paddingHorizontal:12,paddingVertical:10,minHeight:38,fontSize:13,borderRadius:10,iconSize:14,labelFontSize:11,labelGap:4,messageFontSize:11,messageGap:2},md:{paddingHorizontal:14,paddingVertical:13,minHeight:44,fontSize:14,borderRadius:10,iconSize:16,labelFontSize:12,labelGap:4,messageFontSize:12,messageGap:2},lg:{paddingHorizontal:16,paddingVertical:15,minHeight:52,fontSize:16,borderRadius:10,iconSize:18,labelFontSize:13,labelGap:4,messageFontSize:13,messageGap:2}};export const resolveVariantColors=(e,t,o)=>{const r=e.components.field?.[t],i=e.colors.field;let l,n,s,a,d;"outlined"===t?(l=i.background,n=i.backgroundFocused,s=i.backgroundDisabled,a=i.border,d=e.colors.border.width):"underline"===t?(l="transparent",n=void 0,s="transparent",a={bottom:i.border},d={bottom:e.colors.border.width}):(l=i.background,n=void 0,s=i.backgroundDisabled,a="transparent",d=0);const wrapToIdleShape=e=>"string"==typeof a?e:{bottom:e},c=expandColorSides(o?.borderIdle??r?.borderIdle??a),b=expandColorSides(o?.borderFocused??r?.borderFocused??wrapToIdleShape(i.borderFocused)),p=expandColorSides(o?.borderError??r?.borderError??wrapToIdleShape(i.borderError)),g=expandColorSides(o?.borderDisabled??r?.borderDisabled??a),u=expandWidthSides(o?.borderWidth??r?.borderWidth??d);return{backgroundIdleEmpty:o?.backgroundIdleEmpty??r?.backgroundIdleEmpty??l,backgroundIdleFilled:o?.backgroundIdleFilled??r?.backgroundIdleFilled??o?.backgroundIdleEmpty??r?.backgroundIdleEmpty??l,backgroundFocused:o?.backgroundFocused??r?.backgroundFocused??n,backgroundError:o?.backgroundError??r?.backgroundError??void 0,backgroundDisabled:o?.backgroundDisabled??r?.backgroundDisabled??s,borderIdle:c,borderFocused:b,borderError:p,borderDisabled:g,borderWidth:u,borderFocusedRepresentative:pickRepresentativeBorderColor(b)}};export const FieldBase=e=>{const{size:t="md",variant:o,focused:r=!1,disabled:i=!1,error:l=!1,filled:n=!1,leading:s,leadingDivider:a=!1,trailing:d,slotAlign:c="center",slotLineHeight:b,topNotch:p,children:g,onPress:u,pressFeedback:m=!0,minHeight:h,maxHeight:f,width:x,height:S,paddingHorizontal:y,paddingLeft:F,paddingRight:z,paddingVertical:k,borderRadius:R,borderTopLeftRadius:C,borderTopRightRadius:j,borderBottomLeftRadius:v,borderBottomRightRadius:I,borderWidth:T,borderTopWidth:w,borderRightWidth:_,borderBottomWidth:E,borderLeftWidth:V,gap:H,fillOverrides:D,style:L,testID:W,accessibilityRole:G,accessibilityLabel:B,accessibilityState:q,accessibilityHint:A}=e,M=useTheme(),P=useMemo(()=>buildStyles(),[]),N=o??M.components.field?.defaultVariant??"outlined",O=resolveFieldSize(M,t),U=useMemo(()=>resolveVariantColors(M,N,D),[M,N,D]),Z=l?2:r?1:0,$=useRef(createAnimatedValue(Z)).current;useEffect(()=>{const e=Animated.timing($,{toValue:Z,duration:M.motion.duration.fast,easing:Easing.bezier(...M.motion.easing.standard),useNativeDriver:!1});return e.start(),()=>e.stop()},[Z,$,M.motion.duration.fast,M.motion.easing.standard]);const J=[0,1,2],K=n?U.backgroundIdleFilled:U.backgroundIdleEmpty,Q=U.backgroundFocused??K,X=U.backgroundError??K,Y=i?U.backgroundDisabled:$.interpolate({inputRange:J,outputRange:[K,Q,X]}),ee=U.borderIdle,te=U.borderFocused,oe=U.borderError,re={top:w,right:_,bottom:E,left:V},ie={top:re.top??T??U.borderWidth.top,right:re.right??T??U.borderWidth.right,bottom:re.bottom??T??U.borderWidth.bottom,left:re.left??T??U.borderWidth.left},le={minHeight:S??h??O.minHeight,maxHeight:f,paddingHorizontal:y??O.paddingHorizontal,paddingVertical:k??O.paddingVertical,paddingLeft:F??y??O.paddingHorizontal,paddingRight:z??y??O.paddingHorizontal,backgroundColor:Y,columnGap:H??M.spacing.md,alignItems:"top"===c?"flex-start":"center"},ne="underline"===N,se=ne?0:R??O.borderRadius,ae=ne?{tl:0,tr:0,bl:0,br:0}:{tl:C??se,tr:j??se,bl:v??se,br:I??se};le.borderTopLeftRadius=ae.tl,le.borderTopRightRadius=ae.tr,le.borderBottomLeftRadius=ae.bl,le.borderBottomRightRadius=ae.br,le.borderCurve=smoothCorners.borderCurve,le.borderTopWidth=ie.top,le.borderRightWidth=ie.right,le.borderBottomWidth=ie.bottom,le.borderLeftWidth=ie.left;const sideColor=e=>$.interpolate({inputRange:J,outputRange:[ee[e],te[e],oe[e]]}),sameOnEverySide=e=>e.top===e.right&&e.top===e.bottom&&e.top===e.left,de=!ne&&ae.tl===ae.tr&&ae.tl===ae.bl&&ae.tl===ae.br&&sameOnEverySide(ie)&&sameOnEverySide(ee)&&sameOnEverySide(te)&&sameOnEverySide(oe)&&sameOnEverySide(U.borderDisabled),ce=useSquircle(de,ae.tl);if(ce.active)le.backgroundColor="transparent",le.borderTopColor="transparent",le.borderRightColor="transparent",le.borderBottomColor="transparent",le.borderLeftColor="transparent";else if(i){const e=U.borderDisabled;le.borderTopColor=e.top,le.borderRightColor=e.right,le.borderBottomColor=e.bottom,le.borderLeftColor=e.left}else le.borderTopColor=sideColor("top"),le.borderRightColor=sideColor("right"),le.borderBottomColor=sideColor("bottom"),le.borderLeftColor=sideColor("left");const be=i?U.borderDisabled.top:sideColor("top"),pe=useRef(Z);pe.current=Z,useEffect(()=>{$.setValue(pe.current)},[U,$]),void 0!==x&&(le.width=x),void 0!==S&&(le.height=S);const ge={disabled:i,...q},ue="top"===c,me=ue?{alignSelf:"flex-start",marginTop:Math.max(0,((b??O.iconSize)-O.iconSize)/2)}:null,he=S??h??O.minHeight,fe=(()=>{if(!p)return 0;const e=Math.min(ae.tl,he/2),t=p.left;return e<=0||t>=e?0:Math.ceil(e-Math.sqrt(e*e-(e-t)*(e-t)))})(),xe=p&&ie.top>0?_jsx(Animated.View,{pointerEvents:"none",style:{position:"absolute",top:-ie.top,left:p.left-ie.left,width:p.width,height:ie.top+fe,backgroundColor:Y}}):null,renderInner=e=>_jsxs(_Fragment,{children:[ce.active&&ce.size?_jsx(SquircleFill,{width:ce.size.width,height:ce.size.height,radius:ae.tl,fill:e&&!i?M.colors.surface.pressed:Y,stroke:be,strokeWidth:ie.top,outset:ie.top}):null,xe,null!=s?_jsx(View,{style:[P.slot,me],children:s}):null,null!=s&&a?_jsx(View,{pointerEvents:"none",style:[P.divider,me,{height:O.iconSize,backgroundColor:M.colors.field.border}]}):null,_jsx(View,{style:[P.content,ue?P.contentTop:null],children:g}),null!=d?_jsx(View,{style:[P.slot,me],children:d}):null]}),Se=_jsx(Animated.View,{onLayout:ce.onLayout,style:[P.box,le,L],accessibilityRole:G,accessibilityLabel:B,accessibilityHint:A,accessibilityState:ge,...ariaFromState(ge),testID:W,children:renderInner(!1)});return u&&!m?_jsx(Pressable,{onPress:u,disabled:i,accessible:!1,children:Se}):u?_jsx(Pressable,{onPress:u,disabled:i,accessibilityRole:G??"button",accessibilityLabel:B,accessibilityHint:A,accessibilityState:ge,...ariaFromState(ge),testID:W,children:({pressed:e})=>_jsx(Animated.View,{onLayout:ce.onLayout,style:[P.box,le,!e||i||ce.active?null:{backgroundColor:M.colors.surface.pressed},L],children:renderInner(e)})}):Se};FieldBase.displayName="FieldBase";const buildStyles=()=>StyleSheet.create({box:{flexDirection:"row",alignItems:"center",overflow:"visible"},slot:{alignItems:"center",justifyContent:"center"},divider:{width:1,alignSelf:"center"},content:{flex:1,flexDirection:"row",alignItems:"center"},contentTop:{alignItems:"flex-start"}});export default FieldBase;
1
+ "use strict";import{useEffect,useMemo,useRef}from"react";import{Animated,Easing,Pressable,StyleSheet,Text,View}from"react-native";import{createAnimatedValue,fontFor,resolveFieldSize,useTheme}from"../../theme/index.js";import{ariaFromState}from"../../utils/ariaState.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{NotationInkContext,useNotationInk}from"../Notation/Notation.js";import{SquircleFill,useSquircle}from"../SquircleFill/SquircleFill.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const expandColorSides=e=>"string"==typeof e?{top:e,right:e,bottom:e,left:e}:{top:e.top??"transparent",right:e.right??"transparent",bottom:e.bottom??"transparent",left:e.left??"transparent"},expandWidthSides=e=>"number"==typeof e?{top:e,right:e,bottom:e,left:e}:{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0};export const pickRepresentativeBorderColor=e=>{for(const t of["bottom","top","left","right"]){const o=e[t];if(o&&"transparent"!==o)return o}return e.bottom};export const resolveFieldTextStyle=(e,t={})=>{const{disabled:o=!1}=t,r=e.components.field,i=e.colors.field;return{color:o?r?.disabledTextColor??i.textDisabled:r?.textColor??i.text,placeholderColor:r?.placeholderColor??(o?i.placeholderDisabled:i.placeholder),weightStyle:r?.fontWeight?{fontWeight:r.fontWeight}:fontFor(e,"normal")}};export const RequiredMark=()=>{const e=useTheme(),t=e.components.field;return _jsx(Text,{style:{color:t?.requiredMarkerColor??e.colors.toneText.error},children:` ${t?.requiredMarker??"*"}`})};export const RequiredPlaceholder=({text:e,color:t,fontSize:o,weightStyle:r,align:i="center",paddingTop:l,textAlign:n})=>_jsx(View,{pointerEvents:"none",style:[StyleSheet.absoluteFill,{justifyContent:"top"===i?"flex-start":"center",paddingTop:l}],children:_jsxs(Text,{accessible:!1,numberOfLines:1,style:{color:t,fontSize:o,...r,includeFontPadding:!1,textAlign:n},children:[e,_jsx(RequiredMark,{})]})});export const FieldErrorGlyph=({size:e,color:t})=>{const o=useTheme(),r=o.icons?.error??defaultIcons.error;return _jsx(_Fragment,{children:r({size:e,color:t})})};export const hasFieldText=e=>null!=e&&!1!==e&&!0!==e&&""!==e;export const fieldTextAsString=e=>"string"==typeof e?e:void 0;export const FieldLabel=({children:e,size:t="md",required:o=!1,help:r,color:i,style:l})=>{const n=useTheme(),s=resolveFieldSize(n,t),d=hasFieldText(r),a=useNotationInk(l,s.labelText,i??n.colors.field.label),c=_jsxs(Text,{style:[familyStyles.label,{color:i??n.colors.field.label,fontSize:s.labelText,...fontFor(n,"semibold"),marginBottom:d?n.spacing.none:s.labelGap},d?familyStyles.labelShrink:null,l],children:[_jsx(NotationInkContext.Provider,{value:a,children:e}),o?_jsx(RequiredMark,{}):null]});return d?_jsxs(View,{style:[familyStyles.labelRow,{marginBottom:s.labelGap}],children:[c,_jsx(View,{style:[familyStyles.help,{marginLeft:n.spacing.xs}],children:r})]}):c};export const FieldMessage=({text:e,error:t=!1,size:o="md",style:r})=>{const i=useTheme(),l=resolveFieldSize(i,o),n=t?i.colors.field.message:i.colors.text.secondary,s=useNotationInk(r,l.messageText,n);return hasFieldText(e)?_jsxs(View,{style:[familyStyles.messageRow,{marginTop:l.messageGap,columnGap:i.spacing.xs}],accessibilityLiveRegion:t?"polite":"none",children:[t?_jsx(FieldErrorGlyph,{size:l.messageText,color:n}):null,_jsx(Text,{style:[familyStyles.messageText,{color:n,fontSize:l.messageText,...fontFor(i,"normal")},r],children:_jsx(NotationInkContext.Provider,{value:s,children:e})})]}):null};const familyStyles=StyleSheet.create({label:{includeFontPadding:!1},labelShrink:{flexShrink:1},labelRow:{flexDirection:"row",alignItems:"center"},help:{flexShrink:0,alignItems:"center",justifyContent:"center"},messageRow:{flexDirection:"row",alignItems:"center"},messageText:{flexShrink:1,includeFontPadding:!1}});export const resolveVariantColors=(e,t,o)=>{const r=e.components.field?.[t],i=e.colors.field;let l,n,s,d,a;"outlined"===t?(l=i.background,n=i.backgroundFocused,s=i.backgroundDisabled,d=i.border,a=e.colors.border.width):"underline"===t?(l="transparent",n=void 0,s="transparent",d={bottom:i.border},a={bottom:e.colors.border.width}):(l=i.background,n=void 0,s=i.backgroundDisabled,d="transparent",a=0);const wrapToIdleShape=e=>"string"==typeof d?e:{bottom:e},c=expandColorSides(o?.borderIdle??r?.borderIdle??d),b=expandColorSides(o?.borderFocused??r?.borderFocused??wrapToIdleShape(i.borderFocused)),u=expandColorSides(o?.borderError??r?.borderError??wrapToIdleShape(i.borderError)),p=expandColorSides(o?.borderDisabled??r?.borderDisabled??d),g=expandWidthSides(o?.borderWidth??r?.borderWidth??a);return{backgroundIdleEmpty:o?.backgroundIdleEmpty??r?.backgroundIdleEmpty??l,backgroundIdleFilled:o?.backgroundIdleFilled??r?.backgroundIdleFilled??o?.backgroundIdleEmpty??r?.backgroundIdleEmpty??l,backgroundFocused:o?.backgroundFocused??r?.backgroundFocused??n,backgroundError:o?.backgroundError??r?.backgroundError??void 0,backgroundDisabled:o?.backgroundDisabled??r?.backgroundDisabled??s,borderIdle:c,borderFocused:b,borderError:u,borderDisabled:p,borderWidth:g,borderFocusedRepresentative:pickRepresentativeBorderColor(b)}};export const FieldBase=e=>{const{size:t="md",variant:o,focused:r=!1,disabled:i=!1,error:l=!1,filled:n=!1,leading:s,leadingDivider:d=!1,trailing:a,slotAlign:c="center",slotLineHeight:b,topNotch:u,children:p,onPress:g,pressFeedback:m=!0,minHeight:h,maxHeight:f,width:x,height:y,paddingHorizontal:S,paddingLeft:k,paddingRight:F,paddingVertical:R,borderRadius:C,borderTopLeftRadius:T,borderTopRightRadius:j,borderBottomLeftRadius:v,borderBottomRightRadius:I,borderWidth:w,borderTopWidth:_,borderRightWidth:E,borderBottomWidth:D,borderLeftWidth:L,gap:W,fillOverrides:V,style:z,testID:B,accessibilityRole:q,accessibilityLabel:M,accessibilityState:A,accessibilityHint:H}=e,P=useTheme(),N=useMemo(()=>buildStyles(),[]),G=o??P.components.field?.defaultVariant??"outlined",X=resolveFieldSize(P,t),O=useMemo(()=>resolveVariantColors(P,G,V),[P,G,V]),Y=l?2:r?1:0,$=useRef(createAnimatedValue(Y)).current;useEffect(()=>{const e=Animated.timing($,{toValue:Y,duration:P.motion.duration.fast,easing:Easing.bezier(...P.motion.easing.standard),useNativeDriver:!1});return e.start(),()=>e.stop()},[Y,$,P.motion.duration.fast,P.motion.easing.standard]);const J=[0,1,2],K=n?O.backgroundIdleFilled:O.backgroundIdleEmpty,Q=O.backgroundFocused??K,U=O.backgroundError??K,Z=i?O.backgroundDisabled:$.interpolate({inputRange:J,outputRange:[K,Q,U]}),ee=O.borderIdle,te=O.borderFocused,oe=O.borderError,re={top:_,right:E,bottom:D,left:L},ie={top:re.top??w??O.borderWidth.top,right:re.right??w??O.borderWidth.right,bottom:re.bottom??w??O.borderWidth.bottom,left:re.left??w??O.borderWidth.left},le={minHeight:y??h??X.minHeight,maxHeight:f,paddingHorizontal:S??X.paddingX,paddingVertical:R??X.paddingY,paddingLeft:k??S??X.paddingX,paddingRight:F??S??X.paddingX,backgroundColor:Z,columnGap:W??P.spacing.md,alignItems:"top"===c?"flex-start":"center"},ne="underline"===G,se=ne?P.radius.none:C??X.radius,de=ne?{tl:P.radius.none,tr:P.radius.none,bl:P.radius.none,br:P.radius.none}:{tl:T??se,tr:j??se,bl:v??se,br:I??se};le.borderTopLeftRadius=de.tl,le.borderTopRightRadius=de.tr,le.borderBottomLeftRadius=de.bl,le.borderBottomRightRadius=de.br,le.borderCurve=smoothCorners.borderCurve,le.borderTopWidth=ie.top,le.borderRightWidth=ie.right,le.borderBottomWidth=ie.bottom,le.borderLeftWidth=ie.left;const sideColor=e=>$.interpolate({inputRange:J,outputRange:[ee[e],te[e],oe[e]]}),sameOnEverySide=e=>e.top===e.right&&e.top===e.bottom&&e.top===e.left,ae=!ne&&de.tl===de.tr&&de.tl===de.bl&&de.tl===de.br&&sameOnEverySide(ie)&&sameOnEverySide(ee)&&sameOnEverySide(te)&&sameOnEverySide(oe)&&sameOnEverySide(O.borderDisabled),ce=useSquircle(ae,de.tl);if(ce.active)le.backgroundColor="transparent",le.borderTopColor="transparent",le.borderRightColor="transparent",le.borderBottomColor="transparent",le.borderLeftColor="transparent";else if(i){const e=O.borderDisabled;le.borderTopColor=e.top,le.borderRightColor=e.right,le.borderBottomColor=e.bottom,le.borderLeftColor=e.left}else le.borderTopColor=sideColor("top"),le.borderRightColor=sideColor("right"),le.borderBottomColor=sideColor("bottom"),le.borderLeftColor=sideColor("left");const be=i?O.borderDisabled.top:sideColor("top"),ue=useRef(Y);ue.current=Y,useEffect(()=>{$.setValue(ue.current)},[O,$]),void 0!==x&&(le.width=x),void 0!==y&&(le.height=y);const pe={disabled:i,...A},ge="top"===c,me=ge?{alignSelf:"flex-start",marginTop:Math.max(0,((b??X.icon)-X.icon)/2)}:null,he=y??h??X.minHeight,fe=(()=>{if(!u)return 0;const e=Math.min(de.tl,he/2),t=u.left;return e<=0||t>=e?0:Math.ceil(e-Math.sqrt(e*e-(e-t)*(e-t)))})(),xe=u&&ie.top>0?_jsx(Animated.View,{pointerEvents:"none",style:{position:"absolute",top:-ie.top,left:u.left-ie.left,width:u.width,height:ie.top+fe,backgroundColor:Z}}):null,renderInner=e=>_jsxs(_Fragment,{children:[ce.active&&ce.size?_jsx(SquircleFill,{width:ce.size.width,height:ce.size.height,radius:de.tl,fill:e&&!i?P.colors.surface.pressed:Z,stroke:be,strokeWidth:ie.top,outset:ie.top}):null,xe,null!=s?_jsx(View,{style:[N.slot,me],children:s}):null,null!=s&&d?_jsx(View,{pointerEvents:"none",style:[N.divider,me,{height:X.icon,backgroundColor:P.colors.field.border}]}):null,_jsx(View,{style:[N.content,ge?N.contentTop:null],children:p}),null!=a?_jsx(View,{style:[N.slot,me],children:a}):null]}),ye=_jsx(Animated.View,{onLayout:ce.onLayout,style:[N.box,le,z],accessibilityRole:q,accessibilityLabel:M,accessibilityHint:H,accessibilityState:pe,...ariaFromState(pe),testID:B,children:renderInner(!1)});return g&&!m?_jsx(Pressable,{onPress:g,disabled:i,accessible:!1,children:ye}):g?_jsx(Pressable,{onPress:g,disabled:i,accessibilityRole:q??"button",accessibilityLabel:M,accessibilityHint:H,accessibilityState:pe,...ariaFromState(pe),testID:B,children:({pressed:e})=>_jsx(Animated.View,{onLayout:ce.onLayout,style:[N.box,le,!e||i||ce.active?null:{backgroundColor:P.colors.surface.pressed},z],children:renderInner(e)})}):ye};FieldBase.displayName="FieldBase";const buildStyles=()=>StyleSheet.create({box:{flexDirection:"row",alignItems:"center",overflow:"visible"},slot:{alignItems:"center",justifyContent:"center"},divider:{width:1,alignSelf:"center"},content:{flex:1,flexDirection:"row",alignItems:"center"},contentTop:{alignItems:"flex-start"}});export default FieldBase;
@@ -1 +1 @@
1
- "use strict";export{default,FieldBase,FieldErrorGlyph,FieldLabel,FieldMessage,fieldTextAsString,hasFieldText,RequiredMark,RequiredPlaceholder,resolveFieldSize,resolveFieldTextStyle}from"./FieldBase.js";export{FLOATED_LABEL_SCALE,useFloatingLabel}from"./useFloatingLabel.js";
1
+ "use strict";export{default,FieldBase,FieldErrorGlyph,FieldLabel,FieldMessage,fieldTextAsString,hasFieldText,RequiredMark,RequiredPlaceholder,resolveFieldTextStyle}from"./FieldBase.js";export{FLOATED_LABEL_SCALE,useFloatingLabel}from"./useFloatingLabel.js";
@@ -1 +1 @@
1
- "use strict";import{useEffect,useMemo,useRef,useState}from"react";import{Animated,Easing,StyleSheet}from"react-native";import{createAnimatedValue,fontFor,useTheme}from"../../theme/index.js";import{NotationInkContext}from"../Notation/Notation.js";import{hasFieldText,RequiredMark}from"./FieldBase.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const FLOATED_LABEL_SCALE=.85;const FLOATED_LABEL_LIFT=1,NOTCH_GAP=4;export const useFloatingLabel=({label:t,enabled:e,floated:n,required:i=!1,variant:o,sizeTokens:a,leadingOffset:r,trailingOffset:s=0,textAlign:l="left",paddingLeft:u,lineHeight:d,restNudge:f=0,floatTrim:m=0,color:c,style:g})=>{const h=useTheme(),p=useRef(createAnimatedValue(n?1:0)).current,x=useRef(createAnimatedValue(n?1:0)).current,S="outlined"===o,[A,R]=useState(null);return useEffect(()=>{const t=n?1:0,timing=(e,n)=>Animated.timing(e,{toValue:t,duration:h.motion.duration.fast,easing:Easing.bezier(...h.motion.easing.standard),useNativeDriver:n});S||x.setValue(t);const e=S?Animated.parallel([timing(p,!0),timing(x,!1)]):timing(p,!0);return e.start(),()=>e.stop()},[n,S,p,x,h.motion.duration.fast,h.motion.easing.standard]),useMemo(()=>{if(!e||!hasFieldText(t))return{node:null,topNotch:void 0};const n=d??A?.height??a.fontSize,o=null!=d?a.paddingVertical+f:Math.max(0,(a.minHeight-n)/2),j=-(o+n/2+1-m),v=p.interpolate({inputRange:[0,1],outputRange:[0,j]}),E=p.interpolate({inputRange:[0,1],outputRange:[1,.85]}),L=-r,T=p.interpolate({inputRange:[0,1],outputRange:[0,L]}),z="right"===l?{right:a.paddingHorizontal+s,transformOrigin:"right center"}:"center"===l?{alignSelf:"center",transformOrigin:"center"}:{left:u+r,transformOrigin:"left center"},_=A?.85*A.width:0,y=A?"right"===l?A.width-_:"center"===l?(A.width-_)/2:0:0,F=S&&A?{left:A.x+L+y-4,width:x.interpolate({inputRange:[0,1],outputRange:[0,_+8]})}:void 0,N=StyleSheet.flatten(g),O={fontSize:N?.fontSize??a.fontSize,color:N?.color??c};return{node:_jsxs(Animated.Text,{pointerEvents:"none",onLayout:t=>{const{x:e,width:n,height:i}=t.nativeEvent.layout;R(t=>t&&t.x===e&&t.width===n&&t.height===i?t:{x:e,width:n,height:i})},style:[styles.label,z,{top:o,color:c,fontSize:a.fontSize,lineHeight:d,...fontFor(h,"medium"),transform:[{translateX:T},{translateY:v},{scale:E}]},g],children:[_jsx(NotationInkContext.Provider,{value:O,children:t}),i?_jsx(RequiredMark,{}):null]}),topNotch:F}},[e,t,i,S,a,r,s,l,u,d,f,m,c,g,p,x,A,h])};const styles=StyleSheet.create({label:{position:"absolute",zIndex:1}});
1
+ "use strict";import{useEffect,useMemo,useRef,useState}from"react";import{Animated,Easing,StyleSheet}from"react-native";import{createAnimatedValue,fontFor,useTheme}from"../../theme/index.js";import{NotationInkContext}from"../Notation/Notation.js";import{hasFieldText,RequiredMark}from"./FieldBase.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";export const FLOATED_LABEL_SCALE=.85;const FLOATED_LABEL_LIFT=1;export const useFloatingLabel=({label:t,enabled:e,floated:n,required:i=!1,variant:o,sizeTokens:a,leadingOffset:r,trailingOffset:s=0,textAlign:l="left",paddingLeft:u,lineHeight:d,restNudge:m=0,floatTrim:f=0,color:g,style:c})=>{const h=useTheme(),p=useRef(createAnimatedValue(n?1:0)).current,x=useRef(createAnimatedValue(n?1:0)).current,A="outlined"===o,[R,S]=useState(null);return useEffect(()=>{const t=n?1:0,timing=(e,n)=>Animated.timing(e,{toValue:t,duration:h.motion.duration.fast,easing:Easing.bezier(...h.motion.easing.standard),useNativeDriver:n});A||x.setValue(t);const e=A?Animated.parallel([timing(p,!0),timing(x,!1)]):timing(p,!0);return e.start(),()=>e.stop()},[n,A,p,x,h.motion.duration.fast,h.motion.easing.standard]),useMemo(()=>{if(!e||!hasFieldText(t))return{node:null,topNotch:void 0};const n=d??R?.height??a.text,o=null!=d?a.paddingY+m:Math.max(0,(a.minHeight-n)/2),j=-(o+n/2+1-f),v=p.interpolate({inputRange:[0,1],outputRange:[0,j]}),E=p.interpolate({inputRange:[0,1],outputRange:[1,.85]}),L=-r,T=p.interpolate({inputRange:[0,1],outputRange:[0,L]}),y="right"===l?{right:a.paddingX+s,transformOrigin:"right center"}:"center"===l?{alignSelf:"center",transformOrigin:"center"}:{left:u+r,transformOrigin:"left center"},F=h.spacing.xs,_=R?.85*R.width:0,N=R?"right"===l?R.width-_:"center"===l?(R.width-_)/2:0:0,b=A&&R?{left:R.x+L+N-F,width:x.interpolate({inputRange:[0,1],outputRange:[0,_+2*F]})}:void 0,w=StyleSheet.flatten(c),O={fontSize:w?.fontSize??a.text,color:w?.color??g};return{node:_jsxs(Animated.Text,{pointerEvents:"none",onLayout:t=>{const{x:e,width:n,height:i}=t.nativeEvent.layout;S(t=>t&&t.x===e&&t.width===n&&t.height===i?t:{x:e,width:n,height:i})},style:[styles.label,y,{top:o,color:g,fontSize:a.text,lineHeight:d,...fontFor(h,"medium"),transform:[{translateX:T},{translateY:v},{scale:E}]},c],children:[_jsx(NotationInkContext.Provider,{value:O,children:t}),i?_jsx(RequiredMark,{}):null]}),topNotch:b}},[e,t,i,A,a,r,s,l,u,d,m,f,g,c,p,x,R,h])};const styles=StyleSheet.create({label:{position:"absolute",zIndex:1}});
@@ -1 +1 @@
1
- "use strict";import{forwardRef,useCallback,useImperativeHandle,useMemo,useRef,useState}from"react";import{Image,Pressable,ScrollView,StyleSheet,Text,View}from"react-native";import{useControllableState}from"../../hooks/index.js";import{fontFor,useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{hasFieldText}from"../FieldBase/index.js";import{OptionSheet}from"../OptionSheet/OptionSheet.js";import{Spinner}from"../Spinner/index.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";let fileIdSeq=0;const nextFileId=()=>"wfp-"+ ++fileIdSeq,DEFAULT_LABELS={trigger:"Attach file",addMore:"Add more",sheetTitle:"Add from",removeFile:e=>`Remove ${e}`,retry:"Retry upload",errorTooMany:e=>`You can attach up to ${e} files.`,errorTooLarge:(e,r)=>`${e} is larger than ${r} MB.`,errorWrongType:e=>`${e} is not an accepted file type.`};export const formatFileSize=e=>{if(void 0===e||e<=0)return"";const r=["B","KB","MB","GB"];let t=e,o=0;for(;t>=1024&&o<r.length-1;)t/=1024,o+=1;return`${t>=10||0===o?Math.round(t):Math.round(10*t)/10} ${r[o]}`};export const matchesAccept=(e,r)=>!r||0===r.length||!!e&&r.some(r=>"*/*"===r||"*"===r||(r.endsWith("/*")?e.startsWith(r.slice(0,r.length-1)):e===r));const isImage=e=>!0===e.type?.startsWith("image/")||!e.type&&/\.(png|jpe?g|gif|webp|heic)$/i.test(e.name),imageSourceOf=e=>e.thumbnailUrl??(isImage(e)?e.uri??e.url:void 0),extensionOf=e=>{const r=e.lastIndexOf(".");return r<=0||r===e.length-1?"FILE":e.slice(r+1).toUpperCase().slice(0,4)},FilePicker=forwardRef((e,r)=>{const{files:t,defaultFiles:o,onChange:i,sources:s,maxFiles:l,maxSizeMB:n,accept:a,validate:c,process:d,variant:u="card",renderFile:g,renderTrigger:h,disabled:p=!1,helperText:m,error:y,labels:b,haptic:x,onPick:f,onRemove:T,onError:S,onFilePress:j,onRetry:C,style:v,accessibilityLabel:w,testID:F}=e,k=useTheme(),_=useMemo(()=>buildStyles(k),[k]),P=useMemo(()=>({...DEFAULT_LABELS,...b}),[b]),z=k.components.filePicker,R=z?.thumbnailSize??84,I=z?.borderRadius??k.radius.md,V=z?.dashedBorderColor??k.colors.primary,[O,B]=useControllableState({value:t,defaultValue:o??[],onChange:i}),L=useRef(O);L.current=O;const M=useCallback(e=>{L.current=e,B(e)},[B]),[H,$]=useState(null),[A,E]=useState(!1),W=y??H??void 0,D="number"==typeof l&&O.length>=l,U=useCallback((e,r)=>{0!==e.length&&($(e[0]),e.forEach(e=>S?.(e,r)),!1!==x&&triggerHaptic("notificationError"))},[S,x]),G=useCallback(async e=>{let r;try{r=await e.pick()}catch(e){return void U([e instanceof Error?e.message:String(e)])}if(!r||0===r.length)return;const t=[];let o=r.map(e=>({id:nextFileId(),name:e.name??e.uri.split("/").pop()??"file",uri:e.uri,type:e.type,size:e.size,meta:e.meta,status:"idle"}));if("number"==typeof l){const e=Math.max(0,l-L.current.length);o.length>e&&(t.push(P.errorTooMany(l)),o=o.slice(0,e))}const i=[];for(const e of o){if("number"==typeof n&&"number"==typeof e.size&&e.size>1024*n*1024){t.push(P.errorTooLarge(e.name,n));continue}if(!matchesAccept(e.type,a)){t.push(P.errorWrongType(e.name));continue}const r=c?.(e);r?t.push(r):i.push(e)}if(U(t),0===i.length)return;if(!d){M([...L.current,...i]),$(t.length>0?t[0]:null);const e=resolveHaptic(x,"selection");return e&&triggerHaptic(e),void f?.(i)}const s=i.map(e=>({...e,status:"processing"}));M([...L.current,...s]);const u=[];for(const e of s)try{const r=await d({...e,status:"idle"}),t={...r,id:e.id,status:r.status??"idle"};M(L.current.map(r=>r.id===e.id?t:r)),u.push(t)}catch(r){M(L.current.filter(r=>r.id!==e.id)),U([r instanceof Error?r.message:String(r)],e)}if(u.length>0){0===t.length&&$(null);const e=resolveHaptic(x,"selection");e&&triggerHaptic(e),f?.(u)}},[l,n,a,c,d,P,U,M,f,x]),N=useCallback(e=>{if(p||D)return;const r=e?s.find(r=>r.key===e):1===s.length?s[0]:void 0;r?G(r):s.length>1&&E(!0)},[p,D,s,G]),q=useCallback(e=>{if(p)return;M(L.current.filter(r=>r.id!==e.id)),$(null);const r=resolveHaptic(x,"selection");r&&triggerHaptic(r),T?.(e)},[p,M,T,x]),K=useCallback(()=>{M([]),$(null)},[M]);useImperativeHandle(r,()=>({open:N,clear:K}),[N,K]);const Y=0===O.length?P.trigger:`${O.length} file${1===O.length?"":"s"} attached`,J=w??`Attachments. ${Y}`,statusText=e=>{switch(e.status){case"processing":return"Processing…";case"uploading":return`Uploading ${Math.round(100*(e.progress??0))}%`;case"done":return"Uploaded";case"error":return e.error??"Failed";default:return""}},fileA11yLabel=e=>[e.name,formatFileSize(e.size),statusText(e)].filter(Boolean).join(", "),Q=k.icons?.attachment??defaultIcons.attachment,renderStatusOverlay=e=>{if("processing"===e.status)return _jsx(View,{style:[_.tileOverlay,{backgroundColor:k.colors.background.overlay}],children:_jsx(Spinner,{size:"sm"})});if("uploading"===e.status){const r=Math.round(100*(e.progress??0));return _jsxs(View,{style:[_.tileOverlay,{backgroundColor:k.colors.background.overlay}],children:[_jsx(Text,{style:[_.tileOverlayText,{color:k.colors.onOverlay}],children:`${r}%`}),_jsx(View,{style:[_.tileProgressTrack,{backgroundColor:k.colors.border.primary}],children:_jsx(View,{style:[_.tileProgressFill,{width:`${r}%`,backgroundColor:k.colors.primary}]})})]})}return"done"===e.status?_jsx(View,{style:[_.doneBadge,{backgroundColor:k.colors.success}],children:_jsx(Text,{style:[_.doneBadgeText,{color:k.colors.onSuccess}],children:"✓"})}):null},renderThumbnail=e=>{const r=imageSourceOf(e);return r?_jsx(Image,{source:{uri:r},style:_.thumbnailImage}):_jsx(View,{style:[_.extensionTile,{backgroundColor:k.colors.background.secondary}],children:_jsx(Text,{style:[_.extensionText,{color:k.colors.text.secondary,...fontFor(k,"semibold")}],children:extensionOf(e.name)})})},removeButton=e=>_jsx(Pressable,{onPress:()=>q(e),disabled:p,hitSlop:8,accessibilityRole:"button",accessibilityLabel:P.removeFile(e.name),style:[_.removeButton,{backgroundColor:k.colors.background.overlay}],children:_jsx(Text,{style:[_.removeButtonText,{color:k.colors.onOverlay}],children:"×"})}),retryButton=e=>C&&"error"===e.status?_jsx(Pressable,{onPress:()=>C(e),disabled:p,hitSlop:8,accessibilityRole:"button",accessibilityLabel:P.retry,children:_jsx(Text,{style:[_.retryText,{color:k.colors.primary}],children:"↻"})}):null,renderOneFile=(e,r)=>{const t={file:e,index:r,disabled:p,remove:()=>q(e),retry:C?()=>C(e):void 0},o=g?g(t):"card"===u?(e=>{const{file:r}=e;return _jsxs(View,{style:[_.tile,{width:R,height:R,borderRadius:I,...smoothCorners,borderColor:"error"===r.status?k.colors.error:k.colors.border.primary}],children:[renderThumbnail(r),renderStatusOverlay(r),"error"===r.status?_jsx(View,{style:[_.tileOverlay,{backgroundColor:k.colors.background.overlay}],children:retryButton(r)}):null,removeButton(r)]})})(t):(e=>{const{file:r}=e,t=statusText(r);return _jsxs(View,{style:[_.listRow,{borderRadius:I,...smoothCorners,borderColor:"error"===r.status?k.colors.error:k.colors.border.primary,backgroundColor:k.colors.background.primary}],children:[_jsxs(View,{style:[_.listThumb,{borderRadius:k.radius.sm,...smoothCorners}],children:[renderThumbnail(r),"processing"===r.status?_jsx(View,{style:[_.tileOverlay,{backgroundColor:k.colors.background.overlay}],children:_jsx(Spinner,{size:"sm"})}):null]}),_jsxs(View,{style:_.listTextWrap,children:[_jsx(Text,{numberOfLines:1,ellipsizeMode:"middle",style:[_.listName,{color:k.colors.text.primary,fontSize:k.typography.fontSize.sm,...fontFor(k,"medium")}],children:r.name}),_jsx(Text,{numberOfLines:1,style:[_.listSubtitle,{color:"error"===r.status?k.colors.toneText.error:k.colors.text.tertiary,fontSize:k.typography.fontSize.xs}],children:[formatFileSize(r.size),t].filter(Boolean).join(" · ")}),"uploading"===r.status?_jsx(View,{style:[_.listProgressTrack,{backgroundColor:k.colors.border.primary}],children:_jsx(View,{style:[_.listProgressFill,{width:`${Math.round(100*(r.progress??0))}%`,backgroundColor:k.colors.primary}]})}):null]}),retryButton(r),_jsx(Pressable,{onPress:()=>q(r),disabled:p,hitSlop:8,accessibilityRole:"button",accessibilityLabel:P.removeFile(r.name),children:_jsx(Text,{style:[_.listRemoveText,{color:k.colors.text.tertiary}],children:"×"})})]})})(t);return _jsx(Pressable,{onPress:j?()=>j(e):void 0,disabled:p||!j,accessibilityLabel:fileA11yLabel(e),children:o},e.id)},X={open:N,disabled:p||D,fileCount:O.length,atCapacity:D},dashedTrigger=e=>_jsxs(Pressable,{onPress:()=>N(),disabled:p||D,accessibilityRole:"button",accessibilityLabel:J,accessibilityState:{disabled:p||D},"aria-disabled":p||D,style:({pressed:r})=>[_.trigger,e?_.triggerCompact:null,{borderRadius:I,...smoothCorners,borderColor:V,backgroundColor:r?k.colors.surface.pressed:k.colors.background.primary,opacity:p||D?.55:1}],children:[_jsxs(View,{style:_.triggerRow,children:[Q?Q({size:16,color:k.colors.primary}):null,_jsx(Text,{style:[_.triggerText,{color:k.colors.primary,fontSize:k.typography.fontSize.sm,...fontFor(k,"medium")}],children:0===O.length?P.trigger:P.addMore})]}),!e&&m?_jsx(Text,{style:[_.helperText,{color:k.colors.text.tertiary,fontSize:k.typography.fontSize.xs}],children:m}):null]}),Z=_jsx(Pressable,{onPress:()=>N(),disabled:p||D,accessibilityRole:"button",accessibilityLabel:P.addMore,style:({pressed:e})=>[_.tile,_.addTile,{width:R,height:R,borderRadius:I,...smoothCorners,borderColor:V,backgroundColor:e?k.colors.surface.pressed:"transparent",opacity:p||D?.55:1}],children:_jsx(Text,{style:[_.addTileText,{color:k.colors.primary}],children:"+"})});return _jsxs(View,{style:[_.container,v],testID:F,accessibilityLabel:J,children:["card"===u?0===O.length?h?h(X):dashedTrigger(!1):_jsxs(ScrollView,{horizontal:!0,showsHorizontalScrollIndicator:!1,contentContainerStyle:[_.strip,{columnGap:k.spacing.sm}],children:[O.map(renderOneFile),h?h(X):D||p?null:Z]}):_jsxs(View,{style:{rowGap:k.spacing.sm},children:[h?h(X):D?null:dashedTrigger(O.length>0),O.map(renderOneFile)]}),hasFieldText(W)?_jsx(Text,{accessibilityLiveRegion:"polite",style:[_.errorText,{color:k.colors.toneText.error,fontSize:k.typography.fontSize.xs,marginTop:k.spacing.xxs}],children:W}):null,_jsx(OptionSheet,{open:A,onClose:()=>E(!1),title:P.sheetTitle,options:s,labelOf:e=>e.label,getValue:e=>e.key,disabledOf:()=>!1,descriptionOf:e=>e.description,iconOf:e=>e.icon,isSelected:()=>!1,onSelect:e=>{E(!1),G(e)}})]})});FilePicker.displayName="FilePicker";const buildStyles=e=>StyleSheet.create({container:{width:"100%"},trigger:{borderWidth:1,borderStyle:"dashed",alignItems:"center",paddingVertical:14,paddingHorizontal:16},triggerCompact:{paddingVertical:10},triggerRow:{flexDirection:"row",alignItems:"center",columnGap:8},triggerText:{includeFontPadding:!1},helperText:{includeFontPadding:!1,marginTop:6,textAlign:"center"},strip:{paddingVertical:2},tile:{borderWidth:1,overflow:"hidden"},addTile:{borderStyle:"dashed",alignItems:"center",justifyContent:"center"},addTileText:{fontSize:28,includeFontPadding:!1},thumbnailImage:{width:"100%",height:"100%",resizeMode:"cover"},extensionTile:{width:"100%",height:"100%",alignItems:"center",justifyContent:"center"},extensionText:{fontSize:12,letterSpacing:1,includeFontPadding:!1},tileOverlay:{...StyleSheet.absoluteFill,alignItems:"center",justifyContent:"center"},tileOverlayText:{fontSize:12,includeFontPadding:!1,marginBottom:6},tileProgressTrack:{position:"absolute",left:8,right:8,bottom:8,height:3,borderRadius:2,...smoothCorners,overflow:"hidden"},tileProgressFill:{height:"100%",borderRadius:2,...smoothCorners},doneBadge:{position:"absolute",right:4,bottom:4,width:18,height:18,borderRadius:9,...smoothCorners,alignItems:"center",justifyContent:"center"},doneBadgeText:{fontSize:11,includeFontPadding:!1},removeButton:{position:"absolute",top:4,right:4,width:20,height:20,borderRadius:10,...smoothCorners,alignItems:"center",justifyContent:"center"},removeButtonText:{fontSize:13,lineHeight:15,includeFontPadding:!1},retryText:{fontSize:20,includeFontPadding:!1},listRow:{flexDirection:"row",alignItems:"center",borderWidth:1,padding:10,columnGap:10},listThumb:{width:40,height:40,overflow:"hidden"},listTextWrap:{flex:1},listName:{includeFontPadding:!1},listSubtitle:{includeFontPadding:!1,marginTop:2},listProgressTrack:{height:3,borderRadius:2,...smoothCorners,overflow:"hidden",marginTop:6},listProgressFill:{height:"100%",borderRadius:2,...smoothCorners},listRemoveText:{fontSize:22,includeFontPadding:!1,paddingHorizontal:4},errorText:{includeFontPadding:!1}});export{FilePicker};export default FilePicker;
1
+ "use strict";import{forwardRef,useCallback,useImperativeHandle,useMemo,useRef,useState}from"react";import{Image,Pressable,ScrollView,StyleSheet,Text,View}from"react-native";import{useControllableState}from"../../hooks/index.js";import{fontFor,radiusOf,useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{hasFieldText}from"../FieldBase/index.js";import{OptionSheet}from"../OptionSheet/OptionSheet.js";import{Spinner}from"../Spinner/index.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";let fileIdSeq=0;const nextFileId=()=>"wfp-"+ ++fileIdSeq,DEFAULT_LABELS={trigger:"Attach file",addMore:"Add more",sheetTitle:"Add from",removeFile:e=>`Remove ${e}`,retry:"Retry upload",errorTooMany:e=>`You can attach up to ${e} files.`,errorTooLarge:(e,r)=>`${e} is larger than ${r} MB.`,errorWrongType:e=>`${e} is not an accepted file type.`};export const formatFileSize=e=>{if(void 0===e||e<=0)return"";const r=["B","KB","MB","GB"];let t=e,o=0;for(;t>=1024&&o<r.length-1;)t/=1024,o+=1;return`${t>=10||0===o?Math.round(t):Math.round(10*t)/10} ${r[o]}`};export const matchesAccept=(e,r)=>!r||0===r.length||!!e&&r.some(r=>"*/*"===r||"*"===r||(r.endsWith("/*")?e.startsWith(r.slice(0,r.length-1)):e===r));const isImage=e=>!0===e.type?.startsWith("image/")||!e.type&&/\.(png|jpe?g|gif|webp|heic)$/i.test(e.name),imageSourceOf=e=>e.thumbnailUrl??(isImage(e)?e.uri??e.url:void 0),extensionOf=e=>{const r=e.lastIndexOf(".");return r<=0||r===e.length-1?"FILE":e.slice(r+1).toUpperCase().slice(0,4)},FilePicker=forwardRef((e,r)=>{const{files:t,defaultFiles:o,onChange:i,sources:s,maxFiles:l,maxSizeMB:n,accept:a,validate:c,process:d,variant:u="card",renderFile:g,renderTrigger:p,disabled:h=!1,helperText:m,error:y,labels:x,haptic:f,onPick:b,onRemove:S,onError:T,onFilePress:j,onRetry:C,style:v,accessibilityLabel:w,testID:k}=e,F=useTheme(),z=useMemo(()=>buildStyles(F),[F]),_=useMemo(()=>({...DEFAULT_LABELS,...x}),[x]),P=F.components.filePicker,R=P?.thumbnailSize??84,I=radiusOf(F,P?.radius??"md","components.filePicker.radius"),O=P?.dashedBorderColor??F.colors.primary,[V,B]=useControllableState({value:t,defaultValue:o??[],onChange:i}),L=useRef(V);L.current=V;const M=useCallback(e=>{L.current=e,B(e)},[B]),[H,$]=useState(null),[A,E]=useState(!1),W=y??H??void 0,D="number"==typeof l&&V.length>=l,U=useCallback((e,r)=>{0!==e.length&&($(e[0]),e.forEach(e=>T?.(e,r)),!1!==f&&triggerHaptic("notificationError"))},[T,f]),G=useCallback(async e=>{let r;try{r=await e.pick()}catch(e){return void U([e instanceof Error?e.message:String(e)])}if(!r||0===r.length)return;const t=[];let o=r.map(e=>({id:nextFileId(),name:e.name??e.uri.split("/").pop()??"file",uri:e.uri,type:e.type,size:e.size,meta:e.meta,status:"idle"}));if("number"==typeof l){const e=Math.max(0,l-L.current.length);o.length>e&&(t.push(_.errorTooMany(l)),o=o.slice(0,e))}const i=[];for(const e of o){if("number"==typeof n&&"number"==typeof e.size&&e.size>1024*n*1024){t.push(_.errorTooLarge(e.name,n));continue}if(!matchesAccept(e.type,a)){t.push(_.errorWrongType(e.name));continue}const r=c?.(e);r?t.push(r):i.push(e)}if(U(t),0===i.length)return;if(!d){M([...L.current,...i]),$(t.length>0?t[0]:null);const e=resolveHaptic(f,"selection");return e&&triggerHaptic(e),void b?.(i)}const s=i.map(e=>({...e,status:"processing"}));M([...L.current,...s]);const u=[];for(const e of s)try{const r=await d({...e,status:"idle"}),t={...r,id:e.id,status:r.status??"idle"};M(L.current.map(r=>r.id===e.id?t:r)),u.push(t)}catch(r){M(L.current.filter(r=>r.id!==e.id)),U([r instanceof Error?r.message:String(r)],e)}if(u.length>0){0===t.length&&$(null);const e=resolveHaptic(f,"selection");e&&triggerHaptic(e),b?.(u)}},[l,n,a,c,d,_,U,M,b,f]),N=useCallback(e=>{if(h||D)return;const r=e?s.find(r=>r.key===e):1===s.length?s[0]:void 0;r?G(r):s.length>1&&E(!0)},[h,D,s,G]),q=useCallback(e=>{if(h)return;M(L.current.filter(r=>r.id!==e.id)),$(null);const r=resolveHaptic(f,"selection");r&&triggerHaptic(r),S?.(e)},[h,M,S,f]),K=useCallback(()=>{M([]),$(null)},[M]);useImperativeHandle(r,()=>({open:N,clear:K}),[N,K]);const Y=0===V.length?_.trigger:`${V.length} file${1===V.length?"":"s"} attached`,J=w??`Attachments. ${Y}`,statusText=e=>{switch(e.status){case"processing":return"Processing…";case"uploading":return`Uploading ${Math.round(100*(e.progress??0))}%`;case"done":return"Uploaded";case"error":return e.error??"Failed";default:return""}},fileA11yLabel=e=>[e.name,formatFileSize(e.size),statusText(e)].filter(Boolean).join(", "),Q=F.icons?.attachment??defaultIcons.attachment,renderStatusOverlay=e=>{if("processing"===e.status)return _jsx(View,{style:[z.tileOverlay,{backgroundColor:F.colors.background.overlay}],children:_jsx(Spinner,{size:"sm"})});if("uploading"===e.status){const r=Math.round(100*(e.progress??0));return _jsxs(View,{style:[z.tileOverlay,{backgroundColor:F.colors.background.overlay}],children:[_jsx(Text,{style:[z.tileOverlayText,{color:F.colors.onOverlay}],children:`${r}%`}),_jsx(View,{style:[z.tileProgressTrack,{backgroundColor:F.colors.border.primary}],children:_jsx(View,{style:[z.tileProgressFill,{width:`${r}%`,backgroundColor:F.colors.primary}]})})]})}return"done"===e.status?_jsx(View,{style:[z.doneBadge,{backgroundColor:F.colors.success}],children:_jsx(Text,{style:[z.doneBadgeText,{color:F.colors.onSuccess}],children:"✓"})}):null},renderThumbnail=e=>{const r=imageSourceOf(e);return r?_jsx(Image,{source:{uri:r},style:z.thumbnailImage}):_jsx(View,{style:[z.extensionTile,{backgroundColor:F.colors.background.secondary}],children:_jsx(Text,{style:[z.extensionText,{color:F.colors.text.secondary,...fontFor(F,"semibold")}],children:extensionOf(e.name)})})},removeButton=e=>_jsx(Pressable,{onPress:()=>q(e),disabled:h,hitSlop:8,accessibilityRole:"button",accessibilityLabel:_.removeFile(e.name),style:[z.removeButton,{backgroundColor:F.colors.background.overlay}],children:_jsx(Text,{style:[z.removeButtonText,{color:F.colors.onOverlay}],children:"×"})}),retryButton=e=>C&&"error"===e.status?_jsx(Pressable,{onPress:()=>C(e),disabled:h,hitSlop:8,accessibilityRole:"button",accessibilityLabel:_.retry,children:_jsx(Text,{style:[z.retryText,{color:F.colors.primary}],children:"↻"})}):null,renderOneFile=(e,r)=>{const t={file:e,index:r,disabled:h,remove:()=>q(e),retry:C?()=>C(e):void 0},o=g?g(t):"card"===u?(e=>{const{file:r}=e;return _jsxs(View,{style:[z.tile,{width:R,height:R,borderRadius:I,...smoothCorners,borderColor:"error"===r.status?F.colors.error:F.colors.border.primary}],children:[renderThumbnail(r),renderStatusOverlay(r),"error"===r.status?_jsx(View,{style:[z.tileOverlay,{backgroundColor:F.colors.background.overlay}],children:retryButton(r)}):null,removeButton(r)]})})(t):(e=>{const{file:r}=e,t=statusText(r);return _jsxs(View,{style:[z.listRow,{borderRadius:I,...smoothCorners,borderColor:"error"===r.status?F.colors.error:F.colors.border.primary,backgroundColor:F.colors.background.primary}],children:[_jsxs(View,{style:[z.listThumb,{borderRadius:F.radius.sm,...smoothCorners}],children:[renderThumbnail(r),"processing"===r.status?_jsx(View,{style:[z.tileOverlay,{backgroundColor:F.colors.background.overlay}],children:_jsx(Spinner,{size:"sm"})}):null]}),_jsxs(View,{style:z.listTextWrap,children:[_jsx(Text,{numberOfLines:1,ellipsizeMode:"middle",style:[z.listName,{color:F.colors.text.primary,fontSize:F.typography.fontSize.sm,...fontFor(F,"medium")}],children:r.name}),_jsx(Text,{numberOfLines:1,style:[z.listSubtitle,{color:"error"===r.status?F.colors.toneText.error:F.colors.text.tertiary,fontSize:F.typography.fontSize.xs}],children:[formatFileSize(r.size),t].filter(Boolean).join(" · ")}),"uploading"===r.status?_jsx(View,{style:[z.listProgressTrack,{backgroundColor:F.colors.border.primary}],children:_jsx(View,{style:[z.listProgressFill,{width:`${Math.round(100*(r.progress??0))}%`,backgroundColor:F.colors.primary}]})}):null]}),retryButton(r),_jsx(Pressable,{onPress:()=>q(r),disabled:h,hitSlop:8,accessibilityRole:"button",accessibilityLabel:_.removeFile(r.name),children:_jsx(Text,{style:[z.listRemoveText,{color:F.colors.text.tertiary}],children:"×"})})]})})(t);return _jsx(Pressable,{onPress:j?()=>j(e):void 0,disabled:h||!j,accessibilityLabel:fileA11yLabel(e),children:o},e.id)},X={open:N,disabled:h||D,fileCount:V.length,atCapacity:D},dashedTrigger=e=>_jsxs(Pressable,{onPress:()=>N(),disabled:h||D,accessibilityRole:"button",accessibilityLabel:J,accessibilityState:{disabled:h||D},"aria-disabled":h||D,style:({pressed:r})=>[z.trigger,e?z.triggerCompact:null,{borderRadius:I,...smoothCorners,borderColor:O,backgroundColor:r?F.colors.surface.pressed:F.colors.background.primary,opacity:h||D?.55:1}],children:[_jsxs(View,{style:z.triggerRow,children:[Q?Q({size:16,color:F.colors.primary}):null,_jsx(Text,{style:[z.triggerText,{color:F.colors.primary,fontSize:F.typography.fontSize.sm,...fontFor(F,"medium")}],children:0===V.length?_.trigger:_.addMore})]}),!e&&m?_jsx(Text,{style:[z.helperText,{color:F.colors.text.tertiary,fontSize:F.typography.fontSize.xs}],children:m}):null]}),Z=_jsx(Pressable,{onPress:()=>N(),disabled:h||D,accessibilityRole:"button",accessibilityLabel:_.addMore,style:({pressed:e})=>[z.tile,z.addTile,{width:R,height:R,borderRadius:I,...smoothCorners,borderColor:O,backgroundColor:e?F.colors.surface.pressed:"transparent",opacity:h||D?.55:1}],children:_jsx(Text,{style:[z.addTileText,{color:F.colors.primary}],children:"+"})});return _jsxs(View,{style:[z.container,v],testID:k,accessibilityLabel:J,children:["card"===u?0===V.length?p?p(X):dashedTrigger(!1):_jsxs(ScrollView,{horizontal:!0,showsHorizontalScrollIndicator:!1,contentContainerStyle:[z.strip,{columnGap:F.spacing.sm}],children:[V.map(renderOneFile),p?p(X):D||h?null:Z]}):_jsxs(View,{style:{rowGap:F.spacing.sm},children:[p?p(X):D?null:dashedTrigger(V.length>0),V.map(renderOneFile)]}),hasFieldText(W)?_jsx(Text,{accessibilityLiveRegion:"polite",style:[z.errorText,{color:F.colors.toneText.error,fontSize:F.typography.fontSize.xs,marginTop:F.spacing.xxs}],children:W}):null,_jsx(OptionSheet,{open:A,onClose:()=>E(!1),title:_.sheetTitle,options:s,labelOf:e=>e.label,getValue:e=>e.key,disabledOf:()=>!1,descriptionOf:e=>e.description,iconOf:e=>e.icon,isSelected:()=>!1,onSelect:e=>{E(!1),G(e)}})]})});FilePicker.displayName="FilePicker";const buildStyles=e=>StyleSheet.create({container:{width:"100%"},trigger:{borderWidth:1,borderStyle:"dashed",alignItems:"center",minHeight:48,paddingVertical:e.spacing.md,paddingHorizontal:e.spacing.lg},triggerCompact:{minHeight:40,paddingVertical:e.spacing.sm},triggerRow:{flexDirection:"row",alignItems:"center",columnGap:e.spacing.sm},triggerText:{includeFontPadding:!1},helperText:{includeFontPadding:!1,marginTop:e.spacing.xs,textAlign:"center"},strip:{paddingVertical:e.spacing.xxs},tile:{borderWidth:1,overflow:"hidden"},addTile:{borderStyle:"dashed",alignItems:"center",justifyContent:"center"},addTileText:{fontSize:e.typography.fontSize["3xl"],includeFontPadding:!1},thumbnailImage:{width:"100%",height:"100%",resizeMode:"cover"},extensionTile:{width:"100%",height:"100%",alignItems:"center",justifyContent:"center"},extensionText:{fontSize:e.typography.fontSize.sm,letterSpacing:1,includeFontPadding:!1},tileOverlay:{...StyleSheet.absoluteFill,alignItems:"center",justifyContent:"center"},tileOverlayText:{fontSize:e.typography.fontSize.sm,includeFontPadding:!1,marginBottom:e.spacing.xs},tileProgressTrack:{position:"absolute",left:8,right:8,bottom:8,height:3,borderRadius:e.radius.pill,...smoothCorners,overflow:"hidden"},tileProgressFill:{height:"100%",borderRadius:e.radius.pill,...smoothCorners},doneBadge:{position:"absolute",right:4,bottom:4,width:18,height:18,borderRadius:e.radius.pill,...smoothCorners,alignItems:"center",justifyContent:"center"},doneBadgeText:{fontSize:e.typography.fontSize.xs,includeFontPadding:!1},removeButton:{position:"absolute",top:4,right:4,width:20,height:20,borderRadius:e.radius.pill,...smoothCorners,alignItems:"center",justifyContent:"center"},removeButtonText:{fontSize:e.typography.fontSize.sm,lineHeight:15,includeFontPadding:!1},retryText:{fontSize:e.typography.fontSize.xl,includeFontPadding:!1},listRow:{flexDirection:"row",alignItems:"center",borderWidth:1,padding:e.spacing.sm,columnGap:e.spacing.sm},listThumb:{width:40,height:40,overflow:"hidden"},listTextWrap:{flex:1},listName:{includeFontPadding:!1},listSubtitle:{includeFontPadding:!1,marginTop:e.spacing.xxs},listProgressTrack:{height:3,borderRadius:e.radius.pill,...smoothCorners,overflow:"hidden",marginTop:e.spacing.xs},listProgressFill:{height:"100%",borderRadius:e.radius.pill,...smoothCorners},listRemoveText:{fontSize:e.typography.fontSize["2xl"],includeFontPadding:!1,paddingHorizontal:e.spacing.xs},errorText:{includeFontPadding:!1}});export{FilePicker};export default FilePicker;
@@ -1 +1 @@
1
- "use strict";import{Logger}from"@webority/mobile-core";import React,{forwardRef,useCallback,useEffect,useMemo,useRef,useState}from"react";import{AccessibilityInfo,Animated,BackHandler,Easing,Platform,Pressable,StyleSheet,Text,View}from"react-native";import Reanimated,{cancelAnimation,Easing as ReanimatedEasing,useAnimatedStyle,useSharedValue,withTiming}from"react-native-reanimated";import{useSafeAreaInsets}from"react-native-safe-area-context";import{usePresenceMotion}from"../../hooks/usePresenceMotion.js";import{usePressAnimation}from"../../hooks/usePressAnimation.js";import{createAnimatedValue,setNativeValue,useTheme}from"../../theme/index.js";import{announce}from"../../utils/announce.js";import{ACCENT_PRESSED_TINT}from"../../utils/color.js";import{smoothCorners}from"../../utils/corners.js";import{resolveHaptic,triggerHaptic}from"../../utils/hapticUtils.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";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: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=forwardRef((e,t)=>{const{icon:n,onPress:o,label:i,collapsed:s=!1,size:r="md",tone:a="primary",position:l,bottomOffset:c,disabled:u=!1,hideOnScroll:d=!1,isScrolling:m=!1,accessibilityLabel:g,accessibilityHint:b,haptic:f,style:p,containerStyle:h,labelStyle:y,testID:S}=e,w=useTheme(),x=useSafeAreaInsets(),v=sizeMap[r],A=useMemo(()=>buildStyles(w),[w]),{scale:R,opacity:_,pressIn:E,pressOut:C}=usePressAnimation({enabled:!u}),j=usePresenceMotion(),P=w.components.floatingActionButton,I=P?.edgeOffset??24,k=P?.bottomOffset??24,V=useRef(createAnimatedValue(1)).current,F=j.duration("normal");useEffect(()=>{if(!d)return void setNativeValue(V,1);const e=Animated.timing(V,{toValue:m?0:1,duration:F,easing:Easing.bezier(...w.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[d,m,V,F,w.motion.easing.standard]);const T=v.diameter+(c??k)+x.bottom+I,z=V.interpolate({inputRange:[0,1],outputRange:j.range(T,0)}),D=useMemo(()=>Animated.multiply(V,_),[V,_]),B=n,M="string"==typeof i&&i.length>0,L=M&&s,O=j.reduced,H=w.spacing.sm,N=v.labelPaddingHorizontal,$=w.motion.duration.fast,G=w.motion.easing.standard,W=useSharedValue(L?1:0),[U,Y]=useState(null);useEffect(()=>{const e=L?1:0;return W.value=O?e:withTiming(e,{duration:$,easing:ReanimatedEasing.bezier(...G)}),()=>cancelAnimation(W)},[L,O,W,$,G]);const Q=useCallback(e=>{const t=Math.ceil(e);Y(e=>e===t?e:t)},[]),X=useAnimatedStyle(()=>({paddingHorizontal:N*(1-W.value)})),q=useAnimatedStyle(()=>{const e=Math.max(0,1-2*W.value);return null===U?W.value>=1?{opacity:e,width:0}:{opacity:e}:{opacity:e,width:(U+H)*(1-W.value)}}),J=u?w.colors.surface.disabled:toneBackground(w,a),K=u?w.colors.text.disabled:toneForeground(w,a),Z=useMemo(()=>{if(!l)return null;const e=(c??k)+x.bottom;switch(l){case"bottomLeft":return{position:"absolute",bottom:e,left:I};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center"};default:return{position:"absolute",bottom:e,right:I}}},[l,c,x.bottom,k,I]);return _jsx(Animated.View,{style:[Z,{transform:[{translateY:z},{scale:R}],opacity:D},h,p],pointerEvents:d&&m?"none":"auto",children:_jsx(Pressable,{ref:t,onPress:e=>{if(u)return;const t=resolveHaptic(f,"impactLight");t&&triggerHaptic(t),o()},onPressIn:E,onPressOut:C,disabled:u,accessibilityRole:"button",accessibilityLabel:g,accessibilityHint:b,accessibilityState:{disabled:u},"aria-disabled":u,testID:S,style:[A.base,M?{height:v.diameter,minWidth:v.diameter,borderRadius:v.diameter/2,...smoothCorners}:{width:v.diameter,height:v.diameter,borderRadius:v.diameter/2,...smoothCorners},w.shadows.lg,{backgroundColor:J,opacity:u?.55:1}],children:({pressed:e})=>_jsxs(_Fragment,{children:[e&&!u?_jsx(View,{pointerEvents:"none",testID:"fab-pressed",style:[A.pressedTint,{backgroundColor:pressedTintFor(w,a),borderRadius:v.diameter/2,...smoothCorners}]}):null,M?_jsxs(Reanimated.View,{style:[A.extendedRow,X],children:[B,_jsx(Reanimated.View,{style:[A.labelClip,q],children:_jsx(Text,{onLayout:e=>Q(e.nativeEvent.layout.width),style:[A.label,{color:K,fontSize:v.fontSize,fontWeight:w.typography.fontWeight.semibold,marginLeft:H},y],numberOfLines:1,children:i})})]}):B]})})})});FloatingActionButton.displayName="FloatingActionButton";const buildStyles=e=>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:o,open:i,defaultOpen:s=!1,onOpenChange:r,position:a="bottomRight",bottomOffset:l,size:c="md",accessibilityLabel:u="Quick actions",haptic:d,hideOnScroll:m=!1,isScrolling:g=!1,containerStyle:b,secondaryActionStyle:f,labelPillStyle:p,labelStyle:h,testID:y}=e,S=useTheme(),w=useSafeAreaInsets(),x=sizeMap[c],v=useMemo(()=>buildGroupStyles(S),[S]),A=usePresenceMotion(),R=A.duration("normal"),_=S.components.floatingActionButton,E=_?.edgeOffset??24,C=_?.bottomOffset??24,j=_?.secondaryGap??16,P=_?.staggerMs??50,I=useMemo(()=>o.slice(0,6),[o]),k=I.length,V=useMemo(()=>I.map((e,t)=>({action:e,index:t})).reverse(),[I]),F=__DEV__?describeActionProblem(o):"";useEffect(()=>{__DEV__&&F&&Logger.warn(`[@webority/mobile-ui] FloatingActionButtonGroup ${F}`)},[F]);const T="boolean"==typeof i,[z,D]=useState(s),B=T?i:z,M=useRef(createAnimatedValue(1)).current;useEffect(()=>{if(!m)return void setNativeValue(M,1);const e=Animated.timing(M,{toValue:g?0:1,duration:R,easing:Easing.bezier(...S.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[m,g,M,R,S.motion.easing.standard]);const L=m&&g;useEffect(()=>{L&&B&&(T||D(!1),r?.(!1))},[L,B,T,r]);const O=x.diameter+(l??C)+w.bottom+E,H=M.interpolate({inputRange:[0,1],outputRange:A.range(O,0)}),N=M,$=useRef(createAnimatedValue(B?1:0)).current,G=useRef([]),[W,U]=useState(0);useEffect(()=>{const e=G.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 Animated.Value(B?1:0));G.current=t}else G.current=e.slice(0,k);U(e=>e+1)}},[k]),useEffect(()=>{const e=Animated.timing($,{toValue:B?1:0,duration:R,easing:Easing.bezier(...S.motion.easing.standard),useNativeDriver:!0});e.start();const t=G.current.map(e=>Animated.timing(e,{toValue:B?1:0,duration:R,easing:Easing.bezier(...S.motion.easing.standard),useNativeDriver:!0})),n=B?t:[...t].reverse(),o=Animated.stagger(P,n);return o.start(),()=>{e.stop(),o.stop()}},[B,$,R,S.motion.easing.standard,k,W,P]);const Y=useCallback(e=>{const t=resolveHaptic(d,"impactLight");t&&triggerHaptic(t),T||D(e),r?.(e)},[T,r,d]),Q=useRef(null),X=useRef(B),q=useRef(!1);useEffect(()=>{if(X.current===B)return;X.current=B;const e=q.current;if(q.current=!1,L||e)return;const t=Q.current;t&&("web"===Platform.OS?t.focus?.():AccessibilityInfo.sendAccessibilityEvent(t,"focus"));announce(B?`${u}, expanded, ${k} ${1===k?"action":"actions"}`:`${u}, collapsed`)},[B,L,u,k]);const J=useCallback(()=>{Y(!B)},[B,Y]),K=useCallback(e=>{!1!==d&&triggerHaptic("selection"),q.current=!0,e.onPress(),T||D(!1),r?.(!1)},[T,r,d]),Z=useCallback(()=>{B&&Y(!1)},[B,Y]);useEffect(()=>{if(!B)return;const e=BackHandler.addEventListener("hardwareBackPress",()=>(Y(!1),!0));return()=>e.remove()},[B,Y]),useEffect(()=>{if(!B||"web"!==Platform.OS)return;const onKeyDown=e=>{"Escape"===e.key&&Y(!1)};return window.addEventListener("keydown",onKeyDown),()=>window.removeEventListener("keydown",onKeyDown)},[B,Y]);const ee=useMemo(()=>{const e=(l??C)+w.bottom;switch(a){case"bottomLeft":return{position:"absolute",bottom:e,left:E,alignItems:"flex-start"};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center",alignItems:"center"};default:return{position:"absolute",bottom:e,right:E,alignItems:"flex-end"}}},[a,l,w.bottom,C,E]),slotOffset=e=>-(x.diameter+j)*(e+1),te=useMemo(()=>{switch(a){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"}}},[a]),ne=.78*x.diameter,oe=useMemo(()=>{const e=ne+S.spacing.sm;switch(a){case"bottomLeft":return{left:e,alignItems:"flex-start"};case"bottomCenter":return{right:x.diameter/2+ne/2+S.spacing.sm,alignItems:"flex-end"};default:return{right:e,alignItems:"flex-end"}}},[a,ne,x.diameter,S.spacing.sm]),ie=$.interpolate({inputRange:[0,1],outputRange:[0,.4]}),se=$.interpolate(A.reduced?{inputRange:[0,.5,.5001,1],outputRange:["0deg","0deg","45deg","45deg"]}:{inputRange:[0,1],outputRange:["0deg","45deg"]});return _jsxs(_Fragment,{children:[B?_jsx(Animated.View,{pointerEvents:B?"auto":"none",style:[StyleSheet.absoluteFill,{backgroundColor:S.colors.background.overlay,opacity:ie}],children:_jsx(Pressable,{style:StyleSheet.absoluteFill,onPress:Z,accessibilityElementsHidden:!0,importantForAccessibility:"no",testID:y?`${y}-backdrop`:void 0})}):null,_jsxs(Animated.View,{pointerEvents:L?"none":"box-none",style:[ee,{transform:[{translateY:H}],opacity:N},b],accessibilityRole:"menu",testID:y,children:[V.map(({action:e,index:t})=>{const n=G.current[t];if(!n)return null;const o=n.interpolate({inputRange:[0,1],outputRange:A.range(0,slotOffset(t))}),i=n.interpolate({inputRange:[0,1],outputRange:A.range(.6,1)}),s=toneBackground(S,e.tone??"primary"),r=toneForeground(S,e.tone??"primary"),a=e.label?_jsx(View,{pointerEvents:"none",style:[v.labelSlot,oe],testID:y?`${y}-label-${e.key}`:void 0,children:_jsx(View,{style:[v.labelPill,S.shadows.sm,{backgroundColor:S.colors.background.elevated,paddingHorizontal:S.spacing.sm,paddingVertical:S.spacing.xs,borderRadius:S.radius.sm,...smoothCorners},p],children:_jsx(Text,{style:[{color:S.colors.text.primary,fontSize:S.typography.fontSize.sm,fontWeight:S.typography.fontWeight.medium},h],numberOfLines:1,children:e.label})})}):null;return _jsxs(Animated.View,{pointerEvents:B?"auto":"none",accessibilityElementsHidden:!B,importantForAccessibility:B?"auto":"no-hide-descendants","aria-hidden":!B,style:[v.secondaryRow,te,{position:"absolute",bottom:0,opacity:n,transform:[{translateY:o},{scale:i}]}],children:[_jsx(Pressable,{onPress:()=>K(e),focusable:B,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel,style:[v.fabBase,S.shadows.md,{width:ne,height:ne,borderRadius:ne/2,...smoothCorners,backgroundColor:s},f],testID:y?`${y}-action-${e.key}`:void 0,children:({pressed:t})=>_jsxs(_Fragment,{children:[t?_jsx(View,{pointerEvents:"none",testID:"fab-pressed",style:[v.pressedTint,{backgroundColor:pressedTintFor(S,e.tone??"primary"),borderRadius:ne/2,...smoothCorners}]}):null,React.isValidElement(e.icon)?e.icon:_jsx(Text,{style:{color:r},children:String(e.icon??"")})]})}),a]},e.key)}),_jsx(Pressable,{ref:Q,onPress:J,accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{expanded:B},"aria-expanded":B,style:[v.fabBase,S.shadows.lg,{width:x.diameter,height:x.diameter,borderRadius:x.diameter/2,...smoothCorners,backgroundColor:S.colors.primary}],testID:y?`${y}-primary`:void 0,children:({pressed:e})=>_jsxs(_Fragment,{children:[e?_jsx(View,{pointerEvents:"none",testID:"fab-pressed",style:[v.pressedTint,{backgroundColor:ACCENT_PRESSED_TINT,borderRadius:x.diameter/2,...smoothCorners}]}):null,_jsx(Animated.View,{style:n?void 0:{transform:[{rotate:se}]},children:B&&n?n:t})]})})]})]})},buildGroupStyles=e=>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"}});export{FloatingActionButton,FloatingActionButtonGroup};export default FloatingActionButton;
1
+ "use strict";import{Logger}from"@webority/mobile-core";import React,{forwardRef,useCallback,useEffect,useMemo,useRef,useState}from"react";import{AccessibilityInfo,Animated,BackHandler,Easing,Platform,Pressable,StyleSheet,Text,View}from"react-native";import Reanimated,{cancelAnimation,Easing as ReanimatedEasing,useAnimatedStyle,useSharedValue,withTiming}from"react-native-reanimated";import{useSafeAreaInsets}from"react-native-safe-area-context";import{usePresenceMotion}from"../../hooks/usePresenceMotion.js";import{usePressAnimation}from"../../hooks/usePressAnimation.js";import{createAnimatedValue,resolveFloatingActionButtonSize,setNativeValue,spaceOf,useTheme}from"../../theme/index.js";import{announce}from"../../utils/announce.js";import{ACCENT_PRESSED_TINT}from"../../utils/color.js";import{smoothCorners}from"../../utils/corners.js";import{resolveHaptic,triggerHaptic}from"../../utils/hapticUtils.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const 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: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=forwardRef((e,t)=>{const{icon:n,onPress:o,label:s,collapsed:i=!1,size:r="md",tone:a="primary",position:l,bottomOffset:c,disabled:u=!1,hideOnScroll:d=!1,isScrolling:m=!1,accessibilityLabel:g,accessibilityHint:f,haptic:p,style:b,containerStyle:h,labelStyle:y,testID:w}=e,A=useTheme(),x=useSafeAreaInsets(),S=useMemo(()=>resolveFloatingActionButtonSize(A,r),[A,r]),v=useMemo(()=>buildStyles(A),[A]),{scale:R,opacity:_,pressIn:E,pressOut:C}=usePressAnimation({enabled:!u}),j=usePresenceMotion(),P=A.components.floatingActionButton,I=spaceOf(A,P.edgeOffset,"components.floatingActionButton.edgeOffset"),k=spaceOf(A,P.bottomOffset,"components.floatingActionButton.bottomOffset"),F=useRef(createAnimatedValue(1)).current,O=j.duration("normal");useEffect(()=>{if(!d)return void setNativeValue(F,1);const e=Animated.timing(F,{toValue:m?0:1,duration:O,easing:Easing.bezier(...A.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[d,m,F,O,A.motion.easing.standard]);const V=S.diameter+(c??k)+x.bottom+I,B=F.interpolate({inputRange:[0,1],outputRange:j.range(V,0)}),T=useMemo(()=>Animated.multiply(F,_),[F,_]),D=n,L="string"==typeof s&&s.length>0,M=L&&i,N=j.reduced,z=A.spacing.sm,H=S.labelPaddingX,$=A.motion.duration.fast,G=A.motion.easing.standard,W=useSharedValue(M?1:0),[U,Y]=useState(null);useEffect(()=>{const e=M?1:0;return W.value=N?e:withTiming(e,{duration:$,easing:ReanimatedEasing.bezier(...G)}),()=>cancelAnimation(W)},[M,N,W,$,G]);const X=useCallback(e=>{const t=Math.ceil(e);Y(e=>e===t?e:t)},[]),Q=useAnimatedStyle(()=>({paddingHorizontal:H*(1-W.value)})),q=useAnimatedStyle(()=>{const e=Math.max(0,1-2*W.value);return null===U?W.value>=1?{opacity:e,width:0}:{opacity:e}:{opacity:e,width:(U+z)*(1-W.value)}}),J=u?A.colors.surface.disabled:toneBackground(A,a),K=u?A.colors.text.disabled:toneForeground(A,a),Z=useMemo(()=>{if(!l)return null;const e=(c??k)+x.bottom;switch(l){case"bottomLeft":return{position:"absolute",bottom:e,left:I};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center"};default:return{position:"absolute",bottom:e,right:I}}},[l,c,x.bottom,k,I]);return _jsx(Animated.View,{style:[Z,{transform:[{translateY:B},{scale:R}],opacity:T},h,b],pointerEvents:d&&m?"none":"auto",children:_jsx(Pressable,{ref:t,onPress:e=>{if(u)return;const t=resolveHaptic(p,"impactLight");t&&triggerHaptic(t),o()},onPressIn:E,onPressOut:C,disabled:u,accessibilityRole:"button",accessibilityLabel:g,accessibilityHint:f,accessibilityState:{disabled:u},"aria-disabled":u,testID:w,style:[v.base,L?{height:S.diameter,minWidth:S.diameter,borderRadius:S.diameter/2,...smoothCorners}:{width:S.diameter,height:S.diameter,borderRadius:S.diameter/2,...smoothCorners},A.shadows.lg,{backgroundColor:J,opacity:u?.55:1}],children:({pressed:e})=>_jsxs(_Fragment,{children:[e&&!u?_jsx(View,{pointerEvents:"none",testID:"fab-pressed",style:[v.pressedTint,{backgroundColor:pressedTintFor(A,a),borderRadius:S.diameter/2,...smoothCorners}]}):null,L?_jsxs(Reanimated.View,{style:[v.extendedRow,Q],children:[D,_jsx(Reanimated.View,{style:[v.labelClip,q],children:_jsx(Text,{onLayout:e=>X(e.nativeEvent.layout.width),style:[v.label,{color:K,fontSize:S.text,fontWeight:A.typography.fontWeight.semibold,marginLeft:z},y],numberOfLines:1,children:s})})]}):D]})})})});FloatingActionButton.displayName="FloatingActionButton";const buildStyles=e=>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:o,open:s,defaultOpen:i=!1,onOpenChange:r,position:a="bottomRight",bottomOffset:l,size:c="md",accessibilityLabel:u="Quick actions",haptic:d,hideOnScroll:m=!1,isScrolling:g=!1,containerStyle:f,secondaryActionStyle:p,labelPillStyle:b,labelStyle:h,testID:y}=e,w=useTheme(),A=useSafeAreaInsets(),x=useMemo(()=>resolveFloatingActionButtonSize(w,c),[w,c]),S=useMemo(()=>buildGroupStyles(w),[w]),v=usePresenceMotion(),R=v.duration("normal"),_=w.components.floatingActionButton,E=spaceOf(w,_.edgeOffset,"components.floatingActionButton.edgeOffset"),C=spaceOf(w,_.bottomOffset,"components.floatingActionButton.bottomOffset"),j=spaceOf(w,_.secondaryGap,"components.floatingActionButton.secondaryGap"),P=_.staggerMs,I=useMemo(()=>o.slice(0,6),[o]),k=I.length,F=useMemo(()=>I.map((e,t)=>({action:e,index:t})).reverse(),[I]),O=__DEV__?describeActionProblem(o):"";useEffect(()=>{__DEV__&&O&&Logger.warn(`[@webority/mobile-ui] FloatingActionButtonGroup ${O}`)},[O]);const V="boolean"==typeof s,[B,T]=useState(i),D=V?s:B,L=useRef(createAnimatedValue(1)).current;useEffect(()=>{if(!m)return void setNativeValue(L,1);const e=Animated.timing(L,{toValue:g?0:1,duration:R,easing:Easing.bezier(...w.motion.easing.standard),useNativeDriver:!0});return e.start(),()=>e.stop()},[m,g,L,R,w.motion.easing.standard]);const M=m&&g;useEffect(()=>{M&&D&&(V||T(!1),r?.(!1))},[M,D,V,r]);const N=x.diameter+(l??C)+A.bottom+E,z=L.interpolate({inputRange:[0,1],outputRange:v.range(N,0)}),H=L,$=useRef(createAnimatedValue(D?1:0)).current,G=useRef([]),[W,U]=useState(0);useEffect(()=>{const e=G.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 Animated.Value(D?1:0));G.current=t}else G.current=e.slice(0,k);U(e=>e+1)}},[k]),useEffect(()=>{const e=Animated.timing($,{toValue:D?1:0,duration:R,easing:Easing.bezier(...w.motion.easing.standard),useNativeDriver:!0});e.start();const t=G.current.map(e=>Animated.timing(e,{toValue:D?1:0,duration:R,easing:Easing.bezier(...w.motion.easing.standard),useNativeDriver:!0})),n=D?t:[...t].reverse(),o=Animated.stagger(P,n);return o.start(),()=>{e.stop(),o.stop()}},[D,$,R,w.motion.easing.standard,k,W,P]);const Y=useCallback(e=>{const t=resolveHaptic(d,"impactLight");t&&triggerHaptic(t),V||T(e),r?.(e)},[V,r,d]),X=useRef(null),Q=useRef(D),q=useRef(!1);useEffect(()=>{if(Q.current===D)return;Q.current=D;const e=q.current;if(q.current=!1,M||e)return;const t=X.current;t&&("web"===Platform.OS?t.focus?.():AccessibilityInfo.sendAccessibilityEvent(t,"focus"));announce(D?`${u}, expanded, ${k} ${1===k?"action":"actions"}`:`${u}, collapsed`)},[D,M,u,k]);const J=useCallback(()=>{Y(!D)},[D,Y]),K=useCallback(e=>{!1!==d&&triggerHaptic("selection"),q.current=!0,e.onPress(),V||T(!1),r?.(!1)},[V,r,d]),Z=useCallback(()=>{D&&Y(!1)},[D,Y]);useEffect(()=>{if(!D)return;const e=BackHandler.addEventListener("hardwareBackPress",()=>(Y(!1),!0));return()=>e.remove()},[D,Y]),useEffect(()=>{if(!D||"web"!==Platform.OS)return;const onKeyDown=e=>{"Escape"===e.key&&Y(!1)};return window.addEventListener("keydown",onKeyDown),()=>window.removeEventListener("keydown",onKeyDown)},[D,Y]);const ee=useMemo(()=>{const e=(l??C)+A.bottom;switch(a){case"bottomLeft":return{position:"absolute",bottom:e,left:E,alignItems:"flex-start"};case"bottomCenter":return{position:"absolute",bottom:e,alignSelf:"center",alignItems:"center"};default:return{position:"absolute",bottom:e,right:E,alignItems:"flex-end"}}},[a,l,A.bottom,C,E]),slotOffset=e=>-(x.diameter+j)*(e+1),te=useMemo(()=>{switch(a){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"}}},[a]),ne=.78*x.diameter,oe=useMemo(()=>{const e=ne+w.spacing.sm;switch(a){case"bottomLeft":return{left:e,alignItems:"flex-start"};case"bottomCenter":return{right:x.diameter/2+ne/2+w.spacing.sm,alignItems:"flex-end"};default:return{right:e,alignItems:"flex-end"}}},[a,ne,x.diameter,w.spacing.sm]),se=$.interpolate({inputRange:[0,1],outputRange:[0,.4]}),ie=$.interpolate(v.reduced?{inputRange:[0,.5,.5001,1],outputRange:["0deg","0deg","45deg","45deg"]}:{inputRange:[0,1],outputRange:["0deg","45deg"]});return _jsxs(_Fragment,{children:[D?_jsx(Animated.View,{pointerEvents:D?"auto":"none",style:[StyleSheet.absoluteFill,{backgroundColor:w.colors.background.overlay,opacity:se}],children:_jsx(Pressable,{style:StyleSheet.absoluteFill,onPress:Z,accessibilityElementsHidden:!0,importantForAccessibility:"no",testID:y?`${y}-backdrop`:void 0})}):null,_jsxs(Animated.View,{pointerEvents:M?"none":"box-none",style:[ee,{transform:[{translateY:z}],opacity:H},f],accessibilityRole:"menu",testID:y,children:[F.map(({action:e,index:t})=>{const n=G.current[t];if(!n)return null;const o=n.interpolate({inputRange:[0,1],outputRange:v.range(0,slotOffset(t))}),s=n.interpolate({inputRange:[0,1],outputRange:v.range(.6,1)}),i=toneBackground(w,e.tone??"primary"),r=toneForeground(w,e.tone??"primary"),a=e.label?_jsx(View,{pointerEvents:"none",style:[S.labelSlot,oe],testID:y?`${y}-label-${e.key}`:void 0,children:_jsx(View,{style:[S.labelPill,w.shadows.sm,{backgroundColor:w.colors.background.elevated,paddingHorizontal:w.spacing.sm,paddingVertical:w.spacing.xs,borderRadius:w.radius.sm,...smoothCorners},b],children:_jsx(Text,{style:[{color:w.colors.text.primary,fontSize:w.typography.fontSize.sm,fontWeight:w.typography.fontWeight.medium},h],numberOfLines:1,children:e.label})})}):null;return _jsxs(Animated.View,{pointerEvents:D?"auto":"none",accessibilityElementsHidden:!D,importantForAccessibility:D?"auto":"no-hide-descendants","aria-hidden":!D,style:[S.secondaryRow,te,{position:"absolute",bottom:0,opacity:n,transform:[{translateY:o},{scale:s}]}],children:[_jsx(Pressable,{onPress:()=>K(e),focusable:D,accessibilityRole:"menuitem",accessibilityLabel:e.accessibilityLabel,style:[S.fabBase,w.shadows.md,{width:ne,height:ne,borderRadius:ne/2,...smoothCorners,backgroundColor:i},p],testID:y?`${y}-action-${e.key}`:void 0,children:({pressed:t})=>_jsxs(_Fragment,{children:[t?_jsx(View,{pointerEvents:"none",testID:"fab-pressed",style:[S.pressedTint,{backgroundColor:pressedTintFor(w,e.tone??"primary"),borderRadius:ne/2,...smoothCorners}]}):null,React.isValidElement(e.icon)?e.icon:_jsx(Text,{style:{color:r},children:String(e.icon??"")})]})}),a]},e.key)}),_jsx(Pressable,{ref:X,onPress:J,accessibilityRole:"button",accessibilityLabel:u,accessibilityState:{expanded:D},"aria-expanded":D,style:[S.fabBase,w.shadows.lg,{width:x.diameter,height:x.diameter,borderRadius:x.diameter/2,...smoothCorners,backgroundColor:w.colors.primary}],testID:y?`${y}-primary`:void 0,children:({pressed:e})=>_jsxs(_Fragment,{children:[e?_jsx(View,{pointerEvents:"none",testID:"fab-pressed",style:[S.pressedTint,{backgroundColor:ACCENT_PRESSED_TINT,borderRadius:x.diameter/2,...smoothCorners}]}):null,_jsx(Animated.View,{style:n?void 0:{transform:[{rotate:ie}]},children:D&&n?n:t})]})})]})]})},buildGroupStyles=e=>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"}});export{FloatingActionButton,FloatingActionButtonGroup};export default FloatingActionButton;
@@ -1 +1 @@
1
- "use strict";import React,{useCallback,useMemo,useRef,useState}from"react";import{Dimensions,Image,Pressable,Modal as RNModal,StyleSheet,Text,View}from"react-native";import{Gesture,GestureDetector}from"react-native-gesture-handler";import Animated,{runOnJS,useAnimatedStyle,useSharedValue,withSpring,withTiming}from"react-native-reanimated";import{useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{Carousel}from"../Carousel/index.js";import{Skeleton}from"../Skeleton/index.js";import{ToastHost}from"../Toast/ToastProvider.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const MAX_SCALE_FALLBACK=4,MIN_SCALE_FALLBACK=1,DOUBLE_TAP_SCALE_FALLBACK=2,SPRING_CONFIG={damping:18,stiffness:220,mass:1},ImageGallery=({images:e,initialIndex:t=0,showThumbnails:a=!0,showCounter:l=!0,enableLightbox:i=!0,enablePinchZoom:o=!0,onIndexChange:s,haptic:n,loading:r=!1,accessibilityLabel:u,containerStyle:c,testID:h})=>{const d=useTheme(),m=useMemo(()=>buildStyles(d),[d]),[g,p]=useState(clamp(t,0,Math.max(0,e.length-1))),[b,S]=useState(!1),y=useCallback(e=>{p(e),s?.(e)},[s]),v=useCallback(()=>{if(!i)return;const e=resolveHaptic(n,"selection");e&&triggerHaptic(e),S(!0)},[i,n]),x=useCallback(()=>{const e=resolveHaptic(n,"selection");e&&triggerHaptic(e),S(!1)},[n]),I=useCallback((t,a)=>{const l=t.alt??`Image ${a+1} of ${e.length}`;return _jsx(Pressable,{onPress:v,accessibilityRole:"image",accessibilityLabel:l,accessibilityHint:i?"Tap to open fullscreen":void 0,style:m.imageWrap,children:_jsx(Image,{source:t.source,style:m.image,resizeMode:"cover"})})},[i,e.length,v,m]),w=useCallback(e=>_jsx(Image,{source:e.source,style:m.thumbnailImage,resizeMode:"cover"}),[m]),f=_jsxs(View,{style:[m.container,c],testID:h,accessibilityLabel:u??"Image gallery",children:[_jsxs(View,{style:m.carouselWrap,children:[_jsx(Carousel,{data:e,defaultIndex:t,onIndexChange:y,renderItem:I,showPagination:!1,showThumbnails:a,renderThumbnail:w,haptic:n}),l&&e.length>0?_jsx(View,{style:m.counterPill,pointerEvents:"none",children:_jsx(Text,{style:[m.counterText,{color:d.colors.onOverlay}],accessibilityLabel:`Image ${g+1} of ${e.length}`,children:`${g+1} / ${e.length}`})}):null]}),i?_jsx(Lightbox,{visible:b,images:e,initialIndex:g,enablePinchZoom:o,showCounter:l,onClose:x,onIndexChange:y,haptic:n}):null]});return r?_jsx(ImageGallerySkeleton,{images:e,showThumbnails:a,showCounter:l,containerStyle:c,testID:h}):f};ImageGallery.displayName="ImageGallery";const ImageGallerySkeleton=({images:e,showThumbnails:t=!0,showCounter:a=!0,containerStyle:l,testID:i})=>{const o=Math.min(e?.length||4,6);return _jsxs(View,{style:[{width:"100%"},l],testID:i,accessibilityRole:"progressbar",accessibilityState:{busy:!0},"aria-busy":!0,children:[_jsxs(View,{style:{position:"relative"},children:[_jsx(Skeleton,{width:"100%",height:280,radius:"lg"}),a?_jsx(View,{style:{position:"absolute",top:12,right:12},children:_jsx(Skeleton,{width:44,height:22,radius:"full"})}):null]}),t?_jsx(View,{style:{flexDirection:"row",marginTop:12},children:Array.from({length:o}).map((e,t)=>_jsx(Skeleton,{width:64,height:64,radius:"md",style:{marginRight:8}},`sk-thumb-${t}`))}):null]})};ImageGallerySkeleton.displayName="ImageGallerySkeleton",ImageGallery.Skeleton=ImageGallerySkeleton;const Lightbox=({visible:e,images:t,initialIndex:a,enablePinchZoom:l,showCounter:i,onClose:o,onIndexChange:s,haptic:n})=>{const r=useTheme(),u=useMemo(()=>buildLightboxStyles(r),[r]),c=r.components.imageGallery,h=c?.maxScale??4,d=c?.minScale??1,m=c?.doubleTapScale??2,g=useRef(null),[p,b]=useState(a),S=useCallback(e=>{if(e!==p){const t=resolveHaptic(n,"selection");t&&triggerHaptic(t),b(e),s(e)}},[p,s,n]),y=useCallback((e,a)=>_jsx(ZoomableImage,{image:e,index:a,total:t.length,active:a===p,enabled:l,maxScale:h,minScale:d,doubleTapScale:m,haptic:n}),[p,l,t.length,h,d,m,n]),v=t[p]?.caption;return _jsx(RNModal,{visible:e,transparent:!0,statusBarTranslucent:!0,presentationStyle:"overFullScreen",animationType:"fade",onRequestClose:o,accessibilityViewIsModal:!0,children:_jsxs(View,{style:u.backdrop,accessibilityViewIsModal:!0,children:[_jsx(Carousel,{ref:g,data:t,defaultIndex:a,onIndexChange:S,renderItem:y,showPagination:!1,haptic:n}),i&&t.length>0?_jsx(View,{style:u.counterPill,pointerEvents:"none",children:_jsx(Text,{style:[u.counterText,{color:r.colors.onOverlay}],accessibilityLabel:`Image ${p+1} of ${t.length}`,children:`${p+1} / ${t.length}`})}):null,_jsx(Pressable,{onPress:o,accessibilityRole:"button",accessibilityLabel:"Close gallery",style:u.closeButton,hitSlop:12,children:(r.icons?.close??defaultIcons.close)({size:24,color:r.colors.onOverlay})}),v?_jsx(Animated.View,{style:u.captionWrap,entering:void 0,accessibilityElementsHidden:!1,children:_jsx(Text,{style:u.captionText,numberOfLines:3,children:v})}):null,_jsx(ToastHost,{})]})})},ZoomableImage=({image:e,index:t,total:a,active:l,enabled:i,maxScale:o,minScale:s,doubleTapScale:n,haptic:r})=>{const u=Dimensions.get("window"),c=useSharedValue(1),h=useSharedValue(1),d=useSharedValue(0),m=useSharedValue(0),g=useSharedValue(0),p=useSharedValue(0),b=useCallback(()=>{c.value=withSpring(1,SPRING_CONFIG),h.value=1,d.value=withSpring(0,SPRING_CONFIG),m.value=withSpring(0,SPRING_CONFIG),g.value=0,p.value=0},[c,h,d,m,g,p]);React.useEffect(()=>{l||(c.value=withTiming(1,{duration:150}),d.value=withTiming(0,{duration:150}),m.value=withTiming(0,{duration:150}),h.value=1,g.value=0,p.value=0)},[l,c,d,m,h,g,p]);const S=useCallback(()=>{!1!==r&&triggerHaptic("impactLight")},[r]),y=useMemo(()=>Gesture.Pinch().enabled(i).onStart(()=>{"worklet";h.value=c.value}).onUpdate(e=>{"worklet";const t=h.value*e.scale;c.value=t<s?s+.3*(t-s):t>o?o+.2*(t-o):t}).onEnd(()=>{"worklet";return c.value<s?(c.value=withSpring(s,SPRING_CONFIG),d.value=withSpring(0,SPRING_CONFIG),m.value=withSpring(0,SPRING_CONFIG),h.value=s,g.value=0,void(p.value=0)):c.value>o?(c.value=withSpring(o,SPRING_CONFIG),void(h.value=o)):void(h.value=c.value)}),[i,c,h,d,m,g,p,s,o]),v=useMemo(()=>Gesture.Pan().minPointers(1).maxPointers(1).onStart(()=>{"worklet";g.value=d.value,p.value=m.value}).onUpdate(e=>{"worklet";c.value<=1||(d.value=g.value+e.translationX,m.value=p.value+e.translationY)}).onEnd(()=>{"worklet";g.value=d.value,p.value=m.value}),[c,d,m,g,p]),x=useMemo(()=>Gesture.Tap().numberOfTaps(2).onEnd(()=>{"worklet";runOnJS(S)(),c.value>1?(c.value=withSpring(1,SPRING_CONFIG),d.value=withSpring(0,SPRING_CONFIG),m.value=withSpring(0,SPRING_CONFIG),h.value=1,g.value=0,p.value=0):(c.value=withSpring(n,SPRING_CONFIG),h.value=n)}),[c,h,d,m,g,p,S,n]),I=useMemo(()=>Gesture.Race(y,v,x),[y,v,x]),w=useAnimatedStyle(()=>({transform:[{translateX:d.value},{translateY:m.value},{scale:c.value}]}));React.useEffect(()=>{l||b()},[l,b]);const f=e.alt??`Image ${t+1} of ${a}`;return _jsx(GestureDetector,{gesture:I,children:_jsx(Animated.View,{style:[lightboxImageStyles.container,{width:u.width}],children:_jsx(Animated.Image,{source:e.source,resizeMode:"contain",style:[lightboxImageStyles.image,w],accessibilityLabel:f,accessible:!0})})})},clamp=(e,t,a)=>Math.min(Math.max(e,t),a),buildStyles=e=>StyleSheet.create({container:{width:"100%"},carouselWrap:{width:"100%",position:"relative"},imageWrap:{width:"100%",aspectRatio:16/9,backgroundColor:e.colors.background.secondary,overflow:"hidden",borderRadius:e.radius.md,...smoothCorners},image:{width:"100%",height:"100%"},thumbnailImage:{width:"100%",height:"100%"},counterPill:{position:"absolute",top:12,alignSelf:"center",paddingHorizontal:12,paddingVertical:4,borderRadius:e.radius.full,...smoothCorners,backgroundColor:"rgba(0,0,0,0.55)"},counterText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold}}),buildLightboxStyles=e=>StyleSheet.create({backdrop:{flex:1,backgroundColor:"#000",justifyContent:"center"},counterPill:{position:"absolute",top:48,alignSelf:"center",paddingHorizontal:14,paddingVertical:6,borderRadius:e.radius.full,...smoothCorners,backgroundColor:"rgba(0,0,0,0.6)"},counterText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold},closeButton:{position:"absolute",top:44,right:16,width:40,height:40,borderRadius:20,...smoothCorners,alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0,0,0,0.5)"},captionWrap:{position:"absolute",left:0,right:0,bottom:32,paddingHorizontal:24},captionText:{color:"#FFFFFF",fontSize:14,lineHeight:20,textAlign:"center"}}),lightboxImageStyles=StyleSheet.create({container:{flex:1,alignItems:"center",justifyContent:"center"},image:{width:"100%",height:"100%"}});export{ImageGallery};export default ImageGallery;
1
+ "use strict";import React,{useCallback,useMemo,useRef,useState}from"react";import{Dimensions,Image,Pressable,Modal as RNModal,StyleSheet,Text,View}from"react-native";import{Gesture,GestureDetector}from"react-native-gesture-handler";import Animated,{runOnJS,useAnimatedStyle,useSharedValue,withSpring,withTiming}from"react-native-reanimated";import{useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{smoothCorners}from"../../utils/corners.js";import{defaultIcons}from"../AppIcon/defaultIcons.js";import{Carousel}from"../Carousel/index.js";import{Skeleton}from"../Skeleton/index.js";import{ToastHost}from"../Toast/ToastProvider.js";import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";const MAX_SCALE_FALLBACK=4,MIN_SCALE_FALLBACK=1,DOUBLE_TAP_SCALE_FALLBACK=2,SPRING_CONFIG={damping:18,stiffness:220,mass:1},ImageGallery=({images:e,initialIndex:t=0,showThumbnails:a=!0,showCounter:l=!0,enableLightbox:i=!0,enablePinchZoom:s=!0,onIndexChange:o,haptic:n,loading:r=!1,accessibilityLabel:u,containerStyle:c,testID:h})=>{const d=useTheme(),g=useMemo(()=>buildStyles(d),[d]),[m,p]=useState(clamp(t,0,Math.max(0,e.length-1))),[b,S]=useState(!1),y=useCallback(e=>{p(e),o?.(e)},[o]),x=useCallback(()=>{if(!i)return;const e=resolveHaptic(n,"selection");e&&triggerHaptic(e),S(!0)},[i,n]),v=useCallback(()=>{const e=resolveHaptic(n,"selection");e&&triggerHaptic(e),S(!1)},[n]),I=useCallback((t,a)=>{const l=t.alt??`Image ${a+1} of ${e.length}`;return _jsx(Pressable,{onPress:x,accessibilityRole:"image",accessibilityLabel:l,accessibilityHint:i?"Tap to open fullscreen":void 0,style:g.imageWrap,children:_jsx(Image,{source:t.source,style:g.image,resizeMode:"cover"})})},[i,e.length,x,g]),w=useCallback(e=>_jsx(Image,{source:e.source,style:g.thumbnailImage,resizeMode:"cover"}),[g]),f=_jsxs(View,{style:[g.container,c],testID:h,accessibilityLabel:u??"Image gallery",children:[_jsxs(View,{style:g.carouselWrap,children:[_jsx(Carousel,{data:e,defaultIndex:t,onIndexChange:y,renderItem:I,showPagination:!1,showThumbnails:a,renderThumbnail:w,haptic:n}),l&&e.length>0?_jsx(View,{style:g.counterPill,pointerEvents:"none",children:_jsx(Text,{style:[g.counterText,{color:d.colors.onOverlay}],accessibilityLabel:`Image ${m+1} of ${e.length}`,children:`${m+1} / ${e.length}`})}):null]}),i?_jsx(Lightbox,{visible:b,images:e,initialIndex:m,enablePinchZoom:s,showCounter:l,onClose:v,onIndexChange:y,haptic:n}):null]});return r?_jsx(ImageGallerySkeleton,{images:e,showThumbnails:a,showCounter:l,containerStyle:c,testID:h}):f};ImageGallery.displayName="ImageGallery";const ImageGallerySkeleton=({images:e,showThumbnails:t=!0,showCounter:a=!0,containerStyle:l,testID:i})=>{const s=useTheme(),o=Math.min(e?.length||4,6);return _jsxs(View,{style:[{width:"100%"},l],testID:i,accessibilityRole:"progressbar",accessibilityState:{busy:!0},"aria-busy":!0,children:[_jsxs(View,{style:{position:"relative"},children:[_jsx(Skeleton,{width:"100%",height:280,radius:"lg"}),a?_jsx(View,{style:{position:"absolute",top:12,right:12},children:_jsx(Skeleton,{width:44,height:22,radius:"pill"})}):null]}),t?_jsx(View,{style:{flexDirection:"row",marginTop:s.spacing.md},children:Array.from({length:o}).map((e,t)=>_jsx(Skeleton,{width:64,height:64,radius:"md",style:{marginRight:s.spacing.sm}},`sk-thumb-${t}`))}):null]})};ImageGallerySkeleton.displayName="ImageGallerySkeleton",ImageGallery.Skeleton=ImageGallerySkeleton;const Lightbox=({visible:e,images:t,initialIndex:a,enablePinchZoom:l,showCounter:i,onClose:s,onIndexChange:o,haptic:n})=>{const r=useTheme(),u=useMemo(()=>buildLightboxStyles(r),[r]),c=r.components.imageGallery,h=c?.maxScale??4,d=c?.minScale??1,g=c?.doubleTapScale??2,m=useRef(null),[p,b]=useState(a),S=useCallback(e=>{if(e!==p){const t=resolveHaptic(n,"selection");t&&triggerHaptic(t),b(e),o(e)}},[p,o,n]),y=useCallback((e,a)=>_jsx(ZoomableImage,{image:e,index:a,total:t.length,active:a===p,enabled:l,maxScale:h,minScale:d,doubleTapScale:g,haptic:n}),[p,l,t.length,h,d,g,n]),x=t[p]?.caption;return _jsx(RNModal,{visible:e,transparent:!0,statusBarTranslucent:!0,presentationStyle:"overFullScreen",animationType:"fade",onRequestClose:s,accessibilityViewIsModal:!0,children:_jsxs(View,{style:u.backdrop,accessibilityViewIsModal:!0,children:[_jsx(Carousel,{ref:m,data:t,defaultIndex:a,onIndexChange:S,renderItem:y,showPagination:!1,haptic:n}),i&&t.length>0?_jsx(View,{style:u.counterPill,pointerEvents:"none",children:_jsx(Text,{style:[u.counterText,{color:r.colors.onOverlay}],accessibilityLabel:`Image ${p+1} of ${t.length}`,children:`${p+1} / ${t.length}`})}):null,_jsx(Pressable,{onPress:s,accessibilityRole:"button",accessibilityLabel:"Close gallery",style:u.closeButton,hitSlop:12,children:(r.icons?.close??defaultIcons.close)({size:24,color:r.colors.onOverlay})}),x?_jsx(Animated.View,{style:u.captionWrap,entering:void 0,accessibilityElementsHidden:!1,children:_jsx(Text,{style:u.captionText,numberOfLines:3,children:x})}):null,_jsx(ToastHost,{})]})})},ZoomableImage=({image:e,index:t,total:a,active:l,enabled:i,maxScale:s,minScale:o,doubleTapScale:n,haptic:r})=>{const u=Dimensions.get("window"),c=useSharedValue(1),h=useSharedValue(1),d=useSharedValue(0),g=useSharedValue(0),m=useSharedValue(0),p=useSharedValue(0),b=useCallback(()=>{c.value=withSpring(1,SPRING_CONFIG),h.value=1,d.value=withSpring(0,SPRING_CONFIG),g.value=withSpring(0,SPRING_CONFIG),m.value=0,p.value=0},[c,h,d,g,m,p]);React.useEffect(()=>{l||(c.value=withTiming(1,{duration:150}),d.value=withTiming(0,{duration:150}),g.value=withTiming(0,{duration:150}),h.value=1,m.value=0,p.value=0)},[l,c,d,g,h,m,p]);const S=useCallback(()=>{!1!==r&&triggerHaptic("impactLight")},[r]),y=useMemo(()=>Gesture.Pinch().enabled(i).onStart(()=>{"worklet";h.value=c.value}).onUpdate(e=>{"worklet";const t=h.value*e.scale;c.value=t<o?o+.3*(t-o):t>s?s+.2*(t-s):t}).onEnd(()=>{"worklet";return c.value<o?(c.value=withSpring(o,SPRING_CONFIG),d.value=withSpring(0,SPRING_CONFIG),g.value=withSpring(0,SPRING_CONFIG),h.value=o,m.value=0,void(p.value=0)):c.value>s?(c.value=withSpring(s,SPRING_CONFIG),void(h.value=s)):void(h.value=c.value)}),[i,c,h,d,g,m,p,o,s]),x=useMemo(()=>Gesture.Pan().minPointers(1).maxPointers(1).onStart(()=>{"worklet";m.value=d.value,p.value=g.value}).onUpdate(e=>{"worklet";c.value<=1||(d.value=m.value+e.translationX,g.value=p.value+e.translationY)}).onEnd(()=>{"worklet";m.value=d.value,p.value=g.value}),[c,d,g,m,p]),v=useMemo(()=>Gesture.Tap().numberOfTaps(2).onEnd(()=>{"worklet";runOnJS(S)(),c.value>1?(c.value=withSpring(1,SPRING_CONFIG),d.value=withSpring(0,SPRING_CONFIG),g.value=withSpring(0,SPRING_CONFIG),h.value=1,m.value=0,p.value=0):(c.value=withSpring(n,SPRING_CONFIG),h.value=n)}),[c,h,d,g,m,p,S,n]),I=useMemo(()=>Gesture.Race(y,x,v),[y,x,v]),w=useAnimatedStyle(()=>({transform:[{translateX:d.value},{translateY:g.value},{scale:c.value}]}));React.useEffect(()=>{l||b()},[l,b]);const f=e.alt??`Image ${t+1} of ${a}`;return _jsx(GestureDetector,{gesture:I,children:_jsx(Animated.View,{style:[lightboxImageStyles.container,{width:u.width}],children:_jsx(Animated.Image,{source:e.source,resizeMode:"contain",style:[lightboxImageStyles.image,w],accessibilityLabel:f,accessible:!0})})})},clamp=(e,t,a)=>Math.min(Math.max(e,t),a),buildStyles=e=>StyleSheet.create({container:{width:"100%"},carouselWrap:{width:"100%",position:"relative"},imageWrap:{width:"100%",aspectRatio:16/9,backgroundColor:e.colors.background.secondary,overflow:"hidden",borderRadius:e.radius.md,...smoothCorners},image:{width:"100%",height:"100%"},thumbnailImage:{width:"100%",height:"100%"},counterPill:{position:"absolute",top:12,alignSelf:"center",paddingHorizontal:e.spacing.md,paddingVertical:e.spacing.xs,borderRadius:e.radius.pill,...smoothCorners,backgroundColor:"rgba(0,0,0,0.55)"},counterText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold}}),buildLightboxStyles=e=>StyleSheet.create({backdrop:{flex:1,backgroundColor:"#000",justifyContent:"center"},counterPill:{position:"absolute",top:48,alignSelf:"center",paddingHorizontal:e.spacing.md,paddingVertical:e.spacing.xs,borderRadius:e.radius.pill,...smoothCorners,backgroundColor:"rgba(0,0,0,0.6)"},counterText:{fontSize:e.typography.fontSize.sm,fontWeight:e.typography.fontWeight.semibold},closeButton:{position:"absolute",top:44,right:16,width:40,height:40,borderRadius:e.radius.pill,...smoothCorners,alignItems:"center",justifyContent:"center",backgroundColor:"rgba(0,0,0,0.5)"},captionWrap:{position:"absolute",left:0,right:0,bottom:32,paddingHorizontal:e.spacing.xl},captionText:{color:"#FFFFFF",fontSize:e.typography.fontSize.base,lineHeight:21,textAlign:"center"}}),lightboxImageStyles=StyleSheet.create({container:{flex:1,alignItems:"center",justifyContent:"center"},image:{width:"100%",height:"100%"}});export{ImageGallery};export default ImageGallery;
@@ -1 +1 @@
1
- "use strict";import{forwardRef,useCallback,useMemo,useState}from"react";import{Pressable,StyleSheet,Text,View}from"react-native";import{fontFor,useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{Chevron}from"../FieldBase/Chevron.js";import{FieldLabel,resolveFieldSize}from"../FieldBase/FieldBase.js";import{OptionSheet}from"../OptionSheet/OptionSheet.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const InlineSelect=forwardRef((e,t)=>{const{options:l,getOptionLabel:i,getOptionValue:s,getOptionDisabled:o,getOptionDescription:a,getOptionIcon:n,value:r,onChange:c,placeholder:d,label:p,title:b,searchable:S=!1,haptic:u,disabled:m=!1,size:x="md",color:f,chevronColor:g,chevronSize:h,textStyle:y,style:O,optionStyle:j,selectedOptionStyle:C,optionTextStyle:v,selectedOptionTextStyle:F,accessibilityLabel:_,testID:k}=e,I=useTheme(),T=useMemo(()=>buildStyles(I),[I]),z=resolveFieldSize(I,x),L=useCallback(e=>i?i(e):e.label??"",[i]),H=useCallback(e=>s?s(e):e.value,[s]),w=useCallback(e=>o?o(e):!0===e.disabled,[o]),D=useCallback(e=>a?a(e):e.description,[a]),P=useCallback(e=>n?n(e):e.icon,[n]),[V,B]=useState(!1),M=useMemo(()=>{if(null!=r)return l.find(e=>H(e)===r)},[l,r,H]),R=useCallback(e=>r===e,[r]),$=useCallback(()=>{if(m)return;const e=resolveHaptic(u,"selection");e&&triggerHaptic(e),B(!0)},[m,u]),N=useCallback(()=>{B(!1)},[]),G=useCallback(e=>{if(w(e))return;const t=resolveHaptic(u,"selection");t&&triggerHaptic(t),c(H(e)),N()},[w,H,c,N,u]),q=m?I.colors.text.disabled:f??I.components.inlineSelect?.color??I.colors.primary,A=void 0!==M?L(M):d??"Select",E=void 0!==M?`Selected: ${L(M)}`:d??"No selection",J=_jsxs(Pressable,{ref:t,onPress:$,disabled:m,hitSlop:8,accessibilityRole:"button",accessibilityLabel:_??`${p??b??"Select"}. ${E}`,accessibilityState:{disabled:m,expanded:V},"aria-disabled":m,"aria-expanded":V,testID:k,style:({pressed:e})=>[T.trigger,{columnGap:I.spacing.xs,opacity:e&&!m?.6:1},O],children:[_jsx(Text,{style:[T.triggerText,{color:q,fontSize:z.fontSize,...fontFor(I,"medium")},y],numberOfLines:1,children:A}),_jsx(Chevron,{color:g??q,size:h??z.iconSize,open:V})]});return _jsxs(_Fragment,{children:[p?_jsxs(View,{style:T.labelled,children:[_jsx(FieldLabel,{size:x,children:p}),J]}):J,_jsx(OptionSheet,{open:V,onClose:N,title:b,accessibilityLabel:p??b??d??"Options",options:l,labelOf:L,getValue:H,disabledOf:w,descriptionOf:D,iconOf:P,isSelected:R,onSelect:G,searchable:S,optionStyle:j,selectedOptionStyle:C,optionTextStyle:v,selectedOptionTextStyle:F})]})});InlineSelect.displayName="InlineSelect";const buildStyles=e=>StyleSheet.create({labelled:{alignItems:"flex-start"},trigger:{flexDirection:"row",alignItems:"center"},triggerText:{includeFontPadding:!1}});export{InlineSelect};export default InlineSelect;
1
+ "use strict";import{forwardRef,useCallback,useMemo,useState}from"react";import{Pressable,StyleSheet,Text,View}from"react-native";import{fontFor,resolveFieldSize,useTheme}from"../../theme/index.js";import{resolveHaptic,triggerHaptic}from"../../utils/index.js";import{Chevron}from"../FieldBase/Chevron.js";import{FieldLabel}from"../FieldBase/FieldBase.js";import{OptionSheet}from"../OptionSheet/OptionSheet.js";import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";const InlineSelect=forwardRef((e,t)=>{const{options:l,getOptionLabel:i,getOptionValue:s,getOptionDisabled:o,getOptionDescription:a,getOptionIcon:r,value:n,onChange:c,placeholder:d,label:p,title:b,searchable:S=!1,haptic:u,disabled:m=!1,size:x="md",color:f,chevronColor:g,chevronSize:h,textStyle:y,style:O,optionStyle:j,selectedOptionStyle:C,optionTextStyle:v,selectedOptionTextStyle:F,accessibilityLabel:_,testID:k}=e,I=useTheme(),T=useMemo(()=>buildStyles(I),[I]),z=resolveFieldSize(I,x),L=useCallback(e=>i?i(e):e.label??"",[i]),H=useCallback(e=>s?s(e):e.value,[s]),w=useCallback(e=>o?o(e):!0===e.disabled,[o]),D=useCallback(e=>a?a(e):e.description,[a]),P=useCallback(e=>r?r(e):e.icon,[r]),[V,B]=useState(!1),M=useMemo(()=>{if(null!=n)return l.find(e=>H(e)===n)},[l,n,H]),R=useCallback(e=>n===e,[n]),$=useCallback(()=>{if(m)return;const e=resolveHaptic(u,"selection");e&&triggerHaptic(e),B(!0)},[m,u]),N=useCallback(()=>{B(!1)},[]),G=useCallback(e=>{if(w(e))return;const t=resolveHaptic(u,"selection");t&&triggerHaptic(t),c(H(e)),N()},[w,H,c,N,u]),q=m?I.colors.text.disabled:f??I.components.inlineSelect?.color??I.colors.primary,A=void 0!==M?L(M):d??"Select",E=void 0!==M?`Selected: ${L(M)}`:d??"No selection",J=_jsxs(Pressable,{ref:t,onPress:$,disabled:m,hitSlop:8,accessibilityRole:"button",accessibilityLabel:_??`${p??b??"Select"}. ${E}`,accessibilityState:{disabled:m,expanded:V},"aria-disabled":m,"aria-expanded":V,testID:k,style:({pressed:e})=>[T.trigger,{columnGap:I.spacing.xs,opacity:e&&!m?.6:1},O],children:[_jsx(Text,{style:[T.triggerText,{color:q,fontSize:z.text,...fontFor(I,"medium")},y],numberOfLines:1,children:A}),_jsx(Chevron,{color:g??q,size:h??z.icon,open:V})]});return _jsxs(_Fragment,{children:[p?_jsxs(View,{style:T.labelled,children:[_jsx(FieldLabel,{size:x,children:p}),J]}):J,_jsx(OptionSheet,{open:V,onClose:N,title:b,accessibilityLabel:p??b??d??"Options",options:l,labelOf:L,getValue:H,disabledOf:w,descriptionOf:D,iconOf:P,isSelected:R,onSelect:G,searchable:S,optionStyle:j,selectedOptionStyle:C,optionTextStyle:v,selectedOptionTextStyle:F})]})});InlineSelect.displayName="InlineSelect";const buildStyles=e=>StyleSheet.create({labelled:{alignItems:"flex-start"},trigger:{flexDirection:"row",alignItems:"center"},triggerText:{includeFontPadding:!1}});export{InlineSelect};export default InlineSelect;