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,710 @@
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.AddressCascader = void 0;
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_safe_area_context_1 = require("react-native-safe-area-context");
42
+ const zkit_tools_1 = require("zkit-tools");
43
+ const useI18n_1 = require("../../i18n/useI18n");
44
+ const useTheme_1 = require("../../theme/useTheme");
45
+ const Sheet_1 = require("../Sheet");
46
+ const Text_1 = require("../Text");
47
+ const actionBar_1 = require("../Picker/actionBar");
48
+ const area_data_1 = require("@vant/area-data");
49
+ // 懒加载转换省市区数据。
50
+ let cachedAreaData = null;
51
+ function getAreaData() {
52
+ if (cachedAreaData)
53
+ return cachedAreaData;
54
+ const { province_list, city_list, county_list } = area_data_1.areaList;
55
+ const countiesByCity = new Map();
56
+ for (const [countyCode, countyName] of Object.entries(county_list)) {
57
+ const cityPrefix = countyCode.slice(0, 4);
58
+ const county = { value: countyCode, text: String(countyName) };
59
+ const counties = countiesByCity.get(cityPrefix);
60
+ if (counties) {
61
+ counties.push(county);
62
+ }
63
+ else {
64
+ countiesByCity.set(cityPrefix, [county]);
65
+ }
66
+ }
67
+ const citiesByProvince = new Map();
68
+ for (const [cityCode, cityName] of Object.entries(city_list)) {
69
+ const provincePrefix = cityCode.slice(0, 2);
70
+ const children = countiesByCity.get(cityCode.slice(0, 4));
71
+ const city = (children === null || children === void 0 ? void 0 : children.length)
72
+ ? { value: cityCode, text: String(cityName), children }
73
+ : { value: cityCode, text: String(cityName) };
74
+ const cities = citiesByProvince.get(provincePrefix);
75
+ if (cities) {
76
+ cities.push(city);
77
+ }
78
+ else {
79
+ citiesByProvince.set(provincePrefix, [city]);
80
+ }
81
+ }
82
+ const provinces = Object.entries(province_list).map(([provinceCode, provinceName]) => {
83
+ const children = citiesByProvince.get(provinceCode.slice(0, 2));
84
+ return (children === null || children === void 0 ? void 0 : children.length)
85
+ ? { value: provinceCode, text: String(provinceName), children }
86
+ : { value: provinceCode, text: String(provinceName) };
87
+ });
88
+ cachedAreaData = provinces;
89
+ return provinces;
90
+ }
91
+ const MAX_LEVELS = 3;
92
+ const LEVELS = Array.from({ length: MAX_LEVELS }, (_, level) => level);
93
+ const LIST_FADE_DURATION = 180;
94
+ const LIST_FADE_START_OPACITY = 0.58;
95
+ const OPTION_ROW_ESTIMATED_HEIGHT = (0, zkit_tools_1.wp)(58);
96
+ const SELECTED_OPTION_VIEW_POSITION = 0.18;
97
+ function clampNumber(n, min, max) {
98
+ return Math.max(min, Math.min(max, n));
99
+ }
100
+ function pickPrimitive(node, keys, fallback) {
101
+ for (const key of keys) {
102
+ const v = node === null || node === void 0 ? void 0 : node[key];
103
+ if (typeof v === 'string' || typeof v === 'number')
104
+ return v;
105
+ }
106
+ return fallback;
107
+ }
108
+ function pickValue(node, fallbackIndex) {
109
+ var _a;
110
+ const fallback = fallbackIndex == null ? undefined : String(fallbackIndex);
111
+ return String((_a = pickPrimitive(node, ['value', 'id', 'code', 'key'], fallback)) !== null && _a !== void 0 ? _a : '');
112
+ }
113
+ function pickText(node) {
114
+ const v = pickPrimitive(node, ['text', 'label', 'title', 'name']);
115
+ return v == null ? '' : String(v);
116
+ }
117
+ function getChildren(node) {
118
+ return Array.isArray(node === null || node === void 0 ? void 0 : node.children) ? node.children : [];
119
+ }
120
+ function hasNextLevel(node, level) {
121
+ return level < MAX_LEVELS - 1 && getChildren(node).length > 0;
122
+ }
123
+ function buildLabel(labels, separator) {
124
+ return labels.filter(Boolean).join(separator);
125
+ }
126
+ function resolvePath(list, value) {
127
+ const nextValue = [];
128
+ const labels = [];
129
+ const items = [];
130
+ let currentList = Array.isArray(list) ? list : [];
131
+ for (let level = 0; level < MAX_LEVELS; level += 1) {
132
+ const desired = value === null || value === void 0 ? void 0 : value[level];
133
+ if (desired == null || !currentList.length)
134
+ break;
135
+ const idx = currentList.findIndex((item, index) => pickValue(item, index) === String(desired));
136
+ if (idx < 0)
137
+ break;
138
+ const item = currentList[idx];
139
+ if (!item)
140
+ break;
141
+ nextValue.push(pickValue(item, idx));
142
+ labels.push(pickText(item));
143
+ items.push(item);
144
+ currentList = getChildren(item);
145
+ }
146
+ return { value: nextValue, labels, items };
147
+ }
148
+ function getActiveLevelFromItems(items) {
149
+ if (!items.length)
150
+ return 0;
151
+ const lastIndex = Math.min(items.length - 1, MAX_LEVELS - 1);
152
+ const lastItem = items[lastIndex];
153
+ if (hasNextLevel(lastItem, lastIndex) && items.length < MAX_LEVELS)
154
+ return items.length;
155
+ return lastIndex;
156
+ }
157
+ function createDraft(list, value) {
158
+ const resolved = resolvePath(list, value);
159
+ return {
160
+ ...resolved,
161
+ activeLevel: getActiveLevelFromItems(resolved.items),
162
+ };
163
+ }
164
+ function getListForLevel(list, items, level) {
165
+ let currentList = Array.isArray(list) ? list : [];
166
+ for (let i = 0; i < level; i += 1) {
167
+ const next = getChildren(items[i]);
168
+ if (!next.length)
169
+ return [];
170
+ currentList = next;
171
+ }
172
+ return currentList;
173
+ }
174
+ function isCompleteDraft(draft) {
175
+ if (!draft.items.length)
176
+ return false;
177
+ const lastLevel = draft.items.length - 1;
178
+ const lastItem = draft.items[lastLevel];
179
+ return !hasNextLevel(lastItem, lastLevel);
180
+ }
181
+ function composeTrigger(children, onPress, disabled, ctx) {
182
+ if (typeof children === 'function') {
183
+ const node = children(ctx);
184
+ return composeTrigger(node, onPress, disabled, ctx);
185
+ }
186
+ if (React.isValidElement(children)) {
187
+ const child = children;
188
+ const prevOnPress = child.props.onPress;
189
+ if (typeof prevOnPress === 'function') {
190
+ return React.cloneElement(child, {
191
+ onPress: (...args) => {
192
+ prevOnPress(...args);
193
+ onPress();
194
+ },
195
+ disabled: disabled || child.props.disabled,
196
+ });
197
+ }
198
+ return React.cloneElement(child, {
199
+ onPress,
200
+ disabled: disabled || child.props.disabled,
201
+ });
202
+ }
203
+ return ((0, jsx_runtime_1.jsx)(react_native_1.Pressable, { onPress: onPress, disabled: disabled, children: children }));
204
+ }
205
+ const AddressOptionRow = React.memo(function AddressOptionRow({ option, selected, disabled, primaryColor, onSurfaceColor, mutedColor, onPress, onLayout, }) {
206
+ const handlePress = React.useCallback(() => {
207
+ onPress(option.item, option.index, option.level);
208
+ }, [onPress, option]);
209
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.Pressable, { accessibilityRole: "button", disabled: disabled || option.disabled, onLayout: onLayout, onPress: handlePress, style: ({ pressed }) => [
210
+ styles.optionRow,
211
+ {
212
+ opacity: option.disabled ? 0.46 : pressed ? 0.78 : 1,
213
+ },
214
+ ], children: [(0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.optionMain, children: (0, jsx_runtime_1.jsx)(Text_1.Text, { numberOfLines: 2, style: [
215
+ styles.optionText,
216
+ {
217
+ color: selected ? primaryColor : onSurfaceColor,
218
+ fontWeight: selected ? '700' : '500',
219
+ },
220
+ ], children: option.text }) }), (0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.optionMark, children: selected ? ((0, jsx_runtime_1.jsx)(vector_icons_1.Feather, { name: "check", size: (0, zkit_tools_1.wp)(19), color: primaryColor })) : option.hasChildren ? ((0, jsx_runtime_1.jsx)(vector_icons_1.Feather, { name: "chevron-right", size: (0, zkit_tools_1.wp)(18), color: mutedColor })) : null })] }));
221
+ });
222
+ exports.AddressCascader = React.forwardRef(function AddressCascader({ list, value: valueProp, defaultValue, onValueChange, open: openProp, defaultOpen = false, onOpenChange, onDismissComplete, label: labelProp, defaultLabel, onLabelChange, title, separator = ' / ', levelLabels, lazyContent = true, drawerSize, disabled = false, onCancel, onConfirm, onChange, children, }, ref) {
223
+ const { t } = (0, useI18n_1.useI18n)();
224
+ const theme = (0, useTheme_1.useTheme)();
225
+ const { height: screenH } = (0, react_native_1.useWindowDimensions)();
226
+ const insets = (0, react_native_safe_area_context_1.useSafeAreaInsets)();
227
+ const safeBottom = (0, actionBar_1.getPickerActionBarBottomInset)(insets.bottom);
228
+ const areaData = React.useMemo(() => list !== null && list !== void 0 ? list : getAreaData(), [list]);
229
+ const isValueControlled = valueProp !== undefined;
230
+ const [innerValue, setInnerValue] = React.useState(defaultValue);
231
+ const value = valueProp !== undefined ? valueProp : innerValue;
232
+ const [innerOpen, setInnerOpen] = React.useState(defaultOpen);
233
+ const isOpenControlled = openProp !== undefined;
234
+ const visible = openProp !== undefined ? !!openProp : innerOpen;
235
+ const [contentMounted, setContentMounted] = React.useState(() => !lazyContent || visible);
236
+ const [innerLabel, setInnerLabel] = React.useState(defaultLabel !== null && defaultLabel !== void 0 ? defaultLabel : '');
237
+ const [draft, setDraft] = React.useState(() => createDraft(areaData, value));
238
+ const draftRef = React.useRef(draft);
239
+ draftRef.current = draft;
240
+ const defaultLevelLabels = React.useMemo(() => [
241
+ t('addressCascader.province'),
242
+ t('addressCascader.city'),
243
+ t('addressCascader.district'),
244
+ ], [t]);
245
+ const resolvedLevelLabels = React.useMemo(() => {
246
+ const next = (levelLabels === null || levelLabels === void 0 ? void 0 : levelLabels.length) ? levelLabels : defaultLevelLabels;
247
+ return Array.from({ length: MAX_LEVELS }, (_, i) => { var _a, _b; return (_b = (_a = next[i]) !== null && _a !== void 0 ? _a : defaultLevelLabels[i]) !== null && _b !== void 0 ? _b : ''; });
248
+ }, [defaultLevelLabels, levelLabels]);
249
+ React.useEffect(() => {
250
+ const nextDraft = createDraft(areaData, value);
251
+ draftRef.current = nextDraft;
252
+ setDraft(nextDraft);
253
+ }, [areaData, value]);
254
+ React.useEffect(() => {
255
+ if (visible) {
256
+ const nextDraft = createDraft(areaData, value);
257
+ draftRef.current = nextDraft;
258
+ setDraft(nextDraft);
259
+ if (lazyContent)
260
+ setContentMounted(true);
261
+ }
262
+ // 这里只希望在进入打开态时重置草稿和挂载懒加载内容。
263
+ // eslint-disable-next-line react-hooks/exhaustive-deps
264
+ }, [visible]);
265
+ const sheetHeight = React.useMemo(() => {
266
+ const maxHeight = Math.max((0, zkit_tools_1.wp)(320), screenH - Math.max(insets.top, (0, zkit_tools_1.wp)(24)));
267
+ const n = typeof drawerSize === 'number' ? drawerSize : drawerSize == null ? undefined : Number.parseFloat(drawerSize);
268
+ if (n != null && Number.isFinite(n) && n > 0) {
269
+ return clampNumber(n, Math.min((0, zkit_tools_1.wp)(360), maxHeight), maxHeight);
270
+ }
271
+ return clampNumber(screenH * 0.72, Math.min((0, zkit_tools_1.wp)(430), maxHeight), maxHeight);
272
+ }, [drawerSize, insets.top, screenH]);
273
+ const detents = React.useMemo(() => [clampNumber(sheetHeight / screenH, 0.1, 0.92)], [screenH, sheetHeight]);
274
+ const setCascaderOpen = React.useCallback((nextOpen) => {
275
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(nextOpen);
276
+ if (!isOpenControlled)
277
+ setInnerOpen(nextOpen);
278
+ }, [isOpenControlled, onOpenChange]);
279
+ const close = React.useCallback(() => {
280
+ setCascaderOpen(false);
281
+ }, [setCascaderOpen]);
282
+ const openPicker = React.useCallback(() => {
283
+ if (disabled)
284
+ return;
285
+ if (!visible) {
286
+ setCascaderOpen(true);
287
+ }
288
+ const nextDraft = createDraft(areaData, value);
289
+ draftRef.current = nextDraft;
290
+ setDraft(nextDraft);
291
+ if (lazyContent)
292
+ setContentMounted(true);
293
+ }, [areaData, disabled, lazyContent, setCascaderOpen, value, visible]);
294
+ React.useImperativeHandle(ref, () => ({
295
+ open: openPicker,
296
+ close,
297
+ }), [close, openPicker]);
298
+ const committed = React.useMemo(() => resolvePath(areaData, value), [areaData, value]);
299
+ const committedLabel = React.useMemo(() => buildLabel(committed.labels, separator), [committed.labels, separator]);
300
+ const effectiveLabel = labelProp !== undefined ? labelProp : committedLabel || innerLabel;
301
+ const effectiveCtx = React.useMemo(() => ({
302
+ value: committed.value,
303
+ label: effectiveLabel,
304
+ labels: committed.labels,
305
+ items: committed.items,
306
+ }), [committed.items, committed.labels, committed.value, effectiveLabel]);
307
+ const currentList = React.useMemo(() => getListForLevel(areaData, draft.items, draft.activeLevel), [areaData, draft.activeLevel, draft.items]);
308
+ const currentOptions = React.useMemo(() => currentList.map((item, index) => ({
309
+ item,
310
+ index,
311
+ level: draft.activeLevel,
312
+ value: pickValue(item, index),
313
+ text: pickText(item),
314
+ disabled: !!item.disabled,
315
+ hasChildren: hasNextLevel(item, draft.activeLevel),
316
+ })), [currentList, draft.activeLevel]);
317
+ const activeSelectedValue = draft.value[draft.activeLevel];
318
+ const activeSelectedIndex = React.useMemo(() => currentOptions.findIndex((item) => item.value === activeSelectedValue), [activeSelectedValue, currentOptions]);
319
+ const currentOptionsRef = React.useRef(currentOptions);
320
+ const activeSelectedIndexRef = React.useRef(activeSelectedIndex);
321
+ currentOptionsRef.current = currentOptions;
322
+ activeSelectedIndexRef.current = activeSelectedIndex;
323
+ const confirmDisabled = disabled || !isCompleteDraft(draft);
324
+ const stepsScrollRef = React.useRef(null);
325
+ const optionsScrollRef = React.useRef(null);
326
+ const optionLayoutYRef = React.useRef(new Map());
327
+ const optionsViewportHeightRef = React.useRef(0);
328
+ const pendingOptionScrollFrameRef = React.useRef(null);
329
+ const pendingActiveOptionScrollRef = React.useRef(false);
330
+ const listOpacity = React.useRef(new react_native_1.Animated.Value(1)).current;
331
+ const pendingListTransitionFrameRef = React.useRef(null);
332
+ const previousActiveLevelRef = React.useRef(draft.activeLevel);
333
+ const listAnimatedStyle = React.useMemo(() => ({
334
+ opacity: listOpacity,
335
+ }), [listOpacity]);
336
+ React.useEffect(() => {
337
+ const rafId = requestAnimationFrame(() => {
338
+ var _a, _b;
339
+ if (draft.activeLevel <= 0) {
340
+ (_a = stepsScrollRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({ x: 0, animated: true });
341
+ return;
342
+ }
343
+ (_b = stepsScrollRef.current) === null || _b === void 0 ? void 0 : _b.scrollToEnd({ animated: true });
344
+ });
345
+ return () => cancelAnimationFrame(rafId);
346
+ }, [draft.activeLevel]);
347
+ const cancelListTransitionFrame = React.useCallback(() => {
348
+ if (pendingListTransitionFrameRef.current == null)
349
+ return;
350
+ cancelAnimationFrame(pendingListTransitionFrameRef.current);
351
+ pendingListTransitionFrameRef.current = null;
352
+ }, []);
353
+ const resetListTransition = React.useCallback(() => {
354
+ cancelListTransitionFrame();
355
+ listOpacity.stopAnimation();
356
+ listOpacity.setValue(1);
357
+ }, [cancelListTransitionFrame, listOpacity]);
358
+ const startListTransition = React.useCallback((fromLevel, toLevel) => {
359
+ previousActiveLevelRef.current = toLevel;
360
+ if (!visible || !contentMounted || fromLevel === toLevel) {
361
+ resetListTransition();
362
+ return;
363
+ }
364
+ cancelListTransitionFrame();
365
+ listOpacity.stopAnimation();
366
+ listOpacity.setValue(LIST_FADE_START_OPACITY);
367
+ pendingListTransitionFrameRef.current = requestAnimationFrame(() => {
368
+ pendingListTransitionFrameRef.current = null;
369
+ react_native_1.Animated.timing(listOpacity, {
370
+ toValue: 1,
371
+ duration: LIST_FADE_DURATION,
372
+ easing: react_native_1.Easing.out(react_native_1.Easing.cubic),
373
+ useNativeDriver: true,
374
+ }).start();
375
+ });
376
+ }, [
377
+ cancelListTransitionFrame,
378
+ contentMounted,
379
+ listOpacity,
380
+ resetListTransition,
381
+ visible,
382
+ ]);
383
+ React.useEffect(() => {
384
+ if (!visible || !contentMounted) {
385
+ previousActiveLevelRef.current = draft.activeLevel;
386
+ resetListTransition();
387
+ return;
388
+ }
389
+ if (previousActiveLevelRef.current !== draft.activeLevel) {
390
+ previousActiveLevelRef.current = draft.activeLevel;
391
+ resetListTransition();
392
+ }
393
+ }, [contentMounted, draft.activeLevel, resetListTransition, visible]);
394
+ React.useEffect(() => {
395
+ return resetListTransition;
396
+ }, [resetListTransition]);
397
+ const keyExtractor = React.useCallback((item) => `${item.level}-${item.value}-${item.index}`, []);
398
+ const scrollActiveOptionIntoView = React.useCallback((animated) => {
399
+ const scrollView = optionsScrollRef.current;
400
+ if (!scrollView)
401
+ return;
402
+ const activeIndex = activeSelectedIndexRef.current;
403
+ if (activeIndex <= 0) {
404
+ scrollView.scrollTo({ y: 0, animated });
405
+ return;
406
+ }
407
+ const activeOption = currentOptionsRef.current[activeIndex];
408
+ if (!activeOption)
409
+ return;
410
+ const key = keyExtractor(activeOption);
411
+ const layoutY = optionLayoutYRef.current.get(key);
412
+ const viewportHeight = optionsViewportHeightRef.current;
413
+ const fallbackY = activeIndex * OPTION_ROW_ESTIMATED_HEIGHT;
414
+ const measuredY = layoutY !== null && layoutY !== void 0 ? layoutY : fallbackY;
415
+ const viewOffset = viewportHeight > 0 ? viewportHeight * SELECTED_OPTION_VIEW_POSITION : 0;
416
+ scrollView.scrollTo({
417
+ y: Math.max(0, measuredY - viewOffset),
418
+ animated,
419
+ });
420
+ }, [keyExtractor]);
421
+ const scheduleActiveOptionScroll = React.useCallback((animated = false) => {
422
+ if (!visible || !contentMounted || !pendingActiveOptionScrollRef.current)
423
+ return;
424
+ if (pendingOptionScrollFrameRef.current != null) {
425
+ cancelAnimationFrame(pendingOptionScrollFrameRef.current);
426
+ }
427
+ pendingOptionScrollFrameRef.current = requestAnimationFrame(() => {
428
+ pendingOptionScrollFrameRef.current = null;
429
+ if (!pendingActiveOptionScrollRef.current)
430
+ return;
431
+ pendingActiveOptionScrollRef.current = false;
432
+ scrollActiveOptionIntoView(animated);
433
+ });
434
+ }, [contentMounted, scrollActiveOptionIntoView, visible]);
435
+ React.useEffect(() => {
436
+ optionLayoutYRef.current.clear();
437
+ }, [currentOptions]);
438
+ React.useEffect(() => {
439
+ if (!visible || !contentMounted) {
440
+ pendingActiveOptionScrollRef.current = false;
441
+ return;
442
+ }
443
+ pendingActiveOptionScrollRef.current = true;
444
+ scheduleActiveOptionScroll(false);
445
+ return () => {
446
+ if (pendingOptionScrollFrameRef.current != null) {
447
+ cancelAnimationFrame(pendingOptionScrollFrameRef.current);
448
+ pendingOptionScrollFrameRef.current = null;
449
+ }
450
+ };
451
+ }, [contentMounted, draft.activeLevel, scheduleActiveOptionScroll, visible]);
452
+ const emitDraftChange = React.useCallback((nextDraft) => {
453
+ const label = buildLabel(nextDraft.labels, separator);
454
+ onChange === null || onChange === void 0 ? void 0 : onChange({
455
+ value: nextDraft.value,
456
+ values: nextDraft.value,
457
+ label,
458
+ labels: nextDraft.labels,
459
+ items: nextDraft.items,
460
+ });
461
+ }, [onChange, separator]);
462
+ const handleLevelPress = React.useCallback((level) => {
463
+ if (disabled)
464
+ return;
465
+ const prevDraft = draftRef.current;
466
+ if (level !== 0 && !prevDraft.items[level - 1])
467
+ return;
468
+ if (prevDraft.activeLevel === level)
469
+ return;
470
+ const nextDraft = { ...prevDraft, activeLevel: level };
471
+ startListTransition(prevDraft.activeLevel, nextDraft.activeLevel);
472
+ draftRef.current = nextDraft;
473
+ setDraft(nextDraft);
474
+ }, [disabled, startListTransition]);
475
+ const handleItemPress = React.useCallback((item, index, level) => {
476
+ if (disabled || item.disabled)
477
+ return;
478
+ const prevDraft = draftRef.current;
479
+ if (level !== prevDraft.activeLevel)
480
+ return;
481
+ const nextItems = prevDraft.items.slice(0, level);
482
+ const nextLabels = prevDraft.labels.slice(0, level);
483
+ const nextValue = prevDraft.value.slice(0, level);
484
+ nextItems[level] = item;
485
+ nextLabels[level] = pickText(item);
486
+ nextValue[level] = pickValue(item, index);
487
+ const nextDraft = {
488
+ value: nextValue,
489
+ labels: nextLabels,
490
+ items: nextItems,
491
+ activeLevel: hasNextLevel(item, level) ? level + 1 : level,
492
+ };
493
+ if (prevDraft.activeLevel !== nextDraft.activeLevel) {
494
+ startListTransition(prevDraft.activeLevel, nextDraft.activeLevel);
495
+ }
496
+ draftRef.current = nextDraft;
497
+ setDraft(nextDraft);
498
+ emitDraftChange(nextDraft);
499
+ }, [disabled, emitDraftChange, startListTransition]);
500
+ const handleCancel = React.useCallback(() => {
501
+ onCancel === null || onCancel === void 0 ? void 0 : onCancel();
502
+ close();
503
+ }, [close, onCancel]);
504
+ const handleConfirm = React.useCallback(() => {
505
+ if (confirmDisabled)
506
+ return;
507
+ const label = buildLabel(draft.labels, separator);
508
+ const payload = {
509
+ value: draft.value,
510
+ values: draft.value,
511
+ label,
512
+ labels: draft.labels,
513
+ items: draft.items,
514
+ };
515
+ onLabelChange === null || onLabelChange === void 0 ? void 0 : onLabelChange(label);
516
+ if (labelProp === undefined)
517
+ setInnerLabel(label);
518
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(draft.value);
519
+ if (!isValueControlled)
520
+ setInnerValue(draft.value);
521
+ onConfirm === null || onConfirm === void 0 ? void 0 : onConfirm(payload);
522
+ close();
523
+ }, [
524
+ close,
525
+ confirmDisabled,
526
+ draft.items,
527
+ draft.labels,
528
+ draft.value,
529
+ isValueControlled,
530
+ labelProp,
531
+ onConfirm,
532
+ onLabelChange,
533
+ onValueChange,
534
+ separator,
535
+ ]);
536
+ const handleSheetOpenChange = React.useCallback((nextOpen, meta) => {
537
+ if (!nextOpen && visible && meta.reason !== 'api') {
538
+ onCancel === null || onCancel === void 0 ? void 0 : onCancel();
539
+ }
540
+ setCascaderOpen(nextOpen);
541
+ }, [onCancel, setCascaderOpen, visible]);
542
+ const handleSheetDismissComplete = React.useCallback(() => {
543
+ if (lazyContent)
544
+ setContentMounted(false);
545
+ onDismissComplete === null || onDismissComplete === void 0 ? void 0 : onDismissComplete();
546
+ }, [lazyContent, onDismissComplete]);
547
+ const triggerNode = React.useMemo(() => (children != null ? composeTrigger(children, openPicker, disabled, effectiveCtx) : null), [children, disabled, effectiveCtx, openPicker]);
548
+ const renderStep = React.useCallback((level) => {
549
+ const selected = draft.labels[level];
550
+ const isActive = draft.activeLevel === level;
551
+ const enabled = level === 0 || !!draft.items[level - 1];
552
+ return ((0, jsx_runtime_1.jsxs)(React.Fragment, { children: [level > 0 ? (0, jsx_runtime_1.jsx)(vector_icons_1.Feather, { name: "chevron-right", size: (0, zkit_tools_1.wp)(14), color: theme.colors.muted }) : null, (0, jsx_runtime_1.jsx)(react_native_1.Pressable, { accessibilityRole: "button", disabled: !enabled || disabled, onPress: () => handleLevelPress(level), style: ({ pressed }) => [
553
+ styles.stepPill,
554
+ {
555
+ backgroundColor: isActive ? theme.colors.secondary : theme.colors.surface,
556
+ borderColor: isActive ? theme.colors.secondary : theme.colors.border,
557
+ opacity: enabled ? (pressed ? 0.78 : 1) : 0.45,
558
+ },
559
+ ], children: (0, jsx_runtime_1.jsx)(Text_1.Text, { numberOfLines: 1, style: [
560
+ styles.stepText,
561
+ { color: isActive || selected ? theme.colors.onSurface : theme.colors.muted },
562
+ ], children: selected || resolvedLevelLabels[level] }) })] }, `step-${level}`));
563
+ }, [
564
+ disabled,
565
+ draft.activeLevel,
566
+ draft.items,
567
+ draft.labels,
568
+ handleLevelPress,
569
+ resolvedLevelLabels,
570
+ theme.colors.border,
571
+ theme.colors.muted,
572
+ theme.colors.onSurface,
573
+ theme.colors.secondary,
574
+ theme.colors.surface,
575
+ ]);
576
+ const handleOptionLayout = React.useCallback((key, event) => {
577
+ optionLayoutYRef.current.set(key, event.nativeEvent.layout.y);
578
+ scheduleActiveOptionScroll(false);
579
+ }, [scheduleActiveOptionScroll]);
580
+ const handleOptionsContentSizeChange = React.useCallback(() => {
581
+ scheduleActiveOptionScroll(false);
582
+ }, [scheduleActiveOptionScroll]);
583
+ const handleOptionsViewportLayout = React.useCallback((event) => {
584
+ optionsViewportHeightRef.current = event.nativeEvent.layout.height;
585
+ scheduleActiveOptionScroll(false);
586
+ }, [scheduleActiveOptionScroll]);
587
+ const renderOption = React.useCallback((item) => {
588
+ const key = keyExtractor(item);
589
+ const selected = item.value === activeSelectedValue;
590
+ return ((0, jsx_runtime_1.jsx)(AddressOptionRow, { option: item, selected: selected, disabled: disabled, primaryColor: theme.colors.primary, onSurfaceColor: theme.colors.onSurface, mutedColor: theme.colors.muted, onPress: handleItemPress, onLayout: selected ? (event) => handleOptionLayout(key, event) : undefined }));
591
+ }, [
592
+ activeSelectedValue,
593
+ disabled,
594
+ handleOptionLayout,
595
+ handleItemPress,
596
+ keyExtractor,
597
+ theme.colors.muted,
598
+ theme.colors.onSurface,
599
+ theme.colors.primary,
600
+ ]);
601
+ const renderSeparator = React.useCallback(() => (0, jsx_runtime_1.jsx)(react_native_1.View, { style: [styles.separatorLine, { backgroundColor: theme.colors.border }] }), [theme.colors.border]);
602
+ const sheetNode = ((0, jsx_runtime_1.jsx)(Sheet_1.Sheet, { placement: "bottom", open: visible, onOpenChange: handleSheetOpenChange, onCloseComplete: handleSheetDismissComplete, detents: detents, backgroundColor: theme.colors.surface, handle: false, draggable: false, dismissible: !disabled, nativeProps: { insetAdjustment: 'never' }, children: (0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [
603
+ styles.sheetInner,
604
+ {
605
+ backgroundColor: theme.colors.surface,
606
+ height: sheetHeight,
607
+ paddingBottom: safeBottom,
608
+ },
609
+ ], pointerEvents: disabled ? 'none' : 'auto', children: [(0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.header, children: (0, jsx_runtime_1.jsx)(Text_1.Text, { style: [styles.headerTitle, { color: theme.colors.onSurface }], numberOfLines: 1, children: title !== null && title !== void 0 ? title : t('addressCascader.title') }) }), contentMounted ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_native_1.ScrollView, { ref: stepsScrollRef, horizontal: true, showsHorizontalScrollIndicator: false, contentContainerStyle: styles.stepsContent, style: styles.stepsScroll, children: LEVELS.map(renderStep) }), (0, jsx_runtime_1.jsx)(react_native_1.Animated.View, { style: [styles.listFrame, { borderColor: theme.colors.border }, listAnimatedStyle], children: currentOptions.length > 0 ? ((0, jsx_runtime_1.jsx)(react_native_1.ScrollView, { ref: optionsScrollRef, contentContainerStyle: styles.listContent, keyboardShouldPersistTaps: "handled", nestedScrollEnabled: true, onContentSizeChange: handleOptionsContentSizeChange, onLayout: handleOptionsViewportLayout, showsVerticalScrollIndicator: false, style: styles.optionsScroll, children: currentOptions.map((option, index) => {
610
+ const key = keyExtractor(option);
611
+ return ((0, jsx_runtime_1.jsxs)(React.Fragment, { children: [renderOption(option), index < currentOptions.length - 1 ? renderSeparator() : null] }, key));
612
+ }) })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.emptyState, children: (0, jsx_runtime_1.jsx)(Text_1.Text, { style: [styles.emptyText, { color: theme.colors.muted }], children: t('addressCascader.empty') }) })) })] })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.lazyPlaceholder })), (0, jsx_runtime_1.jsx)(actionBar_1.PickerActionBar, { cancelText: t('picker.cancel'), confirmText: t('picker.confirm'), onCancel: handleCancel, onConfirm: handleConfirm, disabled: disabled, confirmDisabled: confirmDisabled, style: styles.footer })] }) }));
613
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [triggerNode, sheetNode] }));
614
+ });
615
+ const styles = react_native_1.StyleSheet.create({
616
+ sheetInner: {
617
+ paddingHorizontal: (0, zkit_tools_1.wp)(16),
618
+ paddingTop: (0, zkit_tools_1.wp)(12),
619
+ width: '100%',
620
+ },
621
+ header: {
622
+ alignItems: 'center',
623
+ height: (0, zkit_tools_1.wp)(34),
624
+ justifyContent: 'center',
625
+ },
626
+ headerTitle: {
627
+ fontSize: (0, zkit_tools_1.sp)(16),
628
+ fontWeight: '600',
629
+ },
630
+ stepsScroll: {
631
+ alignSelf: 'stretch',
632
+ flexGrow: 0,
633
+ marginTop: (0, zkit_tools_1.wp)(10),
634
+ maxHeight: (0, zkit_tools_1.wp)(40),
635
+ width: '100%',
636
+ },
637
+ stepsContent: {
638
+ alignItems: 'center',
639
+ flexGrow: 1,
640
+ gap: (0, zkit_tools_1.wp)(8),
641
+ justifyContent: 'center',
642
+ paddingHorizontal: (0, zkit_tools_1.wp)(4),
643
+ },
644
+ stepPill: {
645
+ alignItems: 'center',
646
+ borderRadius: (0, zkit_tools_1.wp)(8),
647
+ borderWidth: (0, zkit_tools_1.wp)(1),
648
+ justifyContent: 'center',
649
+ maxWidth: (0, zkit_tools_1.wp)(178),
650
+ minHeight: (0, zkit_tools_1.wp)(34),
651
+ minWidth: (0, zkit_tools_1.wp)(76),
652
+ paddingHorizontal: (0, zkit_tools_1.wp)(11),
653
+ },
654
+ stepText: {
655
+ fontSize: (0, zkit_tools_1.sp)(14),
656
+ fontWeight: '700',
657
+ },
658
+ listFrame: {
659
+ borderTopWidth: react_native_1.StyleSheet.hairlineWidth,
660
+ flex: 1,
661
+ marginTop: (0, zkit_tools_1.wp)(12),
662
+ overflow: 'hidden',
663
+ },
664
+ optionsScroll: {
665
+ flex: 1,
666
+ },
667
+ listContent: {
668
+ paddingBottom: (0, zkit_tools_1.wp)(6),
669
+ },
670
+ optionRow: {
671
+ alignItems: 'center',
672
+ flexDirection: 'row',
673
+ minHeight: (0, zkit_tools_1.wp)(56),
674
+ paddingHorizontal: (0, zkit_tools_1.wp)(10),
675
+ paddingVertical: (0, zkit_tools_1.wp)(7),
676
+ },
677
+ optionMain: {
678
+ flex: 1,
679
+ minWidth: 0,
680
+ paddingRight: (0, zkit_tools_1.wp)(12),
681
+ },
682
+ optionText: {
683
+ fontSize: (0, zkit_tools_1.sp)(16),
684
+ lineHeight: (0, zkit_tools_1.sp)(22),
685
+ },
686
+ optionMark: {
687
+ alignItems: 'center',
688
+ justifyContent: 'center',
689
+ width: (0, zkit_tools_1.wp)(28),
690
+ },
691
+ separatorLine: {
692
+ height: react_native_1.StyleSheet.hairlineWidth,
693
+ },
694
+ emptyState: {
695
+ alignItems: 'center',
696
+ flex: 1,
697
+ justifyContent: 'center',
698
+ minHeight: (0, zkit_tools_1.wp)(180),
699
+ },
700
+ emptyText: {
701
+ fontSize: (0, zkit_tools_1.sp)(14),
702
+ fontWeight: '600',
703
+ },
704
+ lazyPlaceholder: {
705
+ flex: 1,
706
+ },
707
+ footer: {
708
+ paddingTop: (0, zkit_tools_1.wp)(12),
709
+ },
710
+ });