@lmb-it/kitsconcerto-native 0.1.243 → 0.1.245

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 (282) hide show
  1. package/animations/index.cjs +25 -15
  2. package/animations/index.cjs.map +1 -1
  3. package/animations/index.js +25 -15
  4. package/animations/index.js.map +1 -1
  5. package/apps/mobile/src/Core/AutoComplete/index.cjs +105 -64
  6. package/apps/mobile/src/Core/AutoComplete/index.cjs.map +1 -1
  7. package/apps/mobile/src/Core/AutoComplete/index.js +106 -65
  8. package/apps/mobile/src/Core/AutoComplete/index.js.map +1 -1
  9. package/apps/mobile/src/Core/Dropdown/index.cjs +2 -0
  10. package/apps/mobile/src/Core/Dropdown/index.cjs.map +1 -1
  11. package/apps/mobile/src/Core/Dropdown/index.js +2 -0
  12. package/apps/mobile/src/Core/Dropdown/index.js.map +1 -1
  13. package/apps/mobile/src/Core/Trees/components/CoreToolbar.cjs +2 -0
  14. package/apps/mobile/src/Core/Trees/components/CoreToolbar.cjs.map +1 -1
  15. package/apps/mobile/src/Core/Trees/components/CoreToolbar.js +2 -0
  16. package/apps/mobile/src/Core/Trees/components/CoreToolbar.js.map +1 -1
  17. package/apps/mobile/src/Factory/ResponsiveElement.cjs +2 -0
  18. package/apps/mobile/src/Factory/ResponsiveElement.cjs.map +1 -1
  19. package/apps/mobile/src/Factory/ResponsiveElement.js +2 -0
  20. package/apps/mobile/src/Factory/ResponsiveElement.js.map +1 -1
  21. package/apps/mobile/src/Factory/helpers/cssVarMap.cjs +16 -0
  22. package/apps/mobile/src/Factory/helpers/cssVarMap.cjs.map +1 -1
  23. package/apps/mobile/src/Factory/helpers/cssVarMap.js +16 -0
  24. package/apps/mobile/src/Factory/helpers/cssVarMap.js.map +1 -1
  25. package/apps/mobile/src/Factory/helpers/style.cjs +17 -1
  26. package/apps/mobile/src/Factory/helpers/style.cjs.map +1 -1
  27. package/apps/mobile/src/Factory/helpers/style.js +17 -1
  28. package/apps/mobile/src/Factory/helpers/style.js.map +1 -1
  29. package/apps/mobile/src/Factory/useSeparator.cjs +1 -0
  30. package/apps/mobile/src/Factory/useSeparator.cjs.map +1 -1
  31. package/apps/mobile/src/Factory/useSeparator.js +1 -0
  32. package/apps/mobile/src/Factory/useSeparator.js.map +1 -1
  33. package/components/Accordion/accordion.cjs +2 -0
  34. package/components/Accordion/accordion.cjs.map +1 -1
  35. package/components/Accordion/accordion.js +2 -0
  36. package/components/Accordion/accordion.js.map +1 -1
  37. package/components/Badge/index.cjs +2 -0
  38. package/components/Badge/index.cjs.map +1 -1
  39. package/components/Badge/index.js +2 -0
  40. package/components/Badge/index.js.map +1 -1
  41. package/components/BottomTabBar/index.cjs +2 -0
  42. package/components/BottomTabBar/index.cjs.map +1 -1
  43. package/components/BottomTabBar/index.js +2 -0
  44. package/components/BottomTabBar/index.js.map +1 -1
  45. package/components/Button/Button.cjs +2 -0
  46. package/components/Button/Button.cjs.map +1 -1
  47. package/components/Button/Button.js +2 -0
  48. package/components/Button/Button.js.map +1 -1
  49. package/components/MessageComposer/index.cjs +2 -0
  50. package/components/MessageComposer/index.cjs.map +1 -1
  51. package/components/MessageComposer/index.js +2 -0
  52. package/components/MessageComposer/index.js.map +1 -1
  53. package/components/SegmentedControl/index.cjs +2 -0
  54. package/components/SegmentedControl/index.cjs.map +1 -1
  55. package/components/SegmentedControl/index.js +2 -0
  56. package/components/SegmentedControl/index.js.map +1 -1
  57. package/components/SkeletonText/index.cjs +2 -0
  58. package/components/SkeletonText/index.cjs.map +1 -1
  59. package/components/SkeletonText/index.js +2 -0
  60. package/components/SkeletonText/index.js.map +1 -1
  61. package/components/Tabs/index.cjs +2 -0
  62. package/components/Tabs/index.cjs.map +1 -1
  63. package/components/Tabs/index.js +2 -0
  64. package/components/Tabs/index.js.map +1 -1
  65. package/components/overlay/ConfirmDialog/index.cjs +146 -89
  66. package/components/overlay/ConfirmDialog/index.cjs.map +1 -1
  67. package/components/overlay/ConfirmDialog/index.js +147 -90
  68. package/components/overlay/ConfirmDialog/index.js.map +1 -1
  69. package/components/overlay/Dialog/index.cjs +90 -64
  70. package/components/overlay/Dialog/index.cjs.map +1 -1
  71. package/components/overlay/Dialog/index.js +91 -65
  72. package/components/overlay/Dialog/index.js.map +1 -1
  73. package/components/overlay/Toast/index.cjs +59 -24
  74. package/components/overlay/Toast/index.cjs.map +1 -1
  75. package/components/overlay/Toast/index.js +62 -27
  76. package/components/overlay/Toast/index.js.map +1 -1
  77. package/contexts/Locale/index.cjs +2 -0
  78. package/contexts/Locale/index.cjs.map +1 -1
  79. package/contexts/Locale/index.js +2 -0
  80. package/contexts/Locale/index.js.map +1 -1
  81. package/contexts/Main/index.cjs +2 -0
  82. package/contexts/Main/index.cjs.map +1 -1
  83. package/contexts/Main/index.js +2 -0
  84. package/contexts/Main/index.js.map +1 -1
  85. package/contexts/Theme/KitsThemeProvider.cjs +2 -0
  86. package/contexts/Theme/KitsThemeProvider.cjs.map +1 -1
  87. package/contexts/Theme/KitsThemeProvider.js +2 -0
  88. package/contexts/Theme/KitsThemeProvider.js.map +1 -1
  89. package/contexts/Theme/index.cjs +1 -0
  90. package/contexts/Theme/index.cjs.map +1 -1
  91. package/contexts/Theme/index.js +1 -0
  92. package/contexts/Theme/index.js.map +1 -1
  93. package/contexts/Theme/resolvers.cjs +4 -0
  94. package/contexts/Theme/resolvers.cjs.map +1 -1
  95. package/contexts/Theme/resolvers.js +4 -0
  96. package/contexts/Theme/resolvers.js.map +1 -1
  97. package/data/DataView/Pagination/index.cjs +2 -0
  98. package/data/DataView/Pagination/index.cjs.map +1 -1
  99. package/data/DataView/Pagination/index.js +2 -0
  100. package/data/DataView/Pagination/index.js.map +1 -1
  101. package/data/TreeView/index.cjs +2 -0
  102. package/data/TreeView/index.cjs.map +1 -1
  103. package/data/TreeView/index.js +2 -0
  104. package/data/TreeView/index.js.map +1 -1
  105. package/form/controls/Checkbox/checkbox.cjs +2 -0
  106. package/form/controls/Checkbox/checkbox.cjs.map +1 -1
  107. package/form/controls/Checkbox/checkbox.js +2 -0
  108. package/form/controls/Checkbox/checkbox.js.map +1 -1
  109. package/form/controls/RadioButton/radiobutton.cjs +2 -0
  110. package/form/controls/RadioButton/radiobutton.cjs.map +1 -1
  111. package/form/controls/RadioButton/radiobutton.js +2 -0
  112. package/form/controls/RadioButton/radiobutton.js.map +1 -1
  113. package/form/controls/SelectButton/index.cjs +2 -0
  114. package/form/controls/SelectButton/index.cjs.map +1 -1
  115. package/form/controls/SelectButton/index.js +2 -0
  116. package/form/controls/SelectButton/index.js.map +1 -1
  117. package/form/controls/TriStateCheckbox/index.cjs +2 -0
  118. package/form/controls/TriStateCheckbox/index.cjs.map +1 -1
  119. package/form/controls/TriStateCheckbox/index.js +2 -0
  120. package/form/controls/TriStateCheckbox/index.js.map +1 -1
  121. package/form/file-pickers/MainUploader/index.cjs +1 -0
  122. package/form/file-pickers/MainUploader/index.cjs.map +1 -1
  123. package/form/file-pickers/MainUploader/index.js +1 -0
  124. package/form/file-pickers/MainUploader/index.js.map +1 -1
  125. package/form/helpers/ErrorMessage/errormessage.cjs +2 -0
  126. package/form/helpers/ErrorMessage/errormessage.cjs.map +1 -1
  127. package/form/helpers/ErrorMessage/errormessage.js +2 -0
  128. package/form/helpers/ErrorMessage/errormessage.js.map +1 -1
  129. package/form/helpers/FormContainer/index.cjs +2 -0
  130. package/form/helpers/FormContainer/index.cjs.map +1 -1
  131. package/form/helpers/FormContainer/index.js +2 -0
  132. package/form/helpers/FormContainer/index.js.map +1 -1
  133. package/form/helpers/Label/label.cjs +2 -0
  134. package/form/helpers/Label/label.cjs.map +1 -1
  135. package/form/helpers/Label/label.js +2 -0
  136. package/form/helpers/Label/label.js.map +1 -1
  137. package/form/inputs/InputMask/index.cjs +2 -0
  138. package/form/inputs/InputMask/index.cjs.map +1 -1
  139. package/form/inputs/InputMask/index.js +2 -0
  140. package/form/inputs/InputMask/index.js.map +1 -1
  141. package/form/inputs/InputNumber/index.cjs +2 -0
  142. package/form/inputs/InputNumber/index.cjs.map +1 -1
  143. package/form/inputs/InputNumber/index.js +2 -0
  144. package/form/inputs/InputNumber/index.js.map +1 -1
  145. package/form/inputs/InputPassword/index.cjs +2 -0
  146. package/form/inputs/InputPassword/index.cjs.map +1 -1
  147. package/form/inputs/InputPassword/index.js +2 -0
  148. package/form/inputs/InputPassword/index.js.map +1 -1
  149. package/form/inputs/InputSwitch/index.cjs +2 -0
  150. package/form/inputs/InputSwitch/index.cjs.map +1 -1
  151. package/form/inputs/InputSwitch/index.js +2 -0
  152. package/form/inputs/InputSwitch/index.js.map +1 -1
  153. package/form/inputs/InputText/index.cjs +2 -0
  154. package/form/inputs/InputText/index.cjs.map +1 -1
  155. package/form/inputs/InputText/index.js +2 -0
  156. package/form/inputs/InputText/index.js.map +1 -1
  157. package/form/inputs/InputTextarea/index.cjs +2 -0
  158. package/form/inputs/InputTextarea/index.cjs.map +1 -1
  159. package/form/inputs/InputTextarea/index.js +2 -0
  160. package/form/inputs/InputTextarea/index.js.map +1 -1
  161. package/form/inputs/PhoneInput/index.cjs +2 -0
  162. package/form/inputs/PhoneInput/index.cjs.map +1 -1
  163. package/form/inputs/PhoneInput/index.js +2 -0
  164. package/form/inputs/PhoneInput/index.js.map +1 -1
  165. package/form/inputs/RadiusPicker/components/NumericRadiusInput.cjs +1 -0
  166. package/form/inputs/RadiusPicker/components/NumericRadiusInput.cjs.map +1 -1
  167. package/form/inputs/RadiusPicker/components/NumericRadiusInput.js +1 -0
  168. package/form/inputs/RadiusPicker/components/NumericRadiusInput.js.map +1 -1
  169. package/form/selects/AutoComplete/index.cjs +2 -0
  170. package/form/selects/AutoComplete/index.cjs.map +1 -1
  171. package/form/selects/AutoComplete/index.js +2 -0
  172. package/form/selects/AutoComplete/index.js.map +1 -1
  173. package/form/selects/Dropdown/index.cjs +2 -0
  174. package/form/selects/Dropdown/index.cjs.map +1 -1
  175. package/form/selects/Dropdown/index.js +2 -0
  176. package/form/selects/Dropdown/index.js.map +1 -1
  177. package/form/selects/ListBox/index.cjs +2 -0
  178. package/form/selects/ListBox/index.cjs.map +1 -1
  179. package/form/selects/ListBox/index.js +2 -0
  180. package/form/selects/ListBox/index.js.map +1 -1
  181. package/form/selects/MultiSelect/index.cjs +2 -0
  182. package/form/selects/MultiSelect/index.cjs.map +1 -1
  183. package/form/selects/MultiSelect/index.js +2 -0
  184. package/form/selects/MultiSelect/index.js.map +1 -1
  185. package/form/selects/TreeSelect/index.cjs +2 -0
  186. package/form/selects/TreeSelect/index.cjs.map +1 -1
  187. package/form/selects/TreeSelect/index.js +2 -0
  188. package/form/selects/TreeSelect/index.js.map +1 -1
  189. package/form-renderer/components/layout/FieldWrapper.cjs +2 -0
  190. package/form-renderer/components/layout/FieldWrapper.cjs.map +1 -1
  191. package/form-renderer/components/layout/FieldWrapper.js +2 -0
  192. package/form-renderer/components/layout/FieldWrapper.js.map +1 -1
  193. package/hooks/shadowPresets.cjs +1 -0
  194. package/hooks/shadowPresets.cjs.map +1 -1
  195. package/hooks/shadowPresets.js +1 -0
  196. package/hooks/shadowPresets.js.map +1 -1
  197. package/hooks/useFocusStyles.cjs +2 -0
  198. package/hooks/useFocusStyles.cjs.map +1 -1
  199. package/hooks/useFocusStyles.js +2 -0
  200. package/hooks/useFocusStyles.js.map +1 -1
  201. package/index.cjs +5 -0
  202. package/index.cjs.map +1 -1
  203. package/index.d.ts +60 -3
  204. package/index.js +1 -0
  205. package/index.js.map +1 -1
  206. package/layout/Center/index.cjs +2 -0
  207. package/layout/Center/index.cjs.map +1 -1
  208. package/layout/Center/index.js +2 -0
  209. package/layout/Center/index.js.map +1 -1
  210. package/layout/Container/container.cjs +2 -0
  211. package/layout/Container/container.cjs.map +1 -1
  212. package/layout/Container/container.js +2 -0
  213. package/layout/Container/container.js.map +1 -1
  214. package/layout/Flex/index.cjs +2 -0
  215. package/layout/Flex/index.cjs.map +1 -1
  216. package/layout/Flex/index.js +2 -0
  217. package/layout/Flex/index.js.map +1 -1
  218. package/layout/HStack/index.cjs +2 -0
  219. package/layout/HStack/index.cjs.map +1 -1
  220. package/layout/HStack/index.js +2 -0
  221. package/layout/HStack/index.js.map +1 -1
  222. package/layout/List/index.cjs +2 -0
  223. package/layout/List/index.cjs.map +1 -1
  224. package/layout/List/index.js +2 -0
  225. package/layout/List/index.js.map +1 -1
  226. package/layout/ListItem/index.cjs +2 -0
  227. package/layout/ListItem/index.cjs.map +1 -1
  228. package/layout/ListItem/index.js +2 -0
  229. package/layout/ListItem/index.js.map +1 -1
  230. package/layout/ScrollView/index.cjs +2 -0
  231. package/layout/ScrollView/index.cjs.map +1 -1
  232. package/layout/ScrollView/index.js +2 -0
  233. package/layout/ScrollView/index.js.map +1 -1
  234. package/layout/VStack/index.cjs +2 -0
  235. package/layout/VStack/index.cjs.map +1 -1
  236. package/layout/VStack/index.js +2 -0
  237. package/layout/VStack/index.js.map +1 -1
  238. package/package.json +1 -1
  239. package/packages/types/src/Theme/alphaColors.cjs +24 -0
  240. package/packages/types/src/Theme/alphaColors.cjs.map +1 -0
  241. package/packages/types/src/Theme/alphaColors.js +19 -0
  242. package/packages/types/src/Theme/alphaColors.js.map +1 -0
  243. package/packages/types/src/Theme/resolvers.cjs +6 -0
  244. package/packages/types/src/Theme/resolvers.cjs.map +1 -1
  245. package/packages/types/src/Theme/resolvers.js +6 -0
  246. package/packages/types/src/Theme/resolvers.js.map +1 -1
  247. package/primitives/Box/index.cjs +2 -0
  248. package/primitives/Box/index.cjs.map +1 -1
  249. package/primitives/Box/index.js +2 -0
  250. package/primitives/Box/index.js.map +1 -1
  251. package/primitives/Card/index.cjs +2 -0
  252. package/primitives/Card/index.cjs.map +1 -1
  253. package/primitives/Card/index.js +2 -0
  254. package/primitives/Card/index.js.map +1 -1
  255. package/primitives/Divider/index.cjs +2 -0
  256. package/primitives/Divider/index.cjs.map +1 -1
  257. package/primitives/Divider/index.js +2 -0
  258. package/primitives/Divider/index.js.map +1 -1
  259. package/primitives/Heading/index.cjs +2 -0
  260. package/primitives/Heading/index.cjs.map +1 -1
  261. package/primitives/Heading/index.js +2 -0
  262. package/primitives/Heading/index.js.map +1 -1
  263. package/primitives/Icon/index.cjs +1 -0
  264. package/primitives/Icon/index.cjs.map +1 -1
  265. package/primitives/Icon/index.js +1 -0
  266. package/primitives/Icon/index.js.map +1 -1
  267. package/primitives/Image/index.cjs +2 -0
  268. package/primitives/Image/index.cjs.map +1 -1
  269. package/primitives/Image/index.js +2 -0
  270. package/primitives/Image/index.js.map +1 -1
  271. package/primitives/Skeleton/index.cjs +2 -0
  272. package/primitives/Skeleton/index.cjs.map +1 -1
  273. package/primitives/Skeleton/index.js +2 -0
  274. package/primitives/Skeleton/index.js.map +1 -1
  275. package/primitives/Svg/index.cjs +2 -0
  276. package/primitives/Svg/index.cjs.map +1 -1
  277. package/primitives/Svg/index.js +2 -0
  278. package/primitives/Svg/index.js.map +1 -1
  279. package/primitives/Text/index.cjs +2 -0
  280. package/primitives/Text/index.cjs.map +1 -1
  281. package/primitives/Text/index.js +2 -0
  282. package/primitives/Text/index.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Dialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, ScrollView, StyleSheet, View, useWindowDimensions} from \"react-native\";\nimport Animated, {FadeIn, SlideInDown, ZoomIn} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IKitsDialogControlled} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\nexport default function KitsDialogControlled({state, onHide}: IKitsDialogControlled) {\n const {\n children,\n content: contentProp,\n onClose,\n asyncClose,\n type,\n icon,\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n position = 'center',\n responsive = true,\n hideHeader,\n headerRender,\n footerRender,\n footerStyle,\n canClose,\n bodyStyle,\n closeIcon,\n // Native default true preserves historical tap-to-dismiss; web's\n // PrimeReact default is false — pass explicitly in shared code.\n dismissableMask = true,\n breakpoints,\n ...rest\n } = state;\n const {resolveToken, theme} = useKitsTheme();\n const severityColors = useSeverityColors(type || 'secondary');\n const colors = type ? severityColors : null;\n const insets = useSafeAreaInsets();\n const isSheet = position === 'bottom';\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = colors?.border ?? resolveToken('border');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n const resolvedFooterStyle = useResolvedStyle(footerStyle || {});\n const resolvedBodyStyle = useResolvedStyle(bodyStyle || {});\n\n const {width: screenWidth} = useWindowDimensions();\n // Consumer `breakpoints` ({'960px': '75vw'}) mirrors the web prop: the\n // smallest max-width threshold >= the screen width wins; vw/% both map\n // to a percentage of the window width. Falls back to the responsive\n // default (50% tablets/desktop, 95% phones <=641px).\n const breakpointWidth = (() => {\n if (!breakpoints) return null;\n const matches = Object.entries(breakpoints)\n .map(([k, v]) => [parseFloat(k), v] as const)\n .filter(([px]) => !Number.isNaN(px) && screenWidth <= px)\n .sort(([a], [b]) => a - b);\n const value = matches[0]?.[1];\n if (value == null) return null;\n const num = parseFloat(value);\n return Number.isNaN(num) ? null : `${num}%`;\n })();\n const responsiveWidth = breakpointWidth ?? (screenWidth > 641 ? '50%' : '95%');\n const hasExplicitWidth = (resolvedStyle as any).width != null;\n\n const hide = async () => {\n // canClose gate — intercepts every close path (backdrop Pressable,\n // built-in X Pressable, RN Modal onRequestClose). When blocked,\n // onClose is suppressed and the dialog stays open.\n if (canClose === false || (typeof canClose === 'function' && !canClose())) {\n return;\n }\n if (asyncClose && typeof onClose === \"function\") {\n await onClose();\n } else {\n onClose?.();\n }\n onHide();\n };\n\n if (!state.visible) return null;\n\n const content = typeof children === \"function\" ? children(hide) : children;\n // Content-mode override (mirrors web): consumer node replaces the whole\n // header / body / footer template inside the panel.\n const contentMode = contentProp != null\n ? (typeof contentProp === \"function\" ? contentProp({hide}) : contentProp)\n : null;\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n <Animated.View entering={FadeIn.duration(anim.scrim.enterDuration)} style={[isSheet ? styles.sheetOverlay : styles.overlay, resolvedMaskStyle as any]}>\n <Pressable style={StyleSheet.absoluteFill} onPress={dismissableMask ? hide : undefined}/>\n <Animated.View\n entering={isSheet\n ? SlideInDown.springify().damping(anim.sheet.enter.damping).stiffness(anim.sheet.enter.stiffness)\n : ZoomIn.springify().damping(anim.dialog.enter.damping).stiffness(anim.dialog.enter.stiffness)}\n style={[\n styles.panel,\n isSheet && styles.sheetPanel,\n {backgroundColor: surfaceColor, borderColor},\n // Explicit `breakpoints` win even when responsive=false (web parity)\n !isSheet && !hasExplicitWidth && (breakpoints != null || responsive) ? {width: responsiveWidth} : null,\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {contentMode != null ? contentMode : <>\n {/* Grabber (bottom-sheet) */}\n {isSheet && <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>}\n\n {/* Severity accent strip */}\n {colors && !isSheet && (\n <View style={{height: 4, backgroundColor: colors.solid, borderTopLeftRadius: 16, borderTopRightRadius: 16}}/>\n )}\n\n {/* Custom header (headerRender) — fully replaces the built-in header\n View when provided. Wins over the default header even if `header`\n is also set. */}\n {!hideHeader && headerRender != null && headerRender({close: () => { void hide(); }})}\n\n {/* Header (default) — rendered when no headerRender and `header` is set. */}\n {!hideHeader && headerRender == null && rest.header != null && (\n <View style={[styles.header, {borderBottomColor: borderColor}, resolvedHeaderStyle as any]}>\n {/* Inline severity icon */}\n {(icon || brandLogo) && colors && (\n <View style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n backgroundColor: colors.iconBg,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 12,\n }}>\n {brandLogo ? brandLogo : typeof icon === 'string' ? (\n <Icon name={icon as never} size={'lg'} color={colors.iconFg}/>\n ) : icon}\n </View>\n )}\n <Text style={{fontSize: 18, fontWeight: \"700\", color: textColor, flex: 1}}>\n {rest.header as React.ReactNode}\n </Text>\n <Pressable onPress={hide} hitSlop={8}>\n {closeIcon ?? <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>}\n </Pressable>\n </View>\n )}\n\n {/* Body — bodyStyle is applied AFTER the built-in maxHeight: 400,\n so consumers can lift the cap (`maxHeight: 600`) or unlock flex\n sizing (`minHeight: 0`) without losing the default behavior when\n bodyStyle is unset. */}\n <ScrollView\n style={[styles.body, resolvedBodyStyle as any]}\n contentContainerStyle={styles.bodyContent}\n showsVerticalScrollIndicator={false}\n >\n {content}\n </ScrollView>\n\n {/* Footer — footerRender takes precedence over `footer`. footerStyle\n is merged AFTER the built-in flex defaults so consumers can override\n alignment (e.g. justifyContent: 'space-between' for left-delete /\n right-actions layouts) without losing the borderTop / padding. */}\n {(footerRender != null || rest.footer != null) && (\n <View style={[\n styles.footer,\n {borderTopColor: borderColor},\n isSheet && {paddingBottom: 12 + insets.bottom},\n resolvedFooterStyle as any,\n ]}>\n {footerRender\n ? footerRender({close: () => { void hide(); }})\n : (rest.footer as React.ReactNode)}\n </View>\n )}\n </>}\n </Animated.View>\n </Animated.View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: \"rgba(0,0,0,0.45)\",\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 24,\n },\n sheetOverlay: {\n flex: 1,\n backgroundColor: \"rgba(0,0,0,0.45)\",\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"90%\",\n borderWidth: 0,\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n paddingTop: 10,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n panel: {\n borderRadius: 16,\n borderWidth: 1,\n minWidth: 250,\n maxWidth: \"90%\",\n maxHeight: \"80%\",\n overflow: \"hidden\",\n elevation: 12,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 6},\n shadowOpacity: 0.2,\n shadowRadius: 12,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n paddingVertical: 16,\n borderBottomWidth: 1,\n },\n body: {\n maxHeight: 400,\n },\n bodyContent: {\n padding: 20,\n },\n footer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n paddingHorizontal: 20,\n paddingVertical: 12,\n borderTopWidth: 1,\n gap: 8,\n },\n});\n"],"names":["anim"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Dialog/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {Modal, Pressable, ScrollView, StyleSheet, View, useWindowDimensions} from \"react-native\";\nimport Animated, {Easing, FadeIn, FadeOut, runOnJS, SlideInDown, SlideOutDown, ZoomIn, ZoomOut} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Icon, Text} from \"../../../_compat\";\nimport type {IKitsDialogControlled} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {useSeverityColors} from \"../../../hooks/useSeverityColors\";\nimport {useResolvedStyle} from \"../../../hooks\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\n/**\n * Keeps the RN Modal mounted through the exit animation. `visible` drives the\n * inner scrim + panel entering/exiting; the Modal itself stays mounted until\n * the panel's exit animation reports finished, then unmounts.\n *\n * Re-entrancy: a new `visible=true` during an exit re-renders the inner (which\n * re-enters), and the still-pending exit callback is ignored because\n * `visibleRef` is already back to `true` — so the Modal is never torn down\n * mid-reopen.\n */\nfunction useOverlayPresence(visible: boolean) {\n const [mounted, setMounted] = React.useState(visible);\n const visibleRef = React.useRef(visible);\n React.useEffect(() => {\n visibleRef.current = visible;\n if (visible) setMounted(true);\n }, [visible]);\n // Runs on the JS thread (dispatched via runOnJS from the exit worklet).\n const handleExitFinished = React.useCallback(() => {\n if (!visibleRef.current) setMounted(false);\n }, []);\n return {mounted, handleExitFinished};\n}\n\nexport default function KitsDialogControlled({state, onHide}: IKitsDialogControlled) {\n const {\n children,\n content: contentProp,\n onClose,\n asyncClose,\n type,\n icon,\n style,\n contentStyle,\n headerStyle,\n maskStyle,\n position = 'center',\n responsive = true,\n hideHeader,\n headerRender,\n footerRender,\n footerStyle,\n canClose,\n bodyStyle,\n closeIcon,\n // Native default true preserves historical tap-to-dismiss; web's\n // PrimeReact default is false — pass explicitly in shared code.\n dismissableMask = true,\n breakpoints,\n ...rest\n } = state;\n const {resolveToken, theme} = useKitsTheme();\n const severityColors = useSeverityColors(type || 'secondary');\n const colors = type ? severityColors : null;\n const insets = useSafeAreaInsets();\n const isSheet = position === 'bottom';\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = colors?.border ?? resolveToken('border');\n const subtextColor = resolveToken('gray.500');\n const grabberColor = resolveToken('gray.300');\n // Scrim via the literal alpha overlay token → rgba(0,0,0,0.4) in both modes.\n const scrimColor = resolveToken('black-alpha-40');\n const brandLogo = type === 'brand' ? theme.config.logo : null;\n\n const resolvedStyle = useResolvedStyle(style || {});\n const resolvedContentStyle = useResolvedStyle(contentStyle || {});\n const resolvedHeaderStyle = useResolvedStyle(headerStyle || {});\n const resolvedMaskStyle = useResolvedStyle(maskStyle || {});\n const resolvedFooterStyle = useResolvedStyle(footerStyle || {});\n const resolvedBodyStyle = useResolvedStyle(bodyStyle || {});\n\n const {width: screenWidth} = useWindowDimensions();\n // Consumer `breakpoints` ({'960px': '75vw'}) mirrors the web prop: the\n // smallest max-width threshold >= the screen width wins; vw/% both map\n // to a percentage of the window width. Falls back to the responsive\n // default (50% tablets/desktop, 95% phones <=641px).\n const breakpointWidth = (() => {\n if (!breakpoints) return null;\n const matches = Object.entries(breakpoints)\n .map(([k, v]) => [parseFloat(k), v] as const)\n .filter(([px]) => !Number.isNaN(px) && screenWidth <= px)\n .sort(([a], [b]) => a - b);\n const value = matches[0]?.[1];\n if (value == null) return null;\n const num = parseFloat(value);\n return Number.isNaN(num) ? null : `${num}%`;\n })();\n const responsiveWidth = breakpointWidth ?? (screenWidth > 641 ? '50%' : '95%');\n const hasExplicitWidth = (resolvedStyle as any).width != null;\n\n const hide = async () => {\n // canClose gate — intercepts every close path (backdrop Pressable,\n // built-in X Pressable, RN Modal onRequestClose). When blocked,\n // onClose is suppressed and the dialog stays open.\n if (canClose === false || (typeof canClose === 'function' && !canClose())) {\n return;\n }\n if (asyncClose && typeof onClose === \"function\") {\n await onClose();\n } else {\n onClose?.();\n }\n onHide();\n };\n\n const {mounted, handleExitFinished} = useOverlayPresence(!!state.visible);\n if (!mounted) return null;\n\n const content = typeof children === \"function\" ? children(hide) : children;\n // Content-mode override (mirrors web): consumer node replaces the whole\n // header / body / footer template inside the panel.\n const contentMode = contentProp != null\n ? (typeof contentProp === \"function\" ? contentProp({hide}) : contentProp)\n : null;\n\n return (\n <Modal visible transparent animationType=\"none\" onRequestClose={hide}>\n {state.visible && (\n <Animated.View\n entering={FadeIn.duration(anim.scrim.enterDuration)}\n exiting={FadeOut.duration(anim.scrim.exitDuration)}\n style={[isSheet ? styles.sheetOverlay : styles.overlay, {backgroundColor: scrimColor}, resolvedMaskStyle as any]}\n >\n <Pressable style={StyleSheet.absoluteFill} onPress={dismissableMask ? hide : undefined}/>\n <Animated.View\n entering={isSheet\n ? SlideInDown.springify().damping(anim.sheet.enter.damping).stiffness(anim.sheet.enter.stiffness).mass(anim.sheet.enter.mass ?? 1)\n : ZoomIn.springify().damping(anim.dialog.enter.damping).stiffness(anim.dialog.enter.stiffness).mass(anim.dialog.enter.mass ?? 1)}\n exiting={(isSheet\n ? SlideOutDown.duration(anim.sheet.exitDuration).easing(Easing.in(Easing.ease))\n : ZoomOut.duration(anim.dialog.exitDuration).easing(Easing.in(Easing.ease))\n ).withCallback((finished) => {\n 'worklet';\n if (finished) runOnJS(handleExitFinished)();\n })}\n style={[\n styles.panel,\n isSheet && styles.sheetPanel,\n {backgroundColor: surfaceColor, borderColor},\n // Explicit `breakpoints` win even when responsive=false (web parity)\n !isSheet && !hasExplicitWidth && (breakpoints != null || responsive) ? {width: responsiveWidth} : null,\n resolvedStyle as any,\n resolvedContentStyle as any,\n ]}\n >\n {contentMode != null ? contentMode : <>\n {/* Grabber (bottom-sheet) */}\n {isSheet && <View style={[styles.grabber, {backgroundColor: grabberColor}]}/>}\n\n {/* Severity accent strip */}\n {colors && !isSheet && (\n <View style={{height: 4, backgroundColor: colors.solid, borderTopLeftRadius: 20, borderTopRightRadius: 20}}/>\n )}\n\n {/* Custom header (headerRender) — fully replaces the built-in header\n View when provided. Wins over the default header even if `header`\n is also set. */}\n {!hideHeader && headerRender != null && headerRender({close: () => { void hide(); }})}\n\n {/* Header (default) — rendered when no headerRender and `header` is set. */}\n {!hideHeader && headerRender == null && rest.header != null && (\n <View style={[styles.header, {borderBottomColor: borderColor}, resolvedHeaderStyle as any]}>\n {/* Inline severity icon */}\n {(icon || brandLogo) && colors && (\n <View style={{\n width: 36,\n height: 36,\n borderRadius: 18,\n backgroundColor: colors.iconBg,\n alignItems: 'center',\n justifyContent: 'center',\n marginRight: 12,\n }}>\n {brandLogo ? brandLogo : typeof icon === 'string' ? (\n <Icon name={icon as never} size={'lg'} color={colors.iconFg}/>\n ) : icon}\n </View>\n )}\n <Text style={{fontSize: 18, fontWeight: \"700\", color: textColor, flex: 1}}>\n {rest.header as React.ReactNode}\n </Text>\n <Pressable onPress={hide} hitSlop={8}>\n {closeIcon ?? <Text style={{fontSize: 18, color: subtextColor}}>✕</Text>}\n </Pressable>\n </View>\n )}\n\n {/* Body — bodyStyle is applied AFTER the built-in maxHeight: 400,\n so consumers can lift the cap (`maxHeight: 600`) or unlock flex\n sizing (`minHeight: 0`) without losing the default behavior when\n bodyStyle is unset. */}\n <ScrollView\n style={[styles.body, resolvedBodyStyle as any]}\n contentContainerStyle={styles.bodyContent}\n showsVerticalScrollIndicator={false}\n >\n {content}\n </ScrollView>\n\n {/* Footer — footerRender takes precedence over `footer`. footerStyle\n is merged AFTER the built-in flex defaults so consumers can override\n alignment (e.g. justifyContent: 'space-between' for left-delete /\n right-actions layouts) without losing the borderTop / padding. */}\n {(footerRender != null || rest.footer != null) && (\n <View style={[\n styles.footer,\n {borderTopColor: borderColor},\n isSheet && {paddingBottom: 12 + insets.bottom},\n resolvedFooterStyle as any,\n ]}>\n {footerRender\n ? footerRender({close: () => { void hide(); }})\n : (rest.footer as React.ReactNode)}\n </View>\n )}\n </>}\n </Animated.View>\n </Animated.View>\n )}\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 24,\n },\n sheetOverlay: {\n flex: 1,\n justifyContent: \"flex-end\",\n },\n sheetPanel: {\n width: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"90%\",\n borderWidth: 0,\n borderTopLeftRadius: 24,\n borderTopRightRadius: 24,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n paddingTop: 10,\n },\n grabber: {\n width: 40,\n height: 5,\n borderRadius: 999,\n alignSelf: \"center\",\n marginBottom: 6,\n },\n panel: {\n // 20 == radii.xl (no numeric radii resolver on native — see report).\n borderRadius: 20,\n borderWidth: 1,\n minWidth: 250,\n maxWidth: \"90%\",\n maxHeight: \"80%\",\n overflow: \"hidden\",\n // Subtle elevation: low opacity, wide blur, minimal offset.\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 2},\n shadowOpacity: 0.15,\n shadowRadius: 20,\n },\n header: {\n flexDirection: \"row\",\n alignItems: \"center\",\n paddingHorizontal: 20,\n paddingVertical: 16,\n borderBottomWidth: 1,\n },\n body: {\n maxHeight: 400,\n },\n bodyContent: {\n padding: 20,\n },\n footer: {\n flexDirection: \"row\",\n justifyContent: \"flex-end\",\n paddingHorizontal: 20,\n paddingVertical: 12,\n borderTopWidth: 1,\n gap: 8,\n },\n});\n"],"names":["anim"],"mappings":"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"}
@@ -14,24 +14,21 @@ var index_native = require('../../../primitives/Text/index.cjs');
14
14
  let toastIdCounter = 0;
15
15
  const LIFE = 3e3;
16
16
  const SIZE_CONFIG = {
17
- sm: { paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, minW: 200 },
18
- md: { paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, minW: 280 },
19
- lg: { paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, minW: 320 }
17
+ sm: { paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, actionSize: 12, minW: 200 },
18
+ md: { paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, actionSize: 13, minW: 280 },
19
+ lg: { paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, actionSize: 15, minW: 320 }
20
20
  };
21
21
  const KitsToast = ({ ref }) => {
22
22
  const [toasts, setToasts] = React.useState([]);
23
23
  const timersRef = React.useRef(/* @__PURE__ */ new Map());
24
24
  const { resolveToken } = KitsThemeProvider_native.useKitsTheme();
25
25
  const insets = reactNativeSafeAreaContext.useSafeAreaInsets();
26
- const [keyboardVisible, setKeyboardVisible] = React.useState(false);
27
- React.useEffect(() => {
28
- const showSub = reactNative.Keyboard.addListener("keyboardDidShow", () => setKeyboardVisible(true));
29
- const hideSub = reactNative.Keyboard.addListener("keyboardDidHide", () => setKeyboardVisible(false));
30
- return () => {
31
- showSub.remove();
32
- hideSub.remove();
33
- };
34
- }, []);
26
+ const keyboard = Animated.useAnimatedKeyboard();
27
+ const keyboardOffsetStyle = Animated.useAnimatedStyle(() => {
28
+ if (reactNative.Platform.OS === "android") return { transform: [{ translateY: 0 }] };
29
+ const h = keyboard.height.value;
30
+ return { transform: [{ translateY: h > 0 ? -(h + index.overlayAnimations.toast.keyboardGap) : 0 }] };
31
+ });
35
32
  const severityColors = {
36
33
  success: resolveToken("green.500"),
37
34
  info: resolveToken("blue.500"),
@@ -51,9 +48,20 @@ const KitsToast = ({ ref }) => {
51
48
  }
52
49
  setToasts((prev) => prev.filter((t) => t.id !== id));
53
50
  }, []);
54
- const toast = React.useCallback((severity, summary, body = "", position = "bottom-center", isUpdate = false, size = "md", onPress) => {
51
+ const toast = React.useCallback((severity, summary, body = "", position = "bottom-center", isUpdate = false, size = "md", onPress, options) => {
55
52
  const id = ++toastIdCounter;
56
- const item = { id, severity, summary, body, position, size, sticky: severity === "loading", onPress };
53
+ const item = {
54
+ id,
55
+ severity,
56
+ summary,
57
+ body,
58
+ position,
59
+ size,
60
+ sticky: severity === "loading",
61
+ onPress,
62
+ action: options?.action,
63
+ offset: options?.offset
64
+ };
57
65
  setToasts((prev) => {
58
66
  if (!isUpdate) return [...prev, item];
59
67
  const lastAtPos = [...prev].reverse().find((t) => t.position === position);
@@ -102,31 +110,34 @@ const KitsToast = ({ ref }) => {
102
110
  };
103
111
  const isTop = (position) => position.startsWith("top");
104
112
  return /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: reactNative.StyleSheet.absoluteFill, pointerEvents: "box-none", children: toasts.map((item) => {
105
- const top = keyboardVisible ? true : isTop(item.position);
113
+ const top = isTop(item.position);
106
114
  const align = getAlignment(item.position);
107
- const entering = top ? Animated.SlideInUp.duration(index.overlayAnimations.toast.slideInDuration) : Animated.SlideInDown.duration(index.overlayAnimations.toast.slideInDuration);
108
- const exiting = top ? Animated.SlideOutUp.duration(index.overlayAnimations.toast.slideOutDuration) : Animated.SlideOutDown.duration(index.overlayAnimations.toast.slideOutDuration);
115
+ const entering = (top ? Animated.FadeInUp : Animated.FadeInDown).springify().damping(index.overlayAnimations.toast.enter.damping).stiffness(index.overlayAnimations.toast.enter.stiffness).mass(index.overlayAnimations.toast.enter.mass);
116
+ const exiting = (top ? Animated.FadeOutUp : Animated.FadeOutDown).duration(index.overlayAnimations.toast.exitDuration);
109
117
  const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;
110
118
  const accentColor = severityColors[item.severity] ?? severityColors.info;
111
119
  return /* @__PURE__ */ jsxRuntime.jsx(
112
120
  Animated.View,
113
121
  {
114
- entering,
115
- exiting,
116
- layout: Animated.Layout.duration(index.overlayAnimations.toast.layoutDuration),
117
122
  style: [
118
123
  styles.toastWrapper,
119
124
  {
120
125
  alignItems: align,
121
- ...top ? { top: insets.top + 8 } : { bottom: insets.bottom + 8 }
122
- }
126
+ // `offset` is consumer chrome KitsConcerto cannot see
127
+ // (a bottom tab bar, a sticky header). It stacks ON TOP
128
+ // of the safe-area inset; absent, the gap is unchanged.
129
+ ...top ? { top: insets.top + 8 + (item.offset ?? 0) } : { bottom: insets.bottom + 8 + (item.offset ?? 0) }
130
+ },
131
+ // Bottom toasts lift with the keyboard; top toasts never move.
132
+ top ? null : keyboardOffsetStyle
123
133
  ],
124
134
  pointerEvents: "box-none",
125
135
  children: /* @__PURE__ */ jsxRuntime.jsx(
126
136
  Animated.View,
127
137
  {
128
- entering: Animated.FadeIn.duration(index.overlayAnimations.toast.itemEnterDuration),
129
- exiting: Animated.FadeOut.duration(index.overlayAnimations.toast.itemExitDuration),
138
+ entering,
139
+ exiting,
140
+ layout: Animated.Layout.duration(index.overlayAnimations.toast.layoutDuration),
130
141
  style: [
131
142
  styles.toast,
132
143
  {
@@ -152,6 +163,20 @@ const KitsToast = ({ ref }) => {
152
163
  /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: { fontWeight: "600", fontSize: s.summarySize, color: textColor }, children: item.summary }),
153
164
  !!item.body && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: { fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7 }, children: item.body })
154
165
  ] }),
166
+ !!item.action && /* @__PURE__ */ jsxRuntime.jsx(
167
+ reactNative.Pressable,
168
+ {
169
+ accessibilityRole: "button",
170
+ accessibilityLabel: item.action.label,
171
+ hitSlop: 8,
172
+ onPress: () => {
173
+ item.action?.onPress();
174
+ removeToast(item.id);
175
+ },
176
+ style: [styles.action, { borderColor: accentColor }],
177
+ children: /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: { fontSize: s.actionSize, fontWeight: "600", color: accentColor }, children: item.action.label })
178
+ }
179
+ ),
155
180
  /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { onPress: () => removeToast(item.id), hitSlop: 8, children: /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: { fontSize: s.closeSize, fontWeight: "bold", color: textColor, opacity: 0.4 }, children: "\u2715" }) })
156
181
  ] })
157
182
  ]
@@ -173,6 +198,10 @@ const styles = reactNative.StyleSheet.create({
173
198
  },
174
199
  toast: {
175
200
  flexDirection: "row",
201
+ // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;
202
+ // the wrapper's alignItems keeps -left/-center/-right placement intact.
203
+ width: "100%",
204
+ maxWidth: 560,
176
205
  borderRadius: 10,
177
206
  borderWidth: 1,
178
207
  marginBottom: 8,
@@ -184,6 +213,12 @@ const styles = reactNative.StyleSheet.create({
184
213
  shadowRadius: 6
185
214
  },
186
215
  accentBar: {},
216
+ action: {
217
+ borderWidth: 1,
218
+ borderRadius: 6,
219
+ paddingHorizontal: 10,
220
+ paddingVertical: 4
221
+ },
187
222
  pressArea: {
188
223
  flex: 1,
189
224
  flexDirection: "row"
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Keyboard, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeIn,\n FadeOut,\n SlideInUp,\n SlideInDown,\n SlideOutUp,\n SlideOutDown,\n Layout,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastFunction,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n const [keyboardVisible, setKeyboardVisible] = useState(false);\n\n useEffect(() => {\n const showSub = Keyboard.addListener(\"keyboardDidShow\", () => setKeyboardVisible(true));\n const hideSub = Keyboard.addListener(\"keyboardDidHide\", () => setKeyboardVisible(false));\n return () => {\n showSub.remove();\n hideSub.remove();\n };\n }, []);\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {id, severity, summary, body, position, size, sticky: severity === \"loading\", onPress};\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n // When keyboard is visible, force bottom toasts to render at top\n const top = keyboardVisible ? true : isTop(item.position);\n const align = getAlignment(item.position);\n const entering = top ? SlideInUp.duration(anim.toast.slideInDuration) : SlideInDown.duration(anim.toast.slideInDuration);\n const exiting = top ? SlideOutUp.duration(anim.toast.slideOutDuration) : SlideOutDown.duration(anim.toast.slideOutDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n ...(top\n ? {top: insets.top + 8}\n : {bottom: insets.bottom + 8}),\n },\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={FadeIn.duration(anim.toast.itemEnterDuration)}\n exiting={FadeOut.duration(anim.toast.itemExitDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["useState","useRef","useKitsTheme","useSafeAreaInsets","useEffect","Keyboard","useCallback","useImperativeHandle","jsx","View","StyleSheet","SlideInUp","anim","SlideInDown","SlideOutUp","SlideOutDown","Layout","FadeIn","FadeOut","jsxs","Pressable","ActivityIndicator","Text"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Platform, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeInUp,\n FadeInDown,\n FadeOutUp,\n FadeOutDown,\n Layout,\n useAnimatedKeyboard,\n useAnimatedStyle,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastAction,\n IToastFunction,\n IToastOptions,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n action?: IToastAction;\n offset?: number;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; actionSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, actionSize: 12, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, actionSize: 13, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, actionSize: 15, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n\n // Keyboard avoidance for BOTTOM-positioned toasts, driven on the UI thread so\n // the lift tracks the keyboard's own curve instead of snapping on a JS event.\n const keyboard = useAnimatedKeyboard();\n const keyboardOffsetStyle = useAnimatedStyle(() => {\n // Android ships `windowSoftInputMode=\"adjustResize\"`: the window (and with\n // it this absoluteFill host) is already resized to sit above the keyboard,\n // so the toast clears it for free. Adding the keyboard height here would\n // double-compensate and launch the toast into the middle of the screen.\n if (Platform.OS === \"android\") return {transform: [{translateY: 0}]};\n const h = keyboard.height.value;\n return {transform: [{translateY: h > 0 ? -(h + anim.toast.keyboardGap) : 0}]};\n });\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n options?: IToastOptions,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {\n id, severity, summary, body, position, size,\n sticky: severity === \"loading\",\n onPress,\n action: options?.action,\n offset: options?.offset,\n };\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n const top = isTop(item.position);\n const align = getAlignment(item.position);\n // One builder owns the whole entrance: FadeInUp/FadeInDown animate\n // opacity AND translateY together, direction matched to placement\n // (top toasts drop in from above, bottom toasts rise from below).\n const entering = (top ? FadeInUp : FadeInDown)\n .springify()\n .damping(anim.toast.enter.damping)\n .stiffness(anim.toast.enter.stiffness)\n .mass(anim.toast.enter.mass ?? 1);\n const exiting = (top ? FadeOutUp : FadeOutDown).duration(anim.toast.exitDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n // `offset` is consumer chrome KitsConcerto cannot see\n // (a bottom tab bar, a sticky header). It stacks ON TOP\n // of the safe-area inset; absent, the gap is unchanged.\n ...(top\n ? {top: insets.top + 8 + (item.offset ?? 0)}\n : {bottom: insets.bottom + 8 + (item.offset ?? 0)}),\n },\n // Bottom toasts lift with the keyboard; top toasts never move.\n top ? null : keyboardOffsetStyle,\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n {!!item.action && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={item.action.label}\n hitSlop={8}\n // Nested Pressable: RN hands the touch to the\n // deepest responder, so the surrounding body\n // press never double-fires (same mechanism the\n // close control has always relied on).\n onPress={() => {\n item.action?.onPress();\n removeToast(item.id);\n }}\n style={[styles.action, {borderColor: accentColor}]}\n >\n <Text style={{fontSize: s.actionSize, fontWeight: \"600\", color: accentColor}}>\n {item.action.label}\n </Text>\n </Pressable>\n )}\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;\n // the wrapper's alignItems keeps -left/-center/-right placement intact.\n width: \"100%\",\n maxWidth: 560,\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n action: {\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["useState","useRef","useKitsTheme","useSafeAreaInsets","useAnimatedKeyboard","useAnimatedStyle","Platform","anim","useCallback","useImperativeHandle","useEffect","jsx","View","StyleSheet","FadeInUp","FadeInDown","FadeOutUp","FadeOutDown","Layout","jsxs","Pressable","ActivityIndicator","Text"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useState, useRef, useEffect, useCallback, useImperativeHandle } from 'react';
3
- import { Keyboard, View, StyleSheet, Pressable, ActivityIndicator } from 'react-native';
4
- import Animated, { SlideInUp, SlideInDown, SlideOutUp, SlideOutDown, FadeOut, FadeIn, Layout } from 'react-native-reanimated';
2
+ import { useState, useRef, useCallback, useImperativeHandle, useEffect } from 'react';
3
+ import { Platform, View, StyleSheet, Pressable, ActivityIndicator } from 'react-native';
4
+ import Animated, { useAnimatedKeyboard, useAnimatedStyle, FadeInUp, FadeInDown, FadeOutUp, FadeOutDown, Layout } from 'react-native-reanimated';
5
5
  import { useSafeAreaInsets } from 'react-native-safe-area-context';
6
6
  import { overlayAnimations } from '../../../animations/index.js';
7
7
  import { useKitsTheme } from '../../../contexts/Theme/KitsThemeProvider.js';
@@ -10,24 +10,21 @@ import Text from '../../../primitives/Text/index.js';
10
10
  let toastIdCounter = 0;
11
11
  const LIFE = 3e3;
12
12
  const SIZE_CONFIG = {
13
- sm: { paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, minW: 200 },
14
- md: { paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, minW: 280 },
15
- lg: { paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, minW: 320 }
13
+ sm: { paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, actionSize: 12, minW: 200 },
14
+ md: { paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, actionSize: 13, minW: 280 },
15
+ lg: { paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, actionSize: 15, minW: 320 }
16
16
  };
17
17
  const KitsToast = ({ ref }) => {
18
18
  const [toasts, setToasts] = useState([]);
19
19
  const timersRef = useRef(/* @__PURE__ */ new Map());
20
20
  const { resolveToken } = useKitsTheme();
21
21
  const insets = useSafeAreaInsets();
22
- const [keyboardVisible, setKeyboardVisible] = useState(false);
23
- useEffect(() => {
24
- const showSub = Keyboard.addListener("keyboardDidShow", () => setKeyboardVisible(true));
25
- const hideSub = Keyboard.addListener("keyboardDidHide", () => setKeyboardVisible(false));
26
- return () => {
27
- showSub.remove();
28
- hideSub.remove();
29
- };
30
- }, []);
22
+ const keyboard = useAnimatedKeyboard();
23
+ const keyboardOffsetStyle = useAnimatedStyle(() => {
24
+ if (Platform.OS === "android") return { transform: [{ translateY: 0 }] };
25
+ const h = keyboard.height.value;
26
+ return { transform: [{ translateY: h > 0 ? -(h + overlayAnimations.toast.keyboardGap) : 0 }] };
27
+ });
31
28
  const severityColors = {
32
29
  success: resolveToken("green.500"),
33
30
  info: resolveToken("blue.500"),
@@ -47,9 +44,20 @@ const KitsToast = ({ ref }) => {
47
44
  }
48
45
  setToasts((prev) => prev.filter((t) => t.id !== id));
49
46
  }, []);
50
- const toast = useCallback((severity, summary, body = "", position = "bottom-center", isUpdate = false, size = "md", onPress) => {
47
+ const toast = useCallback((severity, summary, body = "", position = "bottom-center", isUpdate = false, size = "md", onPress, options) => {
51
48
  const id = ++toastIdCounter;
52
- const item = { id, severity, summary, body, position, size, sticky: severity === "loading", onPress };
49
+ const item = {
50
+ id,
51
+ severity,
52
+ summary,
53
+ body,
54
+ position,
55
+ size,
56
+ sticky: severity === "loading",
57
+ onPress,
58
+ action: options?.action,
59
+ offset: options?.offset
60
+ };
53
61
  setToasts((prev) => {
54
62
  if (!isUpdate) return [...prev, item];
55
63
  const lastAtPos = [...prev].reverse().find((t) => t.position === position);
@@ -98,31 +106,34 @@ const KitsToast = ({ ref }) => {
98
106
  };
99
107
  const isTop = (position) => position.startsWith("top");
100
108
  return /* @__PURE__ */ jsx(View, { style: StyleSheet.absoluteFill, pointerEvents: "box-none", children: toasts.map((item) => {
101
- const top = keyboardVisible ? true : isTop(item.position);
109
+ const top = isTop(item.position);
102
110
  const align = getAlignment(item.position);
103
- const entering = top ? SlideInUp.duration(overlayAnimations.toast.slideInDuration) : SlideInDown.duration(overlayAnimations.toast.slideInDuration);
104
- const exiting = top ? SlideOutUp.duration(overlayAnimations.toast.slideOutDuration) : SlideOutDown.duration(overlayAnimations.toast.slideOutDuration);
111
+ const entering = (top ? FadeInUp : FadeInDown).springify().damping(overlayAnimations.toast.enter.damping).stiffness(overlayAnimations.toast.enter.stiffness).mass(overlayAnimations.toast.enter.mass);
112
+ const exiting = (top ? FadeOutUp : FadeOutDown).duration(overlayAnimations.toast.exitDuration);
105
113
  const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;
106
114
  const accentColor = severityColors[item.severity] ?? severityColors.info;
107
115
  return /* @__PURE__ */ jsx(
108
116
  Animated.View,
109
117
  {
110
- entering,
111
- exiting,
112
- layout: Layout.duration(overlayAnimations.toast.layoutDuration),
113
118
  style: [
114
119
  styles.toastWrapper,
115
120
  {
116
121
  alignItems: align,
117
- ...top ? { top: insets.top + 8 } : { bottom: insets.bottom + 8 }
118
- }
122
+ // `offset` is consumer chrome KitsConcerto cannot see
123
+ // (a bottom tab bar, a sticky header). It stacks ON TOP
124
+ // of the safe-area inset; absent, the gap is unchanged.
125
+ ...top ? { top: insets.top + 8 + (item.offset ?? 0) } : { bottom: insets.bottom + 8 + (item.offset ?? 0) }
126
+ },
127
+ // Bottom toasts lift with the keyboard; top toasts never move.
128
+ top ? null : keyboardOffsetStyle
119
129
  ],
120
130
  pointerEvents: "box-none",
121
131
  children: /* @__PURE__ */ jsx(
122
132
  Animated.View,
123
133
  {
124
- entering: FadeIn.duration(overlayAnimations.toast.itemEnterDuration),
125
- exiting: FadeOut.duration(overlayAnimations.toast.itemExitDuration),
134
+ entering,
135
+ exiting,
136
+ layout: Layout.duration(overlayAnimations.toast.layoutDuration),
126
137
  style: [
127
138
  styles.toast,
128
139
  {
@@ -148,6 +159,20 @@ const KitsToast = ({ ref }) => {
148
159
  /* @__PURE__ */ jsx(Text, { style: { fontWeight: "600", fontSize: s.summarySize, color: textColor }, children: item.summary }),
149
160
  !!item.body && /* @__PURE__ */ jsx(Text, { style: { fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7 }, children: item.body })
150
161
  ] }),
162
+ !!item.action && /* @__PURE__ */ jsx(
163
+ Pressable,
164
+ {
165
+ accessibilityRole: "button",
166
+ accessibilityLabel: item.action.label,
167
+ hitSlop: 8,
168
+ onPress: () => {
169
+ item.action?.onPress();
170
+ removeToast(item.id);
171
+ },
172
+ style: [styles.action, { borderColor: accentColor }],
173
+ children: /* @__PURE__ */ jsx(Text, { style: { fontSize: s.actionSize, fontWeight: "600", color: accentColor }, children: item.action.label })
174
+ }
175
+ ),
151
176
  /* @__PURE__ */ jsx(Pressable, { onPress: () => removeToast(item.id), hitSlop: 8, children: /* @__PURE__ */ jsx(Text, { style: { fontSize: s.closeSize, fontWeight: "bold", color: textColor, opacity: 0.4 }, children: "\u2715" }) })
152
177
  ] })
153
178
  ]
@@ -169,6 +194,10 @@ const styles = StyleSheet.create({
169
194
  },
170
195
  toast: {
171
196
  flexDirection: "row",
197
+ // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;
198
+ // the wrapper's alignItems keeps -left/-center/-right placement intact.
199
+ width: "100%",
200
+ maxWidth: 560,
172
201
  borderRadius: 10,
173
202
  borderWidth: 1,
174
203
  marginBottom: 8,
@@ -180,6 +209,12 @@ const styles = StyleSheet.create({
180
209
  shadowRadius: 6
181
210
  },
182
211
  accentBar: {},
212
+ action: {
213
+ borderWidth: 1,
214
+ borderRadius: 6,
215
+ paddingHorizontal: 10,
216
+ paddingVertical: 4
217
+ },
183
218
  pressArea: {
184
219
  flex: 1,
185
220
  flexDirection: "row"
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Keyboard, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeIn,\n FadeOut,\n SlideInUp,\n SlideInDown,\n SlideOutUp,\n SlideOutDown,\n Layout,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastFunction,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n const [keyboardVisible, setKeyboardVisible] = useState(false);\n\n useEffect(() => {\n const showSub = Keyboard.addListener(\"keyboardDidShow\", () => setKeyboardVisible(true));\n const hideSub = Keyboard.addListener(\"keyboardDidHide\", () => setKeyboardVisible(false));\n return () => {\n showSub.remove();\n hideSub.remove();\n };\n }, []);\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {id, severity, summary, body, position, size, sticky: severity === \"loading\", onPress};\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n // When keyboard is visible, force bottom toasts to render at top\n const top = keyboardVisible ? true : isTop(item.position);\n const align = getAlignment(item.position);\n const entering = top ? SlideInUp.duration(anim.toast.slideInDuration) : SlideInDown.duration(anim.toast.slideInDuration);\n const exiting = top ? SlideOutUp.duration(anim.toast.slideOutDuration) : SlideOutDown.duration(anim.toast.slideOutDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n ...(top\n ? {top: insets.top + 8}\n : {bottom: insets.bottom + 8}),\n },\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={FadeIn.duration(anim.toast.itemEnterDuration)}\n exiting={FadeOut.duration(anim.toast.itemExitDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["anim"],"mappings":";;;;;;;;;AA0CA,IAAI,cAAA,GAAiB,CAAA;AACrB,MAAM,IAAA,GAAO,GAAA;AAEb,MAAM,WAAA,GAAsK;AAAA,EACxK,EAAA,EAAI,EAAC,QAAA,EAAU,CAAA,EAAG,UAAU,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,MAAM,GAAA,EAAG;AAAA,EACvG,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,UAAU,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,MAAM,GAAA,EAAG;AAAA,EACxG,EAAA,EAAI,EAAC,QAAA,EAAU,EAAA,EAAI,UAAU,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,IAAI,WAAA,EAAa,CAAA,EAAG,SAAA,EAAW,EAAA,EAAI,MAAM,GAAA;AACzG,CAAA;AAEA,MAAM,SAAA,GAAY,CAAC,EAAC,GAAA,EAAG,KAAoC;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,CAAsB,EAAE,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,MAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AAC9E,EAAA,MAAM,EAAC,YAAA,EAAY,GAAI,YAAA,EAAa;AACpC,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAE5D,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,MAAM,UAAU,QAAA,CAAS,WAAA,CAAY,mBAAmB,MAAM,kBAAA,CAAmB,IAAI,CAAC,CAAA;AACtF,IAAA,MAAM,UAAU,QAAA,CAAS,WAAA,CAAY,mBAAmB,MAAM,kBAAA,CAAmB,KAAK,CAAC,CAAA;AACvF,IAAA,OAAO,MAAM;AACT,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,OAAA,CAAQ,MAAA,EAAO;AAAA,IACnB,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAyC;AAAA,IAC3C,OAAA,EAAS,aAAa,WAAW,CAAA;AAAA,IACjC,IAAA,EAAM,aAAa,UAAU,CAAA;AAAA,IAC7B,IAAA,EAAM,aAAa,YAAY,CAAA;AAAA,IAC/B,KAAA,EAAO,aAAa,SAAS,CAAA;AAAA,IAC7B,OAAA,EAAS,aAAa,UAAU,CAAA;AAAA,IAChC,KAAA,EAAO,aAAa,SAAS;AAAA,GACjC;AAEA,EAAA,MAAM,YAAA,GAAe,aAAa,cAAc,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,aAAa,QAAQ,CAAA;AAEzC,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,EAAA,KAAe;AAC5C,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACtC,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC/B;AACA,IAAA,SAAA,CAAU,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACnD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAwB,WAAA,CAAY,CACtC,QAAA,EACA,OAAA,EACA,IAAA,GAAe,EAAA,EACf,QAAA,GAA0B,eAAA,EAC1B,QAAA,GAAoB,KAAA,EACpB,IAAA,GAAkB,MAClB,OAAA,KACC;AACD,IAAA,MAAM,KAAK,EAAE,cAAA;AACb,IAAA,MAAM,IAAA,GAAkB,EAAC,EAAA,EAAI,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,QAAA,KAAa,SAAA,EAAW,OAAA,EAAO;AAI7G,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AACd,MAAA,IAAI,CAAC,QAAA,EAAU,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;AACpC,MAAA,MAAM,SAAA,GAAY,CAAC,GAAG,IAAI,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA;AACvE,MAAA,IAAI,CAAC,SAAA,EAAW,OAAO,CAAC,GAAG,MAAM,IAAI,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,UAAU,EAAE,CAAA;AAChD,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,IAAA,CAAK,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,SAAA,CAAU,EAAA,GAAK,OAAO,CAAE,CAAA;AAAA,IAC3D,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAA,CAAY,EAAE,GAAG,IAAI,CAAA;AACpD,MAAA,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAAA,IACnC;AAAA,EACJ,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,QAAA,KAA6B;AACtD,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AACd,MAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,GAAI,IAAA;AACxE,MAAA,QAAA,CAAS,QAAQ,CAAA,CAAA,KAAK;AAClB,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,EAAE,CAAA;AACxC,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QACjC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,OAAO,QAAA,GAAW,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAA,KAAa,QAAQ,IAAI,EAAC;AAAA,IACnE,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACjC,IAAA,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAC9C,IAAA,SAAA,CAAU,QAAQ,KAAA,EAAM;AACxB,IAAA,SAAA,CAAU,EAAE,CAAA;AAAA,EAChB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,mBAAA,CAAoB,KAAK,OAAO,EAAC,KAAA,EAAO,OAAA,EAAS,YAAU,CAAE,CAAA;AAE7D,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAkE;AACpF,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,YAAA;AACvC,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,UAAA;AACxC,IAAA,OAAO,QAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,KAA4B,QAAA,CAAS,WAAW,KAAK,CAAA;AAEpE,EAAA,uBACI,GAAA,CAAC,QAAK,KAAA,EAAO,UAAA,CAAW,cAAc,aAAA,EAAc,UAAA,EAC/C,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAA,IAAA,KAAQ;AAEhB,IAAA,MAAM,GAAA,GAAM,eAAA,GAAkB,IAAA,GAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,GAAA,GAAM,SAAA,CAAU,QAAA,CAASA,iBAAA,CAAK,KAAA,CAAM,eAAe,CAAA,GAAI,WAAA,CAAY,QAAA,CAASA,iBAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AACvH,IAAA,MAAM,OAAA,GAAU,GAAA,GAAM,UAAA,CAAW,QAAA,CAASA,iBAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,GAAI,YAAA,CAAa,QAAA,CAASA,iBAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAC1H,IAAA,MAAM,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,IAAI,KAAK,WAAA,CAAY,EAAA;AAChD,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,QAAQ,KAAK,cAAA,CAAe,IAAA;AAEpE,IAAA,uBACI,GAAA;AAAA,MAAC,QAAA,CAAS,IAAA;AAAA,MAAT;AAAA,QAEG,QAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,MAAA,CAAO,QAAA,CAASA,iBAAA,CAAK,MAAM,cAAc,CAAA;AAAA,QACjD,KAAA,EAAO;AAAA,UACH,MAAA,CAAO,YAAA;AAAA,UACP;AAAA,YACI,UAAA,EAAY,KAAA;AAAA,YACZ,GAAI,GAAA,GACE,EAAC,GAAA,EAAK,MAAA,CAAO,GAAA,GAAM,CAAA,EAAC,GACpB,EAAC,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA;AAAC;AACpC,SACJ;AAAA,QACA,aAAA,EAAc,UAAA;AAAA,QAEd,QAAA,kBAAA,GAAA;AAAA,UAAC,QAAA,CAAS,IAAA;AAAA,UAAT;AAAA,YACG,QAAA,EAAU,MAAA,CAAO,QAAA,CAASA,iBAAA,CAAK,MAAM,iBAAiB,CAAA;AAAA,YACtD,OAAA,EAAS,OAAA,CAAQ,QAAA,CAASA,iBAAA,CAAK,MAAM,gBAAgB,CAAA;AAAA,YACrD,KAAA,EAAO;AAAA,cACH,MAAA,CAAO,KAAA;AAAA,cACP;AAAA,gBACI,eAAA,EAAiB,YAAA;AAAA,gBACjB,WAAA;AAAA,gBACA,UAAU,CAAA,CAAE;AAAA;AAChB,aACJ;AAAA,YAEA,QAAA,kBAAA,IAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACG,OAAO,MAAA,CAAO,SAAA;AAAA,gBACd,QAAA,EAAU,CAAC,IAAA,CAAK,OAAA;AAAA,gBAChB,SAAS,MAAM;AACX,kBAAA,IAAA,CAAK,OAAA,IAAU;AACf,kBAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,gBACvB,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,SAAA,EAAW,EAAC,eAAA,EAAiB,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,WAAA,EAAY,CAAA,EAAE,CAAA;AAAA,uCACrF,IAAA,EAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,OAAA,EAAS,EAAC,eAAA,EAAiB,CAAA,CAAE,QAAA,EAAU,iBAAA,EAAmB,EAAE,QAAA,EAAU,GAAA,EAAK,EAAE,QAAA,GAAW,GAAA,EAAI,CAAA,EAC5G,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAK,aAAa,SAAA,oBACf,GAAA,CAAC,qBAAkB,IAAA,EAAK,OAAA,EAAQ,OAAO,WAAA,EAAY,CAAA;AAAA,oCAEvD,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,aAAA,EAChB,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,EAAC,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,CAAA,CAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAS,EACrE,QAAA,EAAA,IAAA,CAAK,OAAA,EACV,CAAA;AAAA,sBACC,CAAC,CAAC,IAAA,CAAK,wBACJ,GAAA,CAAC,IAAA,EAAA,EAAK,OAAO,EAAC,QAAA,EAAU,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,KAAA,EAAO,SAAA,EAAW,SAAS,GAAA,EAAG,EAC3E,eAAK,IAAA,EACV;AAAA,qBAAA,EAER,CAAA;AAAA,oCACA,GAAA,CAAC,SAAA,EAAA,EAAU,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EACrD,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAO,EAAC,QAAA,EAAU,CAAA,CAAE,SAAA,EAAW,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,GAAA,EAAG,EAAG,QAAA,EAAA,QAAA,EAE1F,CAAA,EACJ;AAAA,mBAAA,EACJ;AAAA;AAAA;AAAA;AACJ;AAAA;AACJ,OAAA;AAAA,MAzDK,IAAA,CAAK;AAAA,KA0Dd;AAAA,EAER,CAAC,CAAA,EACL,CAAA;AAER;AAEA,MAAM,MAAA,GAAS,WAAW,MAAA,CAAO;AAAA,EAC7B,YAAA,EAAc;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACH,aAAA,EAAe,KAAA;AAAA,IACf,YAAA,EAAc,EAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IACX,WAAA,EAAa,MAAA;AAAA,IACb,YAAA,EAAc,EAAC,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAC;AAAA,IAClC,aAAA,EAAe,IAAA;AAAA,IACf,YAAA,EAAc;AAAA,GAClB;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,SAAA,EAAW;AAAA,IACP,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe;AAAA,GACnB;AAAA,EACA,OAAA,EAAS;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY;AAAA,GAChB;AAAA,EACA,aAAA,EAAe;AAAA,IACX,IAAA,EAAM;AAAA;AAEd,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/components/overlay/Toast/index.native.tsx"],"sourcesContent":["import React, {\n type Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport {Platform, Pressable, StyleSheet, ActivityIndicator, View} from \"react-native\";\nimport Animated, {\n FadeInUp,\n FadeInDown,\n FadeOutUp,\n FadeOutDown,\n Layout,\n useAnimatedKeyboard,\n useAnimatedStyle,\n} from \"react-native-reanimated\";\nimport {useSafeAreaInsets} from \"react-native-safe-area-context\";\nimport {Text} from \"../../../_compat\";\nimport type {\n IKitsToastRef,\n IToastAction,\n IToastFunction,\n IToastOptions,\n IToastParams,\n ToastPosition,\n ToastSeverity,\n ToastSize,\n} from \"@lmb-it/kitsconcerto-types\";\nimport {useKitsTheme} from \"../../../contexts/Theme\";\nimport {overlayAnimations as anim} from \"../../../animations\";\n\ninterface ToastItem {\n id: number;\n severity: ToastSeverity;\n summary: string;\n body?: string;\n position: ToastPosition;\n size: ToastSize;\n sticky?: boolean;\n onPress?: () => void;\n action?: IToastAction;\n offset?: number;\n}\n\nlet toastIdCounter = 0;\nconst LIFE = 3000;\n\nconst SIZE_CONFIG: Record<ToastSize, { paddingV: number; paddingH: number; summarySize: number; bodySize: number; accentWidth: number; closeSize: number; actionSize: number; minW: number }> = {\n sm: {paddingV: 8, paddingH: 10, summarySize: 12, bodySize: 10, accentWidth: 3, closeSize: 14, actionSize: 12, minW: 200},\n md: {paddingV: 12, paddingH: 14, summarySize: 14, bodySize: 12, accentWidth: 4, closeSize: 16, actionSize: 13, minW: 280},\n lg: {paddingV: 16, paddingH: 18, summarySize: 16, bodySize: 14, accentWidth: 5, closeSize: 18, actionSize: 15, minW: 320},\n};\n\nconst KitsToast = ({ref}: { ref?: Ref<IKitsToastRef> }) => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const timersRef = useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n const {resolveToken} = useKitsTheme();\n const insets = useSafeAreaInsets();\n\n // Keyboard avoidance for BOTTOM-positioned toasts, driven on the UI thread so\n // the lift tracks the keyboard's own curve instead of snapping on a JS event.\n const keyboard = useAnimatedKeyboard();\n const keyboardOffsetStyle = useAnimatedStyle(() => {\n // Android ships `windowSoftInputMode=\"adjustResize\"`: the window (and with\n // it this absoluteFill host) is already resized to sit above the keyboard,\n // so the toast clears it for free. Adding the keyboard height here would\n // double-compensate and launch the toast into the middle of the screen.\n if (Platform.OS === \"android\") return {transform: [{translateY: 0}]};\n const h = keyboard.height.value;\n return {transform: [{translateY: h > 0 ? -(h + anim.toast.keyboardGap) : 0}]};\n });\n\n const severityColors: Record<string, string> = {\n success: resolveToken('green.500'),\n info: resolveToken('blue.500'),\n warn: resolveToken('yellow.500'),\n error: resolveToken('red.500'),\n loading: resolveToken('blue.500'),\n brand: resolveToken('primary'),\n };\n\n const surfaceColor = resolveToken('surface-card');\n const textColor = resolveToken('text');\n const borderColor = resolveToken('border');\n\n const removeToast = useCallback((id: number) => {\n const timer = timersRef.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(id);\n }\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n const toast: IToastFunction = useCallback((\n severity: ToastSeverity,\n summary: string,\n body: string = \"\",\n position: ToastPosition = \"bottom-center\",\n isUpdate: boolean = false,\n size: ToastSize = \"md\",\n onPress?: () => void,\n options?: IToastOptions,\n ) => {\n const id = ++toastIdCounter;\n const item: ToastItem = {\n id, severity, summary, body, position, size,\n sticky: severity === \"loading\",\n onPress,\n action: options?.action,\n offset: options?.offset,\n };\n\n // isUpdate mirrors web's toastRef.replace: swap the most recent toast\n // at this position instead of stacking a new one.\n setToasts(prev => {\n if (!isUpdate) return [...prev, item];\n const lastAtPos = [...prev].reverse().find(t => t.position === position);\n if (!lastAtPos) return [...prev, item];\n const timer = timersRef.current.get(lastAtPos.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(lastAtPos.id);\n }\n return prev.map(t => (t.id === lastAtPos.id ? item : t));\n });\n\n if (!item.sticky) {\n const timer = setTimeout(() => removeToast(id), LIFE);\n timersRef.current.set(id, timer);\n }\n }, [removeToast]) as IToastFunction;\n\n const dismiss = useCallback((position?: ToastPosition) => {\n setToasts(prev => {\n const toRemove = position ? prev.filter(t => t.position === position) : prev;\n toRemove.forEach(t => {\n const timer = timersRef.current.get(t.id);\n if (timer) {\n clearTimeout(timer);\n timersRef.current.delete(t.id);\n }\n });\n return position ? prev.filter(t => t.position !== position) : [];\n });\n }, []);\n\n const dismissAll = useCallback(() => {\n timersRef.current.forEach(t => clearTimeout(t));\n timersRef.current.clear();\n setToasts([]);\n }, []);\n\n useImperativeHandle(ref, () => ({toast, dismiss, dismissAll}));\n\n useEffect(() => {\n return () => {\n timersRef.current.forEach(t => clearTimeout(t));\n };\n }, []);\n\n if (toasts.length === 0) return null;\n\n const getAlignment = (position: ToastPosition): 'flex-start' | 'center' | 'flex-end' => {\n if (position.endsWith('-left')) return 'flex-start';\n if (position.endsWith('-right')) return 'flex-end';\n return 'center';\n };\n\n const isTop = (position: ToastPosition) => position.startsWith('top');\n\n return (\n <View style={StyleSheet.absoluteFill} pointerEvents=\"box-none\">\n {toasts.map(item => {\n const top = isTop(item.position);\n const align = getAlignment(item.position);\n // One builder owns the whole entrance: FadeInUp/FadeInDown animate\n // opacity AND translateY together, direction matched to placement\n // (top toasts drop in from above, bottom toasts rise from below).\n const entering = (top ? FadeInUp : FadeInDown)\n .springify()\n .damping(anim.toast.enter.damping)\n .stiffness(anim.toast.enter.stiffness)\n .mass(anim.toast.enter.mass ?? 1);\n const exiting = (top ? FadeOutUp : FadeOutDown).duration(anim.toast.exitDuration);\n const s = SIZE_CONFIG[item.size] ?? SIZE_CONFIG.md;\n const accentColor = severityColors[item.severity] ?? severityColors.info;\n\n return (\n <Animated.View\n key={item.id}\n style={[\n styles.toastWrapper,\n {\n alignItems: align,\n // `offset` is consumer chrome KitsConcerto cannot see\n // (a bottom tab bar, a sticky header). It stacks ON TOP\n // of the safe-area inset; absent, the gap is unchanged.\n ...(top\n ? {top: insets.top + 8 + (item.offset ?? 0)}\n : {bottom: insets.bottom + 8 + (item.offset ?? 0)}),\n },\n // Bottom toasts lift with the keyboard; top toasts never move.\n top ? null : keyboardOffsetStyle,\n ]}\n pointerEvents=\"box-none\"\n >\n <Animated.View\n entering={entering}\n exiting={exiting}\n layout={Layout.duration(anim.toast.layoutDuration)}\n style={[\n styles.toast,\n {\n backgroundColor: surfaceColor,\n borderColor,\n minWidth: s.minW,\n },\n ]}\n >\n <Pressable\n style={styles.pressArea}\n disabled={!item.onPress}\n onPress={() => {\n item.onPress?.();\n removeToast(item.id);\n }}\n >\n <View style={[styles.accentBar, {backgroundColor: accentColor, width: s.accentWidth}]}/>\n <View style={[styles.content, {paddingVertical: s.paddingV, paddingHorizontal: s.paddingH, gap: s.paddingH * 0.7}]}>\n {item.severity === \"loading\" && (\n <ActivityIndicator size=\"small\" color={accentColor}/>\n )}\n <View style={styles.textContainer}>\n <Text style={{fontWeight: \"600\", fontSize: s.summarySize, color: textColor}}>\n {item.summary}\n </Text>\n {!!item.body && (\n <Text style={{fontSize: s.bodySize, marginTop: 2, color: textColor, opacity: 0.7}}>\n {item.body}\n </Text>\n )}\n </View>\n {!!item.action && (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={item.action.label}\n hitSlop={8}\n // Nested Pressable: RN hands the touch to the\n // deepest responder, so the surrounding body\n // press never double-fires (same mechanism the\n // close control has always relied on).\n onPress={() => {\n item.action?.onPress();\n removeToast(item.id);\n }}\n style={[styles.action, {borderColor: accentColor}]}\n >\n <Text style={{fontSize: s.actionSize, fontWeight: \"600\", color: accentColor}}>\n {item.action.label}\n </Text>\n </Pressable>\n )}\n <Pressable onPress={() => removeToast(item.id)} hitSlop={8}>\n <Text style={{fontSize: s.closeSize, fontWeight: \"bold\", color: textColor, opacity: 0.4}}>\n ✕\n </Text>\n </Pressable>\n </View>\n </Pressable>\n </Animated.View>\n </Animated.View>\n );\n })}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n toastWrapper: {\n position: \"absolute\",\n left: 16,\n right: 16,\n zIndex: 9999,\n },\n toast: {\n flexDirection: \"row\",\n // Fill the wrapper (already inset 16pt each side) but never exceed 560pt;\n // the wrapper's alignItems keeps -left/-center/-right placement intact.\n width: \"100%\",\n maxWidth: 560,\n borderRadius: 10,\n borderWidth: 1,\n marginBottom: 8,\n overflow: \"hidden\",\n elevation: 6,\n shadowColor: \"#000\",\n shadowOffset: {width: 0, height: 3},\n shadowOpacity: 0.15,\n shadowRadius: 6,\n },\n accentBar: {},\n action: {\n borderWidth: 1,\n borderRadius: 6,\n paddingHorizontal: 10,\n paddingVertical: 4,\n },\n pressArea: {\n flex: 1,\n flexDirection: \"row\",\n },\n content: {\n flex: 1,\n flexDirection: \"row\",\n alignItems: \"center\",\n },\n textContainer: {\n flex: 1,\n },\n});\n\nexport default KitsToast;\n"],"names":["anim"],"mappings":"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"}