zkit-ui 1.0.6 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +25 -11
  2. package/dist/ZKitCoreProvider.d.ts +13 -0
  3. package/dist/ZKitCoreProvider.d.ts.map +1 -0
  4. package/dist/ZKitCoreProvider.js +10 -0
  5. package/dist/ZKitProvider.d.ts +2 -10
  6. package/dist/ZKitProvider.d.ts.map +1 -1
  7. package/dist/ZKitProvider.js +4 -5
  8. package/dist/all.d.ts +59 -0
  9. package/dist/all.d.ts.map +1 -0
  10. package/dist/all.js +92 -0
  11. package/dist/index.d.ts +2 -46
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -73
  14. package/dist/services/PermissionPurposeDialogService/index.d.ts +1 -1
  15. package/dist/services/PermissionPurposeDialogService/index.js +1 -1
  16. package/dist/services/PickerService/index.d.ts +1 -1
  17. package/dist/services/PickerService/index.js +1 -1
  18. package/dist/ui/DatePicker/index.d.ts.map +1 -1
  19. package/dist/ui/DatePicker/index.js +7 -4
  20. package/dist/ui/DatePicker/utils.d.ts +5 -1
  21. package/dist/ui/DatePicker/utils.d.ts.map +1 -1
  22. package/dist/ui/DatePicker/utils.js +62 -12
  23. package/package.json +164 -2
  24. package/src/ZKitCoreProvider.tsx +34 -0
  25. package/src/ZKitProvider.tsx +25 -33
  26. package/src/all.ts +397 -0
  27. package/src/index.ts +5 -374
  28. package/src/services/ActionDialogService/README.md +3 -2
  29. package/src/services/CardToastService/README.md +2 -2
  30. package/src/services/ImagePreviewService/README.md +2 -2
  31. package/src/services/LoadingService/README.md +1 -1
  32. package/src/services/PermissionPurposeDialogService/README.md +2 -2
  33. package/src/services/PermissionPurposeDialogService/index.tsx +1 -1
  34. package/src/services/PickerService/README.md +2 -2
  35. package/src/services/PickerService/index.tsx +1 -1
  36. package/src/ui/Accordion/README.md +2 -2
  37. package/src/ui/AddressCascader/README.md +4 -2
  38. package/src/ui/BetweenTime/README.md +12 -12
  39. package/src/ui/Button/README.md +7 -7
  40. package/src/ui/Checkbox/README.md +2 -2
  41. package/src/ui/DatePicker/README.md +2 -1
  42. package/src/ui/DatePicker/index.tsx +23 -4
  43. package/src/ui/DatePicker/utils.ts +93 -14
  44. package/src/ui/LinkedScroll/README.md +2 -1
  45. package/src/ui/Picker/README.md +2 -1
  46. package/src/ui/Radio/README.md +2 -1
  47. package/src/ui/Sheet/README.md +3 -1
  48. package/src/ui/SliderCaptcha/README.md +1 -1
  49. package/src/ui/Switch/README.md +1 -1
  50. package/src/ui/Text/README.md +2 -2
  51. package/src/ui/TextInput/README.md +6 -6
  52. package/src/ui/WheelColumn/README.md +1 -1
@@ -86,13 +86,16 @@ exports.DatePicker = React.forwardRef(function DatePicker({ value: valueProp, de
86
86
  const [innerValue, setInnerValue] = React.useState(defaultValue);
87
87
  const committedValue = isValueControlled ? valueProp : innerValue;
88
88
  const bounds = React.useMemo(() => (0, utils_1.resolveDatePickerBounds)(min, max), [max, min]);
89
- const options = React.useMemo(() => (0, utils_1.buildDatePickerOptions)({ bounds, precision, isDateDisabled }), [bounds, isDateDisabled, precision]);
89
+ const optionConfig = React.useMemo(() => ({ bounds, precision, isDateDisabled }), [bounds, isDateDisabled, precision]);
90
+ const options = React.useMemo(() => (0, utils_1.buildDatePickerOptions)(optionConfig), [optionConfig]);
91
+ const getDateOptionChildren = React.useMemo(() => (0, utils_1.createDatePickerOptionChildrenResolver)(optionConfig), [optionConfig]);
92
+ const isDateOptionDisabled = React.useMemo(() => (0, utils_1.createDatePickerOptionDisabledResolver)(optionConfig, getDateOptionChildren), [getDateOptionChildren, optionConfig]);
90
93
  const committedDate = React.useMemo(() => (0, utils_1.resolveCommittedDate)(committedValue, bounds, precision), [bounds, committedValue, precision]);
91
94
  const pickerDate = React.useMemo(() => (0, utils_1.resolvePickerDate)(committedDate, defaultPickerValue, bounds, precision), [bounds, committedDate, defaultPickerValue, precision]);
92
95
  const pickerValue = React.useMemo(() => (0, utils_1.pathFromDate)(pickerDate, precision), [pickerDate, precision]);
93
96
  const committedSelection = React.useMemo(() => committedDate
94
- ? (0, utils_1.createDatePickerSelectionFromDate)(committedDate, precision, options, labelFormat)
95
- : null, [committedDate, labelFormat, options, precision]);
97
+ ? (0, utils_1.createDatePickerSelectionFromDate)(committedDate, precision, options, labelFormat, getDateOptionChildren)
98
+ : null, [committedDate, getDateOptionChildren, labelFormat, options, precision]);
96
99
  const resolveSelection = React.useCallback((selection) => (0, utils_1.createDatePickerSelection)(selection, precision, labelFormat, selection.label), [labelFormat, precision]);
97
100
  const handlePickerChange = React.useCallback((_next, selection) => {
98
101
  const nextSelection = resolveSelection(selection);
@@ -153,5 +156,5 @@ exports.DatePicker = React.forwardRef(function DatePicker({ value: valueProp, de
153
156
  return children;
154
157
  return (pickerContext) => children(createRenderContext(committedSelection, precision, pickerContext, placeholderText));
155
158
  }, [children, committedSelection, placeholderText, precision]);
156
- return ((0, jsx_runtime_1.jsx)(Picker_1.Picker, { ref: ref, options: options, value: pickerValue, onChange: handlePickerChange, valueMode: "path", open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange, onDismissComplete: onDismissComplete, title: title !== null && title !== void 0 ? title : t('datePicker.title'), placeholder: placeholderText, cancelText: cancelText, confirmText: confirmText, emptyText: emptyText, formatLabel: formatPickerLabel, renderColumnHeader: handleRenderColumnHeader, maxColumns: (0, utils_1.getColumnCount)(precision), lazyContent: lazyContent, sheetHeight: sheetHeight, disabled: disabled, onCancel: onCancel, onConfirm: handlePickerConfirm, onDraftChange: handlePickerDraftChange, children: pickerChildren }));
159
+ return ((0, jsx_runtime_1.jsx)(Picker_1.Picker, { ref: ref, options: options, value: pickerValue, onChange: handlePickerChange, valueMode: "path", open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange, onDismissComplete: onDismissComplete, title: title !== null && title !== void 0 ? title : t('datePicker.title'), placeholder: placeholderText, cancelText: cancelText, confirmText: confirmText, emptyText: emptyText, formatLabel: formatPickerLabel, renderColumnHeader: handleRenderColumnHeader, getOptionChildren: getDateOptionChildren, isOptionDisabled: isDateOptionDisabled, maxColumns: (0, utils_1.getColumnCount)(precision), lazyContent: lazyContent, sheetHeight: sheetHeight, disabled: disabled, onCancel: onCancel, onConfirm: handlePickerConfirm, onDraftChange: handlePickerDraftChange, children: pickerChildren }));
157
160
  });
@@ -15,6 +15,8 @@ type BuildOptionsConfig = {
15
15
  precision: DatePickerPrecision;
16
16
  isDateDisabled?: DatePickerProps['isDateDisabled'];
17
17
  };
18
+ export type DatePickerOptionChildrenResolver = (option: DatePickerOption, index: number, path: DatePickerOption[]) => readonly DatePickerOption[] | undefined;
19
+ export type DatePickerOptionDisabledResolver = (option: DatePickerOption, index: number, path: DatePickerOption[]) => boolean;
18
20
  export declare function normalizePrecision(input: DatePickerPrecision | undefined): DatePickerPrecision;
19
21
  export declare function getColumnCount(precision: DatePickerPrecision): number;
20
22
  export declare function formatDatePickerValue(date: Dayjs, precision: DatePickerPrecision): DatePickerValue;
@@ -25,8 +27,10 @@ export declare function resolveDatePickerBounds(min: DatePickerInput | null | un
25
27
  export declare function resolveCommittedDate(value: DatePickerValue | null | undefined, bounds: DateBounds, precision: DatePickerPrecision): dayjs.Dayjs | null;
26
28
  export declare function resolvePickerDate(committedDate: Dayjs | null, defaultPickerValue: DatePickerInput | null | undefined, bounds: DateBounds, precision: DatePickerPrecision): dayjs.Dayjs;
27
29
  export declare function buildDatePickerOptions(config: BuildOptionsConfig): DatePickerOption[];
30
+ export declare function createDatePickerOptionChildrenResolver(config: BuildOptionsConfig): DatePickerOptionChildrenResolver;
31
+ export declare function createDatePickerOptionDisabledResolver(config: BuildOptionsConfig, getOptionChildren: DatePickerOptionChildrenResolver): DatePickerOptionDisabledResolver;
28
32
  export declare function createDatePickerSelection(pickerSelection: PickerSelection<DatePickerOption>, precision: DatePickerPrecision, labelFormat?: DatePickerLabelFormat, labelOverride?: string): DatePickerSelection | null;
29
- export declare function createDatePickerSelectionFromDate(date: Dayjs, precision: DatePickerPrecision, options: DatePickerOption[], labelFormat?: DatePickerLabelFormat): DatePickerSelection;
33
+ export declare function createDatePickerSelectionFromDate(date: Dayjs, precision: DatePickerPrecision, options: DatePickerOption[], labelFormat?: DatePickerLabelFormat, getOptionChildren?: DatePickerOptionChildrenResolver): DatePickerSelection;
30
34
  export declare function dateFromOption(option: DatePickerOption | undefined, precision: DatePickerPrecision): dayjs.Dayjs | undefined;
31
35
  export {};
32
36
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/ui/DatePicker/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAEV,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,eAAe,EAChB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,mBAAmB,mCAA0E,CAAC;AAoB3G,KAAK,UAAU,GAAG;IAChB,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,EAAE,KAAK,CAAC;CACZ,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,KAAK,CAAC;IACZ,cAAc,EAAE,mBAAmB,CAAC;CACrC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;CACpD,CAAC;AAUF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,GAAG,mBAAmB,CAE9F;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,mBAAmB,UAE5D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,GAAG,eAAe,CAElG;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,GAAG,eAAe,CAI9F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAKlF;AAoCD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,SAAS,CAUxB;AAeD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACvC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GACtC,UAAU,CAWZ;AAQD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,mBAAmB,sBAK/B;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,KAAK,GAAG,IAAI,EAC3B,kBAAkB,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACtD,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,mBAAmB,eAO/B;AAmFD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,sBAuBhE;AAuBD,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,eAAe,CAAC,gBAAgB,CAAC,EAClD,SAAS,EAAE,mBAAmB,EAC9B,WAAW,CAAC,EAAE,qBAAqB,EACnC,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,GAAG,IAAI,CAuB5B;AAwBD,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,KAAK,EACX,SAAS,EAAE,mBAAmB,EAC9B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,WAAW,CAAC,EAAE,qBAAqB,GAClC,mBAAmB,CAsBrB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EAAE,SAAS,EAAE,mBAAmB,2BAGlG"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/ui/DatePicker/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAEV,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,eAAe,EAChB,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,mBAAmB,mCAA0E,CAAC;AAoB3G,KAAK,UAAU,GAAG;IAChB,GAAG,EAAE,KAAK,CAAC;IACX,GAAG,EAAE,KAAK,CAAC;CACZ,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE,KAAK,CAAC;IACZ,cAAc,EAAE,mBAAmB,CAAC;CACrC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG,CAC7C,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,gBAAgB,EAAE,KACrB,SAAS,gBAAgB,EAAE,GAAG,SAAS,CAAC;AAE7C,MAAM,MAAM,gCAAgC,GAAG,CAC7C,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,gBAAgB,EAAE,KACrB,OAAO,CAAC;AAUb,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,GAAG,mBAAmB,CAE9F;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,mBAAmB,UAE5D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,GAAG,eAAe,CAElG;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,GAAG,eAAe,CAI9F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,GAAG,MAAM,EAAE,CAKlF;AAoCD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,SAAS,EAAE,MAAM,GAChB,UAAU,GAAG,SAAS,CAUxB;AAeD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACvC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GACtC,UAAU,CAWZ;AAQD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACzC,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,mBAAmB,sBAK/B;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,KAAK,GAAG,IAAI,EAC3B,kBAAkB,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,EACtD,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,mBAAmB,eAO/B;AA8ED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,sBAkBhE;AAED,wBAAgB,sCAAsC,CACpD,MAAM,EAAE,kBAAkB,GACzB,gCAAgC,CA0BlC;AAMD,wBAAgB,sCAAsC,CACpD,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,gCAAgC,GAClD,gCAAgC,CA8BlC;AAuBD,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,eAAe,CAAC,gBAAgB,CAAC,EAClD,SAAS,EAAE,mBAAmB,EAC9B,WAAW,CAAC,EAAE,qBAAqB,EACnC,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,GAAG,IAAI,CAuB5B;AA+BD,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,KAAK,EACX,SAAS,EAAE,mBAAmB,EAC9B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,WAAW,CAAC,EAAE,qBAAqB,EACnC,iBAAiB,CAAC,EAAE,gCAAgC,GACnD,mBAAmB,CAsBrB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EAAE,SAAS,EAAE,mBAAmB,2BAGlG"}
@@ -14,6 +14,8 @@ exports.resolveDatePickerBounds = resolveDatePickerBounds;
14
14
  exports.resolveCommittedDate = resolveCommittedDate;
15
15
  exports.resolvePickerDate = resolvePickerDate;
16
16
  exports.buildDatePickerOptions = buildDatePickerOptions;
17
+ exports.createDatePickerOptionChildrenResolver = createDatePickerOptionChildrenResolver;
18
+ exports.createDatePickerOptionDisabledResolver = createDatePickerOptionDisabledResolver;
17
19
  exports.createDatePickerSelection = createDatePickerSelection;
18
20
  exports.createDatePickerSelectionFromDate = createDatePickerSelectionFromDate;
19
21
  exports.dateFromOption = dateFromOption;
@@ -200,10 +202,6 @@ function buildMonths(year, config) {
200
202
  const option = createOption('month', parts, precision === 'month'
201
203
  ? resolveDisabled(optionDate(parts), parts, 'month', precision, isDateDisabled)
202
204
  : false);
203
- if (precision === 'day') {
204
- option.children = buildDays(year, month, config);
205
- option.disabled = option.children.length > 0 && option.children.every((child) => child.disabled);
206
- }
207
205
  months.push(option);
208
206
  }
209
207
  return months;
@@ -216,14 +214,62 @@ function buildDatePickerOptions(config) {
216
214
  const option = createOption('year', parts, precision === 'year'
217
215
  ? resolveDisabled(optionDate(parts), parts, 'year', precision, isDateDisabled)
218
216
  : false);
219
- if (precision !== 'year') {
220
- option.children = buildMonths(year, config);
221
- option.disabled = option.children.length > 0 && option.children.every((child) => child.disabled);
222
- }
223
217
  years.push(option);
224
218
  }
225
219
  return years;
226
220
  }
221
+ function createDatePickerOptionChildrenResolver(config) {
222
+ const cache = new Map();
223
+ return (option) => {
224
+ if (option.column === 'year' && config.precision !== 'year') {
225
+ const key = `months:${option.year}`;
226
+ const cached = cache.get(key);
227
+ if (cached)
228
+ return cached;
229
+ const months = buildMonths(option.year, config);
230
+ cache.set(key, months);
231
+ return months;
232
+ }
233
+ if (option.column === 'month' && config.precision === 'day' && option.month != null) {
234
+ const key = `days:${option.year}-${option.month}`;
235
+ const cached = cache.get(key);
236
+ if (cached)
237
+ return cached;
238
+ const days = buildDays(option.year, option.month, config);
239
+ cache.set(key, days);
240
+ return days;
241
+ }
242
+ return [];
243
+ };
244
+ }
245
+ function getOptionPathKey(option) {
246
+ var _a, _b;
247
+ return `${option.column}:${option.year}-${(_a = option.month) !== null && _a !== void 0 ? _a : 0}-${(_b = option.day) !== null && _b !== void 0 ? _b : 0}`;
248
+ }
249
+ function createDatePickerOptionDisabledResolver(config, getOptionChildren) {
250
+ const cache = new Map();
251
+ const resolveOption = (option, index, path) => {
252
+ var _a, _b;
253
+ const key = getOptionPathKey(option);
254
+ const cached = cache.get(key);
255
+ if (cached != null)
256
+ return cached;
257
+ let disabled = false;
258
+ if (option.column === config.precision) {
259
+ disabled =
260
+ (_a = option.disabled) !== null && _a !== void 0 ? _a : resolveDisabled(optionDate(option), option, option.column, config.precision, config.isDateDisabled);
261
+ }
262
+ else if (config.isDateDisabled) {
263
+ const children = (_b = getOptionChildren(option, index, path)) !== null && _b !== void 0 ? _b : [];
264
+ disabled =
265
+ children.length > 0 &&
266
+ children.every((child, childIndex) => resolveOption(child, childIndex, [...path, child]));
267
+ }
268
+ cache.set(key, disabled);
269
+ return disabled;
270
+ };
271
+ return resolveOption;
272
+ }
227
273
  function numberValues(values) {
228
274
  return values.map((value) => Number(value)).filter((value) => Number.isFinite(value));
229
275
  }
@@ -268,11 +314,13 @@ function createDatePickerSelection(pickerSelection, precision, labelFormat, labe
268
314
  label: labelOverride !== null && labelOverride !== void 0 ? labelOverride : resolveSelectionLabel(base, labelFormat),
269
315
  };
270
316
  }
271
- function findOptionPath(options, values) {
317
+ function findOptionPath(options, values, getOptionChildren) {
318
+ var _a, _b;
272
319
  const items = [];
273
320
  const columns = [];
274
321
  const indices = [];
275
322
  let current = options;
323
+ let path = [];
276
324
  for (const value of values) {
277
325
  columns.push(current);
278
326
  const index = current.findIndex((option) => option.value === value);
@@ -283,13 +331,15 @@ function findOptionPath(options, values) {
283
331
  break;
284
332
  items.push(item);
285
333
  indices.push(index);
286
- current = Array.isArray(item.children) ? item.children : [];
334
+ const nextPath = [...path, item];
335
+ current = [...((_b = (_a = getOptionChildren === null || getOptionChildren === void 0 ? void 0 : getOptionChildren(item, index, nextPath)) !== null && _a !== void 0 ? _a : item.children) !== null && _b !== void 0 ? _b : [])];
336
+ path = nextPath;
287
337
  }
288
338
  return { items, columns, indices };
289
339
  }
290
- function createDatePickerSelectionFromDate(date, precision, options, labelFormat) {
340
+ function createDatePickerSelectionFromDate(date, precision, options, labelFormat, getOptionChildren) {
291
341
  const values = pathFromDate(date, precision);
292
- const { items, columns, indices } = findOptionPath(options, values);
342
+ const { items, columns, indices } = findOptionPath(options, values, getOptionChildren);
293
343
  const labels = values.map((value, index) => (index === 0 ? String(value) : pad2(value)));
294
344
  const base = {
295
345
  value: formatDatePickerValue(date, precision),
package/package.json CHANGED
@@ -1,11 +1,171 @@
1
1
  {
2
2
  "name": "zkit-ui",
3
- "version": "1.0.6",
3
+ "version": "2.0.1",
4
4
  "private": false,
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "source": "src/index.ts",
8
8
  "react-native": "dist/index.js",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "react-native": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./all": {
16
+ "types": "./dist/all.d.ts",
17
+ "react-native": "./dist/all.js",
18
+ "default": "./dist/all.js"
19
+ },
20
+ "./provider": {
21
+ "types": "./dist/ZKitProvider.d.ts",
22
+ "react-native": "./dist/ZKitProvider.js",
23
+ "default": "./dist/ZKitProvider.js"
24
+ },
25
+ "./core-provider": {
26
+ "types": "./dist/ZKitCoreProvider.d.ts",
27
+ "react-native": "./dist/ZKitCoreProvider.js",
28
+ "default": "./dist/ZKitCoreProvider.js"
29
+ },
30
+ "./config": {
31
+ "types": "./dist/config.d.ts",
32
+ "react-native": "./dist/config.js",
33
+ "default": "./dist/config.js"
34
+ },
35
+ "./theme/*": {
36
+ "types": "./dist/theme/*.d.ts",
37
+ "react-native": "./dist/theme/*.js",
38
+ "default": "./dist/theme/*.js"
39
+ },
40
+ "./i18n/locales": {
41
+ "types": "./dist/i18n/locales/index.d.ts",
42
+ "react-native": "./dist/i18n/locales/index.js",
43
+ "default": "./dist/i18n/locales/index.js"
44
+ },
45
+ "./i18n/locales/*": {
46
+ "types": "./dist/i18n/locales/*.d.ts",
47
+ "react-native": "./dist/i18n/locales/*.js",
48
+ "default": "./dist/i18n/locales/*.js"
49
+ },
50
+ "./i18n/*": {
51
+ "types": "./dist/i18n/*.d.ts",
52
+ "react-native": "./dist/i18n/*.js",
53
+ "default": "./dist/i18n/*.js"
54
+ },
55
+ "./accordion": {
56
+ "types": "./dist/ui/Accordion/index.d.ts",
57
+ "react-native": "./dist/ui/Accordion/index.js",
58
+ "default": "./dist/ui/Accordion/index.js"
59
+ },
60
+ "./address-cascader": {
61
+ "types": "./dist/ui/AddressCascader/index.d.ts",
62
+ "react-native": "./dist/ui/AddressCascader/index.js",
63
+ "default": "./dist/ui/AddressCascader/index.js"
64
+ },
65
+ "./between-time": {
66
+ "types": "./dist/ui/BetweenTime/index.d.ts",
67
+ "react-native": "./dist/ui/BetweenTime/index.js",
68
+ "default": "./dist/ui/BetweenTime/index.js"
69
+ },
70
+ "./button": {
71
+ "types": "./dist/ui/Button/index.d.ts",
72
+ "react-native": "./dist/ui/Button/index.js",
73
+ "default": "./dist/ui/Button/index.js"
74
+ },
75
+ "./checkbox": {
76
+ "types": "./dist/ui/Checkbox/index.d.ts",
77
+ "react-native": "./dist/ui/Checkbox/index.js",
78
+ "default": "./dist/ui/Checkbox/index.js"
79
+ },
80
+ "./date-picker": {
81
+ "types": "./dist/ui/DatePicker/index.d.ts",
82
+ "react-native": "./dist/ui/DatePicker/index.js",
83
+ "default": "./dist/ui/DatePicker/index.js"
84
+ },
85
+ "./linked-scroll": {
86
+ "types": "./dist/ui/LinkedScroll/index.d.ts",
87
+ "react-native": "./dist/ui/LinkedScroll/index.js",
88
+ "default": "./dist/ui/LinkedScroll/index.js"
89
+ },
90
+ "./loading-spinner": {
91
+ "types": "./dist/ui/LoadingSpinner/index.d.ts",
92
+ "react-native": "./dist/ui/LoadingSpinner/index.js",
93
+ "default": "./dist/ui/LoadingSpinner/index.js"
94
+ },
95
+ "./picker": {
96
+ "types": "./dist/ui/Picker/index.d.ts",
97
+ "react-native": "./dist/ui/Picker/index.js",
98
+ "default": "./dist/ui/Picker/index.js"
99
+ },
100
+ "./radio": {
101
+ "types": "./dist/ui/Radio/index.d.ts",
102
+ "react-native": "./dist/ui/Radio/index.js",
103
+ "default": "./dist/ui/Radio/index.js"
104
+ },
105
+ "./sheet": {
106
+ "types": "./dist/ui/Sheet/index.d.ts",
107
+ "react-native": "./dist/ui/Sheet/index.js",
108
+ "default": "./dist/ui/Sheet/index.js"
109
+ },
110
+ "./slider-captcha": {
111
+ "types": "./dist/ui/SliderCaptcha/index.d.ts",
112
+ "react-native": "./dist/ui/SliderCaptcha/index.js",
113
+ "default": "./dist/ui/SliderCaptcha/index.js"
114
+ },
115
+ "./switch": {
116
+ "types": "./dist/ui/Switch/index.d.ts",
117
+ "react-native": "./dist/ui/Switch/index.js",
118
+ "default": "./dist/ui/Switch/index.js"
119
+ },
120
+ "./text": {
121
+ "types": "./dist/ui/Text/index.d.ts",
122
+ "react-native": "./dist/ui/Text/index.js",
123
+ "default": "./dist/ui/Text/index.js"
124
+ },
125
+ "./text-input": {
126
+ "types": "./dist/ui/TextInput/index.d.ts",
127
+ "react-native": "./dist/ui/TextInput/index.js",
128
+ "default": "./dist/ui/TextInput/index.js"
129
+ },
130
+ "./wheel-column": {
131
+ "types": "./dist/ui/WheelColumn/index.d.ts",
132
+ "react-native": "./dist/ui/WheelColumn/index.js",
133
+ "default": "./dist/ui/WheelColumn/index.js"
134
+ },
135
+ "./action-dialog": {
136
+ "types": "./dist/services/ActionDialogService/index.d.ts",
137
+ "react-native": "./dist/services/ActionDialogService/index.js",
138
+ "default": "./dist/services/ActionDialogService/index.js"
139
+ },
140
+ "./image-preview": {
141
+ "types": "./dist/services/ImagePreviewService/index.d.ts",
142
+ "react-native": "./dist/services/ImagePreviewService/index.js",
143
+ "default": "./dist/services/ImagePreviewService/index.js"
144
+ },
145
+ "./loading": {
146
+ "types": "./dist/services/LoadingService/index.d.ts",
147
+ "react-native": "./dist/services/LoadingService/index.js",
148
+ "default": "./dist/services/LoadingService/index.js"
149
+ },
150
+ "./permission-purpose-dialog": {
151
+ "types": "./dist/services/PermissionPurposeDialogService/index.d.ts",
152
+ "react-native": "./dist/services/PermissionPurposeDialogService/index.js",
153
+ "default": "./dist/services/PermissionPurposeDialogService/index.js"
154
+ },
155
+ "./picker-service": {
156
+ "types": "./dist/services/PickerService/index.d.ts",
157
+ "react-native": "./dist/services/PickerService/index.js",
158
+ "default": "./dist/services/PickerService/index.js"
159
+ },
160
+ "./toast": {
161
+ "types": "./dist/services/CardToastService/index.d.ts",
162
+ "react-native": "./dist/services/CardToastService/index.js",
163
+ "default": "./dist/services/CardToastService/index.js"
164
+ },
165
+ "./assets/*": "./dist/assets/*",
166
+ "./package.json": "./package.json"
167
+ },
168
+ "sideEffects": false,
9
169
  "repository": {
10
170
  "type": "git",
11
171
  "url": "git+https://github.com/Concur-max/zkit.git",
@@ -30,7 +190,7 @@
30
190
  "@vant/area-data": "^2.1.0",
31
191
  "dayjs": "^1.11.13",
32
192
  "react-native-toast-message": "^2.3.3",
33
- "zkit-tools": "1.0.0"
193
+ "zkit-tools": "1.0.1"
34
194
  },
35
195
  "peerDependencies": {
36
196
  "@expo/vector-icons": "*",
@@ -70,6 +230,8 @@
70
230
  },
71
231
  "scripts": {
72
232
  "build": "node scripts/build.cjs",
233
+ "verify:entrypoints": "node scripts/verify-entrypoints.cjs",
234
+ "verify": "pnpm run build && pnpm run verify:entrypoints",
73
235
  "typecheck": "tsc -p tsconfig.json --noEmit"
74
236
  }
75
237
  }
@@ -0,0 +1,34 @@
1
+ import type * as React from 'react';
2
+ import { I18nProvider } from './i18n/I18nProvider';
3
+ import type { I18nMessages, I18nMissingKeyPolicy } from './i18n/types';
4
+ import { ThemeProvider } from './theme/ThemeProvider';
5
+ import type { Theme, ThemeOverride } from './theme/types';
6
+
7
+ export type ZKitCoreProviderProps = {
8
+ // baseTheme 用于传入完整主题作为基线(例如品牌主题)
9
+ baseTheme?: Theme;
10
+ // theme 用于对 baseTheme 做局部覆盖(例如只改 primary)
11
+ theme?: ThemeOverride;
12
+ locale?: string;
13
+ messages?: I18nMessages;
14
+ missingKeyPolicy?: I18nMissingKeyPolicy;
15
+ children: React.ReactNode;
16
+ };
17
+
18
+ // ZKitCoreProvider 只提供轻量核心上下文,不挂载任何全局浮层或选择器服务。
19
+ export function ZKitCoreProvider({
20
+ baseTheme,
21
+ theme,
22
+ locale,
23
+ messages,
24
+ missingKeyPolicy,
25
+ children,
26
+ }: ZKitCoreProviderProps) {
27
+ return (
28
+ <ThemeProvider baseTheme={baseTheme} theme={theme}>
29
+ <I18nProvider locale={locale} messages={messages} missingKeyPolicy={missingKeyPolicy}>
30
+ {children}
31
+ </I18nProvider>
32
+ </ThemeProvider>
33
+ );
34
+ }
@@ -1,30 +1,18 @@
1
- import type * as React from 'react';
2
- import { I18nProvider } from './i18n/I18nProvider';
3
- import type { I18nMessages, I18nMissingKeyPolicy } from './i18n/types';
4
1
  import { ActionDialogProvider } from './services/ActionDialogService/index';
5
2
  import { ToastProvider } from './services/CardToastService/index';
6
3
  import { ImagePreviewProvider } from './services/ImagePreviewService/index';
7
4
  import { LoadingProvider, type LoadingDefaults } from './services/LoadingService/index';
8
5
  import { PermissionPurposeDialogProvider } from './services/PermissionPurposeDialogService/index';
9
6
  import { PickerServiceProvider } from './services/PickerService/index';
10
- import { ThemeProvider } from './theme/ThemeProvider';
11
- import type { Theme, ThemeOverride } from './theme/types';
7
+ import { ZKitCoreProvider, type ZKitCoreProviderProps } from './ZKitCoreProvider';
12
8
 
13
- export type ZKitProviderProps = {
14
- // baseTheme 用于传入完整主题作为基线(例如品牌主题)
15
- baseTheme?: Theme;
16
- // theme 用于对 baseTheme 做局部覆盖(例如只改 primary)
17
- theme?: ThemeOverride;
18
- locale?: string;
19
- messages?: I18nMessages;
20
- missingKeyPolicy?: I18nMissingKeyPolicy;
9
+ export type ZKitProviderProps = ZKitCoreProviderProps & {
21
10
  loading?: LoadingDefaults;
22
- children: React.ReactNode;
23
11
  };
24
12
 
25
- // ZKitProvider 是组件库推荐的顶层 Provider:
13
+ // ZKitProvider 是完整应用 Provider:
26
14
  // - 同时提供 Theme 与 i18n
27
- // - 避免业务方在 App 里层层包裹多个 Provider
15
+ // - 挂载 Picker / Toast / Dialog / Loading / Permission / ImagePreview 等全局服务
28
16
  export function ZKitProvider({
29
17
  baseTheme,
30
18
  theme,
@@ -35,22 +23,26 @@ export function ZKitProvider({
35
23
  children,
36
24
  }: ZKitProviderProps) {
37
25
  return (
38
- <ThemeProvider baseTheme={baseTheme} theme={theme}>
39
- <I18nProvider locale={locale} messages={messages} missingKeyPolicy={missingKeyPolicy}>
40
- <PickerServiceProvider>
41
- <ToastProvider>
42
- <ActionDialogProvider>
43
- <LoadingProvider defaults={loading}>
44
- <PermissionPurposeDialogProvider>
45
- <ImagePreviewProvider>
46
- {children}
47
- </ImagePreviewProvider>
48
- </PermissionPurposeDialogProvider>
49
- </LoadingProvider>
50
- </ActionDialogProvider>
51
- </ToastProvider>
52
- </PickerServiceProvider>
53
- </I18nProvider>
54
- </ThemeProvider>
26
+ <ZKitCoreProvider
27
+ baseTheme={baseTheme}
28
+ theme={theme}
29
+ locale={locale}
30
+ messages={messages}
31
+ missingKeyPolicy={missingKeyPolicy}
32
+ >
33
+ <PickerServiceProvider>
34
+ <ToastProvider>
35
+ <ActionDialogProvider>
36
+ <LoadingProvider defaults={loading}>
37
+ <PermissionPurposeDialogProvider>
38
+ <ImagePreviewProvider>
39
+ {children}
40
+ </ImagePreviewProvider>
41
+ </PermissionPurposeDialogProvider>
42
+ </LoadingProvider>
43
+ </ActionDialogProvider>
44
+ </ToastProvider>
45
+ </PickerServiceProvider>
46
+ </ZKitCoreProvider>
55
47
  );
56
48
  }