@kilnonedre/foundation 0.0.1-alpha.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.
@@ -0,0 +1,150 @@
1
+ import { z } from 'zod';
2
+ import { ClassValue } from 'clsx';
3
+
4
+ declare const EnumEntityStatus: {
5
+ readonly ACTIVE: "ACTIVE";
6
+ readonly INACTIVE: "INACTIVE";
7
+ readonly DELETED: "DELETED";
8
+ };
9
+ type EnumEntityStatus = (typeof EnumEntityStatus)[keyof typeof EnumEntityStatus];
10
+ declare const EnumEntityStatusLabel: Record<EnumEntityStatus, string>;
11
+
12
+ declare const EnumApprovalStatus: {
13
+ readonly PENDING: "PENDING";
14
+ readonly APPROVED: "APPROVED";
15
+ readonly REJECTED: "REJECTED";
16
+ readonly CANCELLED: "CANCELLED";
17
+ };
18
+ type EnumApprovalStatus = (typeof EnumApprovalStatus)[keyof typeof EnumApprovalStatus];
19
+ declare const EnumApprovalStatusLabel: Record<EnumApprovalStatus, string>;
20
+
21
+ declare const EnumPublishMethod: {
22
+ readonly IMMEDIATE: "IMMEDIATE";
23
+ readonly SCHEDULED: "SCHEDULED";
24
+ readonly WAREHOUSE: "WAREHOUSE";
25
+ };
26
+ type EnumPublishMethod = (typeof EnumPublishMethod)[keyof typeof EnumPublishMethod];
27
+ declare const EnumPublishMethodLabel: Record<EnumPublishMethod, string>;
28
+
29
+ declare const EnumStorageMethod: {
30
+ readonly COLD: "COLD";
31
+ readonly FROZEN: "FROZEN";
32
+ readonly NORMAL: "NORMAL";
33
+ };
34
+ type EnumStorageMethod = (typeof EnumStorageMethod)[keyof typeof EnumStorageMethod];
35
+ declare const EnumStorageMethodLabel: Record<EnumStorageMethod, string>;
36
+
37
+ declare const EnumFormMode: {
38
+ readonly VIEW: "VIEW";
39
+ readonly CREATE: "CREATE";
40
+ readonly UPDATE: "UPDATE";
41
+ readonly DELETE: "DELETE";
42
+ };
43
+ type EnumFormMode = (typeof EnumFormMode)[keyof typeof EnumFormMode];
44
+ declare const EnumFormModeLabel: Record<EnumFormMode, string>;
45
+
46
+ declare const EnumApprovalView: {
47
+ readonly ALL: "ALL";
48
+ readonly SUBMITTED_BY_ME: "SUBMITTED_BY_ME";
49
+ readonly ASSIGNED_TO_ME: "ASSIGNED_TO_ME";
50
+ };
51
+ type EnumApprovalView = (typeof EnumApprovalView)[keyof typeof EnumApprovalView];
52
+ declare const EnumApprovalViewLabel: Record<EnumApprovalView, string>;
53
+
54
+ declare const EnumOrderStatus: {
55
+ readonly CREATED: "CREATED";
56
+ readonly PAID: "PAID";
57
+ readonly SHIPPED: "SHIPPED";
58
+ readonly COMPLETED: "COMPLETED";
59
+ readonly CANCELLED: "CANCELLED";
60
+ readonly REFUNDING: "REFUNDING";
61
+ readonly REFUNDED: "REFUNDED";
62
+ };
63
+ type EnumOrderStatus = (typeof EnumOrderStatus)[keyof typeof EnumOrderStatus];
64
+ declare const EnumOrderStatusLabel: Record<EnumOrderStatus, string>;
65
+
66
+ declare const EnumMapProvider: {
67
+ readonly AMAP: "AMAP";
68
+ readonly TENCENT: "TENCENT";
69
+ };
70
+ type EnumMapProvider = (typeof EnumMapProvider)[keyof typeof EnumMapProvider];
71
+ declare const EnumMapProviderLabel: Record<EnumMapProvider, string>;
72
+
73
+ declare const EnumGenderType: {
74
+ readonly MALE: "MALE";
75
+ readonly FEMALE: "FEMALE";
76
+ readonly UNKNOWN: "UNKNOWN";
77
+ };
78
+ type EnumGenderType = (typeof EnumGenderType)[keyof typeof EnumGenderType];
79
+ declare const EnumGenderTypeLabel: Record<EnumGenderType, string>;
80
+
81
+ declare const EnumSemanticColor: {
82
+ readonly PRIMARY: "PRIMARY";
83
+ readonly SUCCESS: "SUCCESS";
84
+ readonly WARNING: "WARNING";
85
+ readonly DANGER: "DANGER";
86
+ readonly INFO: "INFO";
87
+ readonly NEUTRAL: "NEUTRAL";
88
+ readonly DARK: "DARK";
89
+ };
90
+ type EnumSemanticColor = (typeof EnumSemanticColor)[keyof typeof EnumSemanticColor];
91
+ declare const EnumSemanticColorLabel: Record<EnumSemanticColor, string>;
92
+
93
+ declare const EnumVariant: {
94
+ readonly SOLID: "SOLID";
95
+ readonly OUTLINE: "OUTLINE";
96
+ readonly SOFT: "SOFT";
97
+ };
98
+ type EnumVariant = (typeof EnumVariant)[keyof typeof EnumVariant];
99
+ declare const EnumVariantLabel: Record<EnumVariant, string>;
100
+
101
+ declare const boolToText: (bool: boolean) => "是" | "否";
102
+
103
+ declare const formatDecimal: (value: number | string | null | undefined, digits?: number) => string;
104
+
105
+ interface CommonOption {
106
+ value: string;
107
+ label: string;
108
+ }
109
+
110
+ declare const enumToOptions: <T extends string>(enumObj: Record<string, T>, labelMap: Record<T, string>) => Array<CommonOption>;
111
+
112
+ declare const isValidEmail: (string: string) => boolean;
113
+
114
+ declare const isValidURL: (string: string) => boolean;
115
+
116
+ declare const emptyToUndefined: (value: unknown) => unknown;
117
+ declare const enumValues: <T extends Record<string, string>>(obj: T) => [T[keyof T], ...T[keyof T][]];
118
+ declare const zTextOptional: (label: string, min?: number, max?: number) => z.ZodPreprocess<z.ZodOptional<z.ZodString>>;
119
+ declare const zTextRequired: (label: string, min?: number, max?: number) => z.ZodString;
120
+ declare const zIdCard: (label?: string) => z.ZodString;
121
+ declare const zIdCardOptional: (label?: string) => z.ZodPreprocess<z.ZodOptional<z.ZodString>>;
122
+ declare const zEmail: (max?: number) => z.ZodString;
123
+ declare const zPhone: (max?: number) => z.ZodString;
124
+ declare const zId: (label?: string) => z.ZodString;
125
+ declare const zIds: (label?: string) => z.ZodArray<z.ZodString>;
126
+ declare const zTexts: (label?: string) => z.ZodArray<z.ZodString>;
127
+ declare const zImageId: (label: string) => z.ZodString;
128
+ declare const zImageIdRequired: (label: string) => z.ZodString;
129
+ declare const zImageIds: (label: string) => z.ZodArray<z.ZodString>;
130
+ declare const zImageIdsOptional: (label: string) => z.ZodOptional<z.ZodArray<z.ZodString>>;
131
+ declare const zEnumRequired: <T extends Record<string, string>>(enumObj: T, label: string) => z.ZodEnum<{ [k_1 in T[keyof T]]: k_1; } extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never>;
132
+ declare const zEnumNullable: <T extends Record<string, string>>(enumObj: T, label: string) => z.ZodNullable<z.ZodEnum<{ [k_1 in T[keyof T]]: k_1; } extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never>>;
133
+ declare const zEnumNullableRequired: <T extends Record<string, string>>(enumObj: T, label: string) => z.ZodNullable<z.ZodEnum<{ [k_1 in T[keyof T]]: k_1; } extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never>> & z.ZodType<({ [k_1 in T[keyof T]]: k_1; } extends infer T_2 ? { [k in keyof T_2]: T_2[k]; } : never)[T[keyof T]], ({ [k_1 in T[keyof T]]: k_1; } extends infer T_3 ? { [k in keyof T_3]: T_3[k]; } : never)[T[keyof T]] | null, z.core.$ZodTypeInternals<({ [k_1 in T[keyof T]]: k_1; } extends infer T_4 ? { [k in keyof T_4]: T_4[k]; } : never)[T[keyof T]], ({ [k_1 in T[keyof T]]: k_1; } extends infer T_5 ? { [k in keyof T_5]: T_5[k]; } : never)[T[keyof T]] | null>>;
134
+ declare const zEnumOptional: <T extends Record<string, string>>(enumObj: T) => z.ZodOptional<z.ZodEnum<{ [k_1 in T[keyof T]]: k_1; } extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never>>;
135
+ declare const zEnumNullableOptional: <T extends Record<string, string>>(enumObj: T) => z.ZodOptional<z.ZodNullable<z.ZodEnum<{ [k_1 in T[keyof T]]: k_1; } extends infer T_1 ? { [k in keyof T_1]: T_1[k]; } : never>>>;
136
+ declare const zBool: () => z.ZodBoolean;
137
+ declare const zDate: (label: string) => z.ZodDate;
138
+ declare const zDateOptional: () => z.ZodOptional<z.ZodDate>;
139
+ declare const zNumber: (label: string, min?: number, max?: number) => z.ZodNumber;
140
+ declare const zNumberOptional: (label: string, min?: number, max?: number) => z.ZodOptional<z.ZodNumber>;
141
+ declare const zCoerceNumber: (label: string, min?: number, max?: number) => z.ZodCoercedNumber<unknown>;
142
+ declare const zCoerceNumberOptional: (label: string, min?: number, max?: number) => z.ZodPreprocess<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
143
+ declare const zDecimal: (label: string, min?: number, max?: number) => z.ZodString;
144
+ declare const zDecimalOptional: (label: string, min?: number, max?: number) => z.ZodPreprocess<z.ZodOptional<z.ZodString>>;
145
+
146
+ declare const formatDateTime: (value: string | Date | number | null | undefined, format?: string) => string;
147
+
148
+ declare function cn(...inputs: ClassValue[]): string;
149
+
150
+ export { type CommonOption, EnumApprovalStatus, EnumApprovalStatusLabel, EnumApprovalView, EnumApprovalViewLabel, EnumEntityStatus, EnumEntityStatusLabel, EnumFormMode, EnumFormModeLabel, EnumGenderType, EnumGenderTypeLabel, EnumMapProvider, EnumMapProviderLabel, EnumOrderStatus, EnumOrderStatusLabel, EnumPublishMethod, EnumPublishMethodLabel, EnumSemanticColor, EnumSemanticColorLabel, EnumStorageMethod, EnumStorageMethodLabel, EnumVariant, EnumVariantLabel, boolToText, cn, emptyToUndefined, enumToOptions, enumValues, formatDateTime, formatDecimal, isValidEmail, isValidURL, zBool, zCoerceNumber, zCoerceNumberOptional, zDate, zDateOptional, zDecimal, zDecimalOptional, zEmail, zEnumNullable, zEnumNullableOptional, zEnumNullableRequired, zEnumOptional, zEnumRequired, zId, zIdCard, zIdCardOptional, zIds, zImageId, zImageIdRequired, zImageIds, zImageIdsOptional, zNumber, zNumberOptional, zPhone, zTextOptional, zTextRequired, zTexts };
package/dist/index.js ADDED
@@ -0,0 +1,470 @@
1
+ // src/type/enum/entity-status.ts
2
+ var EnumEntityStatus = {
3
+ ACTIVE: "ACTIVE",
4
+ INACTIVE: "INACTIVE",
5
+ DELETED: "DELETED"
6
+ };
7
+ var EnumEntityStatusLabel = {
8
+ ACTIVE: "\u6B63\u5E38",
9
+ INACTIVE: "\u505C\u7528",
10
+ DELETED: "\u5DF2\u5220\u9664"
11
+ };
12
+
13
+ // src/type/enum/approval-status.ts
14
+ var EnumApprovalStatus = {
15
+ PENDING: "PENDING",
16
+ APPROVED: "APPROVED",
17
+ REJECTED: "REJECTED",
18
+ CANCELLED: "CANCELLED"
19
+ };
20
+ var EnumApprovalStatusLabel = {
21
+ PENDING: "\u5F85\u5BA1\u6838",
22
+ APPROVED: "\u5BA1\u6838\u901A\u8FC7",
23
+ REJECTED: "\u5BA1\u6838\u62D2\u7EDD",
24
+ CANCELLED: "\u64A4\u56DE"
25
+ };
26
+
27
+ // src/type/enum/publish-method.ts
28
+ var EnumPublishMethod = {
29
+ IMMEDIATE: "IMMEDIATE",
30
+ SCHEDULED: "SCHEDULED",
31
+ WAREHOUSE: "WAREHOUSE"
32
+ };
33
+ var EnumPublishMethodLabel = {
34
+ IMMEDIATE: "\u7ACB\u523B\u4E0A\u67B6",
35
+ SCHEDULED: "\u5B9A\u65F6\u4E0A\u67B6",
36
+ WAREHOUSE: "\u5165\u5E93"
37
+ };
38
+
39
+ // src/type/enum/store-method.ts
40
+ var EnumStorageMethod = {
41
+ COLD: "COLD",
42
+ FROZEN: "FROZEN",
43
+ NORMAL: "NORMAL"
44
+ };
45
+ var EnumStorageMethodLabel = {
46
+ COLD: "\u51B7\u85CF",
47
+ FROZEN: "\u51B7\u51BB",
48
+ NORMAL: "\u5E38\u6E29"
49
+ };
50
+
51
+ // src/type/enum/form-mode.ts
52
+ var EnumFormMode = {
53
+ VIEW: "VIEW",
54
+ CREATE: "CREATE",
55
+ UPDATE: "UPDATE",
56
+ DELETE: "DELETE"
57
+ };
58
+ var EnumFormModeLabel = {
59
+ VIEW: "\u67E5\u770B",
60
+ CREATE: "\u521B\u5EFA",
61
+ UPDATE: "\u66F4\u65B0",
62
+ DELETE: "\u5220\u9664"
63
+ };
64
+
65
+ // src/type/enum/approval-view.ts
66
+ var EnumApprovalView = {
67
+ ALL: "ALL",
68
+ // 全部
69
+ SUBMITTED_BY_ME: "SUBMITTED_BY_ME",
70
+ // 我提交的
71
+ ASSIGNED_TO_ME: "ASSIGNED_TO_ME"
72
+ // 分配给我审批的
73
+ };
74
+ var EnumApprovalViewLabel = {
75
+ ALL: "\u5168\u90E8",
76
+ SUBMITTED_BY_ME: "\u6211\u63D0\u4EA4\u7684",
77
+ ASSIGNED_TO_ME: "\u6211\u5BA1\u6279\u7684"
78
+ };
79
+
80
+ // src/type/enum/order-status.ts
81
+ var EnumOrderStatus = {
82
+ CREATED: "CREATED",
83
+ // 已创建(未支付)
84
+ PAID: "PAID",
85
+ // 已支付(待发货)
86
+ SHIPPED: "SHIPPED",
87
+ // 已发货
88
+ COMPLETED: "COMPLETED",
89
+ // 已完成
90
+ CANCELLED: "CANCELLED",
91
+ // 已取消
92
+ REFUNDING: "REFUNDING",
93
+ // 退款中
94
+ REFUNDED: "REFUNDED"
95
+ // 已退款
96
+ };
97
+ var EnumOrderStatusLabel = {
98
+ CREATED: "\u5DF2\u521B\u5EFA\uFF08\u672A\u652F\u4ED8\uFF09",
99
+ PAID: "\u5DF2\u652F\u4ED8\uFF08\u5F85\u53D1\u8D27\uFF09",
100
+ SHIPPED: "\u5DF2\u53D1\u8D27",
101
+ COMPLETED: "\u5DF2\u5B8C\u6210",
102
+ CANCELLED: "\u5DF2\u53D6\u6D88",
103
+ REFUNDING: "\u9000\u6B3E\u4E2D",
104
+ REFUNDED: "\u5DF2\u9000\u6B3E"
105
+ };
106
+
107
+ // src/type/enum/map-provider.ts
108
+ var EnumMapProvider = {
109
+ AMAP: "AMAP",
110
+ TENCENT: "TENCENT"
111
+ };
112
+ var EnumMapProviderLabel = {
113
+ AMAP: "\u9AD8\u5FB7\u5730\u56FE",
114
+ TENCENT: "\u817E\u8BAF\u5730\u56FE"
115
+ };
116
+
117
+ // src/type/enum/gender-type.ts
118
+ var EnumGenderType = {
119
+ MALE: "MALE",
120
+ FEMALE: "FEMALE",
121
+ UNKNOWN: "UNKNOWN"
122
+ };
123
+ var EnumGenderTypeLabel = {
124
+ MALE: "\u5148\u751F",
125
+ FEMALE: "\u5973\u58EB",
126
+ UNKNOWN: "\u4FDD\u5BC6"
127
+ };
128
+
129
+ // src/type/enum/semantic-color.ts
130
+ var EnumSemanticColor = {
131
+ PRIMARY: "PRIMARY",
132
+ SUCCESS: "SUCCESS",
133
+ WARNING: "WARNING",
134
+ DANGER: "DANGER",
135
+ INFO: "INFO",
136
+ NEUTRAL: "NEUTRAL",
137
+ DARK: "DARK"
138
+ };
139
+ var EnumSemanticColorLabel = {
140
+ PRIMARY: "\u4E3B\u8272\uFF08\u54C1\u724C\u8272\uFF09",
141
+ SUCCESS: "\u6210\u529F\uFF08\u7EFF\uFF09",
142
+ WARNING: "\u8B66\u544A\uFF08\u9EC4\uFF09",
143
+ DANGER: "\u5371\u9669\uFF08\u7EA2\uFF09",
144
+ INFO: "\u4FE1\u606F\uFF08\u84DD\uFF09",
145
+ NEUTRAL: "\u4E2D\u6027\uFF08\u7070\uFF09",
146
+ DARK: "\u6DF1\u8272\uFF08\u9ED1\uFF09"
147
+ };
148
+
149
+ // src/type/enum/variant.ts
150
+ var EnumVariant = {
151
+ SOLID: "SOLID",
152
+ // 实心:背景色 + 白字
153
+ OUTLINE: "OUTLINE",
154
+ // 描边:边框 + 主色文字
155
+ SOFT: "SOFT"
156
+ // 柔和:浅背景 + 深色文字
157
+ };
158
+ var EnumVariantLabel = {
159
+ SOLID: "\u5B9E\u5FC3",
160
+ OUTLINE: "\u63CF\u8FB9",
161
+ SOFT: "\u67D4\u548C"
162
+ };
163
+
164
+ // src/shadcn/components/button.tsx
165
+ import { cva } from "class-variance-authority";
166
+ import { Slot } from "radix-ui";
167
+
168
+ // src/shadcn/lib/utils.ts
169
+ import { clsx } from "clsx";
170
+ import { twMerge } from "tailwind-merge";
171
+
172
+ // src/shadcn/components/button.tsx
173
+ import { jsx } from "react/jsx-runtime";
174
+ var buttonVariants = cva(
175
+ "inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
176
+ {
177
+ variants: {
178
+ variant: {
179
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
180
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
181
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
182
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
183
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
184
+ link: "text-primary underline-offset-4 hover:underline"
185
+ },
186
+ size: {
187
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
188
+ xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
189
+ sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
190
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
191
+ icon: "size-9",
192
+ "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
193
+ "icon-sm": "size-8",
194
+ "icon-lg": "size-10"
195
+ }
196
+ },
197
+ defaultVariants: {
198
+ variant: "default",
199
+ size: "default"
200
+ }
201
+ }
202
+ );
203
+
204
+ // src/util/bool-to-text.ts
205
+ var boolToText = (bool) => {
206
+ return bool ? "\u662F" : "\u5426";
207
+ };
208
+
209
+ // src/util/format-decimal.ts
210
+ var formatDecimal = (value, digits = 2) => {
211
+ const num = Number(value);
212
+ if (Number.isNaN(num)) {
213
+ return 0 .toFixed(digits);
214
+ }
215
+ return num.toFixed(digits);
216
+ };
217
+
218
+ // src/util/enum-to-options.ts
219
+ var enumToOptions = (enumObj, labelMap) => {
220
+ return Object.values(enumObj).map((value) => ({
221
+ value,
222
+ label: labelMap[value]
223
+ }));
224
+ };
225
+
226
+ // src/util/validator/is-valid-email.ts
227
+ var isValidEmail = (string) => {
228
+ const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
229
+ return regex.test(string);
230
+ };
231
+
232
+ // src/util/validator/is-valid-url.ts
233
+ var isValidURL = (string) => {
234
+ const regex = /^(https?:\/\/)?((([a-zA-Z\d]([a-zA-Z\d-]*[a-zA-Z\d])*)\.)+[a-zA-Z]{2,}|\d{1,3}(\.\d{1,3}){3}(:\d+)?)(:\d+)?(\/[-a-zA-Z\d%_.~+]*)*(\?[\d&a-zA-Z_=%.~+-]*)?(#[\d&a-zA-Z_=%.~+-]*)?$/;
235
+ return regex.test(string);
236
+ };
237
+
238
+ // src/util/validator/schema.ts
239
+ import { z } from "zod";
240
+ var emptyToUndefined = (value) => {
241
+ if (typeof value !== "string") return value;
242
+ const v = value.trim();
243
+ return v ? v : void 0;
244
+ };
245
+ var enumValues = (obj) => Object.values(obj);
246
+ var zTextOptional = (label, min = 1, max = 32) => z.preprocess(
247
+ emptyToUndefined,
248
+ z.string().trim().min(min, `${label}\u81F3\u5C11 ${min} \u4E2A\u5B57\u7B26`).max(max, `${label}\u6700\u591A ${max} \u4E2A\u5B57\u7B26`).optional()
249
+ );
250
+ var zTextRequired = (label, min = 1, max = 32) => z.string({
251
+ message: `\u8BF7\u8F93\u5165${label}`
252
+ }).trim().min(min, `${label}\u81F3\u5C11 ${min} \u4E2A\u5B57\u7B26`).max(max, `${label}\u6700\u591A ${max} \u4E2A\u5B57\u7B26`);
253
+ var zIdCard = (label = "\u8EAB\u4EFD\u8BC1\u53F7") => z.string({
254
+ message: `\u8BF7\u8F93\u5165${label}`
255
+ }).trim().regex(/^\d{15}$|^\d{17}(\d|X|x)$/, `${label}\u683C\u5F0F\u4E0D\u6B63\u786E`);
256
+ var zIdCardOptional = (label = "\u8EAB\u4EFD\u8BC1\u53F7") => z.preprocess(
257
+ emptyToUndefined,
258
+ z.string().trim().regex(/^\d{15}$|^\d{17}(\d|X|x)$/, `${label}\u683C\u5F0F\u4E0D\u6B63\u786E`).optional()
259
+ );
260
+ var zEmail = (max = 32) => z.string({
261
+ message: "\u8BF7\u8F93\u5165\u90AE\u7BB1"
262
+ }).trim().email("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u90AE\u7BB1").max(max, `\u90AE\u7BB1\u6700\u591A ${max} \u4E2A\u5B57\u7B26`);
263
+ var zPhone = (max = 11) => z.string({
264
+ message: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7"
265
+ }).trim().regex(/^1[3-9]\d{9}$/, "\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7").max(max, `\u624B\u673A\u53F7\u6700\u591A ${max} \u4F4D`);
266
+ var zId = (label = "ID") => z.string({
267
+ message: `\u8BF7\u9009\u62E9${label}`
268
+ }).uuid(`${label}\u683C\u5F0F\u4E0D\u6B63\u786E`);
269
+ var zIds = (label = "ID") => z.array(zId(label)).min(1, `\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A${label}`);
270
+ var zTexts = (label = "\u5185\u5BB9") => z.array(z.string()).min(1, `\u81F3\u5C11\u9009\u62E9\u4E00\u4E2A${label}`);
271
+ var zImageId = (label) => z.string().uuid(`${label} ID \u683C\u5F0F\u4E0D\u6B63\u786E`);
272
+ var zImageIdRequired = (label) => z.string({
273
+ message: `\u8BF7\u81F3\u5C11\u4E0A\u4F20\u4E00\u5F20${label}`
274
+ }).uuid(`${label} ID \u683C\u5F0F\u4E0D\u6B63\u786E`);
275
+ var zImageIds = (label) => z.array(z.string().uuid(`${label} ID \u683C\u5F0F\u4E0D\u6B63\u786E`)).min(1, `\u81F3\u5C11\u4E0A\u4F201\u5F20${label}`);
276
+ var zImageIdsOptional = (label) => z.array(z.string().uuid(`${label} ID \u683C\u5F0F\u4E0D\u6B63\u786E`)).optional();
277
+ var zEnumRequired = (enumObj, label) => z.enum(enumValues(enumObj), {
278
+ message: `\u8BF7\u9009\u62E9${label}`
279
+ });
280
+ var zEnumNullable = (enumObj, label) => z.enum(enumValues(enumObj), {
281
+ message: `\u8BF7\u9009\u62E9${label}`
282
+ }).nullable();
283
+ var zEnumNullableRequired = (enumObj, label) => z.enum(enumValues(enumObj), {
284
+ message: `\u8BF7\u9009\u62E9${label}`
285
+ }).nullable().refine((v) => v !== null, {
286
+ message: `\u8BF7\u9009\u62E9${label}`
287
+ });
288
+ var zEnumOptional = (enumObj) => z.enum(enumValues(enumObj)).optional();
289
+ var zEnumNullableOptional = (enumObj) => z.enum(enumValues(enumObj)).nullable().optional();
290
+ var zBool = () => z.boolean();
291
+ var zDate = (label) => z.date({
292
+ message: `\u8BF7\u9009\u62E9${label}`
293
+ });
294
+ var zDateOptional = () => z.date().optional();
295
+ var zNumber = (label, min, max) => {
296
+ let schema = z.number({
297
+ message: `\u8BF7\u8F93\u5165${label}`
298
+ });
299
+ if (min !== void 0) {
300
+ schema = schema.min(min, `${label}\u4E0D\u80FD\u5C0F\u4E8E ${min}`);
301
+ }
302
+ if (max !== void 0) {
303
+ schema = schema.max(max, `${label}\u4E0D\u80FD\u5927\u4E8E ${max}`);
304
+ }
305
+ return schema;
306
+ };
307
+ var zNumberOptional = (label, min, max) => {
308
+ let schema = z.number({
309
+ message: `\u8BF7\u8F93\u5165${label}`
310
+ }).optional();
311
+ if (min !== void 0) {
312
+ schema = schema.refine((v) => v === void 0 || v >= min, {
313
+ message: `${label}\u4E0D\u80FD\u5C0F\u4E8E ${min}`
314
+ });
315
+ }
316
+ if (max !== void 0) {
317
+ schema = schema.refine((v) => v === void 0 || v <= max, {
318
+ message: `${label}\u4E0D\u80FD\u5927\u4E8E ${max}`
319
+ });
320
+ }
321
+ return schema;
322
+ };
323
+ var zCoerceNumber = (label, min, max) => {
324
+ let schema = z.coerce.number({
325
+ message: `\u8BF7\u8F93\u5165${label}`
326
+ });
327
+ if (min !== void 0) {
328
+ schema = schema.min(min, `${label}\u4E0D\u80FD\u5C0F\u4E8E ${min}`);
329
+ }
330
+ if (max !== void 0) {
331
+ schema = schema.max(max, `${label}\u4E0D\u80FD\u5927\u4E8E ${max}`);
332
+ }
333
+ return schema;
334
+ };
335
+ var zCoerceNumberOptional = (label, min, max) => z.preprocess(emptyToUndefined, zCoerceNumber(label, min, max).optional());
336
+ var zDecimal = (label, min, max) => {
337
+ let schema = z.string({
338
+ message: `\u8BF7\u8F93\u5165${label}`
339
+ }).trim().regex(/^\d+(\.\d{1,2})?$/, `${label}\u683C\u5F0F\u4E0D\u6B63\u786E`);
340
+ if (min !== void 0) {
341
+ schema = schema.refine((v) => Number(v) >= min, {
342
+ message: `${label}\u4E0D\u80FD\u5C0F\u4E8E ${min}`
343
+ });
344
+ }
345
+ if (max !== void 0) {
346
+ schema = schema.refine((v) => Number(v) <= max, {
347
+ message: `${label}\u4E0D\u80FD\u5927\u4E8E ${max}`
348
+ });
349
+ }
350
+ return schema;
351
+ };
352
+ var zDecimalOptional = (label, min, max) => z.preprocess(emptyToUndefined, zDecimal(label, min, max).optional());
353
+
354
+ // src/util/date/format-datetime.ts
355
+ import dayjs from "dayjs";
356
+ var formatDateTime = (value, format = "YYYY-MM-DD HH:mm:ss") => {
357
+ if (!value) return "";
358
+ return dayjs(value).format(format);
359
+ };
360
+
361
+ // src/util/cn.ts
362
+ import { clsx as clsx2 } from "clsx";
363
+ import { twMerge as twMerge2 } from "tailwind-merge";
364
+ function cn2(...inputs) {
365
+ return twMerge2(clsx2(inputs));
366
+ }
367
+
368
+ // src/shadcn/components/spinner.tsx
369
+ import { Loader2Icon } from "lucide-react";
370
+ import { jsx as jsx2 } from "react/jsx-runtime";
371
+
372
+ // src/components/button/index.tsx
373
+ import { jsx as jsx3, jsxs } from "react/jsx-runtime";
374
+ var colorMap = {
375
+ PRIMARY: {
376
+ [EnumVariant.SOFT]: "bg-primary/10 text-primary hover:bg-primary/20",
377
+ [EnumVariant.SOLID]: "bg-primary text-white hover:bg-primary/90",
378
+ [EnumVariant.OUTLINE]: "border border-primary text-primary bg-transparent hover:bg-primary/10"
379
+ },
380
+ SUCCESS: {
381
+ [EnumVariant.SOFT]: "bg-green-50 text-green-700 hover:bg-green-100",
382
+ [EnumVariant.SOLID]: "bg-green-500 text-white hover:bg-green-600",
383
+ [EnumVariant.OUTLINE]: "border border-green-500 text-green-600 bg-transparent hover:bg-green-50"
384
+ },
385
+ WARNING: {
386
+ [EnumVariant.SOFT]: "bg-yellow-50 text-yellow-700 hover:bg-yellow-100",
387
+ [EnumVariant.SOLID]: "bg-yellow-500 text-white hover:bg-yellow-600",
388
+ [EnumVariant.OUTLINE]: "border border-yellow-500 text-yellow-600 bg-transparent hover:bg-yellow-50"
389
+ },
390
+ DANGER: {
391
+ [EnumVariant.SOFT]: "bg-red-50 text-red-700 hover:bg-red-100",
392
+ [EnumVariant.SOLID]: "bg-red-500 text-white hover:bg-red-600",
393
+ [EnumVariant.OUTLINE]: "border border-red-500 text-red-600 bg-transparent hover:bg-red-50"
394
+ },
395
+ INFO: {
396
+ [EnumVariant.SOFT]: "bg-blue-50 text-blue-700 hover:bg-blue-100",
397
+ [EnumVariant.SOLID]: "bg-blue-500 text-white hover:bg-blue-600",
398
+ [EnumVariant.OUTLINE]: "border border-blue-500 text-blue-600 bg-transparent hover:bg-blue-50"
399
+ },
400
+ NEUTRAL: {
401
+ [EnumVariant.SOFT]: "bg-gray-100 text-gray-700 hover:bg-gray-200",
402
+ [EnumVariant.SOLID]: "bg-gray-500 text-white hover:bg-gray-600",
403
+ [EnumVariant.OUTLINE]: "border border-gray-400 text-gray-700 bg-transparent hover:bg-gray-100"
404
+ },
405
+ DARK: {
406
+ [EnumVariant.SOFT]: "bg-black/10 text-black hover:bg-black/20",
407
+ [EnumVariant.SOLID]: "bg-black text-white hover:bg-black/90",
408
+ [EnumVariant.OUTLINE]: "border border-black text-black bg-transparent hover:bg-black/10"
409
+ }
410
+ };
411
+ export {
412
+ EnumApprovalStatus,
413
+ EnumApprovalStatusLabel,
414
+ EnumApprovalView,
415
+ EnumApprovalViewLabel,
416
+ EnumEntityStatus,
417
+ EnumEntityStatusLabel,
418
+ EnumFormMode,
419
+ EnumFormModeLabel,
420
+ EnumGenderType,
421
+ EnumGenderTypeLabel,
422
+ EnumMapProvider,
423
+ EnumMapProviderLabel,
424
+ EnumOrderStatus,
425
+ EnumOrderStatusLabel,
426
+ EnumPublishMethod,
427
+ EnumPublishMethodLabel,
428
+ EnumSemanticColor,
429
+ EnumSemanticColorLabel,
430
+ EnumStorageMethod,
431
+ EnumStorageMethodLabel,
432
+ EnumVariant,
433
+ EnumVariantLabel,
434
+ boolToText,
435
+ cn2 as cn,
436
+ emptyToUndefined,
437
+ enumToOptions,
438
+ enumValues,
439
+ formatDateTime,
440
+ formatDecimal,
441
+ isValidEmail,
442
+ isValidURL,
443
+ zBool,
444
+ zCoerceNumber,
445
+ zCoerceNumberOptional,
446
+ zDate,
447
+ zDateOptional,
448
+ zDecimal,
449
+ zDecimalOptional,
450
+ zEmail,
451
+ zEnumNullable,
452
+ zEnumNullableOptional,
453
+ zEnumNullableRequired,
454
+ zEnumOptional,
455
+ zEnumRequired,
456
+ zId,
457
+ zIdCard,
458
+ zIdCardOptional,
459
+ zIds,
460
+ zImageId,
461
+ zImageIdRequired,
462
+ zImageIds,
463
+ zImageIdsOptional,
464
+ zNumber,
465
+ zNumberOptional,
466
+ zPhone,
467
+ zTextOptional,
468
+ zTextRequired,
469
+ zTexts
470
+ };
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@kilnonedre/foundation",
3
+ "version": "0.0.1-alpha.1",
4
+ "private": false,
5
+ "description": "Kilnonedre frontend foundation package",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsup src/index.ts --format esm --dts --clean",
15
+ "dev": "tsup src/index.ts --format esm --dts --watch",
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "keywords": [],
19
+ "author": "",
20
+ "license": "UNLICENSED",
21
+ "packageManager": "pnpm@10.27.0",
22
+ "peerDependencies": {
23
+ "next": ">=14",
24
+ "react": ">=18",
25
+ "react-dom": ">=18"
26
+ },
27
+ "devDependencies": {
28
+ "@types/react": "^19.0.0",
29
+ "@types/react-dom": "^19.0.0",
30
+ "tsup": "^8.5.0",
31
+ "typescript": "^5.0.0"
32
+ },
33
+ "dependencies": {
34
+ "@radix-ui/react-slot": "^1.2.4",
35
+ "class-variance-authority": "^0.7.1",
36
+ "clsx": "^2.1.1",
37
+ "dayjs": "^1.11.21",
38
+ "lucide-react": "^1.17.0",
39
+ "radix-ui": "^1.4.3",
40
+ "tailwind-merge": "^3.6.0",
41
+ "zod": "^4.4.3"
42
+ }
43
+ }