@algodomain/smart-forms 0.1.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.
- package/README.md +313 -0
- package/dist/SmartFormProvider-B-BTl4wO.d.cts +94 -0
- package/dist/SmartFormProvider-B-BTl4wO.d.ts +94 -0
- package/dist/SmartTags-HmvmCJPT.d.cts +111 -0
- package/dist/SmartTags-HmvmCJPT.d.ts +111 -0
- package/dist/chunk-6WAEAWTD.js +949 -0
- package/dist/chunk-6WAEAWTD.js.map +1 -0
- package/dist/chunk-IG4XDQMV.js +604 -0
- package/dist/chunk-IG4XDQMV.js.map +1 -0
- package/dist/chunk-Y6NGPMDH.cjs +982 -0
- package/dist/chunk-Y6NGPMDH.cjs.map +1 -0
- package/dist/chunk-YV7RVYMD.cjs +639 -0
- package/dist/chunk-YV7RVYMD.cjs.map +1 -0
- package/dist/fields.cjs +1445 -0
- package/dist/fields.cjs.map +1 -0
- package/dist/fields.d.cts +119 -0
- package/dist/fields.d.ts +119 -0
- package/dist/fields.js +1384 -0
- package/dist/fields.js.map +1 -0
- package/dist/index.cjs +906 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +165 -0
- package/dist/index.d.ts +165 -0
- package/dist/index.js +821 -0
- package/dist/index.js.map +1 -0
- package/dist/opinionated.cjs +408 -0
- package/dist/opinionated.cjs.map +1 -0
- package/dist/opinionated.d.cts +274 -0
- package/dist/opinionated.d.ts +274 -0
- package/dist/opinionated.js +382 -0
- package/dist/opinionated.js.map +1 -0
- package/dist/style.css +114 -0
- package/package.json +90 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { SmartInput } from './chunk-IG4XDQMV.js';
|
|
2
|
+
export { SmartFormProvider, useFormField, useSmartForm } from './chunk-IG4XDQMV.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
import { Link } from 'react-router-dom';
|
|
6
|
+
|
|
7
|
+
var FieldEmail = ({
|
|
8
|
+
field = "email",
|
|
9
|
+
label = "Email Address",
|
|
10
|
+
placeholder = "Enter your email address",
|
|
11
|
+
required = true,
|
|
12
|
+
className = "",
|
|
13
|
+
...props
|
|
14
|
+
}) => {
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
SmartInput,
|
|
17
|
+
{
|
|
18
|
+
field,
|
|
19
|
+
label,
|
|
20
|
+
type: "email",
|
|
21
|
+
placeholder,
|
|
22
|
+
validation: z.string(`${label} is required`).email("Please enter a valid email address"),
|
|
23
|
+
required,
|
|
24
|
+
className,
|
|
25
|
+
...props
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
var FieldPhone = ({
|
|
30
|
+
field = "phone",
|
|
31
|
+
label = "Phone Number",
|
|
32
|
+
placeholder = "Enter your phone number",
|
|
33
|
+
required = true,
|
|
34
|
+
className = "",
|
|
35
|
+
...props
|
|
36
|
+
}) => {
|
|
37
|
+
return /* @__PURE__ */ jsx(
|
|
38
|
+
SmartInput,
|
|
39
|
+
{
|
|
40
|
+
field,
|
|
41
|
+
label,
|
|
42
|
+
type: "tel",
|
|
43
|
+
placeholder,
|
|
44
|
+
validation: z.string(`${label} is required`).min(10, "Phone number must be at least 10 digits").regex(/^[\d\s\-\+\(\)]+$/, "Please enter a valid phone number"),
|
|
45
|
+
required,
|
|
46
|
+
className,
|
|
47
|
+
...props
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
var FieldFirstName = ({
|
|
52
|
+
field = "firstName",
|
|
53
|
+
label = "First Name",
|
|
54
|
+
placeholder = "Enter your first name",
|
|
55
|
+
required = true,
|
|
56
|
+
className = "",
|
|
57
|
+
...props
|
|
58
|
+
}) => {
|
|
59
|
+
return /* @__PURE__ */ jsx(
|
|
60
|
+
SmartInput,
|
|
61
|
+
{
|
|
62
|
+
field,
|
|
63
|
+
label,
|
|
64
|
+
type: "text",
|
|
65
|
+
placeholder,
|
|
66
|
+
validation: z.string(`${label} is required`).min(2, "First name must be at least 2 characters").regex(/^[a-zA-Z\s\-']+$/, "First name can only contain letters, spaces, hyphens, and apostrophes"),
|
|
67
|
+
required,
|
|
68
|
+
className,
|
|
69
|
+
...props
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
};
|
|
73
|
+
var FieldLastName = ({
|
|
74
|
+
field = "lastName",
|
|
75
|
+
label = "Last Name",
|
|
76
|
+
placeholder = "Enter your last name",
|
|
77
|
+
required = true,
|
|
78
|
+
className = "",
|
|
79
|
+
...props
|
|
80
|
+
}) => {
|
|
81
|
+
return /* @__PURE__ */ jsx(
|
|
82
|
+
SmartInput,
|
|
83
|
+
{
|
|
84
|
+
field,
|
|
85
|
+
label,
|
|
86
|
+
type: "text",
|
|
87
|
+
placeholder,
|
|
88
|
+
validation: z.string(`${label} is required`).min(2, "Last name must be at least 2 characters").regex(/^[a-zA-Z\s\-']+$/, "Last name can only contain letters, spaces, hyphens, and apostrophes"),
|
|
89
|
+
required,
|
|
90
|
+
className,
|
|
91
|
+
...props
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
};
|
|
95
|
+
var FieldFullName = ({
|
|
96
|
+
field = "fullName",
|
|
97
|
+
label = "Full Name",
|
|
98
|
+
placeholder = "Enter your full name",
|
|
99
|
+
required = true,
|
|
100
|
+
className = "",
|
|
101
|
+
...props
|
|
102
|
+
}) => {
|
|
103
|
+
return /* @__PURE__ */ jsx(
|
|
104
|
+
SmartInput,
|
|
105
|
+
{
|
|
106
|
+
field,
|
|
107
|
+
label,
|
|
108
|
+
type: "text",
|
|
109
|
+
placeholder,
|
|
110
|
+
validation: z.string(`${label} is required`).min(2, "Full name must be at least 2 characters").regex(/^[a-zA-Z\s\-']+$/, "Full name can only contain letters, spaces, hyphens, and apostrophes"),
|
|
111
|
+
required,
|
|
112
|
+
className,
|
|
113
|
+
...props
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
};
|
|
117
|
+
var FieldPassword = ({
|
|
118
|
+
field = "password",
|
|
119
|
+
label = "Password",
|
|
120
|
+
placeholder = "Enter your password",
|
|
121
|
+
required = false,
|
|
122
|
+
className = "",
|
|
123
|
+
minLength = 8,
|
|
124
|
+
requireUppercase = true,
|
|
125
|
+
requireLowercase = true,
|
|
126
|
+
requireNumbers = true,
|
|
127
|
+
requireSpecialChars = true,
|
|
128
|
+
forgotPasswordLink,
|
|
129
|
+
...props
|
|
130
|
+
}) => {
|
|
131
|
+
let validation = z.string(`${label} is required`).min(minLength, `Password must be at least ${minLength} characters`);
|
|
132
|
+
if (requireUppercase) {
|
|
133
|
+
validation = validation.regex(/[A-Z]/, "Password must contain at least one uppercase letter");
|
|
134
|
+
}
|
|
135
|
+
if (requireLowercase) {
|
|
136
|
+
validation = validation.regex(/[a-z]/, "Password must contain at least one lowercase letter");
|
|
137
|
+
}
|
|
138
|
+
if (requireNumbers) {
|
|
139
|
+
validation = validation.regex(/[0-9]/, "Password must contain at least one number");
|
|
140
|
+
}
|
|
141
|
+
if (requireSpecialChars) {
|
|
142
|
+
validation = validation.regex(/[!@#$%^&*(),.?":{}|<>]/, "Password must contain at least one special character");
|
|
143
|
+
}
|
|
144
|
+
return /* @__PURE__ */ jsxs("div", { className: `flex-1 min-w-0 ${className}`, children: [
|
|
145
|
+
/* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center mb-1", children: [
|
|
146
|
+
/* @__PURE__ */ jsxs("label", { className: "block text-sm font-medium text-foreground", children: [
|
|
147
|
+
label,
|
|
148
|
+
" ",
|
|
149
|
+
required && /* @__PURE__ */ jsx("span", { className: "text-destructive", children: "*" })
|
|
150
|
+
] }),
|
|
151
|
+
forgotPasswordLink && (forgotPasswordLink.to ? /* @__PURE__ */ jsx(
|
|
152
|
+
Link,
|
|
153
|
+
{
|
|
154
|
+
to: forgotPasswordLink.to,
|
|
155
|
+
className: "text-sm text-foreground hover:text-foreground/80 transition-colors",
|
|
156
|
+
onClick: forgotPasswordLink.onClick,
|
|
157
|
+
children: forgotPasswordLink.text || "Forgot your password?"
|
|
158
|
+
}
|
|
159
|
+
) : forgotPasswordLink.href ? /* @__PURE__ */ jsx(
|
|
160
|
+
"a",
|
|
161
|
+
{
|
|
162
|
+
href: forgotPasswordLink.href,
|
|
163
|
+
className: "text-sm text-foreground hover:text-foreground/80 transition-colors",
|
|
164
|
+
onClick: forgotPasswordLink.onClick,
|
|
165
|
+
children: forgotPasswordLink.text || "Forgot your password?"
|
|
166
|
+
}
|
|
167
|
+
) : /* @__PURE__ */ jsx(
|
|
168
|
+
"button",
|
|
169
|
+
{
|
|
170
|
+
type: "button",
|
|
171
|
+
onClick: forgotPasswordLink.onClick,
|
|
172
|
+
className: "text-sm text-foreground hover:text-foreground/80 transition-colors",
|
|
173
|
+
children: forgotPasswordLink.text || "Forgot your password?"
|
|
174
|
+
}
|
|
175
|
+
))
|
|
176
|
+
] }),
|
|
177
|
+
/* @__PURE__ */ jsx(
|
|
178
|
+
SmartInput,
|
|
179
|
+
{
|
|
180
|
+
field,
|
|
181
|
+
type: "password",
|
|
182
|
+
placeholder,
|
|
183
|
+
validation,
|
|
184
|
+
required,
|
|
185
|
+
className: "",
|
|
186
|
+
...props
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
] });
|
|
190
|
+
};
|
|
191
|
+
var FieldConfirmPassword = ({
|
|
192
|
+
field = "confirmPassword",
|
|
193
|
+
label = "Confirm Password",
|
|
194
|
+
placeholder = "Confirm your password",
|
|
195
|
+
required = true,
|
|
196
|
+
className = "",
|
|
197
|
+
...props
|
|
198
|
+
}) => {
|
|
199
|
+
return /* @__PURE__ */ jsx(
|
|
200
|
+
SmartInput,
|
|
201
|
+
{
|
|
202
|
+
field,
|
|
203
|
+
label,
|
|
204
|
+
type: "password",
|
|
205
|
+
placeholder,
|
|
206
|
+
validation: z.string(`${label} is required`).min(1, "Please confirm your password"),
|
|
207
|
+
required,
|
|
208
|
+
className,
|
|
209
|
+
...props
|
|
210
|
+
}
|
|
211
|
+
);
|
|
212
|
+
};
|
|
213
|
+
var FieldAge = ({
|
|
214
|
+
field = "age",
|
|
215
|
+
label = "Age",
|
|
216
|
+
placeholder = "Enter your age",
|
|
217
|
+
required = true,
|
|
218
|
+
className = "",
|
|
219
|
+
minAge = 18,
|
|
220
|
+
maxAge = 120,
|
|
221
|
+
...props
|
|
222
|
+
}) => {
|
|
223
|
+
return /* @__PURE__ */ jsx(
|
|
224
|
+
SmartInput,
|
|
225
|
+
{
|
|
226
|
+
field,
|
|
227
|
+
label,
|
|
228
|
+
type: "number",
|
|
229
|
+
placeholder,
|
|
230
|
+
validation: z.string(`${label} is required`).min(1, `${label} is required`).transform((val) => {
|
|
231
|
+
const num = Number(val);
|
|
232
|
+
if (isNaN(num)) throw new Error("Age must be a valid number");
|
|
233
|
+
return num;
|
|
234
|
+
}).refine((val) => val >= minAge, `You must be at least ${minAge} years old`).refine((val) => val <= maxAge, `Age cannot exceed ${maxAge} years`).refine((val) => Number.isInteger(val), "Age must be a whole number"),
|
|
235
|
+
required,
|
|
236
|
+
className,
|
|
237
|
+
...props
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
};
|
|
241
|
+
var FieldStreetAddress = ({
|
|
242
|
+
field = "streetAddress",
|
|
243
|
+
label = "Street Address",
|
|
244
|
+
placeholder = "Enter your street address",
|
|
245
|
+
required = true,
|
|
246
|
+
className = "",
|
|
247
|
+
...props
|
|
248
|
+
}) => {
|
|
249
|
+
return /* @__PURE__ */ jsx(
|
|
250
|
+
SmartInput,
|
|
251
|
+
{
|
|
252
|
+
field,
|
|
253
|
+
label,
|
|
254
|
+
type: "text",
|
|
255
|
+
placeholder,
|
|
256
|
+
validation: z.string(`${label} is required`).min(5, "Street address must be at least 5 characters").max(100, "Street address must be less than 100 characters"),
|
|
257
|
+
required,
|
|
258
|
+
className,
|
|
259
|
+
...props
|
|
260
|
+
}
|
|
261
|
+
);
|
|
262
|
+
};
|
|
263
|
+
var FieldCity = ({
|
|
264
|
+
field = "city",
|
|
265
|
+
label = "City",
|
|
266
|
+
placeholder = "Enter your city",
|
|
267
|
+
required = true,
|
|
268
|
+
className = "",
|
|
269
|
+
...props
|
|
270
|
+
}) => {
|
|
271
|
+
return /* @__PURE__ */ jsx(
|
|
272
|
+
SmartInput,
|
|
273
|
+
{
|
|
274
|
+
field,
|
|
275
|
+
label,
|
|
276
|
+
type: "text",
|
|
277
|
+
placeholder,
|
|
278
|
+
validation: z.string(`${label} is required`).min(2, "City must be at least 2 characters").max(50, "City must be less than 50 characters").regex(/^[a-zA-Z\s\-']+$/, "City can only contain letters, spaces, hyphens, and apostrophes"),
|
|
279
|
+
required,
|
|
280
|
+
className,
|
|
281
|
+
...props
|
|
282
|
+
}
|
|
283
|
+
);
|
|
284
|
+
};
|
|
285
|
+
var FieldZipCode = ({
|
|
286
|
+
field = "zipCode",
|
|
287
|
+
label = "ZIP Code",
|
|
288
|
+
placeholder = "Enter your ZIP code",
|
|
289
|
+
required = true,
|
|
290
|
+
className = "",
|
|
291
|
+
...props
|
|
292
|
+
}) => {
|
|
293
|
+
return /* @__PURE__ */ jsx(
|
|
294
|
+
SmartInput,
|
|
295
|
+
{
|
|
296
|
+
field,
|
|
297
|
+
label,
|
|
298
|
+
type: "text",
|
|
299
|
+
placeholder,
|
|
300
|
+
validation: z.string(`${label} is required`).regex(/^\d{5}(-\d{4})?$/, "Please enter a valid ZIP code (12345 or 12345-6789)"),
|
|
301
|
+
required,
|
|
302
|
+
className,
|
|
303
|
+
...props
|
|
304
|
+
}
|
|
305
|
+
);
|
|
306
|
+
};
|
|
307
|
+
var FieldState = ({
|
|
308
|
+
field = "state",
|
|
309
|
+
label = "State",
|
|
310
|
+
placeholder = "Enter your state",
|
|
311
|
+
required = true,
|
|
312
|
+
className = "",
|
|
313
|
+
...props
|
|
314
|
+
}) => {
|
|
315
|
+
return /* @__PURE__ */ jsx(
|
|
316
|
+
SmartInput,
|
|
317
|
+
{
|
|
318
|
+
field,
|
|
319
|
+
label,
|
|
320
|
+
type: "text",
|
|
321
|
+
placeholder,
|
|
322
|
+
validation: z.string(`${label} is required`).min(2, "State must be at least 2 characters").max(20, "State must be less than 20 characters").regex(/^[a-zA-Z\s]+$/, "State can only contain letters and spaces"),
|
|
323
|
+
required,
|
|
324
|
+
className,
|
|
325
|
+
...props
|
|
326
|
+
}
|
|
327
|
+
);
|
|
328
|
+
};
|
|
329
|
+
var FieldMessage = ({
|
|
330
|
+
field = "message",
|
|
331
|
+
label = "Message",
|
|
332
|
+
placeholder = "Enter your message",
|
|
333
|
+
required = false,
|
|
334
|
+
className = "",
|
|
335
|
+
maxLength = 500,
|
|
336
|
+
minLength = 10,
|
|
337
|
+
rows = 4,
|
|
338
|
+
...props
|
|
339
|
+
}) => {
|
|
340
|
+
return /* @__PURE__ */ jsx(
|
|
341
|
+
SmartInput,
|
|
342
|
+
{
|
|
343
|
+
field,
|
|
344
|
+
label,
|
|
345
|
+
type: "textarea",
|
|
346
|
+
placeholder,
|
|
347
|
+
validation: z.string(`${label} is required`).min(minLength, `Message must be at least ${minLength} characters`).max(maxLength, `Message must be less than ${maxLength} characters`),
|
|
348
|
+
required,
|
|
349
|
+
className,
|
|
350
|
+
...props
|
|
351
|
+
}
|
|
352
|
+
);
|
|
353
|
+
};
|
|
354
|
+
var FieldComments = ({
|
|
355
|
+
field = "comments",
|
|
356
|
+
label = "Comments",
|
|
357
|
+
placeholder = "Enter your comments",
|
|
358
|
+
required = false,
|
|
359
|
+
className = "",
|
|
360
|
+
maxLength = 1e3,
|
|
361
|
+
minLength = 10,
|
|
362
|
+
rows = 4,
|
|
363
|
+
...props
|
|
364
|
+
}) => {
|
|
365
|
+
return /* @__PURE__ */ jsx(
|
|
366
|
+
SmartInput,
|
|
367
|
+
{
|
|
368
|
+
field,
|
|
369
|
+
label,
|
|
370
|
+
type: "textarea",
|
|
371
|
+
placeholder,
|
|
372
|
+
validation: z.string(`${label} is required`).min(minLength, `Comments must be at least ${minLength} characters`).max(maxLength, `Comments must be less than ${maxLength} characters`),
|
|
373
|
+
required,
|
|
374
|
+
className,
|
|
375
|
+
...props
|
|
376
|
+
}
|
|
377
|
+
);
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
export { FieldAge, FieldCity, FieldComments, FieldConfirmPassword, FieldEmail, FieldFirstName, FieldFullName, FieldLastName, FieldMessage, FieldPassword, FieldPhone, FieldState, FieldStreetAddress, FieldZipCode };
|
|
381
|
+
//# sourceMappingURL=opinionated.js.map
|
|
382
|
+
//# sourceMappingURL=opinionated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/opinionated/FieldEmail.tsx","../src/opinionated/FieldPhone.tsx","../src/opinionated/FieldName.tsx","../src/opinionated/FieldPassword.tsx","../src/opinionated/FieldAge.tsx","../src/opinionated/FieldAddress.tsx","../src/opinionated/FieldMessage.tsx"],"names":["jsx","z"],"mappings":"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","file":"opinionated.js","sourcesContent":["import React from 'react';\nimport { SmartInput } from '../smart-fields/SmartInput';\nimport { z } from 'zod';\n\n// =============================================================================\n// OPINIONATED EMAIL FIELD COMPONENT\n// =============================================================================\n\nexport interface FieldEmailProps {\n field?: string;\n label?: string;\n placeholder?: string;\n required?: boolean;\n className?: string;\n // Allow override of any SmartInput props\n [key: string]: any;\n}\n\n/**\n * Opinionated Email Field Component\n * \n * Pre-configured with:\n * - Standard email validation\n * - Proper label and placeholder\n * - Email input type\n * - Required field indicator\n * \n * Usage:\n * <FieldEmail /> // Uses 'email' as field name\n * <FieldEmail field=\"userEmail\" /> // Custom field name\n * <FieldEmail required={false} /> // Override required\n */\nexport const FieldEmail: React.FC<FieldEmailProps> = ({\n field = 'email',\n label = 'Email Address',\n placeholder = 'Enter your email address',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"email\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`).email('Please enter a valid email address')}\n required={required}\n className={className}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport { SmartInput } from '../smart-fields/SmartInput';\nimport { z } from 'zod';\n\n// =============================================================================\n// OPINIONATED PHONE FIELD COMPONENT\n// =============================================================================\n\nexport interface FieldPhoneProps {\n field?: string;\n label?: string;\n placeholder?: string;\n required?: boolean;\n className?: string;\n // Allow override of any SmartInput props\n [key: string]: any;\n}\n\n/**\n * Opinionated Phone Field Component\n * \n * Pre-configured with:\n * - Phone number validation (minimum 10 digits)\n * - Tel input type\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldPhone /> // Uses 'phone' as field name\n * <FieldPhone field=\"mobileNumber\" /> // Custom field name\n * <FieldPhone required={false} /> // Override required\n */\nexport const FieldPhone: React.FC<FieldPhoneProps> = ({\n field = 'phone',\n label = 'Phone Number',\n placeholder = 'Enter your phone number',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"tel\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(10, 'Phone number must be at least 10 digits')\n .regex(/^[\\d\\s\\-\\+\\(\\)]+$/, 'Please enter a valid phone number')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport { SmartInput } from '../smart-fields/SmartInput';\nimport { z } from 'zod';\n\n// =============================================================================\n// OPINIONATED NAME FIELD COMPONENTS\n// =============================================================================\n\nexport interface FieldNameProps {\n field?: string;\n label?: string;\n placeholder?: string;\n required?: boolean;\n className?: string;\n // Allow override of any SmartInput props\n [key: string]: any;\n}\n\n/**\n * Opinionated First Name Field Component\n * \n * Pre-configured with:\n * - Name validation (minimum 2 characters, letters only)\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldFirstName /> // Uses 'firstName' as field name\n * <FieldFirstName field=\"givenName\" /> // Custom field name\n */\nexport const FieldFirstName: React.FC<FieldNameProps> = ({\n field = 'firstName',\n label = 'First Name',\n placeholder = 'Enter your first name',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"text\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(2, 'First name must be at least 2 characters')\n .regex(/^[a-zA-Z\\s\\-']+$/, 'First name can only contain letters, spaces, hyphens, and apostrophes')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n\n/**\n * Opinionated Last Name Field Component\n * \n * Pre-configured with:\n * - Name validation (minimum 2 characters, letters only)\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldLastName /> // Uses 'lastName' as field name\n * <FieldLastName field=\"surname\" /> // Custom field name\n */\nexport const FieldLastName: React.FC<FieldNameProps> = ({\n field = 'lastName',\n label = 'Last Name',\n placeholder = 'Enter your last name',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"text\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(2, 'Last name must be at least 2 characters')\n .regex(/^[a-zA-Z\\s\\-']+$/, 'Last name can only contain letters, spaces, hyphens, and apostrophes')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n\n/**\n * Opinionated Full Name Field Component\n * \n * Pre-configured with:\n * - Name validation (minimum 2 characters, letters only)\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldFullName /> // Uses 'fullName' as field name\n * <FieldFullName field=\"displayName\" /> // Custom field name\n */\nexport const FieldFullName: React.FC<FieldNameProps> = ({\n field = 'fullName',\n label = 'Full Name',\n placeholder = 'Enter your full name',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"text\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(2, 'Full name must be at least 2 characters')\n .regex(/^[a-zA-Z\\s\\-']+$/, 'Full name can only contain letters, spaces, hyphens, and apostrophes')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport { SmartInput } from '../smart-fields/SmartInput';\nimport { z } from 'zod';\nimport { Link } from 'react-router-dom';\n\n// =============================================================================\n// OPINIONATED PASSWORD FIELD COMPONENT\n// =============================================================================\n\nexport interface FieldPasswordProps {\n field?: string;\n label?: string;\n placeholder?: string;\n required?: boolean;\n className?: string;\n minLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumbers?: boolean;\n requireSpecialChars?: boolean;\n forgotPasswordLink?: {\n text?: string;\n href?: string;\n to?: string;\n onClick?: () => void;\n };\n // Allow override of any SmartInput props\n [key: string]: unknown;\n}\n\n/**\n * Opinionated Password Field Component\n * \n * Pre-configured with:\n * - Strong password validation\n * - Password input type with show/hide toggle\n * - Proper label and placeholder\n * - Required field indicator\n * - Optional \"Forgot your password?\" link\n * \n * Usage:\n * <FieldPassword /> // Uses 'password' as field name\n * <FieldPassword field=\"userPassword\" /> // Custom field name\n * <FieldPassword minLength={12} /> // Custom minimum length\n * <FieldPassword forgotPasswordLink={{ onClick: handleForgotPassword }} /> // With forgot password link\n * <FieldPassword forgotPasswordLink={{ text: \"Reset password\", onClick: handleReset }} /> // Custom link text\n * <FieldPassword forgotPasswordLink={{ to: \"/forgot-password\" }} /> // React Router Link\n * <FieldPassword forgotPasswordLink={{ href: \"/forgot-password\" }} /> // External link\n */\nexport const FieldPassword: React.FC<FieldPasswordProps> = ({\n field = 'password',\n label = 'Password',\n placeholder = 'Enter your password',\n required = false,\n className = '',\n minLength = 8,\n requireUppercase = true,\n requireLowercase = true,\n requireNumbers = true,\n requireSpecialChars = true,\n forgotPasswordLink,\n ...props\n}) => {\n // Build validation schema based on requirements\n let validation = z.string(`${label} is required`).min(minLength, `Password must be at least ${minLength} characters`);\n \n if (requireUppercase) {\n validation = validation.regex(/[A-Z]/, 'Password must contain at least one uppercase letter');\n }\n \n if (requireLowercase) {\n validation = validation.regex(/[a-z]/, 'Password must contain at least one lowercase letter');\n }\n \n if (requireNumbers) {\n validation = validation.regex(/[0-9]/, 'Password must contain at least one number');\n }\n \n if (requireSpecialChars) {\n validation = validation.regex(/[!@#$%^&*(),.?\":{}|<>]/, 'Password must contain at least one special character');\n }\n\n return (\n <div className={`flex-1 min-w-0 ${className}`}>\n {/* Custom label row with forgot password link */}\n <div className=\"flex justify-between items-center mb-1\">\n <label className=\"block text-sm font-medium text-foreground\">\n {label} {required && <span className=\"text-destructive\">*</span>}\n </label>\n {forgotPasswordLink && (\n forgotPasswordLink.to ? (\n <Link\n to={forgotPasswordLink.to}\n className=\"text-sm text-foreground hover:text-foreground/80 transition-colors\"\n onClick={forgotPasswordLink.onClick}\n >\n {forgotPasswordLink.text || 'Forgot your password?'}\n </Link>\n ) : forgotPasswordLink.href ? (\n <a\n href={forgotPasswordLink.href}\n className=\"text-sm text-foreground hover:text-foreground/80 transition-colors\"\n onClick={forgotPasswordLink.onClick}\n >\n {forgotPasswordLink.text || 'Forgot your password?'}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={forgotPasswordLink.onClick}\n className=\"text-sm text-foreground hover:text-foreground/80 transition-colors\"\n >\n {forgotPasswordLink.text || 'Forgot your password?'}\n </button>\n )\n )}\n </div>\n \n {/* Password input field */}\n <SmartInput\n field={field}\n type=\"password\"\n placeholder={placeholder}\n validation={validation}\n required={required}\n className=\"\"\n {...props}\n />\n </div>\n );\n};\n\n/**\n * Opinionated Confirm Password Field Component\n * \n * Pre-configured for password confirmation\n * \n * Usage:\n * <FieldConfirmPassword /> // Uses 'confirmPassword' as field name\n * <FieldConfirmPassword field=\"passwordConfirmation\" /> // Custom field name\n */\nexport const FieldConfirmPassword: React.FC<FieldPasswordProps> = ({\n field = 'confirmPassword',\n label = 'Confirm Password',\n placeholder = 'Confirm your password',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"password\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`).min(1, 'Please confirm your password')}\n required={required}\n className={className}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport { SmartInput } from '../smart-fields/SmartInput';\nimport { z } from 'zod';\n\n// =============================================================================\n// OPINIONATED AGE FIELD COMPONENT\n// =============================================================================\n\nexport interface FieldAgeProps {\n field?: string;\n label?: string;\n placeholder?: string;\n required?: boolean;\n className?: string;\n minAge?: number;\n maxAge?: number;\n // Allow override of any SmartInput props\n [key: string]: any;\n}\n\n/**\n * Opinionated Age Field Component\n * \n * Pre-configured with:\n * - Age validation (typically 18+ for adults)\n * - Number input type\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldAge /> // Uses 'age' as field name, 18+ validation\n * <FieldAge field=\"userAge\" minAge={21} /> // Custom field name, 21+ validation\n * <FieldAge minAge={13} maxAge={100} /> // Custom age range\n */\nexport const FieldAge: React.FC<FieldAgeProps> = ({\n field = 'age',\n label = 'Age',\n placeholder = 'Enter your age',\n required = true,\n className = '',\n minAge = 18,\n maxAge = 120,\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"number\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(1, `${label} is required`)\n .transform((val) => {\n const num = Number(val);\n if (isNaN(num)) throw new Error('Age must be a valid number');\n return num;\n })\n .refine((val) => val >= minAge, `You must be at least ${minAge} years old`)\n .refine((val) => val <= maxAge, `Age cannot exceed ${maxAge} years`)\n .refine((val) => Number.isInteger(val), 'Age must be a whole number')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport { SmartInput } from '../smart-fields/SmartInput';\nimport { z } from 'zod';\n\n// =============================================================================\n// OPINIONATED ADDRESS FIELD COMPONENTS\n// =============================================================================\n\nexport interface FieldAddressProps {\n field?: string;\n label?: string;\n placeholder?: string;\n required?: boolean;\n className?: string;\n // Allow override of any SmartInput props\n [key: string]: any;\n}\n\n/**\n * Opinionated Street Address Field Component\n * \n * Pre-configured with:\n * - Address validation (minimum 5 characters)\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldStreetAddress /> // Uses 'streetAddress' as field name\n * <FieldStreetAddress field=\"address\" /> // Custom field name\n */\nexport const FieldStreetAddress: React.FC<FieldAddressProps> = ({\n field = 'streetAddress',\n label = 'Street Address',\n placeholder = 'Enter your street address',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"text\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(5, 'Street address must be at least 5 characters')\n .max(100, 'Street address must be less than 100 characters')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n\n/**\n * Opinionated City Field Component\n * \n * Pre-configured with:\n * - City validation (letters, spaces, hyphens, apostrophes)\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldCity /> // Uses 'city' as field name\n * <FieldCity field=\"town\" /> // Custom field name\n */\nexport const FieldCity: React.FC<FieldAddressProps> = ({\n field = 'city',\n label = 'City',\n placeholder = 'Enter your city',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"text\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(2, 'City must be at least 2 characters')\n .max(50, 'City must be less than 50 characters')\n .regex(/^[a-zA-Z\\s\\-']+$/, 'City can only contain letters, spaces, hyphens, and apostrophes')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n\n/**\n * Opinionated ZIP Code Field Component\n * \n * Pre-configured with:\n * - ZIP code validation (US format: 12345 or 12345-6789)\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldZipCode /> // Uses 'zipCode' as field name\n * <FieldZipCode field=\"postalCode\" /> // Custom field name\n */\nexport const FieldZipCode: React.FC<FieldAddressProps> = ({\n field = 'zipCode',\n label = 'ZIP Code',\n placeholder = 'Enter your ZIP code',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"text\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .regex(/^\\d{5}(-\\d{4})?$/, 'Please enter a valid ZIP code (12345 or 12345-6789)')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n\n/**\n * Opinionated State Field Component\n * \n * Pre-configured with:\n * - State validation (2-letter state codes or full state names)\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldState /> // Uses 'state' as field name\n * <FieldState field=\"province\" /> // Custom field name\n */\nexport const FieldState: React.FC<FieldAddressProps> = ({\n field = 'state',\n label = 'State',\n placeholder = 'Enter your state',\n required = true,\n className = '',\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"text\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(2, 'State must be at least 2 characters')\n .max(20, 'State must be less than 20 characters')\n .regex(/^[a-zA-Z\\s]+$/, 'State can only contain letters and spaces')\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n","import React from 'react';\nimport { SmartInput } from '../smart-fields/SmartInput';\nimport { z } from 'zod';\n\n// =============================================================================\n// OPINIONATED MESSAGE FIELD COMPONENT\n// =============================================================================\n\nexport interface FieldMessageProps {\n field?: string;\n label?: string;\n placeholder?: string;\n required?: boolean;\n className?: string;\n maxLength?: number;\n minLength?: number;\n rows?: number;\n // Allow override of any SmartInput props\n [key: string]: any;\n}\n\n/**\n * Opinionated Message Field Component\n * \n * Pre-configured with:\n * - Message validation (configurable min/max length)\n * - Textarea input type\n * - Proper label and placeholder\n * - Required field indicator\n * \n * Usage:\n * <FieldMessage /> // Uses 'message' as field name\n * <FieldMessage field=\"comments\" maxLength={1000} /> // Custom field name and length\n * <FieldMessage required={false} /> // Override required\n */\nexport const FieldMessage: React.FC<FieldMessageProps> = ({\n field = 'message',\n label = 'Message',\n placeholder = 'Enter your message',\n required = false,\n className = '',\n maxLength = 500,\n minLength = 10,\n rows = 4,\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"textarea\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(minLength, `Message must be at least ${minLength} characters`)\n .max(maxLength, `Message must be less than ${maxLength} characters`)\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n\n/**\n * Opinionated Comments Field Component\n * \n * Pre-configured for comments with longer length limits\n * \n * Usage:\n * <FieldComments /> // Uses 'comments' as field name\n * <FieldComments field=\"feedback\" maxLength={2000} /> // Custom field name and length\n */\nexport const FieldComments: React.FC<FieldMessageProps> = ({\n field = 'comments',\n label = 'Comments',\n placeholder = 'Enter your comments',\n required = false,\n className = '',\n maxLength = 1000,\n minLength = 10,\n rows = 4,\n ...props\n}) => {\n return (\n <SmartInput\n field={field}\n label={label}\n type=\"textarea\"\n placeholder={placeholder}\n validation={z.string(`${label} is required`)\n .min(minLength, `Comments must be at least ${minLength} characters`)\n .max(maxLength, `Comments must be less than ${maxLength} characters`)\n }\n required={required}\n className={className}\n {...props}\n />\n );\n};\n"]}
|
package/dist/style.css
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* =============================================================================
|
|
2
|
+
@algodomain/smart-forms - Theme CSS Variables
|
|
3
|
+
============================================================================= */
|
|
4
|
+
|
|
5
|
+
/* This file contains only CSS variables for theming.
|
|
6
|
+
No Tailwind directives - consumers need their own Tailwind setup.
|
|
7
|
+
Consumers can override any variable in their own CSS. */
|
|
8
|
+
|
|
9
|
+
:root {
|
|
10
|
+
/* Border radius */
|
|
11
|
+
--radius: 0.625rem;
|
|
12
|
+
|
|
13
|
+
/* Base colors */
|
|
14
|
+
--background: oklch(1 0 0);
|
|
15
|
+
--foreground: oklch(0.145 0 0);
|
|
16
|
+
|
|
17
|
+
/* Card */
|
|
18
|
+
--card: oklch(1 0 0);
|
|
19
|
+
--card-foreground: oklch(0.145 0 0);
|
|
20
|
+
|
|
21
|
+
/* Popover */
|
|
22
|
+
--popover: oklch(1 0 0);
|
|
23
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
24
|
+
|
|
25
|
+
/* Primary */
|
|
26
|
+
--primary: oklch(0.205 0 0);
|
|
27
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
28
|
+
|
|
29
|
+
/* Secondary */
|
|
30
|
+
--secondary: oklch(0.97 0 0);
|
|
31
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
32
|
+
|
|
33
|
+
/* Muted */
|
|
34
|
+
--muted: oklch(0.97 0 0);
|
|
35
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
36
|
+
|
|
37
|
+
/* Accent */
|
|
38
|
+
--accent: oklch(0.97 0 0);
|
|
39
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
40
|
+
|
|
41
|
+
/* Destructive */
|
|
42
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
43
|
+
--destructive-foreground: oklch(0.985 0 0);
|
|
44
|
+
|
|
45
|
+
/* Border & Input */
|
|
46
|
+
--border: oklch(0.922 0 0);
|
|
47
|
+
--input: oklch(0.922 0 0);
|
|
48
|
+
|
|
49
|
+
/* Ring (focus outline) */
|
|
50
|
+
--ring: oklch(0.708 0 0);
|
|
51
|
+
|
|
52
|
+
/* Chart colors (optional) */
|
|
53
|
+
--chart-1: oklch(0.632 0.188 23.813);
|
|
54
|
+
--chart-2: oklch(0.701 0.167 150.149);
|
|
55
|
+
--chart-3: oklch(0.499 0.171 254.868);
|
|
56
|
+
--chart-4: oklch(0.772 0.143 70.08);
|
|
57
|
+
--chart-5: oklch(0.659 0.198 344.088);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Dark mode theme */
|
|
61
|
+
.dark {
|
|
62
|
+
--background: oklch(0.145 0 0);
|
|
63
|
+
--foreground: oklch(0.985 0 0);
|
|
64
|
+
|
|
65
|
+
--card: oklch(0.205 0 0);
|
|
66
|
+
--card-foreground: oklch(0.985 0 0);
|
|
67
|
+
|
|
68
|
+
--popover: oklch(0.205 0 0);
|
|
69
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
70
|
+
|
|
71
|
+
--primary: oklch(0.922 0 0);
|
|
72
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
73
|
+
|
|
74
|
+
--secondary: oklch(0.269 0 0);
|
|
75
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
76
|
+
|
|
77
|
+
--muted: oklch(0.269 0 0);
|
|
78
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
79
|
+
|
|
80
|
+
--accent: oklch(0.269 0 0);
|
|
81
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
82
|
+
|
|
83
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
84
|
+
--destructive-foreground: oklch(0.985 0 0);
|
|
85
|
+
|
|
86
|
+
--border: oklch(1 0 0 / 10%);
|
|
87
|
+
--input: oklch(1 0 0 / 15%);
|
|
88
|
+
|
|
89
|
+
--ring: oklch(0.556 0 0);
|
|
90
|
+
|
|
91
|
+
--chart-1: oklch(0.828 0.132 85.995);
|
|
92
|
+
--chart-2: oklch(0.691 0.201 181.189);
|
|
93
|
+
--chart-3: oklch(0.701 0.208 256.749);
|
|
94
|
+
--chart-4: oklch(0.837 0.135 61.431);
|
|
95
|
+
--chart-5: oklch(0.874 0.146 1.055);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* =============================================================================
|
|
99
|
+
Usage Instructions
|
|
100
|
+
============================================================================= */
|
|
101
|
+
|
|
102
|
+
/* To override theme colors in your app, add this to your own CSS:
|
|
103
|
+
|
|
104
|
+
:root {
|
|
105
|
+
--primary: oklch(0.5 0.2 250);
|
|
106
|
+
--radius: 1rem;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
For full Tailwind utility support (optional), add to your index.css:
|
|
110
|
+
@source "../node_modules/@algodomain/smart-forms/dist/index.js";
|
|
111
|
+
@source "../node_modules/@algodomain/smart-forms/dist/index.cjs";
|
|
112
|
+
|
|
113
|
+
*/
|
|
114
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@algodomain/smart-forms",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A powerful React form framework with smart fields, multi-tab support, and seamless API integration",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
},
|
|
15
|
+
"./fields": {
|
|
16
|
+
"import": "./dist/fields.js",
|
|
17
|
+
"require": "./dist/fields.cjs",
|
|
18
|
+
"types": "./dist/fields.d.ts"
|
|
19
|
+
},
|
|
20
|
+
"./opinionated": {
|
|
21
|
+
"import": "./dist/opinionated.js",
|
|
22
|
+
"require": "./dist/opinionated.cjs",
|
|
23
|
+
"types": "./dist/opinionated.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./style.css": "./dist/style.css"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"sideEffects": [
|
|
31
|
+
"dist/style.css"
|
|
32
|
+
],
|
|
33
|
+
"keywords": [
|
|
34
|
+
"react",
|
|
35
|
+
"forms",
|
|
36
|
+
"smart-forms",
|
|
37
|
+
"form-builder",
|
|
38
|
+
"tailwind",
|
|
39
|
+
"shadcn",
|
|
40
|
+
"validation",
|
|
41
|
+
"zod"
|
|
42
|
+
],
|
|
43
|
+
"author": "AlgoDomain",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/algodomain/smart-forms"
|
|
48
|
+
},
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"date-fns": ">=3",
|
|
51
|
+
"lucide-react": ">=0.400",
|
|
52
|
+
"react": ">=18",
|
|
53
|
+
"react-dom": ">=18",
|
|
54
|
+
"react-toastify": ">=9",
|
|
55
|
+
"tailwindcss": ">=3",
|
|
56
|
+
"zod": ">=3"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/node": "^24.5.2",
|
|
60
|
+
"@types/react": "^19.1.13",
|
|
61
|
+
"@types/react-dom": "^19.1.9",
|
|
62
|
+
"react-router-dom": "^7.9.5",
|
|
63
|
+
"tsup": "^8.0.0",
|
|
64
|
+
"typescript": "~5.8.3"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "tsup",
|
|
68
|
+
"prepublishOnly": "pnpm build"
|
|
69
|
+
},
|
|
70
|
+
"publishConfig": {
|
|
71
|
+
"access": "public"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"@radix-ui/react-checkbox": "^1.3.3",
|
|
75
|
+
"@radix-ui/react-dialog": "^1.1.15",
|
|
76
|
+
"@radix-ui/react-label": "^2.1.8",
|
|
77
|
+
"@radix-ui/react-popover": "^1.1.15",
|
|
78
|
+
"@radix-ui/react-radio-group": "^1.3.8",
|
|
79
|
+
"@radix-ui/react-select": "^2.2.6",
|
|
80
|
+
"@radix-ui/react-slider": "^1.3.6",
|
|
81
|
+
"@radix-ui/react-slot": "^1.2.4",
|
|
82
|
+
"@radix-ui/react-tabs": "^1.1.13",
|
|
83
|
+
"@radix-ui/react-tooltip": "^1.2.8",
|
|
84
|
+
"class-variance-authority": "^0.7.1",
|
|
85
|
+
"clsx": "^2.1.1",
|
|
86
|
+
"cmdk": "^1.1.1",
|
|
87
|
+
"react-day-picker": "^9.11.1",
|
|
88
|
+
"tailwind-merge": "^3.4.0"
|
|
89
|
+
}
|
|
90
|
+
}
|