zkit-ui 1.0.0

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 (267) hide show
  1. package/README.md +267 -0
  2. package/dist/ComponentLibProvider.d.ts +15 -0
  3. package/dist/ComponentLibProvider.d.ts.map +1 -0
  4. package/dist/ComponentLibProvider.js +18 -0
  5. package/dist/assets/animations/spinner.json +1 -0
  6. package/dist/assets/icons/check.svg +4 -0
  7. package/dist/assets/icons/toast/error.webp +0 -0
  8. package/dist/assets/icons/toast/success.webp +0 -0
  9. package/dist/assets/icons/toast/warning.webp +0 -0
  10. package/dist/config.d.ts +16 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +42 -0
  13. package/dist/i18n/I18nProvider.d.ts +11 -0
  14. package/dist/i18n/I18nProvider.d.ts.map +1 -0
  15. package/dist/i18n/I18nProvider.js +84 -0
  16. package/dist/i18n/locale.d.ts +7 -0
  17. package/dist/i18n/locale.d.ts.map +1 -0
  18. package/dist/i18n/locale.js +87 -0
  19. package/dist/i18n/locales/de.d.ts +51 -0
  20. package/dist/i18n/locales/de.d.ts.map +1 -0
  21. package/dist/i18n/locales/de.js +62 -0
  22. package/dist/i18n/locales/en-US.d.ts +51 -0
  23. package/dist/i18n/locales/en-US.d.ts.map +1 -0
  24. package/dist/i18n/locales/en-US.js +62 -0
  25. package/dist/i18n/locales/index.d.ts +9 -0
  26. package/dist/i18n/locales/index.d.ts.map +1 -0
  27. package/dist/i18n/locales/index.js +23 -0
  28. package/dist/i18n/locales/ja.d.ts +51 -0
  29. package/dist/i18n/locales/ja.d.ts.map +1 -0
  30. package/dist/i18n/locales/ja.js +62 -0
  31. package/dist/i18n/locales/zh-CN.d.ts +51 -0
  32. package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
  33. package/dist/i18n/locales/zh-CN.js +62 -0
  34. package/dist/i18n/locales/zh-TW.d.ts +51 -0
  35. package/dist/i18n/locales/zh-TW.d.ts.map +1 -0
  36. package/dist/i18n/locales/zh-TW.js +62 -0
  37. package/dist/i18n/types.d.ts +11 -0
  38. package/dist/i18n/types.d.ts.map +1 -0
  39. package/dist/i18n/types.js +2 -0
  40. package/dist/i18n/useI18n.d.ts +2 -0
  41. package/dist/i18n/useI18n.d.ts.map +1 -0
  42. package/dist/i18n/useI18n.js +41 -0
  43. package/dist/index.d.ts +57 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +90 -0
  46. package/dist/services/ActionDialogService/ActionDialog.d.ts +4 -0
  47. package/dist/services/ActionDialogService/ActionDialog.d.ts.map +1 -0
  48. package/dist/services/ActionDialogService/ActionDialog.js +531 -0
  49. package/dist/services/ActionDialogService/index.d.ts +4 -0
  50. package/dist/services/ActionDialogService/index.d.ts.map +1 -0
  51. package/dist/services/ActionDialogService/index.js +8 -0
  52. package/dist/services/ActionDialogService/service.d.ts +7 -0
  53. package/dist/services/ActionDialogService/service.d.ts.map +1 -0
  54. package/dist/services/ActionDialogService/service.js +309 -0
  55. package/dist/services/ActionDialogService/shared.d.ts +17 -0
  56. package/dist/services/ActionDialogService/shared.d.ts.map +1 -0
  57. package/dist/services/ActionDialogService/shared.js +167 -0
  58. package/dist/services/ActionDialogService/types.d.ts +160 -0
  59. package/dist/services/ActionDialogService/types.d.ts.map +1 -0
  60. package/dist/services/ActionDialogService/types.js +2 -0
  61. package/dist/services/CardToastService/index.d.ts +115 -0
  62. package/dist/services/CardToastService/index.d.ts.map +1 -0
  63. package/dist/services/CardToastService/index.js +899 -0
  64. package/dist/services/ImagePreviewService/index.d.ts +179 -0
  65. package/dist/services/ImagePreviewService/index.d.ts.map +1 -0
  66. package/dist/services/ImagePreviewService/index.js +1383 -0
  67. package/dist/services/LoadingService/index.d.ts +146 -0
  68. package/dist/services/LoadingService/index.d.ts.map +1 -0
  69. package/dist/services/LoadingService/index.js +827 -0
  70. package/dist/services/PermissionPurposeDialogService/index.d.ts +99 -0
  71. package/dist/services/PermissionPurposeDialogService/index.d.ts.map +1 -0
  72. package/dist/services/PermissionPurposeDialogService/index.js +360 -0
  73. package/dist/services/PickerService/index.d.ts +128 -0
  74. package/dist/services/PickerService/index.d.ts.map +1 -0
  75. package/dist/services/PickerService/index.js +250 -0
  76. package/dist/theme/ThemeProvider.d.ts +15 -0
  77. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  78. package/dist/theme/ThemeProvider.js +61 -0
  79. package/dist/theme/defaultTheme.d.ts +3 -0
  80. package/dist/theme/defaultTheme.d.ts.map +1 -0
  81. package/dist/theme/defaultTheme.js +28 -0
  82. package/dist/theme/mergeTheme.d.ts +3 -0
  83. package/dist/theme/mergeTheme.d.ts.map +1 -0
  84. package/dist/theme/mergeTheme.js +19 -0
  85. package/dist/theme/types.d.ts +17 -0
  86. package/dist/theme/types.d.ts.map +1 -0
  87. package/dist/theme/types.js +2 -0
  88. package/dist/theme/useTheme.d.ts +2 -0
  89. package/dist/theme/useTheme.d.ts.map +1 -0
  90. package/dist/theme/useTheme.js +46 -0
  91. package/dist/ui/Accordion/index.d.ts +99 -0
  92. package/dist/ui/Accordion/index.d.ts.map +1 -0
  93. package/dist/ui/Accordion/index.js +777 -0
  94. package/dist/ui/AddressCascader/index.d.ts +58 -0
  95. package/dist/ui/AddressCascader/index.d.ts.map +1 -0
  96. package/dist/ui/AddressCascader/index.js +710 -0
  97. package/dist/ui/BetweenTime/index.d.ts +82 -0
  98. package/dist/ui/BetweenTime/index.d.ts.map +1 -0
  99. package/dist/ui/BetweenTime/index.js +702 -0
  100. package/dist/ui/Button/index.d.ts +93 -0
  101. package/dist/ui/Button/index.d.ts.map +1 -0
  102. package/dist/ui/Button/index.js +832 -0
  103. package/dist/ui/Checkbox/index.d.ts +103 -0
  104. package/dist/ui/Checkbox/index.d.ts.map +1 -0
  105. package/dist/ui/Checkbox/index.js +694 -0
  106. package/dist/ui/DatePicker/index.d.ts +5 -0
  107. package/dist/ui/DatePicker/index.d.ts.map +1 -0
  108. package/dist/ui/DatePicker/index.js +157 -0
  109. package/dist/ui/DatePicker/types.d.ts +99 -0
  110. package/dist/ui/DatePicker/types.d.ts.map +1 -0
  111. package/dist/ui/DatePicker/types.js +2 -0
  112. package/dist/ui/DatePicker/utils.d.ts +32 -0
  113. package/dist/ui/DatePicker/utils.d.ts.map +1 -0
  114. package/dist/ui/DatePicker/utils.js +316 -0
  115. package/dist/ui/LinkedScroll/index.d.ts +78 -0
  116. package/dist/ui/LinkedScroll/index.d.ts.map +1 -0
  117. package/dist/ui/LinkedScroll/index.js +470 -0
  118. package/dist/ui/LoadingSpinner/index.d.ts +8 -0
  119. package/dist/ui/LoadingSpinner/index.d.ts.map +1 -0
  120. package/dist/ui/LoadingSpinner/index.js +122 -0
  121. package/dist/ui/Picker/actionBar.d.ts +14 -0
  122. package/dist/ui/Picker/actionBar.d.ts.map +1 -0
  123. package/dist/ui/Picker/actionBar.js +28 -0
  124. package/dist/ui/Picker/index.d.ts +5 -0
  125. package/dist/ui/Picker/index.d.ts.map +1 -0
  126. package/dist/ui/Picker/index.js +412 -0
  127. package/dist/ui/Picker/types.d.ts +80 -0
  128. package/dist/ui/Picker/types.d.ts.map +1 -0
  129. package/dist/ui/Picker/types.js +2 -0
  130. package/dist/ui/Picker/utils.d.ts +27 -0
  131. package/dist/ui/Picker/utils.d.ts.map +1 -0
  132. package/dist/ui/Picker/utils.js +182 -0
  133. package/dist/ui/Radio/index.d.ts +95 -0
  134. package/dist/ui/Radio/index.d.ts.map +1 -0
  135. package/dist/ui/Radio/index.js +633 -0
  136. package/dist/ui/Sheet/index.d.ts +12 -0
  137. package/dist/ui/Sheet/index.d.ts.map +1 -0
  138. package/dist/ui/Sheet/index.js +832 -0
  139. package/dist/ui/Sheet/nativeBottom.d.ts +52 -0
  140. package/dist/ui/Sheet/nativeBottom.d.ts.map +1 -0
  141. package/dist/ui/Sheet/nativeBottom.js +442 -0
  142. package/dist/ui/Sheet/nativeBottom.web.d.ts +18 -0
  143. package/dist/ui/Sheet/nativeBottom.web.d.ts.map +1 -0
  144. package/dist/ui/Sheet/nativeBottom.web.js +46 -0
  145. package/dist/ui/Sheet/slots.d.ts +5 -0
  146. package/dist/ui/Sheet/slots.d.ts.map +1 -0
  147. package/dist/ui/Sheet/slots.js +40 -0
  148. package/dist/ui/Sheet/types.d.ts +131 -0
  149. package/dist/ui/Sheet/types.d.ts.map +1 -0
  150. package/dist/ui/Sheet/types.js +2 -0
  151. package/dist/ui/SliderCaptcha/index.d.ts +57 -0
  152. package/dist/ui/SliderCaptcha/index.d.ts.map +1 -0
  153. package/dist/ui/SliderCaptcha/index.js +586 -0
  154. package/dist/ui/Switch/index.d.ts +72 -0
  155. package/dist/ui/Switch/index.d.ts.map +1 -0
  156. package/dist/ui/Switch/index.js +671 -0
  157. package/dist/ui/Text/index.d.ts +41 -0
  158. package/dist/ui/Text/index.d.ts.map +1 -0
  159. package/dist/ui/Text/index.js +325 -0
  160. package/dist/ui/TextInput/TextInputPrimitive.d.ts +8 -0
  161. package/dist/ui/TextInput/TextInputPrimitive.d.ts.map +1 -0
  162. package/dist/ui/TextInput/TextInputPrimitive.js +54 -0
  163. package/dist/ui/TextInput/index.d.ts +89 -0
  164. package/dist/ui/TextInput/index.d.ts.map +1 -0
  165. package/dist/ui/TextInput/index.js +545 -0
  166. package/dist/ui/WheelColumn/ZKitWheelPickerNativeComponent.d.ts +39 -0
  167. package/dist/ui/WheelColumn/ZKitWheelPickerNativeComponent.d.ts.map +1 -0
  168. package/dist/ui/WheelColumn/ZKitWheelPickerNativeComponent.js +60 -0
  169. package/dist/ui/WheelColumn/constants.d.ts +2 -0
  170. package/dist/ui/WheelColumn/constants.d.ts.map +1 -0
  171. package/dist/ui/WheelColumn/constants.js +4 -0
  172. package/dist/ui/WheelColumn/index.d.ts +59 -0
  173. package/dist/ui/WheelColumn/index.d.ts.map +1 -0
  174. package/dist/ui/WheelColumn/index.js +547 -0
  175. package/ios/ZKitWheelPicker.h +18 -0
  176. package/ios/ZKitWheelPicker.mm +230 -0
  177. package/ios/ZKitWheelPickerLabel.h +10 -0
  178. package/ios/ZKitWheelPickerLabel.mm +31 -0
  179. package/ios/ZKitWheelPickerManager.h +5 -0
  180. package/ios/ZKitWheelPickerManager.mm +53 -0
  181. package/package.json +75 -0
  182. package/react-native.config.js +10 -0
  183. package/src/ComponentLibProvider.tsx +56 -0
  184. package/src/assets/animations/spinner.json +1 -0
  185. package/src/assets/icons/check.svg +4 -0
  186. package/src/assets/icons/toast/error.webp +0 -0
  187. package/src/assets/icons/toast/success.webp +0 -0
  188. package/src/assets/icons/toast/warning.webp +0 -0
  189. package/src/config.ts +65 -0
  190. package/src/i18n/I18nProvider.tsx +69 -0
  191. package/src/i18n/locale.ts +108 -0
  192. package/src/i18n/locales/de.ts +67 -0
  193. package/src/i18n/locales/en-US.ts +67 -0
  194. package/src/i18n/locales/index.ts +19 -0
  195. package/src/i18n/locales/ja.ts +67 -0
  196. package/src/i18n/locales/zh-CN.ts +67 -0
  197. package/src/i18n/locales/zh-TW.ts +67 -0
  198. package/src/i18n/types.ts +21 -0
  199. package/src/i18n/useI18n.ts +7 -0
  200. package/src/index.ts +395 -0
  201. package/src/services/ActionDialogService/ActionDialog.tsx +756 -0
  202. package/src/services/ActionDialogService/README.md +146 -0
  203. package/src/services/ActionDialogService/index.tsx +39 -0
  204. package/src/services/ActionDialogService/service.tsx +355 -0
  205. package/src/services/ActionDialogService/shared.ts +204 -0
  206. package/src/services/ActionDialogService/types.ts +197 -0
  207. package/src/services/CardToastService/README.md +128 -0
  208. package/src/services/CardToastService/index.tsx +1284 -0
  209. package/src/services/ImagePreviewService/README.md +67 -0
  210. package/src/services/ImagePreviewService/index.tsx +2148 -0
  211. package/src/services/LoadingService/README.md +128 -0
  212. package/src/services/LoadingService/index.tsx +1113 -0
  213. package/src/services/PermissionPurposeDialogService/README.md +80 -0
  214. package/src/services/PermissionPurposeDialogService/index.tsx +449 -0
  215. package/src/services/PickerService/README.md +154 -0
  216. package/src/services/PickerService/index.tsx +410 -0
  217. package/src/theme/ThemeProvider.tsx +40 -0
  218. package/src/theme/defaultTheme.ts +30 -0
  219. package/src/theme/mergeTheme.ts +16 -0
  220. package/src/theme/types.ts +36 -0
  221. package/src/theme/useTheme.ts +10 -0
  222. package/src/types/svg.d.ts +9 -0
  223. package/src/types/vant-area-data.d.ts +19 -0
  224. package/src/ui/Accordion/README.md +67 -0
  225. package/src/ui/Accordion/index.tsx +1221 -0
  226. package/src/ui/AddressCascader/README.md +144 -0
  227. package/src/ui/AddressCascader/index.tsx +1084 -0
  228. package/src/ui/BetweenTime/README.md +490 -0
  229. package/src/ui/BetweenTime/index.tsx +1001 -0
  230. package/src/ui/Button/README.md +186 -0
  231. package/src/ui/Button/index.tsx +1356 -0
  232. package/src/ui/Checkbox/README.md +211 -0
  233. package/src/ui/Checkbox/index.tsx +1231 -0
  234. package/src/ui/DatePicker/README.md +117 -0
  235. package/src/ui/DatePicker/index.tsx +295 -0
  236. package/src/ui/DatePicker/types.ts +115 -0
  237. package/src/ui/DatePicker/utils.ts +405 -0
  238. package/src/ui/LinkedScroll/README.md +55 -0
  239. package/src/ui/LinkedScroll/index.tsx +809 -0
  240. package/src/ui/LoadingSpinner/index.tsx +104 -0
  241. package/src/ui/Picker/README.md +190 -0
  242. package/src/ui/Picker/actionBar.tsx +70 -0
  243. package/src/ui/Picker/index.tsx +694 -0
  244. package/src/ui/Picker/types.ts +94 -0
  245. package/src/ui/Picker/utils.ts +239 -0
  246. package/src/ui/Radio/README.md +207 -0
  247. package/src/ui/Radio/index.tsx +1117 -0
  248. package/src/ui/Sheet/README.md +82 -0
  249. package/src/ui/Sheet/index.tsx +1163 -0
  250. package/src/ui/Sheet/nativeBottom.tsx +683 -0
  251. package/src/ui/Sheet/nativeBottom.web.tsx +40 -0
  252. package/src/ui/Sheet/slots.tsx +75 -0
  253. package/src/ui/Sheet/types.ts +195 -0
  254. package/src/ui/SliderCaptcha/README.md +61 -0
  255. package/src/ui/SliderCaptcha/index.tsx +816 -0
  256. package/src/ui/Switch/README.md +143 -0
  257. package/src/ui/Switch/index.tsx +1092 -0
  258. package/src/ui/Text/README.md +157 -0
  259. package/src/ui/Text/index.tsx +450 -0
  260. package/src/ui/TextInput/README.md +197 -0
  261. package/src/ui/TextInput/TextInputPrimitive.tsx +44 -0
  262. package/src/ui/TextInput/index.tsx +942 -0
  263. package/src/ui/WheelColumn/README.md +104 -0
  264. package/src/ui/WheelColumn/ZKitWheelPickerNativeComponent.tsx +68 -0
  265. package/src/ui/WheelColumn/constants.ts +1 -0
  266. package/src/ui/WheelColumn/index.tsx +826 -0
  267. package/zkit-ui.podspec +19 -0
@@ -0,0 +1,586 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SliderCaptcha = SliderCaptcha;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const vector_icons_1 = require("@expo/vector-icons");
39
+ const React = __importStar(require("react"));
40
+ const react_native_1 = require("react-native");
41
+ const react_native_reanimated_1 = __importStar(require("react-native-reanimated"));
42
+ const react_native_worklets_1 = require("react-native-worklets");
43
+ const zkit_tools_1 = require("zkit-tools");
44
+ const useI18n_1 = require("../../i18n/useI18n");
45
+ const useTheme_1 = require("../../theme/useTheme");
46
+ const Text_1 = require("../Text");
47
+ const DEFAULT_CHALLENGE_WIDTH = 320;
48
+ const DEFAULT_CHALLENGE_HEIGHT = 220;
49
+ const DEFAULT_BLOCK_SIZE = 50;
50
+ const DEFAULT_SUCCESS_DURATION = 500;
51
+ const DEFAULT_ERROR_DURATION = 700;
52
+ const DEFAULT_CARD_MAX_WIDTH = (0, zkit_tools_1.wp)(340);
53
+ const CARD_HORIZONTAL_PADDING = (0, zkit_tools_1.wp)(24);
54
+ const CANVAS_BORDER_WIDTH = (0, zkit_tools_1.wp)(1);
55
+ const CAPTCHA_LAYER_Z_INDEX = 4000;
56
+ const SLIDER_THUMB_SIZE = (0, zkit_tools_1.wp)(44);
57
+ const CAPTCHA_ENTER_DURATION = 280;
58
+ const CAPTCHA_EXIT_DURATION = 220;
59
+ const CAPTCHA_CARD_OFFSET_Y = (0, zkit_tools_1.wp)(18);
60
+ const CAPTCHA_ENTER_EASING = react_native_reanimated_1.Easing.bezier(0.22, 1, 0.36, 1);
61
+ const CAPTCHA_EXIT_EASING = react_native_reanimated_1.Easing.out(react_native_reanimated_1.Easing.cubic);
62
+ function clamp(value, min, max) {
63
+ return Math.min(Math.max(value, min), max);
64
+ }
65
+ function normalizeImageUri(value) {
66
+ if (!value)
67
+ return '';
68
+ if (/^(data:|https?:\/\/|file:\/\/|content:\/\/|asset:|ph:)/.test(value)) {
69
+ return value;
70
+ }
71
+ return `data:image/png;base64,${value}`;
72
+ }
73
+ function parseVerifyResult(result) {
74
+ if (typeof result === 'object' && result !== null) {
75
+ return {
76
+ success: Boolean(result.success),
77
+ message: result.message,
78
+ };
79
+ }
80
+ if (typeof result === 'boolean') {
81
+ return { success: result };
82
+ }
83
+ return { success: true };
84
+ }
85
+ function getSafePositiveNumber(value, fallback) {
86
+ if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
87
+ return fallback;
88
+ }
89
+ return value;
90
+ }
91
+ const styles = react_native_1.StyleSheet.create({
92
+ modalRoot: {
93
+ ...react_native_1.StyleSheet.absoluteFillObject,
94
+ zIndex: CAPTCHA_LAYER_Z_INDEX,
95
+ elevation: react_native_1.Platform.OS === 'android' ? CAPTCHA_LAYER_Z_INDEX : 0,
96
+ },
97
+ overlayBackdrop: {
98
+ ...react_native_1.StyleSheet.absoluteFillObject,
99
+ backgroundColor: 'rgba(0,0,0,0.55)',
100
+ },
101
+ overlayPressable: {
102
+ ...react_native_1.StyleSheet.absoluteFillObject,
103
+ justifyContent: 'center',
104
+ alignItems: 'center',
105
+ paddingHorizontal: (0, zkit_tools_1.wp)(20),
106
+ },
107
+ cardContainer: {
108
+ width: '100%',
109
+ alignItems: 'center',
110
+ },
111
+ card: {
112
+ width: '100%',
113
+ borderRadius: (0, zkit_tools_1.wp)(16),
114
+ paddingHorizontal: CARD_HORIZONTAL_PADDING,
115
+ paddingTop: (0, zkit_tools_1.wp)(18),
116
+ paddingBottom: (0, zkit_tools_1.wp)(20),
117
+ shadowOffset: { width: 0, height: (0, zkit_tools_1.wp)(10) },
118
+ shadowOpacity: 0.1,
119
+ shadowRadius: (0, zkit_tools_1.wp)(20),
120
+ elevation: 10,
121
+ },
122
+ titleRow: {
123
+ flexDirection: 'row',
124
+ alignItems: 'center',
125
+ justifyContent: 'space-between',
126
+ marginBottom: (0, zkit_tools_1.wp)(14),
127
+ },
128
+ title: {
129
+ fontSize: (0, zkit_tools_1.wp)(16),
130
+ fontWeight: '500',
131
+ },
132
+ headerActions: {
133
+ flexDirection: 'row',
134
+ alignItems: 'center',
135
+ },
136
+ headerActionButton: {
137
+ width: (0, zkit_tools_1.wp)(28),
138
+ height: (0, zkit_tools_1.wp)(28),
139
+ borderRadius: (0, zkit_tools_1.wp)(14),
140
+ alignItems: 'center',
141
+ justifyContent: 'center',
142
+ shadowOffset: { width: 0, height: (0, zkit_tools_1.wp)(2) },
143
+ shadowOpacity: 0.08,
144
+ shadowRadius: (0, zkit_tools_1.wp)(4),
145
+ elevation: 3,
146
+ },
147
+ headerActionSpacing: {
148
+ marginLeft: (0, zkit_tools_1.wp)(8),
149
+ },
150
+ canvasWrapper: {
151
+ width: '100%',
152
+ overflow: 'hidden',
153
+ alignSelf: 'center',
154
+ position: 'relative',
155
+ borderWidth: CANVAS_BORDER_WIDTH,
156
+ borderRadius: (0, zkit_tools_1.wp)(16),
157
+ },
158
+ canvasImage: {
159
+ width: '100%',
160
+ height: '100%',
161
+ },
162
+ block: {
163
+ position: 'absolute',
164
+ left: 0,
165
+ },
166
+ feedbackOverlay: {
167
+ position: 'absolute',
168
+ left: 0,
169
+ right: 0,
170
+ bottom: 0,
171
+ height: (0, zkit_tools_1.wp)(36),
172
+ alignItems: 'center',
173
+ justifyContent: 'center',
174
+ zIndex: 20,
175
+ },
176
+ feedbackError: {
177
+ backgroundColor: 'rgba(239, 68, 68, 0.9)',
178
+ },
179
+ feedbackSuccess: {
180
+ backgroundColor: 'rgba(34, 197, 94, 0.9)',
181
+ },
182
+ feedbackText: {
183
+ color: '#FFFFFF',
184
+ fontSize: (0, zkit_tools_1.wp)(14),
185
+ fontWeight: '600',
186
+ letterSpacing: 0.5,
187
+ },
188
+ placeholder: {
189
+ alignItems: 'center',
190
+ justifyContent: 'center',
191
+ },
192
+ sliderTrack: {
193
+ marginTop: (0, zkit_tools_1.wp)(16),
194
+ marginBottom: (0, zkit_tools_1.wp)(4),
195
+ height: SLIDER_THUMB_SIZE,
196
+ borderRadius: SLIDER_THUMB_SIZE / 2,
197
+ overflow: 'hidden',
198
+ justifyContent: 'center',
199
+ },
200
+ sliderThumb: {
201
+ position: 'absolute',
202
+ left: 0,
203
+ width: SLIDER_THUMB_SIZE,
204
+ height: SLIDER_THUMB_SIZE,
205
+ borderRadius: SLIDER_THUMB_SIZE / 2,
206
+ alignItems: 'center',
207
+ justifyContent: 'center',
208
+ shadowOffset: { width: 0, height: (0, zkit_tools_1.wp)(2) },
209
+ shadowOpacity: 0.15,
210
+ shadowRadius: (0, zkit_tools_1.wp)(4),
211
+ elevation: 3,
212
+ borderWidth: (0, zkit_tools_1.wp)(0.5),
213
+ },
214
+ });
215
+ function SliderCaptcha({ visible, onClose, initialChallenge = null, loadChallenge, verifyChallenge, onVerified, onError, texts, dismissOnBackdropPress = true, reloadOnOpen = true, successFeedbackDuration = DEFAULT_SUCCESS_DURATION, errorFeedbackDuration = DEFAULT_ERROR_DURATION, maxCardWidth = DEFAULT_CARD_MAX_WIDTH, cardStyle, }) {
216
+ var _a, _b, _c;
217
+ const { t } = (0, useI18n_1.useI18n)();
218
+ const theme = (0, useTheme_1.useTheme)();
219
+ const [mounted, setMounted] = React.useState(visible);
220
+ const [challenge, setChallenge] = React.useState(null);
221
+ const [status, setStatus] = React.useState('idle');
222
+ const [feedbackMessage, setFeedbackMessage] = React.useState();
223
+ const [canvasLayoutWidth, setCanvasLayoutWidth] = React.useState(0);
224
+ const presentationProgress = (0, react_native_reanimated_1.useSharedValue)(0);
225
+ const thumbX = (0, react_native_reanimated_1.useSharedValue)(0);
226
+ const thumbXRef = React.useRef(0);
227
+ const thumbStartRef = React.useRef(0);
228
+ const visibleRef = React.useRef(visible);
229
+ const visibilityAnimationIdRef = React.useRef(0);
230
+ const loadRequestIdRef = React.useRef(0);
231
+ const verifyRequestIdRef = React.useRef(0);
232
+ const timeoutRef = React.useRef(null);
233
+ const animationFrameRefs = React.useRef([]);
234
+ const resolvedTexts = React.useMemo(() => {
235
+ var _a, _b, _c;
236
+ return ({
237
+ title: (_a = texts === null || texts === void 0 ? void 0 : texts.title) !== null && _a !== void 0 ? _a : t('sliderCaptcha.title'),
238
+ verifyFailed: (_b = texts === null || texts === void 0 ? void 0 : texts.verifyFailed) !== null && _b !== void 0 ? _b : t('sliderCaptcha.verifyFailed'),
239
+ verifySuccess: (_c = texts === null || texts === void 0 ? void 0 : texts.verifySuccess) !== null && _c !== void 0 ? _c : t('sliderCaptcha.verifySuccess'),
240
+ });
241
+ }, [t, texts === null || texts === void 0 ? void 0 : texts.title, texts === null || texts === void 0 ? void 0 : texts.verifyFailed, texts === null || texts === void 0 ? void 0 : texts.verifySuccess]);
242
+ const clearPendingTimeout = React.useCallback(() => {
243
+ if (timeoutRef.current) {
244
+ clearTimeout(timeoutRef.current);
245
+ timeoutRef.current = null;
246
+ }
247
+ }, []);
248
+ const clearPendingAnimationFrames = React.useCallback(() => {
249
+ animationFrameRefs.current.forEach((frameId) => cancelAnimationFrame(frameId));
250
+ animationFrameRefs.current = [];
251
+ }, []);
252
+ const resetThumbPosition = React.useCallback(() => {
253
+ thumbX.value = 0;
254
+ thumbXRef.current = 0;
255
+ thumbStartRef.current = 0;
256
+ }, [thumbX]);
257
+ const resetCaptchaState = React.useCallback(() => {
258
+ setStatus('idle');
259
+ setFeedbackMessage(undefined);
260
+ setChallenge(null);
261
+ resetThumbPosition();
262
+ }, [resetThumbPosition]);
263
+ const originalWidth = getSafePositiveNumber(challenge === null || challenge === void 0 ? void 0 : challenge.originalWidth, DEFAULT_CHALLENGE_WIDTH);
264
+ const originalHeight = getSafePositiveNumber(challenge === null || challenge === void 0 ? void 0 : challenge.originalHeight, DEFAULT_CHALLENGE_HEIGHT);
265
+ const blockWidth = getSafePositiveNumber(challenge === null || challenge === void 0 ? void 0 : challenge.blockWidth, DEFAULT_BLOCK_SIZE);
266
+ const blockHeight = getSafePositiveNumber(challenge === null || challenge === void 0 ? void 0 : challenge.blockHeight, blockWidth);
267
+ const canvasOuterWidth = canvasLayoutWidth > 0
268
+ ? canvasLayoutWidth
269
+ : Math.max(maxCardWidth - CARD_HORIZONTAL_PADDING * 2, 0);
270
+ // Use the drawable content box for coordinate mapping; including the border
271
+ // here introduces the exact sub-pixel Y drift seen when the puzzle piece joins.
272
+ const canvasContentWidth = Math.max(canvasOuterWidth - CANVAS_BORDER_WIDTH * 2, 0);
273
+ const scale = canvasContentWidth > 0 ? canvasContentWidth / originalWidth : 0;
274
+ const displayHeight = Math.max((canvasContentWidth * originalHeight) / originalWidth, 0) + CANVAS_BORDER_WIDTH * 2;
275
+ const blockDisplayWidth = blockWidth * scale;
276
+ const blockDisplayHeight = blockHeight * scale;
277
+ const blockTop = Math.max(0, ((_a = challenge === null || challenge === void 0 ? void 0 : challenge.blockY) !== null && _a !== void 0 ? _a : 0) * scale);
278
+ const maxBlockOffset = Math.max(canvasContentWidth - blockDisplayWidth, 0);
279
+ const maxThumbOffset = Math.max(canvasOuterWidth - SLIDER_THUMB_SIZE, 0);
280
+ const blockTranslateRatio = maxThumbOffset > 0 ? maxBlockOffset / maxThumbOffset : 0;
281
+ const isBusy = status === 'loading' || status === 'verifying';
282
+ const canSlide = visible && Boolean(challenge) && !isBusy;
283
+ const backgroundImageUri = normalizeImageUri((_b = challenge === null || challenge === void 0 ? void 0 : challenge.backgroundImage) !== null && _b !== void 0 ? _b : '');
284
+ const blockImageUri = normalizeImageUri((_c = challenge === null || challenge === void 0 ? void 0 : challenge.blockImage) !== null && _c !== void 0 ? _c : '');
285
+ const requestChallenge = React.useCallback(async (reason) => {
286
+ if (!visibleRef.current)
287
+ return;
288
+ clearPendingTimeout();
289
+ if (reason === 'open') {
290
+ setChallenge(null);
291
+ }
292
+ setFeedbackMessage(undefined);
293
+ setStatus('loading');
294
+ const requestId = loadRequestIdRef.current + 1;
295
+ loadRequestIdRef.current = requestId;
296
+ try {
297
+ const nextChallenge = await loadChallenge({ reason });
298
+ if (!visibleRef.current || loadRequestIdRef.current !== requestId)
299
+ return;
300
+ setChallenge(nextChallenge);
301
+ resetThumbPosition();
302
+ setStatus('idle');
303
+ }
304
+ catch (error) {
305
+ if (!visibleRef.current || loadRequestIdRef.current !== requestId)
306
+ return;
307
+ setStatus('idle');
308
+ onError === null || onError === void 0 ? void 0 : onError(error, { stage: 'load', reason });
309
+ }
310
+ }, [clearPendingTimeout, loadChallenge, onError, resetThumbPosition]);
311
+ const verifyCurrentChallenge = React.useCallback(async () => {
312
+ var _a, _b;
313
+ if (!challenge || isBusy)
314
+ return;
315
+ clearPendingTimeout();
316
+ setFeedbackMessage(undefined);
317
+ setStatus('verifying');
318
+ const progress = maxThumbOffset > 0 ? thumbXRef.current / maxThumbOffset : 0;
319
+ const displayOffsetX = progress * maxBlockOffset;
320
+ const offsetX = scale > 0 ? Math.round(displayOffsetX / scale) : 0;
321
+ const payload = {
322
+ challenge,
323
+ offsetX,
324
+ offsetY: challenge.blockY,
325
+ displayOffsetX,
326
+ progress,
327
+ scale,
328
+ };
329
+ const requestId = verifyRequestIdRef.current + 1;
330
+ verifyRequestIdRef.current = requestId;
331
+ try {
332
+ const rawResult = await verifyChallenge(payload);
333
+ if (!visibleRef.current || verifyRequestIdRef.current !== requestId)
334
+ return;
335
+ const result = parseVerifyResult(rawResult);
336
+ if (result.success) {
337
+ setFeedbackMessage((_a = result.message) !== null && _a !== void 0 ? _a : resolvedTexts.verifySuccess);
338
+ setStatus('success');
339
+ timeoutRef.current = setTimeout(() => {
340
+ if (!visibleRef.current || verifyRequestIdRef.current !== requestId)
341
+ return;
342
+ onVerified === null || onVerified === void 0 ? void 0 : onVerified(payload);
343
+ }, successFeedbackDuration);
344
+ return;
345
+ }
346
+ setFeedbackMessage((_b = result.message) !== null && _b !== void 0 ? _b : resolvedTexts.verifyFailed);
347
+ setStatus('error');
348
+ timeoutRef.current = setTimeout(() => {
349
+ if (!visibleRef.current || verifyRequestIdRef.current !== requestId)
350
+ return;
351
+ void requestChallenge('retry');
352
+ }, errorFeedbackDuration);
353
+ }
354
+ catch (error) {
355
+ if (!visibleRef.current || verifyRequestIdRef.current !== requestId)
356
+ return;
357
+ setFeedbackMessage(resolvedTexts.verifyFailed);
358
+ setStatus('error');
359
+ onError === null || onError === void 0 ? void 0 : onError(error, { stage: 'verify', challenge });
360
+ timeoutRef.current = setTimeout(() => {
361
+ if (!visibleRef.current || verifyRequestIdRef.current !== requestId)
362
+ return;
363
+ void requestChallenge('retry');
364
+ }, errorFeedbackDuration);
365
+ }
366
+ }, [
367
+ challenge,
368
+ clearPendingTimeout,
369
+ errorFeedbackDuration,
370
+ isBusy,
371
+ maxBlockOffset,
372
+ maxThumbOffset,
373
+ onError,
374
+ onVerified,
375
+ requestChallenge,
376
+ resolvedTexts.verifyFailed,
377
+ resolvedTexts.verifySuccess,
378
+ scale,
379
+ successFeedbackDuration,
380
+ verifyChallenge,
381
+ ]);
382
+ React.useEffect(() => {
383
+ visibleRef.current = visible;
384
+ }, [visible]);
385
+ const handleDismissAnimationFinished = React.useCallback((animationId) => {
386
+ if (animationId !== visibilityAnimationIdRef.current || visibleRef.current)
387
+ return;
388
+ setMounted(false);
389
+ resetCaptchaState();
390
+ }, [resetCaptchaState]);
391
+ React.useEffect(() => {
392
+ if (visible && !mounted) {
393
+ setMounted(true);
394
+ }
395
+ }, [mounted, visible]);
396
+ React.useEffect(() => {
397
+ if (!mounted)
398
+ return;
399
+ clearPendingAnimationFrames();
400
+ (0, react_native_reanimated_1.cancelAnimation)(presentationProgress);
401
+ const animationId = visibilityAnimationIdRef.current + 1;
402
+ visibilityAnimationIdRef.current = animationId;
403
+ if (visible) {
404
+ setStatus('idle');
405
+ setFeedbackMessage(undefined);
406
+ resetThumbPosition();
407
+ const frameId = requestAnimationFrame(() => {
408
+ const nestedFrameId = requestAnimationFrame(() => {
409
+ if (visibilityAnimationIdRef.current !== animationId || !visibleRef.current)
410
+ return;
411
+ presentationProgress.value = (0, react_native_reanimated_1.withTiming)(1, {
412
+ duration: CAPTCHA_ENTER_DURATION,
413
+ easing: CAPTCHA_ENTER_EASING,
414
+ });
415
+ });
416
+ animationFrameRefs.current.push(nestedFrameId);
417
+ });
418
+ animationFrameRefs.current.push(frameId);
419
+ if (initialChallenge) {
420
+ setChallenge(initialChallenge);
421
+ }
422
+ else if (reloadOnOpen || challenge === null) {
423
+ void requestChallenge('open');
424
+ }
425
+ return () => {
426
+ clearPendingAnimationFrames();
427
+ };
428
+ }
429
+ loadRequestIdRef.current += 1;
430
+ verifyRequestIdRef.current += 1;
431
+ clearPendingTimeout();
432
+ setStatus('idle');
433
+ setFeedbackMessage(undefined);
434
+ presentationProgress.value = (0, react_native_reanimated_1.withTiming)(0, {
435
+ duration: CAPTCHA_EXIT_DURATION,
436
+ easing: CAPTCHA_EXIT_EASING,
437
+ }, (finished) => {
438
+ if (finished) {
439
+ (0, react_native_worklets_1.scheduleOnRN)(handleDismissAnimationFinished, animationId);
440
+ }
441
+ });
442
+ }, [
443
+ challenge,
444
+ clearPendingAnimationFrames,
445
+ clearPendingTimeout,
446
+ handleDismissAnimationFinished,
447
+ initialChallenge,
448
+ mounted,
449
+ presentationProgress,
450
+ reloadOnOpen,
451
+ requestChallenge,
452
+ resetThumbPosition,
453
+ visible,
454
+ ]);
455
+ React.useEffect(() => () => {
456
+ clearPendingAnimationFrames();
457
+ clearPendingTimeout();
458
+ (0, react_native_reanimated_1.cancelAnimation)(presentationProgress);
459
+ }, [clearPendingAnimationFrames, clearPendingTimeout, presentationProgress]);
460
+ React.useEffect(() => {
461
+ if (!visible || react_native_1.Platform.OS !== 'android')
462
+ return;
463
+ const subscription = react_native_1.BackHandler.addEventListener('hardwareBackPress', () => {
464
+ onClose();
465
+ return true;
466
+ });
467
+ return () => subscription.remove();
468
+ }, [onClose, visible]);
469
+ const handleCanvasLayout = React.useCallback((event) => {
470
+ const nextWidth = event.nativeEvent.layout.width;
471
+ if (!Number.isFinite(nextWidth) || nextWidth <= 0)
472
+ return;
473
+ setCanvasLayoutWidth((currentWidth) => {
474
+ if (Math.abs(currentWidth - nextWidth) < 0.5) {
475
+ return currentWidth;
476
+ }
477
+ return nextWidth;
478
+ });
479
+ }, []);
480
+ const handleRefresh = React.useCallback(() => {
481
+ if (!visible || isBusy)
482
+ return;
483
+ void requestChallenge('refresh');
484
+ }, [isBusy, requestChallenge, visible]);
485
+ const handleBackdropPress = React.useCallback(() => {
486
+ if (!visible || !dismissOnBackdropPress)
487
+ return;
488
+ onClose();
489
+ }, [dismissOnBackdropPress, onClose, visible]);
490
+ const handleRequestClose = React.useCallback(() => {
491
+ if (!visible)
492
+ return;
493
+ onClose();
494
+ }, [onClose, visible]);
495
+ const backdropAnimatedStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => ({
496
+ opacity: presentationProgress.value,
497
+ }));
498
+ const cardAnimatedStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => {
499
+ const progress = presentationProgress.value;
500
+ return {
501
+ opacity: progress,
502
+ transform: [
503
+ { translateY: (1 - progress) * CAPTCHA_CARD_OFFSET_Y },
504
+ { scale: 0.96 + progress * 0.04 },
505
+ ],
506
+ };
507
+ });
508
+ const thumbAnimatedStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => ({
509
+ transform: [{ translateX: thumbX.value }],
510
+ }));
511
+ const blockAnimatedStyle = (0, react_native_reanimated_1.useAnimatedStyle)(() => ({
512
+ transform: [{ translateX: thumbX.value * blockTranslateRatio }],
513
+ }));
514
+ const panResponder = React.useMemo(() => react_native_1.PanResponder.create({
515
+ onStartShouldSetPanResponder: () => canSlide,
516
+ onMoveShouldSetPanResponder: () => canSlide,
517
+ onPanResponderGrant: () => {
518
+ thumbStartRef.current = thumbXRef.current;
519
+ },
520
+ onPanResponderMove: (_event, gestureState) => {
521
+ if (!canSlide)
522
+ return;
523
+ const next = clamp(thumbStartRef.current + gestureState.dx, 0, maxThumbOffset);
524
+ thumbX.value = next;
525
+ thumbXRef.current = next;
526
+ },
527
+ onPanResponderRelease: () => {
528
+ void verifyCurrentChallenge();
529
+ },
530
+ }), [canSlide, maxThumbOffset, thumbX, verifyCurrentChallenge]);
531
+ if (!mounted)
532
+ return null;
533
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { pointerEvents: "box-none", style: styles.modalRoot, children: [(0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.View, { style: [styles.overlayBackdrop, backdropAnimatedStyle] }), (0, jsx_runtime_1.jsx)(react_native_1.Pressable, { style: styles.overlayPressable, onPress: handleBackdropPress, children: (0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.View, { style: [styles.cardContainer, cardAnimatedStyle], collapsable: false, renderToHardwareTextureAndroid: react_native_1.Platform.OS === 'android', shouldRasterizeIOS: react_native_1.Platform.OS === 'ios', needsOffscreenAlphaCompositing: react_native_1.Platform.OS === 'android', children: (0, jsx_runtime_1.jsxs)(react_native_1.Pressable, { style: [
534
+ styles.card,
535
+ {
536
+ maxWidth: maxCardWidth,
537
+ backgroundColor: theme.colors.surface,
538
+ shadowColor: theme.colors.onSurface,
539
+ },
540
+ cardStyle,
541
+ ], onPress: () => { }, collapsable: false, renderToHardwareTextureAndroid: react_native_1.Platform.OS === 'android', shouldRasterizeIOS: react_native_1.Platform.OS === 'ios', needsOffscreenAlphaCompositing: react_native_1.Platform.OS === 'android', children: [(0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.titleRow, children: [(0, jsx_runtime_1.jsx)(Text_1.Text, { style: [styles.title, { color: theme.colors.onSurface }], children: resolvedTexts.title }), (0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.headerActions, children: [(0, jsx_runtime_1.jsx)(react_native_1.Pressable, { style: [
542
+ styles.headerActionButton,
543
+ {
544
+ backgroundColor: theme.colors.surface,
545
+ borderColor: theme.colors.border,
546
+ borderWidth: (0, zkit_tools_1.wp)(0.5),
547
+ shadowColor: theme.colors.onSurface,
548
+ },
549
+ ], onPress: handleRefresh, disabled: !visible || isBusy, hitSlop: 10, children: isBusy ? ((0, jsx_runtime_1.jsx)(react_native_1.ActivityIndicator, { size: "small", color: theme.colors.muted })) : ((0, jsx_runtime_1.jsx)(vector_icons_1.Feather, { name: "refresh-cw", size: (0, zkit_tools_1.wp)(16), color: theme.colors.muted })) }), (0, jsx_runtime_1.jsx)(react_native_1.Pressable, { style: [
550
+ styles.headerActionButton,
551
+ styles.headerActionSpacing,
552
+ {
553
+ backgroundColor: theme.colors.secondary,
554
+ shadowColor: theme.colors.onSurface,
555
+ },
556
+ ], onPress: handleRequestClose, disabled: !visible, hitSlop: 10, children: (0, jsx_runtime_1.jsx)(vector_icons_1.Feather, { name: "x", size: (0, zkit_tools_1.wp)(18), color: theme.colors.muted }) })] })] }), (0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [
557
+ styles.canvasWrapper,
558
+ {
559
+ height: displayHeight,
560
+ backgroundColor: theme.colors.secondary,
561
+ borderColor: theme.colors.border,
562
+ },
563
+ ], onLayout: handleCanvasLayout, children: [backgroundImageUri ? ((0, jsx_runtime_1.jsx)(react_native_1.Image, { style: styles.canvasImage, resizeMode: "cover", source: { uri: backgroundImageUri } })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: [styles.canvasImage, styles.placeholder], children: (0, jsx_runtime_1.jsx)(react_native_1.ActivityIndicator, { size: "small", color: theme.colors.muted }) })), blockImageUri ? ((0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.View, { pointerEvents: "none", style: [
564
+ styles.block,
565
+ {
566
+ top: blockTop,
567
+ width: blockDisplayWidth,
568
+ height: blockDisplayHeight,
569
+ },
570
+ blockAnimatedStyle,
571
+ ], children: (0, jsx_runtime_1.jsx)(react_native_1.Image, { style: styles.canvasImage, resizeMode: "cover", source: { uri: blockImageUri } }) })) : null, (status === 'error' || status === 'success') && feedbackMessage ? ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: [
572
+ styles.feedbackOverlay,
573
+ status === 'error' ? styles.feedbackError : styles.feedbackSuccess,
574
+ ], children: (0, jsx_runtime_1.jsx)(Text_1.Text, { style: styles.feedbackText, children: feedbackMessage }) })) : null] }), (0, jsx_runtime_1.jsx)(react_native_1.View, { style: [
575
+ styles.sliderTrack,
576
+ { backgroundColor: theme.colors.secondary, borderColor: theme.colors.border },
577
+ ], ...panResponder.panHandlers, children: (0, jsx_runtime_1.jsx)(react_native_reanimated_1.default.View, { style: [
578
+ styles.sliderThumb,
579
+ thumbAnimatedStyle,
580
+ {
581
+ backgroundColor: theme.colors.primary,
582
+ borderColor: 'rgba(0,0,0,0.04)',
583
+ shadowColor: theme.colors.onSurface,
584
+ },
585
+ ], children: isBusy ? ((0, jsx_runtime_1.jsx)(react_native_1.ActivityIndicator, { size: "small", color: theme.colors.onPrimary })) : ((0, jsx_runtime_1.jsx)(vector_icons_1.Feather, { name: "arrow-right", size: (0, zkit_tools_1.wp)(20), color: theme.colors.onPrimary })) }) })] }) }) })] }));
586
+ }
@@ -0,0 +1,72 @@
1
+ import * as React from 'react';
2
+ import type { StyleProp, TextStyle, ViewStyle } from 'react-native';
3
+ import { Pressable, View } from 'react-native';
4
+ export type SwitchSize = 'sm' | 'md' | 'lg';
5
+ export type SwitchTone = 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'info';
6
+ export type SwitchLabelPlacement = 'start' | 'end';
7
+ export type SwitchStateText = {
8
+ checked?: string;
9
+ unchecked?: string;
10
+ };
11
+ export type SwitchLayout = {
12
+ width?: number;
13
+ height?: number;
14
+ thumbInset?: number;
15
+ radius?: number;
16
+ labelGap?: number;
17
+ textInset?: number;
18
+ textSize?: number;
19
+ textLineHeight?: number;
20
+ };
21
+ export type SwitchColors = {
22
+ checkedTrack?: string;
23
+ uncheckedTrack?: string;
24
+ thumb?: string;
25
+ checkedThumb?: string;
26
+ uncheckedThumb?: string;
27
+ checkedText?: string;
28
+ uncheckedText?: string;
29
+ focusRing?: string;
30
+ loading?: string;
31
+ };
32
+ export type SwitchSlotProps = {
33
+ checked: boolean;
34
+ disabled: boolean;
35
+ loading: boolean;
36
+ interactive: boolean;
37
+ size: SwitchSize;
38
+ tone: SwitchTone;
39
+ toggle: () => void;
40
+ };
41
+ type NativePressableProps = Omit<React.ComponentPropsWithoutRef<typeof Pressable>, 'accessibilityRole' | 'accessibilityState' | 'children' | 'disabled' | 'style' | 'onChange'>;
42
+ export type SwitchRef = React.ComponentRef<typeof Pressable>;
43
+ export interface SwitchProps extends NativePressableProps {
44
+ checked?: boolean;
45
+ defaultChecked?: boolean;
46
+ onCheckedChange?: (checked: boolean) => void;
47
+ disabled?: boolean;
48
+ loading?: boolean;
49
+ loadingIndicator?: React.ReactNode;
50
+ size?: SwitchSize;
51
+ tone?: SwitchTone;
52
+ duration?: number;
53
+ color?: string;
54
+ colors?: SwitchColors;
55
+ layout?: SwitchLayout;
56
+ stateText?: SwitchStateText;
57
+ label?: React.ReactNode;
58
+ description?: React.ReactNode;
59
+ labelPlacement?: SwitchLabelPlacement;
60
+ children?: React.ReactNode | ((slot: SwitchSlotProps) => React.ReactNode);
61
+ style?: React.ComponentPropsWithoutRef<typeof Pressable>['style'];
62
+ contentStyle?: StyleProp<ViewStyle>;
63
+ trackStyle?: StyleProp<ViewStyle>;
64
+ thumbStyle?: StyleProp<ViewStyle>;
65
+ labelStyle?: StyleProp<TextStyle>;
66
+ descriptionStyle?: StyleProp<TextStyle>;
67
+ stateTextStyle?: StyleProp<TextStyle>;
68
+ accessibilityState?: React.ComponentPropsWithoutRef<typeof Pressable>['accessibilityState'];
69
+ }
70
+ export declare const Switch: React.NamedExoticComponent<SwitchProps & React.RefAttributes<View>>;
71
+ export {};
72
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/Switch/index.tsx"],"names":[],"mappings":"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"}