@lmb-it/kitsconcerto-native 0.1.242 → 0.1.244

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 (286) 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 +48 -6
  62. package/components/Tabs/index.cjs.map +1 -1
  63. package/components/Tabs/index.js +48 -6
  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 +19 -18
  74. package/components/overlay/Toast/index.cjs.map +1 -1
  75. package/components/overlay/Toast/index.js +22 -21
  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 +51 -1
  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/defaultTheme.cjs +1 -1
  244. package/packages/types/src/Theme/defaultTheme.cjs.map +1 -1
  245. package/packages/types/src/Theme/defaultTheme.js +1 -1
  246. package/packages/types/src/Theme/defaultTheme.js.map +1 -1
  247. package/packages/types/src/Theme/resolvers.cjs +6 -0
  248. package/packages/types/src/Theme/resolvers.cjs.map +1 -1
  249. package/packages/types/src/Theme/resolvers.js +6 -0
  250. package/packages/types/src/Theme/resolvers.js.map +1 -1
  251. package/primitives/Box/index.cjs +2 -0
  252. package/primitives/Box/index.cjs.map +1 -1
  253. package/primitives/Box/index.js +2 -0
  254. package/primitives/Box/index.js.map +1 -1
  255. package/primitives/Card/index.cjs +2 -0
  256. package/primitives/Card/index.cjs.map +1 -1
  257. package/primitives/Card/index.js +2 -0
  258. package/primitives/Card/index.js.map +1 -1
  259. package/primitives/Divider/index.cjs +2 -0
  260. package/primitives/Divider/index.cjs.map +1 -1
  261. package/primitives/Divider/index.js +2 -0
  262. package/primitives/Divider/index.js.map +1 -1
  263. package/primitives/Heading/index.cjs +2 -0
  264. package/primitives/Heading/index.cjs.map +1 -1
  265. package/primitives/Heading/index.js +2 -0
  266. package/primitives/Heading/index.js.map +1 -1
  267. package/primitives/Icon/index.cjs +1 -0
  268. package/primitives/Icon/index.cjs.map +1 -1
  269. package/primitives/Icon/index.js +1 -0
  270. package/primitives/Icon/index.js.map +1 -1
  271. package/primitives/Image/index.cjs +2 -0
  272. package/primitives/Image/index.cjs.map +1 -1
  273. package/primitives/Image/index.js +2 -0
  274. package/primitives/Image/index.js.map +1 -1
  275. package/primitives/Skeleton/index.cjs +2 -0
  276. package/primitives/Skeleton/index.cjs.map +1 -1
  277. package/primitives/Skeleton/index.js +2 -0
  278. package/primitives/Skeleton/index.js.map +1 -1
  279. package/primitives/Svg/index.cjs +2 -0
  280. package/primitives/Svg/index.cjs.map +1 -1
  281. package/primitives/Svg/index.js +2 -0
  282. package/primitives/Svg/index.js.map +1 -1
  283. package/primitives/Text/index.cjs +2 -0
  284. package/primitives/Text/index.cjs.map +1 -1
  285. package/primitives/Text/index.js +2 -0
  286. package/primitives/Text/index.js.map +1 -1
@@ -57,6 +57,8 @@ import 'yup';
57
57
  import '../../packages/types/src/Css/map/index.js';
58
58
  import '../../packages/types/src/Theme/shadows.js';
59
59
  import '../../packages/types/src/Theme/defaultTheme.js';
60
+ import '../../packages/types/src/Theme/alphaColors.js';
61
+ import '../../apps/mobile/src/Factory/helpers/cssVarMap.js';
60
62
  import '../../apps/mobile/src/Factory/DimensionsContext.js';
61
63
  import 'i18next';
62
64
  import 'react-i18next';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/SkeletonText/index.native.tsx"],"sourcesContent":["import React from 'react';\nimport {SkeletonText as GSkeletonText} from '@lmb-it/kitsconcertomobile';\nimport type {ISkeletonText} from \"@lmb-it/kitsconcerto-types\";\n\nconst Skeleton: React.FC<ISkeletonText> = ({\n lines = 3,\n gap = 1,\n startColor,\n isLoaded,\n speed,\n animation,\n ...props\n }) => {\n\n return (\n <GSkeletonText\n _lines={lines}\n gap={gap}\n startColor={startColor ?? 'bg-background-200'}\n speed={speed}\n isLoaded={isLoaded}\n className=\"h-3\"\n />\n );\n};\n\nexport default Skeleton;\n"],"names":["GSkeletonText"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,WAAoC,CAAC;AAAA,EACI,KAAA,GAAQ,CAAA;AAAA,EACR,GAAA,GAAM,CAAA;AAAA,EACN,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACP,CAAA,KAAM;AAE7C,EAAA,uBACI,GAAA;AAAA,IAACA,YAAA;AAAA,IAAA;AAAA,MACG,MAAA,EAAQ,KAAA;AAAA,MACR,GAAA;AAAA,MACA,YAAY,UAAA,IAAc,mBAAA;AAAA,MAC1B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAU;AAAA;AAAA,GACd;AAER;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/SkeletonText/index.native.tsx"],"sourcesContent":["import React from 'react';\nimport {SkeletonText as GSkeletonText} from '@lmb-it/kitsconcertomobile';\nimport type {ISkeletonText} from \"@lmb-it/kitsconcerto-types\";\n\nconst Skeleton: React.FC<ISkeletonText> = ({\n lines = 3,\n gap = 1,\n startColor,\n isLoaded,\n speed,\n animation,\n ...props\n }) => {\n\n return (\n <GSkeletonText\n _lines={lines}\n gap={gap}\n startColor={startColor ?? 'bg-background-200'}\n speed={speed}\n isLoaded={isLoaded}\n className=\"h-3\"\n />\n );\n};\n\nexport default Skeleton;\n"],"names":["GSkeletonText"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,WAAoC,CAAC;AAAA,EACI,KAAA,GAAQ,CAAA;AAAA,EACR,GAAA,GAAM,CAAA;AAAA,EACN,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACP,CAAA,KAAM;AAE7C,EAAA,uBACI,GAAA;AAAA,IAACA,YAAA;AAAA,IAAA;AAAA,MACG,MAAA,EAAQ,KAAA;AAAA,MACR,GAAA;AAAA,MACA,YAAY,UAAA,IAAc,mBAAA;AAAA,MAC1B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAU;AAAA;AAAA,GACd;AAER;;;;"}
@@ -61,6 +61,8 @@ require('yup');
61
61
  require('../../packages/types/src/Css/map/index.cjs');
62
62
  require('../../packages/types/src/Theme/shadows.cjs');
63
63
  require('../../packages/types/src/Theme/defaultTheme.cjs');
64
+ require('../../packages/types/src/Theme/alphaColors.cjs');
65
+ require('../../apps/mobile/src/Factory/helpers/cssVarMap.cjs');
64
66
  require('i18next');
65
67
  require('react-i18next');
66
68
  require('../../apps/mobile/src/Core/AutoComplete/index.cjs');
@@ -93,14 +95,39 @@ const SIZE = {
93
95
  };
94
96
  function Tabs(rawProps) {
95
97
  const props = useComponentDefaults.default("Tabs", rawProps).mergedProps;
96
- const { items, value, onChange, size = "md", activeColor = "brand", scrollable = true, gap = 8, testID } = props;
98
+ const {
99
+ items,
100
+ value,
101
+ onChange,
102
+ size = "md",
103
+ activeColor = "brand",
104
+ scrollable = true,
105
+ gap = 8,
106
+ testID,
107
+ countVariant = "suffix",
108
+ activeBadgeBackground = "surface-card",
109
+ activeBadgeTextColor = "text-primary",
110
+ inactiveBadgeBackground = "gray.200",
111
+ inactiveBadgeTextColor = "text-secondary",
112
+ inactiveBackground = "gray.100",
113
+ inactiveTextColor = "text-secondary",
114
+ sizeHeights
115
+ } = props;
97
116
  const cfg = SIZE[size] ?? SIZE.md;
117
+ const heights = { sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights };
118
+ const height = heights[size] ?? heights.md;
98
119
  const activeBg = style.resolveThemeTokenForNative(activeColor);
99
- const inactiveBg = style.resolveThemeTokenForNative("gray.100");
100
- const inactiveText = style.resolveThemeTokenForNative("text-secondary");
120
+ const inactiveBg = style.resolveThemeTokenForNative(inactiveBackground);
121
+ const inactiveText = style.resolveThemeTokenForNative(inactiveTextColor);
122
+ const badge = countVariant === "badge";
123
+ const activeBadgeBg = style.resolveThemeTokenForNative(activeBadgeBackground);
124
+ const activeBadgeFg = style.resolveThemeTokenForNative(activeBadgeTextColor);
125
+ const inactiveBadgeBg = style.resolveThemeTokenForNative(inactiveBadgeBackground);
126
+ const inactiveBadgeFg = style.resolveThemeTokenForNative(inactiveBadgeTextColor);
127
+ const badgeH = cfg.fs + 7;
101
128
  const renderChip = (item) => {
102
129
  const active = item.key === value;
103
- const label = item.count != null ? `${item.label} ${item.count}` : item.label;
130
+ const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;
104
131
  const fg = active ? "#FFFFFF" : inactiveText;
105
132
  return /* @__PURE__ */ jsxRuntime.jsxs(
106
133
  reactNative.TouchableOpacity,
@@ -111,7 +138,7 @@ function Tabs(rawProps) {
111
138
  accessibilityRole: "button",
112
139
  accessibilityState: { selected: active },
113
140
  style: {
114
- height: cfg.h,
141
+ height,
115
142
  borderRadius: 999,
116
143
  paddingHorizontal: cfg.px,
117
144
  flexDirection: "row",
@@ -123,7 +150,22 @@ function Tabs(rawProps) {
123
150
  },
124
151
  children: [
125
152
  item.icon != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.Icon, { name: item.icon, size: cfg.fs + 1, color: fg }),
126
- /* @__PURE__ */ jsxRuntime.jsx(index_native$1.default, { fontSize: cfg.fs, fontWeight: "600", color: fg, children: label })
153
+ /* @__PURE__ */ jsxRuntime.jsx(index_native$1.default, { fontSize: cfg.fs, fontWeight: "600", color: fg, children: label }),
154
+ badge && item.count != null && /* @__PURE__ */ jsxRuntime.jsx(
155
+ reactNative.View,
156
+ {
157
+ style: {
158
+ height: badgeH,
159
+ minWidth: badgeH,
160
+ borderRadius: 999,
161
+ paddingHorizontal: 6,
162
+ alignItems: "center",
163
+ justifyContent: "center",
164
+ backgroundColor: active ? activeBadgeBg : inactiveBadgeBg
165
+ },
166
+ children: /* @__PURE__ */ jsxRuntime.jsx(index_native$1.default, { fontSize: cfg.fs - 2, fontWeight: "600", color: active ? activeBadgeFg : inactiveBadgeFg, children: item.count })
167
+ }
168
+ )
127
169
  ]
128
170
  },
129
171
  item.key
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID} = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(\"gray.100\");\n const inactiveText = resolveThemeTokenForNative(\"text-secondary\");\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height: cfg.h,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","jsxs","TouchableOpacity","jsx","Icon","Text","View","ScrollView"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":["useComponentDefaults","resolveThemeTokenForNative","jsxs","TouchableOpacity","jsx","Icon","Text","View","ScrollView"],"mappings":"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"}
@@ -59,6 +59,8 @@ import 'yup';
59
59
  import '../../packages/types/src/Css/map/index.js';
60
60
  import '../../packages/types/src/Theme/shadows.js';
61
61
  import '../../packages/types/src/Theme/defaultTheme.js';
62
+ import '../../packages/types/src/Theme/alphaColors.js';
63
+ import '../../apps/mobile/src/Factory/helpers/cssVarMap.js';
62
64
  import 'i18next';
63
65
  import 'react-i18next';
64
66
  import '../../apps/mobile/src/Core/AutoComplete/index.js';
@@ -91,14 +93,39 @@ const SIZE = {
91
93
  };
92
94
  function Tabs(rawProps) {
93
95
  const props = useComponentDefaults("Tabs", rawProps).mergedProps;
94
- const { items, value, onChange, size = "md", activeColor = "brand", scrollable = true, gap = 8, testID } = props;
96
+ const {
97
+ items,
98
+ value,
99
+ onChange,
100
+ size = "md",
101
+ activeColor = "brand",
102
+ scrollable = true,
103
+ gap = 8,
104
+ testID,
105
+ countVariant = "suffix",
106
+ activeBadgeBackground = "surface-card",
107
+ activeBadgeTextColor = "text-primary",
108
+ inactiveBadgeBackground = "gray.200",
109
+ inactiveBadgeTextColor = "text-secondary",
110
+ inactiveBackground = "gray.100",
111
+ inactiveTextColor = "text-secondary",
112
+ sizeHeights
113
+ } = props;
95
114
  const cfg = SIZE[size] ?? SIZE.md;
115
+ const heights = { sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights };
116
+ const height = heights[size] ?? heights.md;
96
117
  const activeBg = resolveThemeTokenForNative(activeColor);
97
- const inactiveBg = resolveThemeTokenForNative("gray.100");
98
- const inactiveText = resolveThemeTokenForNative("text-secondary");
118
+ const inactiveBg = resolveThemeTokenForNative(inactiveBackground);
119
+ const inactiveText = resolveThemeTokenForNative(inactiveTextColor);
120
+ const badge = countVariant === "badge";
121
+ const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);
122
+ const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);
123
+ const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);
124
+ const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);
125
+ const badgeH = cfg.fs + 7;
99
126
  const renderChip = (item) => {
100
127
  const active = item.key === value;
101
- const label = item.count != null ? `${item.label} ${item.count}` : item.label;
128
+ const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;
102
129
  const fg = active ? "#FFFFFF" : inactiveText;
103
130
  return /* @__PURE__ */ jsxs(
104
131
  TouchableOpacity,
@@ -109,7 +136,7 @@ function Tabs(rawProps) {
109
136
  accessibilityRole: "button",
110
137
  accessibilityState: { selected: active },
111
138
  style: {
112
- height: cfg.h,
139
+ height,
113
140
  borderRadius: 999,
114
141
  paddingHorizontal: cfg.px,
115
142
  flexDirection: "row",
@@ -121,7 +148,22 @@ function Tabs(rawProps) {
121
148
  },
122
149
  children: [
123
150
  item.icon != null && /* @__PURE__ */ jsx(Icon, { name: item.icon, size: cfg.fs + 1, color: fg }),
124
- /* @__PURE__ */ jsx(Text, { fontSize: cfg.fs, fontWeight: "600", color: fg, children: label })
151
+ /* @__PURE__ */ jsx(Text, { fontSize: cfg.fs, fontWeight: "600", color: fg, children: label }),
152
+ badge && item.count != null && /* @__PURE__ */ jsx(
153
+ View,
154
+ {
155
+ style: {
156
+ height: badgeH,
157
+ minWidth: badgeH,
158
+ borderRadius: 999,
159
+ paddingHorizontal: 6,
160
+ alignItems: "center",
161
+ justifyContent: "center",
162
+ backgroundColor: active ? activeBadgeBg : inactiveBadgeBg
163
+ },
164
+ children: /* @__PURE__ */ jsx(Text, { fontSize: cfg.fs - 2, fontWeight: "600", color: active ? activeBadgeFg : inactiveBadgeFg, children: item.count })
165
+ }
166
+ )
125
167
  ]
126
168
  },
127
169
  item.key
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID} = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(\"gray.100\");\n const inactiveText = resolveThemeTokenForNative(\"text-secondary\");\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height: cfg.h,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/components/Tabs/index.native.tsx"],"sourcesContent":["import React from \"react\";\nimport {ScrollView, TouchableOpacity, View} from \"react-native\";\nimport {resolveThemeTokenForNative} from \"@lmb-it/kitsconcertomobile\";\nimport type {ITabsProps, ITabItem} from \"@lmb-it/kitsconcerto-types\";\nimport {Text, Icon} from \"../../primitives\";\nimport {useComponentDefaults} from \"../../hooks\";\n\n// Mirrors the app's FilterChips (App/src/components/shared/FilterChips).\nconst SIZE = {\n sm: {h: 28, px: 12, fs: 12},\n md: {h: 32, px: 14, fs: 13},\n lg: {h: 40, px: 18, fs: 15},\n} as const;\n\n/**\n * Tabs (native) — horizontally-scrollable selectable filter row.\n *\n * Built like the app's working `FilterChips`: a RN horizontal `ScrollView` of\n * `TouchableOpacity` pills + the library `Text`. Active = filled `activeColor`;\n * inactive = neutral tint. Colours resolve via the standalone token resolver.\n */\nexport function Tabs<K extends string = string>(rawProps: ITabsProps<K>) {\n const props = useComponentDefaults<ITabsProps<K>>(\"Tabs\", rawProps).mergedProps;\n const {\n items, value, onChange, size = \"md\", activeColor = \"brand\", scrollable = true, gap = 8, testID,\n countVariant = \"suffix\",\n activeBadgeBackground = \"surface-card\",\n activeBadgeTextColor = \"text-primary\",\n inactiveBadgeBackground = \"gray.200\",\n inactiveBadgeTextColor = \"text-secondary\",\n inactiveBackground = \"gray.100\",\n inactiveTextColor = \"text-secondary\",\n sizeHeights,\n } = props;\n\n const cfg = SIZE[size] ?? SIZE.md;\n const heights = {sm: SIZE.sm.h, md: SIZE.md.h, lg: SIZE.lg.h, ...sizeHeights};\n const height = heights[size] ?? heights.md;\n const activeBg = resolveThemeTokenForNative(activeColor);\n const inactiveBg = resolveThemeTokenForNative(inactiveBackground);\n const inactiveText = resolveThemeTokenForNative(inactiveTextColor);\n const badge = countVariant === \"badge\";\n const activeBadgeBg = resolveThemeTokenForNative(activeBadgeBackground);\n const activeBadgeFg = resolveThemeTokenForNative(activeBadgeTextColor);\n const inactiveBadgeBg = resolveThemeTokenForNative(inactiveBadgeBackground);\n const inactiveBadgeFg = resolveThemeTokenForNative(inactiveBadgeTextColor);\n const badgeH = cfg.fs + 7;\n\n const renderChip = (item: ITabItem<K>) => {\n const active = item.key === value;\n const label = !badge && item.count != null ? `${item.label} ${item.count}` : item.label;\n const fg = active ? \"#FFFFFF\" : inactiveText;\n return (\n <TouchableOpacity\n key={item.key}\n activeOpacity={0.75}\n disabled={item.disabled}\n onPress={() => onChange(item.key)}\n accessibilityRole=\"button\"\n accessibilityState={{selected: active}}\n style={{\n height,\n borderRadius: 999,\n paddingHorizontal: cfg.px,\n flexDirection: \"row\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n backgroundColor: active ? activeBg : inactiveBg,\n opacity: item.disabled ? 0.5 : 1,\n }}\n >\n {item.icon != null && <Icon name={item.icon as never} size={cfg.fs + 1} color={fg} />}\n <Text fontSize={cfg.fs} fontWeight=\"600\" color={fg}>\n {label}\n </Text>\n {badge && item.count != null && (\n <View\n style={{\n height: badgeH,\n minWidth: badgeH,\n borderRadius: 999,\n paddingHorizontal: 6,\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: active ? activeBadgeBg : inactiveBadgeBg,\n }}\n >\n <Text fontSize={cfg.fs - 2} fontWeight=\"600\" color={active ? activeBadgeFg : inactiveBadgeFg}>\n {item.count}\n </Text>\n </View>\n )}\n </TouchableOpacity>\n );\n };\n\n if (!scrollable) {\n return (\n <View style={{flexDirection: \"row\", flexWrap: \"wrap\", alignItems: \"center\", gap}} testID={testID}>\n {items.map(renderChip)}\n </View>\n );\n }\n\n return (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n keyboardShouldPersistTaps=\"handled\"\n contentContainerStyle={{flexDirection: \"row\", alignItems: \"center\", gap, paddingVertical: 4}}\n testID={testID}\n >\n {items.map(renderChip)}\n </ScrollView>\n );\n}\n\nexport default Tabs;\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAM,IAAA,GAAO;AAAA,EACT,IAAI,EAAC,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAE;AAAA,EAC1B,IAAI,EAAC,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAE;AAAA,EAC1B,IAAI,EAAC,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA;AAC5B,CAAA;AASO,SAAS,KAAgC,QAAA,EAAyB;AACrE,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAoC,MAAA,EAAQ,QAAQ,CAAA,CAAE,WAAA;AACpE,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IAAO,KAAA;AAAA,IAAO,QAAA;AAAA,IAAU,IAAA,GAAO,IAAA;AAAA,IAAM,WAAA,GAAc,OAAA;AAAA,IAAS,UAAA,GAAa,IAAA;AAAA,IAAM,GAAA,GAAM,CAAA;AAAA,IAAG,MAAA;AAAA,IACxF,YAAA,GAAe,QAAA;AAAA,IACf,qBAAA,GAAwB,cAAA;AAAA,IACxB,oBAAA,GAAuB,cAAA;AAAA,IACvB,uBAAA,GAA0B,UAAA;AAAA,IAC1B,sBAAA,GAAyB,gBAAA;AAAA,IACzB,kBAAA,GAAqB,UAAA;AAAA,IACrB,iBAAA,GAAoB,gBAAA;AAAA,IACpB;AAAA,GACJ,GAAI,KAAA;AAEJ,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,EAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,EAAC,EAAA,EAAI,IAAA,CAAK,GAAG,CAAA,EAAG,EAAA,EAAI,IAAA,CAAK,EAAA,CAAG,GAAG,EAAA,EAAI,IAAA,CAAK,EAAA,CAAG,CAAA,EAAG,GAAG,WAAA,EAAW;AAC5E,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,OAAA,CAAQ,EAAA;AACxC,EAAA,MAAM,QAAA,GAAW,2BAA2B,WAAW,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,2BAA2B,kBAAkB,CAAA;AAChE,EAAA,MAAM,YAAA,GAAe,2BAA2B,iBAAiB,CAAA;AACjE,EAAA,MAAM,QAAQ,YAAA,KAAiB,OAAA;AAC/B,EAAA,MAAM,aAAA,GAAgB,2BAA2B,qBAAqB,CAAA;AACtE,EAAA,MAAM,aAAA,GAAgB,2BAA2B,oBAAoB,CAAA;AACrE,EAAA,MAAM,eAAA,GAAkB,2BAA2B,uBAAuB,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkB,2BAA2B,sBAAsB,CAAA;AACzE,EAAA,MAAM,MAAA,GAAS,IAAI,EAAA,GAAK,CAAA;AAExB,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAsB;AACtC,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,KAAQ,KAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,KAAK,IAAA,CAAK,KAAA;AACnF,IAAA,MAAM,EAAA,GAAK,SAAS,SAAA,GAAY,YAAA;AAChC,IAAA,uBACI,IAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QAEG,aAAA,EAAe,IAAA;AAAA,QACf,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAAA,QAChC,iBAAA,EAAkB,QAAA;AAAA,QAClB,kBAAA,EAAoB,EAAC,QAAA,EAAU,MAAA,EAAM;AAAA,QACrC,KAAA,EAAO;AAAA,UACH,MAAA;AAAA,UACA,YAAA,EAAc,GAAA;AAAA,UACd,mBAAmB,GAAA,CAAI,EAAA;AAAA,UACvB,aAAA,EAAe,KAAA;AAAA,UACf,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,GAAA,EAAK,CAAA;AAAA,UACL,eAAA,EAAiB,SAAS,QAAA,GAAW,UAAA;AAAA,UACrC,OAAA,EAAS,IAAA,CAAK,QAAA,GAAW,GAAA,GAAM;AAAA,SACnC;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,IAAQ,IAAA,oBAAQ,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAe,IAAA,EAAM,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,EAAA,EAAI,CAAA;AAAA,0BACnF,GAAA,CAAC,QAAK,QAAA,EAAU,GAAA,CAAI,IAAI,UAAA,EAAW,KAAA,EAAM,KAAA,EAAO,EAAA,EAC3C,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,IAAA,oBACpB,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACG,KAAA,EAAO;AAAA,gBACH,MAAA,EAAQ,MAAA;AAAA,gBACR,QAAA,EAAU,MAAA;AAAA,gBACV,YAAA,EAAc,GAAA;AAAA,gBACd,iBAAA,EAAmB,CAAA;AAAA,gBACnB,UAAA,EAAY,QAAA;AAAA,gBACZ,cAAA,EAAgB,QAAA;AAAA,gBAChB,eAAA,EAAiB,SAAS,aAAA,GAAgB;AAAA,eAC9C;AAAA,cAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAU,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG,UAAA,EAAW,KAAA,EAAM,KAAA,EAAO,MAAA,GAAS,aAAA,GAAgB,eAAA,EACxE,eAAK,KAAA,EACV;AAAA;AAAA;AACJ;AAAA,OAAA;AAAA,MArCC,IAAA,CAAK;AAAA,KAuCd;AAAA,EAER,CAAA;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACb,IAAA,2BACK,IAAA,EAAA,EAAK,KAAA,EAAO,EAAC,aAAA,EAAe,OAAO,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,KAAG,EAAG,MAAA,EAC7E,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,EACzB,CAAA;AAAA,EAER;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,UAAA,EAAU,IAAA;AAAA,MACV,8BAAA,EAAgC,KAAA;AAAA,MAChC,yBAAA,EAA0B,SAAA;AAAA,MAC1B,qBAAA,EAAuB,EAAC,aAAA,EAAe,KAAA,EAAO,YAAY,QAAA,EAAU,GAAA,EAAK,iBAAiB,CAAA,EAAC;AAAA,MAC3F,MAAA;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,IAAI,UAAU;AAAA;AAAA,GACzB;AAER;;;;"}
@@ -3,11 +3,11 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
+ var React = require('react');
6
7
  var reactNative = require('react-native');
7
8
  var Animated = require('react-native-reanimated');
8
9
  var reactNativeSafeAreaContext = require('react-native-safe-area-context');
9
10
  var useSeverityColors = require('../../../hooks/useSeverityColors.cjs');
10
- require('react');
11
11
  require('../../../contexts/DialogContext.cjs');
12
12
  var useResolvedStyle = require('../../../hooks/useResolvedStyle.cjs');
13
13
  var index = require('../../../animations/index.cjs');
@@ -15,6 +15,18 @@ var KitsThemeProvider_native = require('../../../contexts/Theme/KitsThemeProvide
15
15
  var index_native = require('../../../primitives/Text/index.cjs');
16
16
  var index_native$1 = require('../../../primitives/Icon/index.cjs');
17
17
 
18
+ function useOverlayPresence(visible) {
19
+ const [mounted, setMounted] = React.useState(visible);
20
+ const visibleRef = React.useRef(visible);
21
+ React.useEffect(() => {
22
+ visibleRef.current = visible;
23
+ if (visible) setMounted(true);
24
+ }, [visible]);
25
+ const handleExitFinished = React.useCallback(() => {
26
+ if (!visibleRef.current) setMounted(false);
27
+ }, []);
28
+ return { mounted, handleExitFinished };
29
+ }
18
30
  function KitsConfirm(props) {
19
31
  const {
20
32
  visible,
@@ -52,12 +64,14 @@ function KitsConfirm(props) {
52
64
  const textColor = resolveToken("text");
53
65
  const subtextColor = resolveToken("gray.500");
54
66
  const grabberColor = resolveToken("gray.300");
67
+ const scrimColor = resolveToken("black-alpha-40");
55
68
  const brandLogo = type === "brand" ? theme.config.logo : null;
56
69
  const resolvedStyle = useResolvedStyle.default(style || {});
57
70
  const resolvedContentStyle = useResolvedStyle.default(contentStyle || {});
58
71
  const resolvedHeaderStyle = useResolvedStyle.default(headerStyle || {});
59
72
  const resolvedMaskStyle = useResolvedStyle.default(maskStyle || {});
60
- if (!visible) return null;
73
+ const { mounted, handleExitFinished } = useOverlayPresence(!!visible);
74
+ if (!mounted) return null;
61
75
  const isSheet = position === "bottom";
62
76
  const hide = () => onHide?.("hide");
63
77
  const doClick = async (callback) => {
@@ -125,108 +139,145 @@ function KitsConfirm(props) {
125
139
  ] }) });
126
140
  };
127
141
  if (isSheet) {
128
- return /* @__PURE__ */ jsxRuntime.jsx(reactNative.Modal, { visible: true, transparent: true, animationType: "none", onRequestClose: hide, children: /* @__PURE__ */ jsxRuntime.jsxs(Animated.View, { entering: Animated.FadeIn.duration(index.overlayAnimations.scrim.enterDuration), style: [styles.sheetOverlay, resolvedMaskStyle], children: [
129
- /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: reactNative.StyleSheet.absoluteFill, onPress: hide }),
130
- /* @__PURE__ */ jsxRuntime.jsxs(
131
- Animated.View,
132
- {
133
- entering: Animated.SlideInDown.springify().damping(index.overlayAnimations.sheet.enter.damping).stiffness(index.overlayAnimations.sheet.enter.stiffness),
134
- style: [
135
- styles.sheetPanel,
136
- { backgroundColor: panelBg, paddingBottom: 24 + insets.bottom },
137
- resolvedStyle,
138
- resolvedContentStyle
139
- ],
140
- children: [
141
- /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles.grabber, { backgroundColor: grabberColor }] }),
142
- header != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.sheetHeader, { color: textColor }, resolvedHeaderStyle], children: header }),
143
- message != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.sheetMessage, { color: subtextColor }], children: message }),
144
- children,
145
- renderActions(true)
146
- ]
147
- }
148
- )
149
- ] }) });
142
+ return /* @__PURE__ */ jsxRuntime.jsx(reactNative.Modal, { visible: true, transparent: true, animationType: "none", onRequestClose: hide, children: visible && /* @__PURE__ */ jsxRuntime.jsxs(
143
+ Animated.View,
144
+ {
145
+ entering: Animated.FadeIn.duration(index.overlayAnimations.scrim.enterDuration),
146
+ exiting: Animated.FadeOut.duration(index.overlayAnimations.scrim.exitDuration),
147
+ style: [styles.sheetOverlay, { backgroundColor: scrimColor }, resolvedMaskStyle],
148
+ children: [
149
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: reactNative.StyleSheet.absoluteFill, onPress: hide }),
150
+ /* @__PURE__ */ jsxRuntime.jsxs(
151
+ Animated.View,
152
+ {
153
+ entering: Animated.SlideInDown.springify().damping(index.overlayAnimations.sheet.enter.damping).stiffness(index.overlayAnimations.sheet.enter.stiffness).mass(index.overlayAnimations.sheet.enter.mass),
154
+ exiting: Animated.SlideOutDown.duration(index.overlayAnimations.sheet.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease)).withCallback((finished) => {
155
+ "worklet";
156
+ if (finished) Animated.runOnJS(handleExitFinished)();
157
+ }),
158
+ style: [
159
+ styles.sheetPanel,
160
+ { backgroundColor: panelBg, paddingBottom: 24 + insets.bottom },
161
+ resolvedStyle,
162
+ resolvedContentStyle
163
+ ],
164
+ children: [
165
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.View, { style: [styles.grabber, { backgroundColor: grabberColor }] }),
166
+ header != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.sheetHeader, { color: textColor }, resolvedHeaderStyle], children: header }),
167
+ message != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.sheetMessage, { color: subtextColor }], children: message }),
168
+ children,
169
+ renderActions(true)
170
+ ]
171
+ }
172
+ )
173
+ ]
174
+ }
175
+ ) });
150
176
  }
151
177
  if (content) {
152
- return /* @__PURE__ */ jsxRuntime.jsx(reactNative.Modal, { visible: true, transparent: true, animationType: "none", onRequestClose: hide, children: /* @__PURE__ */ jsxRuntime.jsxs(Animated.View, { entering: Animated.FadeIn.duration(index.overlayAnimations.scrim.enterDuration), style: [styles.overlay, resolvedMaskStyle], children: [
153
- /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: reactNative.StyleSheet.absoluteFill, onPress: hide }),
154
- /* @__PURE__ */ jsxRuntime.jsx(
155
- Animated.View,
156
- {
157
- entering: Animated.ZoomIn.springify().damping(index.overlayAnimations.confirm.content.damping).stiffness(index.overlayAnimations.confirm.content.stiffness),
158
- style: [
159
- styles.panel,
160
- { backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380 },
161
- resolvedStyle,
162
- resolvedContentStyle
163
- ],
164
- children: content
165
- }
166
- )
167
- ] }) });
178
+ return /* @__PURE__ */ jsxRuntime.jsx(reactNative.Modal, { visible: true, transparent: true, animationType: "none", onRequestClose: hide, children: visible && /* @__PURE__ */ jsxRuntime.jsxs(
179
+ Animated.View,
180
+ {
181
+ entering: Animated.FadeIn.duration(index.overlayAnimations.scrim.enterDuration),
182
+ exiting: Animated.FadeOut.duration(index.overlayAnimations.scrim.exitDuration),
183
+ style: [styles.overlay, { backgroundColor: scrimColor }, resolvedMaskStyle],
184
+ children: [
185
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: reactNative.StyleSheet.absoluteFill, onPress: hide }),
186
+ /* @__PURE__ */ jsxRuntime.jsx(
187
+ Animated.View,
188
+ {
189
+ entering: Animated.ZoomIn.springify().damping(index.overlayAnimations.confirm.content.damping).stiffness(index.overlayAnimations.confirm.content.stiffness).mass(index.overlayAnimations.confirm.content.mass),
190
+ exiting: Animated.ZoomOut.duration(index.overlayAnimations.confirm.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease)).withCallback((finished) => {
191
+ "worklet";
192
+ if (finished) Animated.runOnJS(handleExitFinished)();
193
+ }),
194
+ style: [
195
+ styles.panel,
196
+ { backgroundColor: surfaceColor, minWidth: 250, maxWidth: 380 },
197
+ resolvedStyle,
198
+ resolvedContentStyle
199
+ ],
200
+ children: content
201
+ }
202
+ )
203
+ ]
204
+ }
205
+ ) });
168
206
  }
169
- return /* @__PURE__ */ jsxRuntime.jsx(reactNative.Modal, { visible: true, transparent: true, animationType: "none", onRequestClose: hide, children: /* @__PURE__ */ jsxRuntime.jsxs(Animated.View, { entering: Animated.FadeIn.duration(index.overlayAnimations.scrim.enterDuration), style: [styles.overlay, resolvedMaskStyle], children: [
170
- /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: reactNative.StyleSheet.absoluteFill, onPress: hide }),
171
- /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.cardStack, children: [
172
- showIcon && /* @__PURE__ */ jsxRuntime.jsx(
173
- Animated.View,
174
- {
175
- entering: Animated.ZoomIn.springify().damping(index.overlayAnimations.confirm.icon.damping).stiffness(index.overlayAnimations.confirm.icon.stiffness).delay(index.overlayAnimations.confirm.icon.delay),
176
- style: [styles.iconBubble, { backgroundColor: colors.iconBg }],
177
- children: brandLogo ? brandLogo : typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(index_native$1.Icon, { name: icon, size: "xl", color: colors.iconFg }) : icon
178
- }
179
- ),
180
- /* @__PURE__ */ jsxRuntime.jsxs(
181
- Animated.View,
182
- {
183
- entering: Animated.ZoomIn.springify().damping(index.overlayAnimations.confirm.enter.damping).stiffness(index.overlayAnimations.confirm.enter.stiffness),
184
- style: [
185
- styles.panel,
207
+ return /* @__PURE__ */ jsxRuntime.jsx(reactNative.Modal, { visible: true, transparent: true, animationType: "none", onRequestClose: hide, children: visible && /* @__PURE__ */ jsxRuntime.jsxs(
208
+ Animated.View,
209
+ {
210
+ entering: Animated.FadeIn.duration(index.overlayAnimations.scrim.enterDuration),
211
+ exiting: Animated.FadeOut.duration(index.overlayAnimations.scrim.exitDuration),
212
+ style: [styles.overlay, { backgroundColor: scrimColor }, resolvedMaskStyle],
213
+ children: [
214
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: reactNative.StyleSheet.absoluteFill, onPress: hide }),
215
+ /* @__PURE__ */ jsxRuntime.jsxs(reactNative.View, { style: styles.cardStack, children: [
216
+ showIcon && /* @__PURE__ */ jsxRuntime.jsx(
217
+ Animated.View,
218
+ {
219
+ entering: Animated.ZoomIn.springify().damping(index.overlayAnimations.confirm.icon.damping).stiffness(index.overlayAnimations.confirm.icon.stiffness).mass(index.overlayAnimations.confirm.icon.mass).delay(index.overlayAnimations.confirm.icon.delay),
220
+ exiting: Animated.ZoomOut.duration(index.overlayAnimations.confirm.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease)),
221
+ style: [styles.iconBubble, { backgroundColor: colors.iconBg }],
222
+ children: brandLogo ? brandLogo : typeof icon === "string" ? /* @__PURE__ */ jsxRuntime.jsx(index_native$1.Icon, { name: icon, size: "xl", color: colors.iconFg }) : icon
223
+ }
224
+ ),
225
+ /* @__PURE__ */ jsxRuntime.jsxs(
226
+ Animated.View,
186
227
  {
187
- backgroundColor: panelBg,
188
- paddingTop: showIcon ? 48 : 24,
189
- gap: 10
190
- },
191
- resolvedStyle,
192
- resolvedContentStyle
193
- ],
194
- children: [
195
- /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: styles.closeBtn, onPress: hide, hitSlop: 12, children: /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: { fontSize: 18, color: subtextColor }, children: "\u2715" }) }),
196
- header != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.header, { color: textColor }, resolvedHeaderStyle], children: header }),
197
- message != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.message, { color: subtextColor }], children: message }),
198
- children,
199
- renderActions(false)
200
- ]
201
- }
202
- )
203
- ] })
204
- ] }) });
228
+ entering: Animated.ZoomIn.springify().damping(index.overlayAnimations.confirm.enter.damping).stiffness(index.overlayAnimations.confirm.enter.stiffness).mass(index.overlayAnimations.confirm.enter.mass),
229
+ exiting: Animated.ZoomOut.duration(index.overlayAnimations.confirm.exitDuration).easing(Animated.Easing.in(Animated.Easing.ease)).withCallback((finished) => {
230
+ "worklet";
231
+ if (finished) Animated.runOnJS(handleExitFinished)();
232
+ }),
233
+ style: [
234
+ styles.panel,
235
+ {
236
+ backgroundColor: panelBg,
237
+ paddingTop: showIcon ? 48 : 24,
238
+ gap: 10
239
+ },
240
+ resolvedStyle,
241
+ resolvedContentStyle
242
+ ],
243
+ children: [
244
+ /* @__PURE__ */ jsxRuntime.jsx(reactNative.Pressable, { style: styles.closeBtn, onPress: hide, hitSlop: 12, children: /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: { fontSize: 18, color: subtextColor }, children: "\u2715" }) }),
245
+ header != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.header, { color: textColor }, resolvedHeaderStyle], children: header }),
246
+ message != null && /* @__PURE__ */ jsxRuntime.jsx(index_native.default, { style: [styles.message, { color: subtextColor }], children: message }),
247
+ children,
248
+ renderActions(false)
249
+ ]
250
+ }
251
+ )
252
+ ] })
253
+ ]
254
+ }
255
+ ) });
205
256
  }
206
257
  const styles = reactNative.StyleSheet.create({
207
258
  overlay: {
208
259
  flex: 1,
209
- backgroundColor: "rgba(0,0,0,0.55)",
210
260
  justifyContent: "center",
211
261
  alignItems: "center",
212
262
  padding: 28
213
263
  },
214
264
  sheetOverlay: {
215
265
  flex: 1,
216
- backgroundColor: "rgba(0,0,0,0.55)",
217
266
  justifyContent: "flex-end"
218
267
  },
219
268
  sheetPanel: {
269
+ // 24 == radii.2xl, top corners only (bottom stays square).
220
270
  borderTopLeftRadius: 24,
221
271
  borderTopRightRadius: 24,
222
272
  paddingHorizontal: 24,
223
273
  paddingTop: 10,
224
274
  gap: 14,
225
- elevation: 16,
275
+ // Subtle elevation (upward for a sheet): low opacity, wide blur, minimal offset.
276
+ elevation: 6,
226
277
  shadowColor: "#000",
227
- shadowOffset: { width: 0, height: -4 },
278
+ shadowOffset: { width: 0, height: -2 },
228
279
  shadowOpacity: 0.15,
229
- shadowRadius: 16
280
+ shadowRadius: 20
230
281
  },
231
282
  grabber: {
232
283
  width: 40,
@@ -266,14 +317,16 @@ const styles = reactNative.StyleSheet.create({
266
317
  },
267
318
  panel: {
268
319
  alignSelf: "stretch",
269
- borderRadius: 16,
320
+ // 20 == radii.xl. Side padding (24) == bottom padding (24) for even rhythm.
321
+ borderRadius: 20,
270
322
  paddingHorizontal: 24,
271
323
  paddingBottom: 24,
272
- elevation: 16,
324
+ // Subtle elevation: low opacity, wide blur, minimal offset.
325
+ elevation: 6,
273
326
  shadowColor: "#000",
274
- shadowOffset: { width: 0, height: 8 },
275
- shadowOpacity: 0.2,
276
- shadowRadius: 16,
327
+ shadowOffset: { width: 0, height: 2 },
328
+ shadowOpacity: 0.15,
329
+ shadowRadius: 20,
277
330
  alignItems: "center"
278
331
  },
279
332
  closeBtn: {
@@ -292,7 +345,8 @@ const styles = reactNative.StyleSheet.create({
292
345
  fontSize: 14,
293
346
  textAlign: "center",
294
347
  lineHeight: 20,
295
- marginBottom: 24
348
+ // Tightened so top/bottom whitespace around the actions reads balanced.
349
+ marginBottom: 16
296
350
  },
297
351
  buttonRow: {
298
352
  flexDirection: "row",
@@ -303,15 +357,18 @@ const styles = reactNative.StyleSheet.create({
303
357
  actionBtn: {
304
358
  paddingVertical: 12,
305
359
  paddingHorizontal: 24,
306
- borderRadius: 8,
360
+ // Pill (== radii.pill). Buttons here are raw Pressables, not kits Button,
361
+ // so the pill comes from borderRadius — the pattern the `buttons` array
362
+ // path (`b.rounded && {borderRadius: 999}`) already uses in this file.
363
+ borderRadius: 999,
307
364
  minWidth: 100,
308
365
  alignItems: "center",
309
366
  justifyContent: "center"
310
367
  },
311
- // Taller, rounder buttons for the bottom-sheet action row.
368
+ // Taller buttons for the bottom-sheet action row (pill shape shared).
312
369
  actionBtnSheet: {
313
370
  paddingVertical: 16,
314
- borderRadius: 12
371
+ borderRadius: 999
315
372
  },
316
373
  actionBtnOutlined: {
317
374
  backgroundColor: "transparent",