@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.
@@ -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
+ }